]> SALOME platform Git repositories - modules/geom.git/blob - src/GenerationGUI/GenerationGUI_PrismDlg.cxx
Salome HOME
Implementation of the "21187: EDF 1137 GEOM: Performance issue when manipulating...
[modules/geom.git] / src / GenerationGUI / GenerationGUI_PrismDlg.cxx
1 //  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21
22 // GEOM GEOMGUI : GUI for Geometry component
23 // File   : GenerationGUI_PrismDlg.cxx
24 // Author : Lucien PIGNOLONI, Open CASCADE S.A.S.
25
26 #include "GenerationGUI_PrismDlg.h"
27
28 #include <DlgRef.h>
29 #include <GeometryGUI.h>
30 #include <GEOMBase.h>
31
32 #include <SUIT_Session.h>
33 #include <SUIT_ResourceMgr.h>
34 #include <SalomeApp_Application.h>
35 #include <LightApp_SelectionMgr.h>
36
37 // OCCT Includes
38 #include <TopoDS_Shape.hxx>
39 #include <TopoDS_Edge.hxx>
40 #include <TopoDS.hxx>
41 #include <TopExp.hxx>
42 #include <TColStd_IndexedMapOfInteger.hxx>
43 #include <TopTools_IndexedMapOfShape.hxx>
44 #include <Precision.hxx>
45
46 #include <GEOMImpl_Types.hxx>
47
48 //=================================================================================
49 // class    : GenerationGUI_PrismDlg()
50 // purpose  : Constructs a GenerationGUI_PrismDlg which is a child of 'parent', with the
51 //            name 'name' and widget flags set to 'f'.
52 //            The dialog will by default be modeless, unless you set 'modal' to
53 //            TRUE to construct a modal dialog.
54 //=================================================================================
55 GenerationGUI_PrismDlg::GenerationGUI_PrismDlg (GeometryGUI* theGeometryGUI, QWidget* parent,
56                                                 bool modal, Qt::WindowFlags fl)
57   : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl)
58 {
59   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
60   QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_PRISM")));
61   QPixmap image1 (aResMgr->loadPixmap("GEOM", tr("ICON_SELECT")));
62   QPixmap image2 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_PRISM_2P")));
63   QPixmap image3 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_PRISM_DXDYDZ")));
64
65   setWindowTitle(tr("GEOM_EXTRUSION_TITLE"));
66
67   /***************************************************************/
68   mainFrame()->GroupConstructors->setTitle(tr("GEOM_EXTRUSION"));
69   mainFrame()->RadioButton1->setIcon(image0);
70   mainFrame()->RadioButton2->setIcon(image2);
71   mainFrame()->RadioButton3->setIcon(image3);
72
73   mainFrame()->RadioButton1->setChecked(true);
74
75   GroupVecH = new DlgRef_2Sel2Spin3Check(centralWidget());
76   GroupVecH->GroupBox1->setTitle(tr("GEOM_EXTRUSION_BSV"));
77   GroupVecH->TextLabel1->setText(tr("GEOM_BASE"));
78   GroupVecH->TextLabel2->setText(tr("GEOM_VECTOR"));
79   GroupVecH->TextLabel3->setText(tr("GEOM_HEIGHT"));
80   GroupVecH->TextLabel4->setText(tr("GEOM_SCALE_FACTOR"));
81   GroupVecH->PushButton1->setIcon(image1);
82   GroupVecH->PushButton2->setIcon(image1);
83   GroupVecH->LineEdit1->setReadOnly(true);
84   GroupVecH->LineEdit2->setReadOnly(true);
85   GroupVecH->CheckBox1->setText(tr("GEOM_BOTHWAY"));
86   GroupVecH->CheckBox2->setText(tr("GEOM_REVERSE"));
87   GroupVecH->CheckBox3->setText(tr("GEOM_SCALE_PRISM"));
88
89   Group2Points = new DlgRef_3Sel3Spin2Check(centralWidget());
90   Group2Points->GroupBox1->setTitle(tr("GEOM_EXTRUSION_BSV_2P"));
91   Group2Points->TextLabel1->setText(tr("GEOM_BASE"));
92   Group2Points->TextLabel2->setText(tr("GEOM_POINT_I").arg(1));
93   Group2Points->TextLabel3->setText(tr("GEOM_POINT_I").arg(2));
94   Group2Points->TextLabel4->setText(tr("GEOM_SCALE_FACTOR"));
95   Group2Points->PushButton1->setIcon(image1);
96   Group2Points->PushButton2->setIcon(image1);
97   Group2Points->PushButton3->setIcon(image1);
98   Group2Points->CheckBox1->setText(tr("GEOM_BOTHWAY"));
99   Group2Points->CheckBox2->setText(tr("GEOM_SCALE_PRISM"));
100
101   GroupDXDYDZ = new DlgRef_1Sel4Spin2Check(centralWidget());
102   GroupDXDYDZ->GroupBox1->setTitle(tr("GEOM_EXTRUSION_DXDYDZ"));
103   GroupDXDYDZ->TextLabel1->setText(tr("GEOM_BASE"));
104   GroupDXDYDZ->PushButton1->setIcon(image1);
105   GroupDXDYDZ->TextLabel2->setText(tr("GEOM_DX"));
106   GroupDXDYDZ->TextLabel3->setText(tr("GEOM_DY"));
107   GroupDXDYDZ->TextLabel4->setText(tr("GEOM_DZ"));
108   GroupDXDYDZ->TextLabel5->setText(tr("GEOM_SCALE_FACTOR"));
109   GroupDXDYDZ->CheckBox1->setText(tr("GEOM_BOTHWAY"));
110   GroupDXDYDZ->CheckBox2->setText(tr("GEOM_SCALE_PRISM"));
111
112   QVBoxLayout* layout = new QVBoxLayout(centralWidget());
113   layout->setMargin(0); layout->setSpacing(6);
114   layout->addWidget(GroupVecH);
115   layout->addWidget(Group2Points);
116   layout->addWidget(GroupDXDYDZ);
117   /***************************************************************/
118
119   setHelpFileName("create_extrusion_page.html");
120
121   Init();
122 }
123
124 //=================================================================================
125 // function : ~GenerationGUI_PrismDlg()
126 // purpose  : Destroys the object and frees any allocated resources
127 //=================================================================================
128 GenerationGUI_PrismDlg::~GenerationGUI_PrismDlg()
129 {
130   // no need to delete child widgets, Qt does it all for us
131 }
132
133 //=================================================================================
134 // function : Init()
135 // purpose  :
136 //=================================================================================
137 void GenerationGUI_PrismDlg::Init()
138 {
139   // Get setting of step value from file configuration
140   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
141   double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100);
142
143   // min, max, step and decimals for spin boxes & initial values
144   double aScaleFactor = 2.0;
145   double aScaleStep = 0.5;
146   double aScaleMin = Precision::Confusion() * 10.0;
147
148   initSpinBox(GroupVecH->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" );
149   GroupVecH->SpinBox_DX->setValue(100.0);
150
151   initSpinBox(GroupDXDYDZ->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" );
152   initSpinBox(GroupDXDYDZ->SpinBox_DY, COORD_MIN, COORD_MAX, step, "length_precision" );
153   initSpinBox(GroupDXDYDZ->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision" );
154   GroupDXDYDZ->SpinBox_DX->setValue(0.0);
155   GroupDXDYDZ->SpinBox_DY->setValue(0.0);
156   GroupDXDYDZ->SpinBox_DZ->setValue(0.0);
157
158   initSpinBox(GroupVecH->SpinBox_DY, aScaleMin, COORD_MAX, aScaleStep, "parametric_precision" );
159   initSpinBox(Group2Points->SpinBox1, aScaleMin, COORD_MAX, aScaleStep, "parametric_precision" );
160   initSpinBox(GroupDXDYDZ->SpinBox_SC, aScaleMin, COORD_MAX, aScaleStep, "parametric_precision" );
161
162   GroupVecH->SpinBox_DY->setValue(aScaleFactor);
163   Group2Points->SpinBox1->setValue(aScaleFactor);
164   GroupDXDYDZ->SpinBox_SC->setValue(aScaleFactor);
165
166   // hide not used controls
167   Group2Points->TextLabel5->hide();
168   Group2Points->TextLabel6->hide();
169
170   Group2Points->SpinBox2->hide();
171   Group2Points->SpinBox3->hide();
172
173   // init variables
174   myEditCurrentArgument = GroupVecH->LineEdit1;
175   GroupVecH->LineEdit1->setReadOnly(true);
176   GroupVecH->LineEdit2->setReadOnly(true);
177
178   Group2Points->LineEdit1->setReadOnly(true);
179   Group2Points->LineEdit2->setReadOnly(true);
180   Group2Points->LineEdit3->setReadOnly(true);
181
182   GroupDXDYDZ->LineEdit1->setReadOnly(true);
183
184   GroupVecH->LineEdit1->setText("");
185   GroupVecH->LineEdit2->setText("");
186
187   Group2Points->LineEdit1->setText("");
188   Group2Points->LineEdit2->setText("");
189   Group2Points->LineEdit3->setText("");
190
191   GroupDXDYDZ->LineEdit1->setText("");
192
193   myBaseObjects.clear();
194   myPoint1.nullify();
195   myPoint2.nullify();
196   myVec.nullify();
197
198   showOnlyPreviewControl();
199     
200   // signals and slots connections
201   connect(buttonOk(),    SIGNAL(clicked()), this, SLOT(ClickOnOk()));
202   connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
203
204   connect(this,          SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int)));
205
206   connect(GroupVecH->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
207   connect(GroupVecH->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
208
209   connect(GroupVecH->SpinBox_DX, SIGNAL(valueChanged(double)),    this, SLOT(ValueChangedInSpinBox()));
210   connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double)));
211
212   connect(GroupVecH->CheckBox1,  SIGNAL(toggled(bool)), this, SLOT(onBothway()));
213   connect(GroupVecH->CheckBox2,  SIGNAL(toggled(bool)), this, SLOT(onReverse()));
214   connect(GroupVecH->CheckBox3,  SIGNAL(toggled(bool)), this, SLOT(onScalePrism()));
215   connect(GroupVecH->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox()));
216
217   connect(Group2Points->PushButton1, SIGNAL(clicked()),       this, SLOT(SetEditCurrentArgument()));
218   connect(Group2Points->PushButton2, SIGNAL(clicked()),       this, SLOT(SetEditCurrentArgument()));
219   connect(Group2Points->PushButton3, SIGNAL(clicked()),       this, SLOT(SetEditCurrentArgument()));
220   connect(Group2Points->CheckBox1,   SIGNAL(toggled(bool)),   this, SLOT(onBothway()));
221   connect(Group2Points->CheckBox2,   SIGNAL(toggled(bool)),   this, SLOT(onScalePrism()));
222   connect(Group2Points->SpinBox1,    SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox()));
223
224   connect(GroupDXDYDZ->PushButton1, SIGNAL(clicked()),            this, SLOT(SetEditCurrentArgument()));
225   connect(GroupDXDYDZ->SpinBox_DX,  SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox()));
226   connect(GroupDXDYDZ->SpinBox_DY,  SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox()));
227   connect(GroupDXDYDZ->SpinBox_DZ,  SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox()));
228   connect(GroupDXDYDZ->SpinBox_SC,  SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox()));
229   connect(GroupDXDYDZ->CheckBox1,   SIGNAL(toggled(bool)),        this, SLOT(onBothway()));
230   connect(GroupDXDYDZ->CheckBox2,   SIGNAL(toggled(bool)),        this, SLOT(onScalePrism()));
231
232   initName(tr("GEOM_EXTRUSION"));
233
234   ConstructorsClicked(0);
235   onBothway();
236 }
237
238 //=================================================================================
239 // function : SetDoubleSpinBoxStep()
240 // purpose  : Double spin box management
241 //=================================================================================
242 void GenerationGUI_PrismDlg::SetDoubleSpinBoxStep (double step)
243 {
244   GroupVecH->SpinBox_DX->setSingleStep(step);
245   GroupDXDYDZ->SpinBox_DX->setSingleStep(step);
246   GroupDXDYDZ->SpinBox_DY->setSingleStep(step);
247   GroupDXDYDZ->SpinBox_DZ->setSingleStep(step);
248 }
249
250 //=================================================================================
251 // function : ConstructorsClicked()
252 // purpose  : Radio button management
253 //=================================================================================
254 void GenerationGUI_PrismDlg::ConstructorsClicked (int constructorId)
255 {
256   switch (constructorId) {
257   case 0:
258     Group2Points->hide();
259     GroupDXDYDZ->hide();
260     GroupVecH->show();
261
262     GroupVecH->LineEdit2->setText("");
263     myVec.nullify();
264
265     GroupVecH->PushButton1->click();
266     break;
267   case 1:
268     GroupVecH->hide();
269     Group2Points->show();
270     GroupDXDYDZ->hide();
271
272     Group2Points->LineEdit2->setText("");
273     Group2Points->LineEdit3->setText("");
274     myPoint1.nullify();
275     myPoint2.nullify();
276
277     Group2Points->PushButton1->click();
278     break;
279   case 2:
280     GroupVecH->hide();
281     Group2Points->hide();
282     GroupDXDYDZ->show();
283
284     GroupDXDYDZ->PushButton1->click();
285     break;
286   default:
287     break;
288   }
289
290   qApp->processEvents();
291   updateGeometry();
292   resize(minimumSizeHint());
293
294   SelectionIntoArgument();
295   processPreview();
296 }
297
298 //=================================================================================
299 // function : ClickOnOk()
300 // purpose  :
301 //=================================================================================
302 void GenerationGUI_PrismDlg::ClickOnOk()
303 {
304   if (ClickOnApply())
305     ClickOnCancel();
306 }
307
308 //=================================================================================
309 // function : ClickOnApply()
310 // purpose  :
311 //=================================================================================
312 bool GenerationGUI_PrismDlg::ClickOnApply()
313 {
314   if (!onAccept())
315     return false;
316
317   initName();
318   // activate selection and connect selection manager
319   ConstructorsClicked(getConstructorId());
320   return true;
321 }
322
323 //=================================================================================
324 // function : SelectionIntoArgument()
325 // purpose  : Called when selection is changed or on dialog initialization or activation
326 //=================================================================================
327 void GenerationGUI_PrismDlg::SelectionIntoArgument()
328 {
329   erasePreview();
330   myEditCurrentArgument->setText("");
331
332   if ( myEditCurrentArgument == GroupVecH->LineEdit1  ||
333        myEditCurrentArgument == Group2Points->LineEdit1 ||
334        myEditCurrentArgument == GroupDXDYDZ->LineEdit1 ) {
335     myBaseObjects.clear();
336     QList<GEOM::GeomObjPtr> objects = getSelected( TopAbs_SHAPE, -1 );
337     for ( int i = 0; i < objects.count(); i++ ) {
338       GEOM::shape_type stype = objects[i]->GetMaxShapeType();
339       if ( stype < GEOM::SHELL || stype > GEOM::VERTEX )
340         continue;
341       myBaseObjects << objects[i];
342     }
343     if ( !myBaseObjects.isEmpty() ) {
344       QString aName = myBaseObjects.count() > 1 ? QString( "%1_objects").arg( myBaseObjects.count() ) : GEOMBase::GetName( myBaseObjects[0].get() );
345       GroupVecH->LineEdit1->setText( aName );
346       Group2Points->LineEdit1->setText( aName );
347       GroupDXDYDZ->LineEdit1->setText( aName );
348     }
349     else {
350       GroupVecH->LineEdit1->setText( "" );
351       Group2Points->LineEdit1->setText( "" );
352       GroupDXDYDZ->LineEdit1->setText( "" );
353     }
354   }
355   else if ( myEditCurrentArgument == GroupVecH->LineEdit2 ) {
356     myVec = getSelected( TopAbs_EDGE );
357     if ( myVec ) {
358       QString aName = GEOMBase::GetName( myVec.get() );
359       myEditCurrentArgument->setText( aName );
360       if ( myBaseObjects.isEmpty() )
361         GroupVecH->PushButton1->click();
362     }
363   }
364   if ( myEditCurrentArgument == Group2Points->LineEdit2 ) {
365     myPoint1 = getSelected( TopAbs_VERTEX );
366     if ( myPoint1 ) {
367       QString aName = GEOMBase::GetName( myPoint1.get() );
368       myEditCurrentArgument->setText( aName );
369       if ( !myPoint2 )
370         Group2Points->PushButton3->click();
371       else if ( myBaseObjects.isEmpty() )
372         Group2Points->PushButton1->click();
373     }
374   }
375   if ( myEditCurrentArgument == Group2Points->LineEdit3 ) {
376     myPoint2 = getSelected( TopAbs_VERTEX );
377     if ( myPoint2 ) {
378       QString aName = GEOMBase::GetName( myPoint2.get() );
379       myEditCurrentArgument->setText( aName );
380       if ( myBaseObjects.isEmpty() )
381         Group2Points->PushButton1->click();
382       else if ( !myPoint1 )
383         Group2Points->PushButton2->click();
384     }
385   }
386
387   processPreview();
388 }
389
390 //=================================================================================
391 // function : SetEditCurrentArgument()
392 // purpose  :
393 //=================================================================================
394 void GenerationGUI_PrismDlg::SetEditCurrentArgument()
395 {
396   QPushButton* send = (QPushButton*)sender();
397
398   disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
399   globalSelection(GEOM_ALLSHAPES);
400   if (send == GroupVecH->PushButton1) {
401     myEditCurrentArgument = GroupVecH->LineEdit1;
402     GroupVecH->PushButton2->setDown(false);
403     GroupVecH->LineEdit2->setEnabled(false);
404   }
405   else if (send == GroupVecH->PushButton2) {
406     myEditCurrentArgument = GroupVecH->LineEdit2;
407     GroupVecH->PushButton1->setDown(false);
408     GroupVecH->LineEdit1->setEnabled(false);
409     localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
410   }
411   else if (send == Group2Points->PushButton1) {
412     myEditCurrentArgument = Group2Points->LineEdit1;
413     Group2Points->PushButton2->setDown(false);
414     Group2Points->PushButton3->setDown(false);
415     Group2Points->LineEdit2->setEnabled(false);
416     Group2Points->LineEdit3->setEnabled(false);
417   }
418   else if (send == Group2Points->PushButton2) {
419     myEditCurrentArgument = Group2Points->LineEdit2;
420     Group2Points->PushButton1->setDown(false);
421     Group2Points->PushButton3->setDown(false);
422     Group2Points->LineEdit1->setEnabled(false);
423     Group2Points->LineEdit3->setEnabled(false);
424     localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX);
425   }
426   else if (send == Group2Points->PushButton3) {
427     myEditCurrentArgument = Group2Points->LineEdit3;
428     Group2Points->PushButton1->setDown(false);
429     Group2Points->PushButton2->setDown(false);
430     Group2Points->LineEdit1->setEnabled(false);
431     Group2Points->LineEdit2->setEnabled(false);
432     localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX);
433   }
434   else   if (send == GroupDXDYDZ->PushButton1) {
435     myEditCurrentArgument = GroupDXDYDZ->LineEdit1;
436   }
437   connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
438           this, SLOT(SelectionIntoArgument()));
439
440   // enable line edit
441   myEditCurrentArgument->setEnabled(true);
442   myEditCurrentArgument->setFocus();
443   // after setFocus(), because it will be setDown(false) when loses focus
444   send->setDown(true);
445
446   // seems we need it only to avoid preview disappearing, caused by selection mode change
447   processPreview();
448 }
449
450 //=================================================================================
451 // function : ActivateThisDialog()
452 // purpose  :
453 //=================================================================================
454 void GenerationGUI_PrismDlg::ActivateThisDialog()
455 {
456   GEOMBase_Skeleton::ActivateThisDialog();
457
458   connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
459            this, SLOT( SelectionIntoArgument() ) );
460
461   ConstructorsClicked( getConstructorId() );
462 }
463
464 //=================================================================================
465 // function : enterEvent()
466 // purpose  : when mouse enter onto the QWidget
467 //=================================================================================
468 void GenerationGUI_PrismDlg::enterEvent (QEvent*)
469 {
470   if (!mainFrame()->GroupConstructors->isEnabled())
471     ActivateThisDialog();
472 }
473
474 //=================================================================================
475 // function : ValueChangedInSpinBox()
476 // purpose  :
477 //=================================================================================
478 void GenerationGUI_PrismDlg::ValueChangedInSpinBox()
479 {
480   processPreview();
481 }
482
483 //=================================================================================
484 // function : createOperation
485 // purpose  :
486 //=================================================================================
487 GEOM::GEOM_IOperations_ptr GenerationGUI_PrismDlg::createOperation()
488 {
489   return getGeomEngine()->GetI3DPrimOperations(getStudyId());
490 }
491
492 //=================================================================================
493 // function : isValid
494 // purpose  :
495 //=================================================================================
496 bool GenerationGUI_PrismDlg::isValid (QString& msg)
497 {
498   bool ok = false;
499   switch ( getConstructorId() ) {
500   case 0:
501     ok = GroupVecH->SpinBox_DX->isValid( msg, !IsPreview() ) &&
502          !myBaseObjects.isEmpty() && myVec;
503     break;
504   case 1:
505     ok = !myBaseObjects.isEmpty() && myPoint1 && myPoint2;
506     break;
507   case 2:
508     ok = GroupDXDYDZ->SpinBox_DX->isValid( msg, !IsPreview() ) &&
509          GroupDXDYDZ->SpinBox_DY->isValid( msg, !IsPreview() ) &&
510          GroupDXDYDZ->SpinBox_DZ->isValid( msg, !IsPreview() ) &&
511          !myBaseObjects.isEmpty();
512     break;
513   default:
514     break;
515   }
516
517   return ok;
518 }
519
520 //=================================================================================
521 // function : onReverse()
522 // purpose  :
523 //=================================================================================
524 void GenerationGUI_PrismDlg::onReverse()
525 {
526   double anOldValue = GroupVecH->SpinBox_DX->value();
527   GroupVecH->SpinBox_DX->setValue(-anOldValue);
528 }
529
530 //=================================================================================
531 // function : onBothway()
532 // purpose  :
533 //=================================================================================
534 void GenerationGUI_PrismDlg::onBothway()
535 {
536   GroupVecH->CheckBox2->setEnabled(!GroupVecH->CheckBox1->isChecked()); // is reversed
537   GroupVecH->CheckBox3->setEnabled(!GroupVecH->CheckBox1->isChecked()); // is scaled
538   GroupVecH->TextLabel4->setEnabled(!GroupVecH->CheckBox1->isChecked() &&
539                                     GroupVecH->CheckBox3->isChecked()); // scale factor
540   GroupVecH->SpinBox_DY->setEnabled(!GroupVecH->CheckBox1->isChecked() &&
541                                     GroupVecH->CheckBox3->isChecked()); // scale factor
542
543   Group2Points->CheckBox2->setEnabled(!Group2Points->CheckBox1->isChecked()); // is scaled
544   Group2Points->TextLabel4->setEnabled(!Group2Points->CheckBox1->isChecked() &&
545                                        Group2Points->CheckBox2->isChecked()); // scale factor
546   Group2Points->SpinBox1->setEnabled(!Group2Points->CheckBox1->isChecked() &&
547                                      Group2Points->CheckBox2->isChecked()); // scale factor
548
549   GroupDXDYDZ->CheckBox2->setEnabled(!GroupDXDYDZ->CheckBox1->isChecked()); // is scaled
550   GroupDXDYDZ->TextLabel5->setEnabled(!GroupDXDYDZ->CheckBox1->isChecked() &&
551                                       GroupDXDYDZ->CheckBox2->isChecked()); // scale factor
552   GroupDXDYDZ->SpinBox_SC->setEnabled(!GroupDXDYDZ->CheckBox1->isChecked() &&
553                                       GroupDXDYDZ->CheckBox2->isChecked()); // scale factor
554
555   processPreview();
556 }
557
558 //=================================================================================
559 // function : onScalePrism()
560 // purpose  :
561 //=================================================================================
562 void GenerationGUI_PrismDlg::onScalePrism()
563 {
564   GroupVecH->TextLabel4->setEnabled(GroupVecH->CheckBox3->isChecked());
565   GroupVecH->SpinBox_DY->setEnabled(GroupVecH->CheckBox3->isChecked());
566
567   Group2Points->TextLabel4->setEnabled(Group2Points->CheckBox2->isChecked());
568   Group2Points->SpinBox1->setEnabled(Group2Points->CheckBox2->isChecked());
569
570   GroupDXDYDZ->TextLabel5->setEnabled(GroupDXDYDZ->CheckBox2->isChecked());
571   GroupDXDYDZ->SpinBox_SC->setEnabled(GroupDXDYDZ->CheckBox2->isChecked());
572
573   processPreview();
574 }
575
576 //=================================================================================
577 // function : execute
578 // purpose  :
579 //=================================================================================
580 bool GenerationGUI_PrismDlg::execute (ObjectList& objects)
581 {
582   QStringList aParameters;
583   GEOM::GEOM_Object_var anObj;
584
585   GEOM::GEOM_I3DPrimOperations_var anOper = GEOM::GEOM_I3DPrimOperations::_narrow(getOperation());
586
587   for (int i = 0; i < myBaseObjects.count(); i++) {
588     switch (getConstructorId()) {
589     case 0:
590       if (GroupVecH->CheckBox1->isChecked())
591         anObj = anOper->MakePrismVecH2Ways(myBaseObjects[i].get(), myVec.get(),
592                                            GroupVecH->SpinBox_DX->value());
593       else {
594         if (GroupVecH->CheckBox3->isChecked())
595           anObj = anOper->MakePrismVecHWithScaling(myBaseObjects[i].get(), myVec.get(),
596                                                    GroupVecH->SpinBox_DX->value(),
597                                                    GroupVecH->SpinBox_DY->value());
598         else
599           anObj = anOper->MakePrismVecH(myBaseObjects[i].get(), myVec.get(),
600                                         GroupVecH->SpinBox_DX->value());
601       }
602
603       if (!anObj->_is_nil() && !IsPreview()) {
604         aParameters << GroupVecH->SpinBox_DX->text();
605         anObj->SetParameters(aParameters.join(":").toLatin1().constData());
606       }
607       break;
608     case 1:
609       if (Group2Points->CheckBox1->isChecked())
610         anObj = anOper->MakePrismTwoPnt2Ways(myBaseObjects[i].get(), myPoint1.get(), myPoint2.get());
611       else {
612         if (Group2Points->CheckBox2->isChecked())
613           anObj = anOper->MakePrismTwoPntWithScaling(myBaseObjects[i].get(), myPoint1.get(),
614                                                      myPoint2.get(), Group2Points->SpinBox1->value());
615         else
616           anObj = anOper->MakePrismTwoPnt(myBaseObjects[i].get(), myPoint1.get(), myPoint2.get());
617       }
618       break;
619     case 2:
620       double dx = GroupDXDYDZ->SpinBox_DX->value();
621       double dy = GroupDXDYDZ->SpinBox_DY->value();
622       double dz = GroupDXDYDZ->SpinBox_DZ->value();
623
624       if (GroupDXDYDZ->CheckBox1->isChecked())
625         anObj = anOper->MakePrismDXDYDZ2Ways(myBaseObjects[i].get(), dx, dy, dz);
626       else {
627         if (GroupDXDYDZ->CheckBox2->isChecked())
628           anObj = anOper->MakePrismDXDYDZWithScaling(myBaseObjects[i].get(), dx, dy, dz,
629                                                      GroupDXDYDZ->SpinBox_SC->value());
630         else
631           anObj = anOper->MakePrismDXDYDZ(myBaseObjects[i].get(), dx, dy, dz);
632       }
633
634       if (!anObj->_is_nil() && !IsPreview()) {
635         aParameters << GroupDXDYDZ->SpinBox_DX->text();
636         aParameters << GroupDXDYDZ->SpinBox_DY->text();
637         aParameters << GroupDXDYDZ->SpinBox_DZ->text();
638         anObj->SetParameters(aParameters.join(":").toLatin1().constData());
639       }
640       break;
641     }
642
643     if (!anObj->_is_nil())
644       objects.push_back(anObj._retn());
645   }
646
647   return true;
648 }
649
650 //=================================================================================
651 // function : addSubshapeToStudy
652 // purpose  : virtual method to add new SubObjects if local selection
653 //=================================================================================
654 void GenerationGUI_PrismDlg::addSubshapesToStudy()
655 {
656   switch (getConstructorId()) {
657   case 0:
658     GEOMBase::PublishSubObject( myVec.get() );
659     break;
660   case 1:
661     GEOMBase::PublishSubObject( myPoint1.get() );
662     GEOMBase::PublishSubObject( myPoint2.get() );
663     break;
664   default:
665     break;
666   }
667 }
668
669 //=================================================================================
670 // function : extractPrefix
671 // purpose  : redefined from GEOMBase_Helper class
672 //=================================================================================
673 bool GenerationGUI_PrismDlg::extractPrefix() const
674 {
675   return myBaseObjects.count() > 1;
676 }