722ce84cbf88c1d3e7b316d5fdfc93cf14f2db22
[occt.git] / samples / qt / Graphic3dDemo / src / ShapeDlg.cxx
1 #include <qapplication.h>
2 #include <qlayout.h>
3 #include <qpushbutton.h>
4 #include <qframe.h>
5 #include <qcheckbox.h>
6 #include <qlabel.h>
7 #include <qcombobox.h>
8 #include <qspinbox.h>
9
10 #include <Aspect_TypeOfLine.hxx>
11 #include <Graphic3d_AspectFillArea3d.hxx>
12 #include <Graphic3d_AspectLine3d.hxx>
13 #include <V3d_TypeOfVisualization.hxx>
14 #include <Prs3d_LineAspect.hxx>
15 #include <Prs3d_ShadingAspect.hxx>
16 #include <AIS_InteractiveObject.hxx>
17 #include <AIS_Drawer.hxx>
18 #include <Graphic3d_ArrayOfPrimitives.hxx>\r
19
20 #include <Sphere_Sphere.hxx>
21 #include <gp_Pnt.hxx>
22
23 #include "ShapeDlg.h"
24 #include "Application.h"
25 #include "MDIWindow.h"
26 #include "Document.h"
27 #include "global.h"
28
29 //////////////////////////////////////////////////////////////////////
30 // Construction/Destruction
31 //////////////////////////////////////////////////////////////////////
32
33 ShapeDlg::ShapeDlg( QWidget* parent, Handle(V3d_View)& view, 
34                     Handle(AIS_InteractiveContext)& cxt )
35 : QDialog( parent ),
36   myView( view ), myContext( cxt )
37 {\r
38     setModal( false );
39     setWindowTitle( tr( "TITLE_SHAPE_DLG" ) );
40
41     myRadius = 100;
42     myDeflection = 1.0;
43     myNbPanes = 0;
44     myNbItems = 0;
45
46     QVBoxLayout* topLayout = new QVBoxLayout( this );\r
47     topLayout->setMargin( 5 );
48
49     // radius frame
50     QFrame* rFrame = new QFrame( this );
51     //rFrame->setFrameStyle( QFrame::Box | QFrame::Sunken );
52     topLayout->addWidget( rFrame );
53     topLayout->addSpacing( 10 );
54
55     QHBoxLayout* rBox = new QHBoxLayout( rFrame );
56     rBox->setMargin( 5 );\r
57     QLabel* rad = new QLabel( tr( "MEN_DLG_RADIUS" ), rFrame );
58     QDoubleSpinBox* rSpin = new QDoubleSpinBox( rFrame  );\r
59     rSpin->setRange( 1, 10000 );\r
60     rSpin->setSingleStep( 1 );\r
61 //    rSpin->setValueDouble( myRadius );
62     rSpin->setValue( myRadius );\r
63 //    verify( connect( rSpin, SIGNAL( sbdValueChanged( double ) ), SLOT( onRadiusChanged( double ) ) ) );
64     verify( connect( rSpin, SIGNAL( valueChanged( double ) ), SLOT( onRadiusChanged( double ) ) ) );\r
65
66     rBox->addWidget( rad );
67     rBox->addWidget( rSpin );
68     rBox->addStretch( 2 );
69
70     // sphere position frame
71     QFrame* pFrame = new QFrame( this );
72     QHBoxLayout* pBox = new QHBoxLayout( pFrame );
73     pBox->setMargin( 5 );\r
74
75     pFrame->setFrameStyle( QFrame::Box | QFrame::Sunken );
76     topLayout->addWidget( pFrame );
77     topLayout->addSpacing( 10 );
78     
79     QLabel *lX, *lY, *lZ;
80
81     lX = new QLabel( tr( "MEN_DLG_X" ), pFrame );
82     lY = new QLabel( tr( "MEN_DLG_Y" ), pFrame );
83     lZ = new QLabel( tr( "MEN_DLG_Z" ), pFrame );
84
85     myXSpin = new QDoubleSpinBox( pFrame );\r
86     myXSpin->setRange( -10000, 10000 );\r
87     myXSpin->setSingleStep( 1 );\r
88     myXSpin->setValue( 0 );\r
89           connect(myXSpin, SIGNAL(valueChanged (double)), SLOT(onPositionChanged()));\r
90     myYSpin = new QDoubleSpinBox( pFrame );\r
91     myYSpin->setRange( -10000, 10000 );\r
92     myYSpin->setSingleStep( 1 );\r
93     myYSpin->setValue( 0 );\r
94     connect(myYSpin, SIGNAL(valueChanged (double)), SLOT(onPositionChanged()));\r
95     myZSpin = new QDoubleSpinBox( pFrame );\r
96     myZSpin->setRange( -10000, 10000 );\r
97     myZSpin->setSingleStep( 1 );\r
98           myZSpin->setValue( 0 );\r
99           connect(myZSpin, SIGNAL(valueChanged (double)), SLOT(onPositionChanged()));\r
100     \r
101
102     pBox->addStretch( 2 );
103     pBox->addWidget( lX );
104     pBox->addWidget( myXSpin );
105     pBox->addStretch( 2 );
106     pBox->addWidget( lY );
107     pBox->addWidget( myYSpin );
108     pBox->addStretch( 2 );
109     pBox->addWidget( lZ );
110     pBox->addWidget( myZSpin );
111     pBox->addStretch( 2 );
112
113     // sphere aspect frame
114     QFrame* aFrame = new QFrame( this );
115     QHBoxLayout* aBox = new QHBoxLayout( aFrame );
116     aBox->setMargin( 5 );\r
117
118     aFrame->setFrameStyle( QFrame::Box | QFrame::Sunken );
119     topLayout->addWidget( aFrame );
120     topLayout->addSpacing( 10 );
121
122     myVNormal = new QCheckBox( aFrame );
123     myVNormal->setText( tr( "MEN_BTN_VNORMAL" ) );
124     myVNormal->setChecked( true );
125     //verify( connect( myVNormal, SIGNAL( toggled( bool ) ), SLOT( onShowEdges( bool ) ) ) );
126
127     myVColor = new QCheckBox( aFrame );
128     myVColor->setText( tr( "MEN_BTN_VCOLOR" ) );
129     //verify( connect( myVColor, SIGNAL( toggled( bool ) ), SLOT( onShowEdges( bool ) ) ) );
130
131     myVTexel = new QCheckBox( aFrame );
132     myVTexel->setText( tr( "MEN_BTN_VTEXEL" ) );
133     //verify( connect( myVTexel, SIGNAL( toggled( bool ) ), SLOT( onShowEdges( bool ) ) ) );
134
135     myText = new QCheckBox( aFrame );\r
136     myText->setText( tr( "MEN_BTN_TEXT" ) );\r
137     verify( connect( myText, SIGNAL( clicked() ), SLOT( onText() ) ) );\r
138 \r
139     aBox->addStretch( 2 );
140     aBox->addWidget( myVNormal );
141     aBox->addStretch( 2 );
142     aBox->addWidget( myVColor );
143     aBox->addStretch( 2 );
144     aBox->addWidget( myVTexel );
145     aBox->addStretch( 2 );
146     aBox->addWidget( myText );\r
147     aBox->addStretch( 2 );\r
148
149     // tesselation frame
150     QFrame* tFrame = new QFrame( this );
151     QHBoxLayout* tBox = new QHBoxLayout( tFrame );
152     tBox->setMargin( 5 );\r
153
154     tFrame->setFrameStyle( QFrame::Box | QFrame::Sunken );
155     topLayout->addWidget( tFrame );
156     topLayout->addSpacing( 10 );
157
158     QLabel *defl, *panes, *items;
159
160     defl = new QLabel( tr( "MEN_DLG_DEFLECTION" ), tFrame );
161     panes = new QLabel( tr( "MEN_DLG_PANES" ), tFrame );
162     items = new QLabel( tr( "MEN_DLG_ITEMS" ), tFrame );
163
164     myDefSpin = new QDoubleSpinBox( tFrame );\r
165     myDefSpin->setRange( 0.1, 13 );\r
166     myDefSpin->setSingleStep( 0.1 );\r
167     myDefSpin->setValue( 1 );\r
168     verify( connect( myDefSpin, SIGNAL( valueChanged( double ) ), SLOT( onDeflectionChanged( double ) ) ) );\r
169     myPanesSpin = new QSpinBox( tFrame );\r
170     myPanesSpin->setRange( 8, 10000 );\r
171     myPanesSpin->setSingleStep( 1 );\r
172     verify( connect( myPanesSpin, SIGNAL( valueChanged( int ) ), SLOT( onPanesChanged( int ) ) ) );
173     myItemsSpin = new QSpinBox( tFrame );
174     myItemsSpin->setRange( 25, 10000000 );\r
175     myItemsSpin->setSingleStep( 1 );\r
176     verify( connect( myItemsSpin, SIGNAL( valueChanged( int ) ), SLOT( onItemsChanged( int ) ) ) );
177
178     tBox->addWidget( defl );
179     tBox->addWidget( myDefSpin );
180     tBox->addWidget( panes );
181     tBox->addWidget( myPanesSpin );
182     tBox->addWidget( items );
183     tBox->addWidget( myItemsSpin );
184
185     // control buttons
186     QPushButton *bOk, *bCancel/*, *bHelp*/;
187     bOk     = new QPushButton( tr( "BTN_OK" ), this );
188     bOk->setDefault(true);
189     verify( connect( bOk, SIGNAL( clicked() ), SLOT( onOk() ) ) );
190     bCancel = new QPushButton( tr( "BTN_CANCEL" ), this );
191     verify( connect( bCancel, SIGNAL( clicked() ), SLOT( onCancel() ) ) );\r
192         verify( connect( this, SIGNAL( destroyed() ), SLOT( onCancel() ) ) );
193 //    bHelp   = new QPushButton( tr( "BTN_HELP" ), this );\r
194 //    verify( connect( bHelp, SIGNAL( clicked() ), SLOT( onHelp() ) ) );\r
195
196     QHBoxLayout* btnLayout = new QHBoxLayout();
197     btnLayout->setSpacing( 5 );\r
198         btnLayout->addStretch( 10 );
199     btnLayout->addWidget( bOk );
200     btnLayout->addWidget( bCancel );
201     btnLayout->addStretch( 10 );\r
202 //    btnLayout->addWidget( bHelp );\r
203     topLayout->addLayout( btnLayout );\r
204
205     QSize s = topLayout->totalMinimumSize();
206     s.setWidth( s.width() + topLayout->margin() + 10 );
207     s.setHeight( s.height() + topLayout->margin() + 10 );
208     setFixedSize( s );
209 }
210
211 ShapeDlg::~ShapeDlg()
212 {
213 }
214
215 void ShapeDlg::showEvent ( QShowEvent* e )
216 {
217     QWidget::showEvent( e );
218 //    myXSpin->setValueDouble( 0 );
219 //    myYSpin->setValueDouble( 0 );
220 //    myZSpin->setValueDouble( 0 );
221     myXSpin->setValue( 0 );\r
222     myYSpin->setValue( 0 );\r
223     myZSpin->setValue( 0 );\r
224     onRadiusChanged( myRadius );
225 }
226
227 void ShapeDlg::onOk()
228 {
229     hide();
230     updateSphere();
231     myShape.Nullify();
232 }
233  
234 void ShapeDlg::onCancel()
235 {
236     hide();
237     myContext->Remove( myShape );
238     myShape.Nullify();
239 }
240
241 void ShapeDlg::onHelp()
242 {
243 }
244
245 void ShapeDlg::onRadiusChanged( double value )
246 {
247     myRadius = value;
248
249     myNbPanes = Sphere_Sphere::NbPanes( myRadius, myDeflection );
250     myNbItems = Sphere_Sphere::NbItems( myNbPanes );
251     
252     myPanesSpin->blockSignals( true );
253     myItemsSpin->blockSignals( true );
254
255     myPanesSpin->setValue( myNbPanes );
256     myItemsSpin->setValue( myNbItems );
257
258     myPanesSpin->blockSignals( false );
259     myItemsSpin->blockSignals( false );
260 \r
261     updateSphere();
262 }
263
264 void ShapeDlg::onItemsChanged( int value )
265 {
266     myNbItems = value;
267     myNbPanes = Sphere_Sphere::NbPanes( myNbItems );
268     myDeflection = Sphere_Sphere::Deflection( myRadius, myNbPanes );
269
270     myDefSpin->blockSignals( true );
271     myPanesSpin->blockSignals( true );
272
273 //    myDefSpin->setValueDouble( myDeflection );
274     myDefSpin->setValue( myDeflection );\r
275     myPanesSpin->setValue( myNbPanes );
276
277     myDefSpin->blockSignals( false );
278     myPanesSpin->blockSignals( false );
279
280     updateSphere();
281 }
282
283 void ShapeDlg::onPanesChanged( int value )
284 {
285     myNbPanes = value;
286     myNbItems = Sphere_Sphere::NbItems( myNbPanes );
287     myDeflection = Sphere_Sphere::Deflection( myRadius, myNbPanes );
288
289     myDefSpin->blockSignals( true );
290     myItemsSpin->blockSignals( true );
291
292 //    myDefSpin->setValueDouble( myDeflection );
293     myDefSpin->setValue( myDeflection );\r
294     myItemsSpin->setValue( myNbItems );
295
296     myDefSpin->blockSignals( false );
297     myItemsSpin->blockSignals( false );
298
299     updateSphere();
300 }
301
302 void ShapeDlg::onDeflectionChanged( double value )
303 {
304     myDeflection = value;
305     myNbPanes = Sphere_Sphere::NbPanes( myRadius, myDeflection );
306     myNbItems = Sphere_Sphere::NbItems( myNbPanes );
307
308     myPanesSpin->blockSignals( true );
309     myItemsSpin->blockSignals( true );
310
311     myPanesSpin->setValue( myNbPanes );
312     myItemsSpin->setValue( myNbItems );
313
314     myPanesSpin->blockSignals( false );
315     myItemsSpin->blockSignals( false );
316
317     updateSphere();
318 }
319 \r
320 void ShapeDlg::onText()\r
321 {\r
322     updateSphere();\r
323 }\r
324 \r
325
326 void ShapeDlg::updateSphere()
327 {
328     QApplication::setOverrideCursor( Qt::WaitCursor );
329     bool visible = isVisible();
330     gp_Pnt myPosition( myXSpin->value(), myYSpin->value(), myZSpin->value() );
331     if ( !myShape.IsNull() ) {
332         myContext->Remove( myShape, false );
333         myShape.Nullify();
334     }
335
336     myShape = 
337         new Sphere_Sphere( myPosition, myRadius, myDeflection, 1/*myVNormalsFlag*/,
338                          0/*myVColorsFlag*/, 0/*myVTexelsFlag*/, myText->isChecked(), Graphic3d_ArrayOfPrimitives::IsEnable());
339     myContext->SetDisplayMode( myShape, Application::getApplication()->getActiveMDI()->getDisplayMode(), false );
340     Application::startTimer();
341     myContext->Display( myShape, false );
342     Application::stopTimer( 0, "Display Sphere::Sphere", !visible );
343     Application::startTimer();
344     myView->Update();
345     Application::stopTimer( 0, "UPDATE", !visible );
346     QApplication::restoreOverrideCursor();
347 }
348 \r
349 void ShapeDlg::onPositionChanged()\r
350 {\r
351         updateSphere();\r
352 }\r
353 \r
354 void ShapeDlg::closeEvent ( QCloseEvent* e )\r
355 {\r
356         onCancel();\r
357 }\r