Salome HOME
d23c6dc33b273705088091ad374b5ac5fbc17601
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_ExtrusionDlg.cxx
1 // Copyright (C) 2007-2012  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
23 // SMESH SMESHGUI : GUI for SMESH component
24 // File   : SMESHGUI_ExtrusionDlg.cxx
25 // Author : Michael ZORIN, Open CASCADE S.A.S.
26 // SMESH includes
27 //
28 #include "SMESHGUI_ExtrusionDlg.h"
29
30 #include "SMESHGUI.h"
31 #include "SMESHGUI_Utils.h"
32 #include "SMESHGUI_VTKUtils.h"
33 #include "SMESHGUI_MeshUtils.h"
34 #include "SMESHGUI_SpinBox.h"
35 #include "SMESHGUI_IdValidator.h"
36 #include "SMESHGUI_FilterDlg.h"
37 #include "SMESHGUI_MeshEditPreview.h"
38
39 #include <SMESH_Actor.h>
40 #include <SMESH_TypeFilter.hxx>
41 #include <SMESH_LogicalFilter.hxx>
42
43 #include <SMDS_Mesh.hxx>
44
45 // SALOME GUI includes
46 #include <SUIT_ResourceMgr.h>
47 #include <SUIT_Desktop.h>
48 #include <SUIT_MessageBox.h>
49 #include <SUIT_Session.h>
50 #include <SUIT_OverrideCursor.h>
51
52 #include <LightApp_Application.h>
53 #include <LightApp_SelectionMgr.h>
54
55 #include <SVTK_ViewModel.h>
56 #include <SVTK_ViewWindow.h>
57
58 #include <SalomeApp_IntSpinBox.h>
59
60 // OCCT includes
61 #include <TColStd_MapOfInteger.hxx>
62 #include <TColStd_IndexedMapOfInteger.hxx>
63 #include <gp_XYZ.hxx>
64
65 // Qt includes
66 #include <QApplication>
67 #include <QButtonGroup>
68 #include <QGroupBox>
69 #include <QLabel>
70 #include <QLineEdit>
71 #include <QPushButton>
72 #include <QRadioButton>
73 #include <QCheckBox>
74 #include <QHBoxLayout>
75 #include <QVBoxLayout>
76 #include <QGridLayout>
77 #include <QKeyEvent>
78
79 // IDL includes
80 #include <SALOMEconfig.h>
81 #include CORBA_SERVER_HEADER(SMESH_Group)
82 #include CORBA_SERVER_HEADER(SMESH_MeshEditor)
83
84 #define SPACING 6
85 #define MARGIN  11
86
87 //=================================================================================
88 // function : SMESHGUI_ExtrusionDlg()
89 // purpose  : constructor
90 //=================================================================================
91 SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
92   : SMESHGUI_PreviewDlg( theModule ),
93     mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
94     myEditCurrentArgument(0),
95     myFilterDlg( 0 ),
96     mySelectedObject(SMESH::SMESH_IDSource::_nil())
97 {
98   QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_EDGE")));
99   QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_TRIANGLE")));
100   QPixmap image2 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
101   QPixmap image3 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_NODE")));
102
103   setModal( false );
104   setAttribute( Qt::WA_DeleteOnClose, true );
105   setWindowTitle(tr("EXTRUSION_ALONG_LINE"));
106   setSizeGripEnabled(true);
107
108   QVBoxLayout* SMESHGUI_ExtrusionDlgLayout = new QVBoxLayout(this);
109   SMESHGUI_ExtrusionDlgLayout->setSpacing(SPACING);
110   SMESHGUI_ExtrusionDlgLayout->setMargin(MARGIN);
111
112   /***************************************************************/
113   ConstructorsBox = new QGroupBox(tr("SMESH_EXTRUSION"), this);
114   GroupConstructors = new QButtonGroup(this);
115   QHBoxLayout* ConstructorsBoxLayout = new QHBoxLayout(ConstructorsBox);
116   ConstructorsBoxLayout->setSpacing(SPACING);
117   ConstructorsBoxLayout->setMargin(MARGIN);
118
119   RadioButton0= new QRadioButton(ConstructorsBox);
120   RadioButton0->setIcon(image3);
121   RadioButton1= new QRadioButton(ConstructorsBox);
122   RadioButton1->setIcon(image0);
123   RadioButton2= new QRadioButton(ConstructorsBox);
124   RadioButton2->setIcon(image1);
125
126   ConstructorsBoxLayout->addWidget(RadioButton0);
127   ConstructorsBoxLayout->addWidget(RadioButton1);
128   ConstructorsBoxLayout->addWidget(RadioButton2);
129
130   GroupConstructors->addButton(RadioButton0, 0);
131   GroupConstructors->addButton(RadioButton1, 1);
132   GroupConstructors->addButton(RadioButton2, 2);
133
134   /***************************************************************/
135   GroupButtons = new QGroupBox(this);
136   QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons);
137   GroupButtonsLayout->setSpacing(SPACING);
138   GroupButtonsLayout->setMargin(MARGIN);
139
140   buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons);
141   buttonOk->setAutoDefault(true);
142   buttonOk->setDefault(true);
143   buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
144   buttonApply->setAutoDefault(true);
145   buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
146   buttonCancel->setAutoDefault(true);
147   buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons);
148   buttonHelp->setAutoDefault(true);
149
150   GroupButtonsLayout->addWidget(buttonOk);
151   GroupButtonsLayout->addSpacing(10);
152   GroupButtonsLayout->addWidget(buttonApply);
153   GroupButtonsLayout->addSpacing(10);
154   GroupButtonsLayout->addStretch();
155   GroupButtonsLayout->addWidget(buttonCancel);
156   GroupButtonsLayout->addWidget(buttonHelp);
157
158   /***************************************************************/
159   GroupArguments = new QGroupBox(tr("EXTRUSION_0D"), this);
160   QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments);
161   GroupArgumentsLayout->setSpacing(SPACING);
162   GroupArgumentsLayout->setMargin(MARGIN);
163
164   myIdValidator = new SMESHGUI_IdValidator(this);
165
166   // Controls for elements selection
167   TextLabelElements = new QLabel(tr("SMESH_ID_ELEMENTS"), GroupArguments);
168
169   SelectElementsButton = new QPushButton(GroupArguments);
170   SelectElementsButton->setIcon(image2);
171
172   LineEditElements = new QLineEdit(GroupArguments);
173   LineEditElements->setValidator(myIdValidator);
174   LineEditElements->setMaxLength(-1);
175   myFilterBtn = new QPushButton( tr( "SMESH_BUT_FILTER" ), GroupArguments );
176   connect(myFilterBtn,   SIGNAL(clicked()), this, SLOT(setFilters()));
177
178   // Control for the whole mesh selection
179   CheckBoxMesh = new QCheckBox(tr("SMESH_SELECT_WHOLE_MESH"), GroupArguments);
180
181   RadioButton3 = new QRadioButton(GroupArguments);
182   RadioButton3->setText( tr("SMESH_EXTRUSION_TO_DISTANCE") );
183   RadioButton4 = new QRadioButton(GroupArguments);
184   RadioButton4->setText( tr("SMESH_EXTRUSION_ALONG_VECTOR") );
185
186   //Control for the Distance selection
187   TextLabelDistance = new QLabel(tr("SMESH_DISTANCE"), GroupArguments);
188   
189   TextLabelDx = new QLabel(tr("SMESH_X"), GroupArguments);
190   SpinBox_Dx = new SMESHGUI_SpinBox(GroupArguments);
191   
192   TextLabelDy = new QLabel(tr("SMESH_Y"), GroupArguments);
193   SpinBox_Dy = new SMESHGUI_SpinBox(GroupArguments);
194
195   TextLabelDz = new QLabel(tr("SMESH_Z"), GroupArguments);
196   SpinBox_Dz = new SMESHGUI_SpinBox(GroupArguments);
197
198   // Controls for vector selection
199
200   TextLabelVector = new QLabel(tr("SMESH_VECTOR"), GroupArguments);
201
202   SelectVectorButton = new QPushButton(GroupArguments);
203   SelectVectorButton->setIcon(image2);
204
205   TextLabelVx = new QLabel(tr("SMESH_DX"), GroupArguments);
206   SpinBox_Vx = new SMESHGUI_SpinBox(GroupArguments);
207
208   TextLabelVy = new QLabel(tr("SMESH_DY"), GroupArguments);
209   SpinBox_Vy = new SMESHGUI_SpinBox(GroupArguments);
210
211   TextLabelVz = new QLabel(tr("SMESH_DZ"), GroupArguments);
212   SpinBox_Vz = new SMESHGUI_SpinBox(GroupArguments);
213
214   TextLabelDist = new QLabel(tr("SMESH_DISTANCE"), GroupArguments);
215   SpinBox_VDist = new SMESHGUI_SpinBox(GroupArguments);
216
217   // Controls for nb. steps defining
218   TextLabelNbSteps = new QLabel(tr("SMESH_NUMBEROFSTEPS"), GroupArguments);
219   SpinBox_NbSteps = new SalomeApp_IntSpinBox(GroupArguments);
220
221   // CheckBox for groups generation
222   MakeGroupsCheck = new QCheckBox(tr("SMESH_MAKE_GROUPS"), GroupArguments);
223
224   //Preview check box
225   myPreviewCheckBox = new QCheckBox(tr("PREVIEW"), GroupArguments);
226
227   GroupArgumentsLayout->addWidget(TextLabelElements,    0, 0);
228   GroupArgumentsLayout->addWidget(SelectElementsButton, 0, 1);
229   GroupArgumentsLayout->addWidget(LineEditElements,     0, 2, 1, 5);
230   GroupArgumentsLayout->addWidget(myFilterBtn,          0, 7);
231   GroupArgumentsLayout->addWidget(CheckBoxMesh,         1, 0, 1, 8);
232   GroupArgumentsLayout->addWidget(RadioButton3,         2, 1, 1, 3);
233   GroupArgumentsLayout->addWidget(RadioButton4,         2, 5, 1, 3);
234   GroupArgumentsLayout->addWidget(TextLabelDistance,    3, 0);
235   GroupArgumentsLayout->addWidget(TextLabelDx,          3, 2);
236   GroupArgumentsLayout->addWidget(SpinBox_Dx,           3, 3);
237   GroupArgumentsLayout->addWidget(TextLabelDy,          3, 4);
238   GroupArgumentsLayout->addWidget(SpinBox_Dy,           3, 5);
239   GroupArgumentsLayout->addWidget(TextLabelDz,          3, 6);
240   GroupArgumentsLayout->addWidget(SpinBox_Dz,           3, 7);
241   GroupArgumentsLayout->addWidget(TextLabelVector,      4, 0);
242   GroupArgumentsLayout->addWidget(SelectVectorButton,   4, 1);
243   GroupArgumentsLayout->addWidget(TextLabelVx,          4, 2);
244   GroupArgumentsLayout->addWidget(SpinBox_Vx,           4, 3);
245   GroupArgumentsLayout->addWidget(TextLabelVy,          4, 4);
246   GroupArgumentsLayout->addWidget(SpinBox_Vy,           4, 5);
247   GroupArgumentsLayout->addWidget(TextLabelVz,          4, 6);
248   GroupArgumentsLayout->addWidget(SpinBox_Vz,           4, 7);
249   GroupArgumentsLayout->addWidget(TextLabelDist,        5, 0);
250   GroupArgumentsLayout->addWidget(SpinBox_VDist,         5, 3);
251   GroupArgumentsLayout->addWidget(TextLabelNbSteps,     6, 0, 1, 3);
252   GroupArgumentsLayout->addWidget(SpinBox_NbSteps,      6, 3);
253   GroupArgumentsLayout->addWidget(myPreviewCheckBox,    7, 0, 1, 8);
254   GroupArgumentsLayout->addWidget(MakeGroupsCheck,      8, 0, 1, 8);
255   GroupArgumentsLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), 8, 0);
256
257
258   /***************************************************************/
259   SMESHGUI_ExtrusionDlgLayout->addWidget(ConstructorsBox);
260   SMESHGUI_ExtrusionDlgLayout->addWidget(GroupArguments);
261   SMESHGUI_ExtrusionDlgLayout->addWidget(GroupButtons);
262
263   /* Initialisations */
264   SpinBox_Vx->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.01, "length_precision");
265   SpinBox_Vy->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.01, "length_precision");
266   SpinBox_Vz->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.01, "length_precision");
267
268   SpinBox_Dx->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
269   SpinBox_Dy->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
270   SpinBox_Dz->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
271   
272   SpinBox_NbSteps->setRange(1, 999999);
273   SpinBox_VDist->RangeStepAndValidator(0, COORD_MAX, 10.0, "length_precision");
274
275   RadioButton0->setChecked(true);
276   RadioButton3->setChecked(true);
277   MakeGroupsCheck->setChecked(true);
278
279   mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
280
281   mySMESHGUI->SetActiveDialogBox(this);
282
283   // Costruction of the logical filter for the elements: mesh/sub-mesh/group
284   QList<SUIT_SelectionFilter*> aListOfFilters;
285   aListOfFilters.append(new SMESH_TypeFilter (SMESH::MESH));
286   aListOfFilters.append(new SMESH_TypeFilter (SMESH::SUBMESH_VERTEX));
287   aListOfFilters.append(new SMESH_TypeFilter (SMESH::GROUP_NODE));
288   myMeshOrSubMeshOrGroupFilter0D =
289     new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
290   aListOfFilters[0] = new SMESH_TypeFilter (SMESH::MESH);
291   aListOfFilters[1] = new SMESH_TypeFilter (SMESH::SUBMESH_EDGE);
292   aListOfFilters[2] = new SMESH_TypeFilter (SMESH::GROUP_EDGE);
293   myMeshOrSubMeshOrGroupFilter1D =
294     new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
295   aListOfFilters[0] = new SMESH_TypeFilter (SMESH::MESH);
296   aListOfFilters[1] = new SMESH_TypeFilter (SMESH::SUBMESH_FACE);
297   aListOfFilters[2] = new SMESH_TypeFilter (SMESH::GROUP_FACE);
298   myMeshOrSubMeshOrGroupFilter2D =
299     new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
300
301   myHelpFileName = "extrusion_page.html";
302
303   Init();
304
305   /***************************************************************/
306   // signals and slots connections
307   connect(buttonOk,     SIGNAL(clicked()), this, SLOT(ClickOnOk()));
308   connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
309   connect(buttonApply,  SIGNAL(clicked()), this, SLOT(ClickOnApply()));
310   connect(buttonHelp,   SIGNAL(clicked()), this, SLOT(ClickOnHelp()));
311
312   connect(RadioButton3, SIGNAL(clicked()), this, SLOT(ClickOnRadio()));
313   connect(RadioButton4, SIGNAL(clicked()), this, SLOT(ClickOnRadio()));
314
315   // to update state of the Ok & Apply buttons
316   connect(SpinBox_Vx, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
317   connect(SpinBox_Vy, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
318   connect(SpinBox_Vz, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
319   connect(SpinBox_Dx, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
320   connect(SpinBox_Dy, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
321   connect(SpinBox_Dz, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
322
323   connect(GroupConstructors,    SIGNAL(buttonClicked(int)), SLOT(ConstructorsClicked(int)));
324   connect(SelectElementsButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
325   connect(SelectVectorButton,   SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
326   connect(mySMESHGUI,           SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
327   connect(mySelectionMgr,       SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
328   /* to close dialog if study change */
329   connect(mySMESHGUI,           SIGNAL(SignalCloseAllDialogs()),   this, SLOT(ClickOnCancel()));
330   connect(LineEditElements,     SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
331   connect(CheckBoxMesh,         SIGNAL(toggled(bool)),               SLOT(onSelectMesh(bool)));
332
333   connect(SpinBox_Dx,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
334   connect(SpinBox_Dy,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
335   connect(SpinBox_Dz,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
336   connect(SpinBox_Vx,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
337   connect(SpinBox_Vy,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
338   connect(SpinBox_Vz,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
339   connect(SpinBox_VDist,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
340   connect(SpinBox_NbSteps,  SIGNAL(valueChanged(int)), this, SLOT(toDisplaySimulation()));
341
342   //To Connect preview check box
343   connectPreviewControl();
344
345   /***************************************************************/
346   
347   ConstructorsClicked(0);
348   ClickOnRadio();
349   SelectionIntoArgument();
350 }
351
352 //=================================================================================
353 // function : ~SMESHGUI_ExtrusionDlg()
354 // purpose  : destructor
355 //=================================================================================
356 SMESHGUI_ExtrusionDlg::~SMESHGUI_ExtrusionDlg()
357 {
358   if ( myFilterDlg != 0 ) {
359     myFilterDlg->setParent( 0 );
360     delete myFilterDlg;
361   }
362   if ( myMeshOrSubMeshOrGroupFilter0D ) delete myMeshOrSubMeshOrGroupFilter0D;
363   if ( myMeshOrSubMeshOrGroupFilter1D ) delete myMeshOrSubMeshOrGroupFilter1D;
364   if ( myMeshOrSubMeshOrGroupFilter2D ) delete myMeshOrSubMeshOrGroupFilter2D;
365 }
366
367 //=================================================================================
368 // function : Init()
369 // purpose  : initialization
370 //=================================================================================
371 void SMESHGUI_ExtrusionDlg::Init (bool ResetControls)
372 {
373   myBusy = false;
374   myIDs.clear();
375
376   LineEditElements->clear();
377   myNbOkElements = 0;
378
379   myActor = 0;
380   myMesh = SMESH::SMESH_Mesh::_nil();
381
382   if (ResetControls) {
383     SpinBox_NbSteps->setValue(1);
384     SpinBox_VDist->setValue(10);
385     SpinBox_Dx->SetValue(0);
386     SpinBox_Dy->SetValue(0);
387     SpinBox_Dz->SetValue(0);
388     SpinBox_Vx->SetValue(0);
389     SpinBox_Vy->SetValue(0);
390     SpinBox_Vz->SetValue(0);
391
392     CheckBoxMesh->setChecked(false);
393     onSelectMesh(false);
394     myPreviewCheckBox->setChecked(false);
395     onDisplaySimulation(false);
396   }
397
398   CheckIsEnable();
399 }
400
401 //=================================================================================
402 // function : CheckIsEnable()
403 // purpose  : Check whether the Ok and Apply buttons should be enabled or not
404 //=================================================================================
405 void SMESHGUI_ExtrusionDlg::CheckIsEnable()
406 {  
407   bool anIsEnable = myNbOkElements > 0 && isValuesValid();
408
409   buttonOk->setEnabled(anIsEnable);
410   buttonApply->setEnabled(anIsEnable);
411 }
412
413 //=================================================================================
414 // function : isValuesValid()
415 // purpose  : Return true in case if values entered into dialog are valid
416 //=================================================================================
417 bool SMESHGUI_ExtrusionDlg::isValuesValid() {
418   double aX, aY, aZ, aModule = 0;
419   if ( RadioButton3->isChecked() ) {
420     aX = SpinBox_Dx->GetValue();
421     aY = SpinBox_Dy->GetValue();
422     aZ = SpinBox_Dz->GetValue();
423     aModule = sqrt(aX*aX + aY*aY + aZ*aZ);
424   } else   if ( RadioButton4->isChecked() ) {
425     aX = SpinBox_Vx->GetValue();
426     aY = SpinBox_Vy->GetValue();
427     aZ = SpinBox_Vz->GetValue();
428     aModule = sqrt(aX*aX + aY*aY + aZ*aZ);
429   }
430   return aModule > 1.0E-38;
431 }
432
433 //=================================================================================
434 // function : ConstructorsClicked()
435 // purpose  : Radio button management
436 //=================================================================================
437 void SMESHGUI_ExtrusionDlg::ConstructorsClicked (int constructorId)
438 {
439   disconnect(mySelectionMgr, 0, this, 0);
440
441   hidePreview();
442
443   TextLabelElements->setText(tr( constructorId ? "SMESH_ID_ELEMENTS" : "SMESH_ID_NODES"));
444
445   switch (constructorId) {
446   case 0:
447     {
448       GroupArguments->setTitle(tr("EXTRUSION_0D"));
449       if (!CheckBoxMesh->isChecked())
450       {
451         LineEditElements->clear();
452         myIDs.clear();
453         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
454           aViewWindow->SetSelectionMode(NodeSelection);
455       }
456       break;
457     }
458   case 1:
459     {
460       GroupArguments->setTitle(tr("EXTRUSION_1D"));
461       if (!CheckBoxMesh->isChecked())
462       {
463         LineEditElements->clear();
464         myIDs.clear();
465         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
466           aViewWindow->SetSelectionMode(EdgeSelection);
467       }
468       break;
469     }
470   case 2:
471     {
472       GroupArguments->setTitle(tr("EXTRUSION_2D"));
473       if (!CheckBoxMesh->isChecked())
474       {
475         LineEditElements->clear();
476         myIDs.clear();
477         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
478           aViewWindow->SetSelectionMode(FaceSelection);
479       }
480       break;
481     }
482   }
483
484   myEditCurrentArgument = (QWidget*)LineEditElements;
485   LineEditElements->setFocus();
486
487   if (CheckBoxMesh->isChecked())
488     onSelectMesh(true);
489
490   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
491 }
492
493 //=================================================================================
494 // function : ConstructorsClicked()
495 // purpose  : Radio button management
496 //=================================================================================
497 void SMESHGUI_ExtrusionDlg::ClickOnRadio()
498 {
499   if ( RadioButton3->isChecked() ) {
500     TextLabelDistance->show();
501     TextLabelDx->show();
502     SpinBox_Dx->show();
503     TextLabelDy->show();
504     SpinBox_Dy->show();
505     TextLabelDz->show();
506     SpinBox_Dz->show();
507
508     TextLabelVector->hide();
509     TextLabelVx->hide();
510     SpinBox_Vx->hide();
511     TextLabelVy->hide();
512     SpinBox_Vy->hide();
513     TextLabelVz->hide();
514     SpinBox_Vz->hide();
515     TextLabelDist->hide();
516     SpinBox_VDist->hide();
517     SelectVectorButton->hide();
518   } else if ( RadioButton4->isChecked() ) {
519     TextLabelDistance->hide();
520     TextLabelDx->hide();
521     SpinBox_Dx->hide();
522     TextLabelDy->hide();
523     SpinBox_Dy->hide();
524     TextLabelDz->hide();
525     SpinBox_Dz->hide();
526
527     TextLabelVector->show();
528     TextLabelVx->show();
529     SpinBox_Vx->show();
530     TextLabelVy->show();
531     SpinBox_Vy->show();
532     TextLabelVz->show();
533     SpinBox_Vz->show();
534     TextLabelDist->show();
535     SpinBox_VDist->show();
536     SelectVectorButton->show();
537   }
538   onDisplaySimulation(true);
539   // AdjustSize
540   qApp->processEvents();
541   updateGeometry();
542   resize( minimumSizeHint() );
543 }
544
545 //=================================================================================
546 // function : ClickOnApply()
547 // purpose  : Called when user presses <Apply> button
548 //=================================================================================
549 bool SMESHGUI_ExtrusionDlg::ClickOnApply()
550 {
551   if (mySMESHGUI->isActiveStudyLocked())
552     return false;
553
554   if (!isValid())
555     return false;
556
557   if (myNbOkElements) {
558
559     SMESH::DirStruct aVector;
560     getExtrusionVector(aVector);
561     
562     QStringList aParameters;
563     if ( RadioButton3->isChecked() ) {
564       aParameters << SpinBox_Dx->text();
565       aParameters << SpinBox_Dy->text();
566       aParameters << SpinBox_Dz->text();
567     } else if ( RadioButton4->isChecked() ) {
568       // only 3 coords in a python dump command :(
569       // aParameters << SpinBox_Vx->text();
570       // aParameters << SpinBox_Vy->text();
571       // aParameters << SpinBox_Vz->text();
572       // aParameters << SpinBox_VDist->text();
573     }
574
575     long aNbSteps = (long)SpinBox_NbSteps->value();
576
577     aParameters << SpinBox_NbSteps->text();
578
579     try {
580       SUIT_OverrideCursor aWaitCursor;
581       SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
582
583       myMesh->SetParameters( aParameters.join(":").toLatin1().constData() );
584
585       if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) {
586         if( CheckBoxMesh->isChecked() ) 
587           switch (GetConstructorId() ) {
588             case 0:
589               {
590                 SMESH::ListOfGroups_var groups = 
591                   aMeshEditor->ExtrusionSweepObject0DMakeGroups(mySelectedObject, aVector, aNbSteps);
592                 break;
593               }
594             case 1:
595               {
596                 SMESH::ListOfGroups_var groups = 
597                   aMeshEditor->ExtrusionSweepObject1DMakeGroups(mySelectedObject, aVector, aNbSteps);
598                 break;
599               }
600             case 2:
601               {
602                 SMESH::ListOfGroups_var groups = 
603                   aMeshEditor->ExtrusionSweepObject2DMakeGroups(mySelectedObject, aVector, aNbSteps);
604                 break;
605               }
606           }
607         else
608         {
609           SMESH::ListOfGroups_var groups;
610           if (GetConstructorId() == 0)
611             groups = aMeshEditor->ExtrusionSweepMakeGroups0D(myElementsId.inout(), aVector, aNbSteps);
612           else
613             groups = aMeshEditor->ExtrusionSweepMakeGroups(myElementsId.inout(), aVector, aNbSteps);
614         }
615
616       }
617       else {
618         if( CheckBoxMesh->isChecked() ) 
619           switch( GetConstructorId() ) {
620             case 0:
621               {
622               aMeshEditor->ExtrusionSweepObject0D(mySelectedObject, aVector, aNbSteps);
623                 break;
624               }
625             case 1:
626               {
627               aMeshEditor->ExtrusionSweepObject1D(mySelectedObject, aVector, aNbSteps);
628                 break;
629               }
630             case 2:
631               {
632               aMeshEditor->ExtrusionSweepObject2D(mySelectedObject, aVector, aNbSteps);
633                 break;
634           }
635         }
636         else
637           if (GetConstructorId() == 0)
638             aMeshEditor->ExtrusionSweep0D(myElementsId.inout(), aVector, aNbSteps);
639           else
640             aMeshEditor->ExtrusionSweep(myElementsId.inout(), aVector, aNbSteps);
641       }
642
643     } catch (...) {
644     }
645
646     SMESH::Update(myIO, SMESH::eDisplay);
647     if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() )
648       mySMESHGUI->updateObjBrowser(true); // new groups may appear
649     Init(false);
650     ConstructorsClicked(GetConstructorId());
651     mySelectionMgr->clearSelected();
652     mySelectedObject = SMESH::SMESH_IDSource::_nil();
653     SelectionIntoArgument();
654
655     SMESHGUI::Modified();
656   }
657   return true;
658 }
659
660 //=================================================================================
661 // function : ClickOnOk()
662 // purpose  : Called when user presses <OK> button
663 //=================================================================================
664 void SMESHGUI_ExtrusionDlg::ClickOnOk()
665 {
666   if (ClickOnApply())
667     ClickOnCancel();
668 }
669
670 //=================================================================================
671 // function : ClickOnCancel()
672 // purpose  : Called when dialog box is closed
673 //=================================================================================
674 void SMESHGUI_ExtrusionDlg::ClickOnCancel()
675 {
676   reject();
677 }
678
679 //=================================================================================
680 // function : ClickOnHelp()
681 // purpose  :
682 //=================================================================================
683 void SMESHGUI_ExtrusionDlg::ClickOnHelp()
684 {
685   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
686   if (app) 
687     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
688   else {
689     QString platform;
690 #ifdef WIN32
691     platform = "winapplication";
692 #else
693     platform = "application";
694 #endif
695     SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
696                              tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
697                              arg(app->resourceMgr()->stringValue("ExternalBrowser", 
698                                                                  platform)).
699                              arg(myHelpFileName));
700   }
701 }
702
703 //=================================================================================
704 // function : onTextChange()
705 // purpose  :
706 //=================================================================================
707 void SMESHGUI_ExtrusionDlg::onTextChange (const QString& theNewText)
708 {
709   QLineEdit* send = (QLineEdit*)sender();
710
711   // return if busy
712   if (myBusy) return;
713
714   // set busy flag
715   myBusy = true;
716
717   if (send == LineEditElements)
718     myNbOkElements = 0;
719
720   // hilight entered elements/nodes
721
722   if (!myIO.IsNull()) {
723     QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts);
724
725     if (send == LineEditElements)
726     {
727       SMDS_Mesh* aMesh = myActor ? myActor->GetObject()->GetMesh() : 0;
728       SMESH::ElementType SMESHType;
729       SMDSAbs_ElementType SMDSType;
730       switch (GetConstructorId()) {
731       case 0:
732         {
733           SMESHType = SMESH::NODE;
734           SMDSType = SMDSAbs_Node;
735           break;
736         }
737       case 1:
738         {
739           SMESHType = SMESH::EDGE;
740           SMDSType = SMDSAbs_Edge;
741           break;                  
742         }
743       case 2:
744         {
745           SMESHType = SMESH::FACE;
746           SMDSType = SMDSAbs_Face;
747           break;
748         }
749       }
750       myElementsId = new SMESH::long_array;
751       myElementsId->length( aListId.count() );
752       TColStd_MapOfInteger newIndices;
753       for (int i = 0; i < aListId.count(); i++) {
754         int id = aListId[ i ].toInt();
755         bool validId = false;
756         if ( id > 0 ) {
757           if ( aMesh ) {
758             const SMDS_MeshElement * e;
759             if (SMDSType == SMDSAbs_Node)
760               e = aMesh->FindNode( id ); 
761             else
762               e = aMesh->FindElement( id );
763             validId = ( e && e->GetType() == SMDSType );
764           } else {
765             validId = ( myMesh->GetElementType( id, true ) == SMESHType );
766           }
767         }
768         if ( validId && newIndices.Add( id ))
769           myElementsId[ newIndices.Extent()-1 ] = id;
770       }
771       myElementsId->length( myNbOkElements = newIndices.Extent() );
772       mySelector->AddOrRemoveIndex(myIO, newIndices, false);
773       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
774         aViewWindow->highlight( myIO, true, true );
775     }
776   }
777
778   CheckIsEnable();
779
780   onDisplaySimulation(true);
781
782   myBusy = false;
783 }
784
785 //=================================================================================
786 // function : SelectionIntoArgument()
787 // purpose  : Called when selection as changed or other case
788 //=================================================================================
789 void SMESHGUI_ExtrusionDlg::SelectionIntoArgument()
790 {
791   if (myBusy) return;
792
793   // return if dialog box is inactive
794   if (!GroupButtons->isEnabled())
795     return;
796
797   // clear
798   if(myEditCurrentArgument != (QWidget*)SpinBox_Vx) {
799     myActor = 0;
800     Handle(SALOME_InteractiveObject) resIO = myIO;
801     myIO.Nullify();
802   }
803
804   QString aString = "";
805   // set busy flag
806   if(myEditCurrentArgument == (QWidget*)LineEditElements) {
807     myBusy = true;
808     LineEditElements->setText(aString);
809     myNbOkElements = 0;
810     myBusy = false;
811   }
812   // get selected mesh
813   SALOME_ListIO aList;
814   mySelectionMgr->selectedObjects(aList, SVTK_Viewer::Type());
815   int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
816   if (nbSel != 1)
817     return;
818
819   Handle(SALOME_InteractiveObject) IO = aList.First();
820
821   if(myEditCurrentArgument != (QWidget*)SpinBox_Vx) {
822     myMesh = SMESH::GetMeshByIO(IO);
823     if (myMesh->_is_nil())
824       return;
825     myIO = IO;
826     myActor = SMESH::FindActorByObject(myMesh);
827   }
828
829   if (myEditCurrentArgument == (QWidget*)LineEditElements) {    
830     int aNbElements = 0;
831
832     // MakeGroups is available if there are groups
833     if ( myMesh->NbGroups() == 0 ) {
834       MakeGroupsCheck->setChecked(false);
835       MakeGroupsCheck->setEnabled(false);
836     } else {
837       MakeGroupsCheck->setEnabled(true);
838     }
839
840     if (CheckBoxMesh->isChecked()) {
841       SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
842
843       if (!SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO)->_is_nil())
844         mySelectedObject = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO);
845       else
846         return;
847     } else {
848       // get indices of selcted elements
849       TColStd_IndexedMapOfInteger aMapIndex;
850       mySelector->GetIndex(IO,aMapIndex);
851       aNbElements = aMapIndex.Extent();
852
853       if (aNbElements < 1)
854         return;
855
856       myElementsId = new SMESH::long_array;
857       myElementsId->length( aNbElements );
858       aString = "";
859       for ( int i = 0; i < aNbElements; ++i )
860         aString += QString(" %1").arg( myElementsId[ i ] = aMapIndex( i+1 ) );
861     }
862
863     myNbOkElements = true;
864
865     myBusy = true;
866     ((QLineEdit*)myEditCurrentArgument)->setText(aString);
867     myBusy = false;
868   }
869   else if(myEditCurrentArgument == (QWidget*)SpinBox_Vx){
870     TColStd_IndexedMapOfInteger aMapIndex;
871     mySelector->GetIndex(IO,aMapIndex);
872     int aNbElements = aMapIndex.Extent();
873     SMESH::SMESH_Mesh_var aMesh_var = SMESH::GetMeshByIO(IO);
874     SMESH_Actor* anActor = SMESH::FindActorByObject(aMesh_var);
875     SMDS_Mesh* aMesh =  anActor ? anActor->GetObject()->GetMesh() : 0;
876
877     if(aNbElements != 1 || !aMesh)
878       return;
879     
880     const SMDS_MeshFace* face = dynamic_cast<const SMDS_MeshFace*>(aMesh->FindElement(aMapIndex(aNbElements)));
881
882     if (!face)
883       return;
884
885     gp_XYZ aNormale = SMESH::getNormale(face);
886     SpinBox_Vx->SetValue(aNormale.X());
887     SpinBox_Vy->SetValue(aNormale.Y());
888     SpinBox_Vz->SetValue(aNormale.Z());
889     
890   }
891   
892   onDisplaySimulation(true);
893   
894   // OK
895   CheckIsEnable();
896 }
897
898 //=================================================================================
899 // function : SetEditCurrentArgument()
900 // purpose  :
901 //=================================================================================
902 void SMESHGUI_ExtrusionDlg::SetEditCurrentArgument()
903 {
904   QPushButton* send = (QPushButton*)sender();
905
906   disconnect(mySelectionMgr, 0, this, 0);
907   mySelectionMgr->clearSelected();
908   mySelectionMgr->clearFilters();
909
910   if (send == SelectElementsButton) {
911     myEditCurrentArgument = (QWidget*)LineEditElements;
912     if (CheckBoxMesh->isChecked())
913     {
914       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
915         aViewWindow->SetSelectionMode(ActorSelection);
916       switch( GetConstructorId() ) {
917       case 0: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter0D); break;
918       case 1: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter1D); break;
919       case 2: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter2D); break;
920       }
921     }
922     else
923     {
924       int aConstructorId = GetConstructorId();
925       switch(aConstructorId) {
926       case 0:
927         {
928           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
929             aViewWindow->SetSelectionMode(NodeSelection);
930           break;
931         }
932       case 1:
933         {
934           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
935             aViewWindow->SetSelectionMode(EdgeSelection);
936           break;
937         }
938       case 2:
939         {
940           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
941             aViewWindow->SetSelectionMode(FaceSelection);
942           break;
943         }
944       }
945     }
946   }
947   else if (send == SelectVectorButton){
948     myEditCurrentArgument = (QWidget*)SpinBox_Vx;
949     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
950       aViewWindow->SetSelectionMode(FaceSelection);
951   }
952   
953   myEditCurrentArgument->setFocus();
954   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
955   SelectionIntoArgument();
956 }
957
958 //=================================================================================
959 // function : DeactivateActiveDialog()
960 // purpose  : Deactivates this dialog
961 //=================================================================================
962 void SMESHGUI_ExtrusionDlg::DeactivateActiveDialog()
963 {
964   if (ConstructorsBox->isEnabled()) {
965     ConstructorsBox->setEnabled(false);
966     GroupArguments->setEnabled(false);
967     GroupButtons->setEnabled(false);
968     mySMESHGUI->ResetState();
969     mySMESHGUI->SetActiveDialogBox(0);
970   }
971 }
972
973 //=================================================================================
974 // function : ActivateThisDialog()
975 // purpose  : Activates this dialog
976 //=================================================================================
977 void SMESHGUI_ExtrusionDlg::ActivateThisDialog()
978 {
979   // Emit a signal to deactivate the active dialog
980   mySMESHGUI->EmitSignalDeactivateDialog();
981   ConstructorsBox->setEnabled(true);
982   GroupArguments->setEnabled(true);
983   GroupButtons->setEnabled(true);
984
985   mySMESHGUI->SetActiveDialogBox(this);
986
987   ConstructorsClicked(GetConstructorId());
988   SelectionIntoArgument();
989 }
990
991 //=================================================================================
992 // function : enterEvent()
993 // purpose  : Mouse enter event
994 //=================================================================================
995 void SMESHGUI_ExtrusionDlg::enterEvent (QEvent*)
996 {
997   if (!ConstructorsBox->isEnabled())
998     ActivateThisDialog();
999 }
1000
1001 //=================================================================================
1002 // function : closeEvent()
1003 // purpose  :
1004 //=================================================================================
1005 void SMESHGUI_ExtrusionDlg::closeEvent( QCloseEvent* )
1006 {
1007   /* same than click on cancel button */
1008   disconnect(mySelectionMgr, 0, this, 0);
1009   mySelectionMgr->clearFilters();
1010   //mySelectionMgr->clearSelected();
1011   if (SMESH::GetCurrentVtkView()) {
1012     SMESH::RemoveFilters(); // PAL6938 -- clean all mesh entity filters
1013     SMESH::SetPointRepresentation(false);
1014     SMESH::SetPickable();
1015   }
1016   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1017     aViewWindow->SetSelectionMode(ActorSelection);
1018   mySMESHGUI->ResetState();
1019 }
1020
1021 void SMESHGUI_ExtrusionDlg::reject()
1022 {
1023   QDialog::reject();
1024   close();
1025 }
1026
1027 //=================================================================================
1028 // function : onSelectMesh()
1029 // purpose  :
1030 //=================================================================================
1031 void SMESHGUI_ExtrusionDlg::onSelectMesh (bool toSelectMesh)
1032 {
1033   if (toSelectMesh) {
1034     myIDs = LineEditElements->text();
1035     TextLabelElements->setText(tr("SMESH_NAME"));
1036   }
1037   else
1038     TextLabelElements->setText(tr("SMESH_ID_ELEMENTS"));
1039
1040   myFilterBtn->setEnabled(!toSelectMesh);
1041
1042   if (myEditCurrentArgument != LineEditElements) {
1043     LineEditElements->clear();
1044     return;
1045   }
1046
1047   mySelectionMgr->clearFilters();
1048
1049   if (toSelectMesh)
1050   {
1051     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1052       aViewWindow->SetSelectionMode(ActorSelection);
1053     switch( GetConstructorId() ) {
1054     case 0: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter0D); break;
1055     case 1: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter1D); break;
1056     case 2: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter2D); break;
1057     }
1058     LineEditElements->setReadOnly(true);
1059     LineEditElements->setValidator(0);
1060   }
1061   else
1062   {
1063     int aConstructorId = GetConstructorId();
1064     switch(aConstructorId) {
1065       case 0:
1066         {
1067           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1068             aViewWindow->SetSelectionMode(NodeSelection);
1069           break;
1070         }
1071       case 1:
1072         {
1073           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1074             aViewWindow->SetSelectionMode(EdgeSelection);
1075           break;
1076         }
1077       case 2:
1078         {
1079           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1080             aViewWindow->SetSelectionMode(FaceSelection);
1081           break;
1082         }
1083     }
1084     LineEditElements->setReadOnly(false);
1085     LineEditElements->setValidator(myIdValidator);
1086     onTextChange(LineEditElements->text());
1087   }
1088
1089   SelectionIntoArgument();
1090
1091   if (!toSelectMesh)
1092     LineEditElements->setText( myIDs );
1093 }
1094
1095 //=================================================================================
1096 // function : GetConstructorId()
1097 // purpose  :
1098 //=================================================================================
1099 int SMESHGUI_ExtrusionDlg::GetConstructorId()
1100 {
1101   return GroupConstructors->checkedId();
1102 }
1103
1104 //=================================================================================
1105 // function : keyPressEvent()
1106 // purpose  :
1107 //=================================================================================
1108 void SMESHGUI_ExtrusionDlg::keyPressEvent( QKeyEvent* e )
1109 {
1110   QDialog::keyPressEvent( e );
1111   if ( e->isAccepted() )
1112     return;
1113
1114   if ( e->key() == Qt::Key_F1 ) {
1115     e->accept();
1116     ClickOnHelp();
1117   }
1118 }
1119
1120 //=================================================================================
1121 // function : setFilters()
1122 // purpose  : SLOT. Called when "Filter" button pressed.
1123 //=================================================================================
1124 void SMESHGUI_ExtrusionDlg::setFilters()
1125 {
1126   if(myMesh->_is_nil()) {
1127     SUIT_MessageBox::critical(this,
1128                               tr("SMESH_ERROR"),
1129                               tr("NO_MESH_SELECTED"));
1130    return;
1131   }
1132   if ( !myFilterDlg )
1133   {
1134     QList<int> types;  
1135     types.append( SMESH::NODE );
1136     types.append( SMESH::EDGE );
1137     types.append( SMESH::FACE );
1138     myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, types );
1139   }
1140   switch( GetConstructorId() ){
1141     case 0: 
1142       {
1143       myFilterDlg->Init( SMESH::NODE );
1144         break;
1145       }
1146     case 1:
1147       {
1148       myFilterDlg->Init( SMESH::EDGE );
1149         break;
1150       }
1151     case 2:
1152       {
1153       myFilterDlg->Init( SMESH::FACE );
1154         break;
1155       }
1156   }
1157   
1158
1159   myFilterDlg->SetSelection();
1160   myFilterDlg->SetMesh( myMesh );
1161   myFilterDlg->SetSourceWg( LineEditElements );
1162
1163   myFilterDlg->show();
1164 }
1165
1166 //=================================================================================
1167 // function : isValid
1168 // purpose  :
1169 //=================================================================================
1170 bool SMESHGUI_ExtrusionDlg::isValid()
1171 {
1172   QString msg;
1173   bool ok = true;
1174   if ( RadioButton3->isChecked() ) {
1175     ok = SpinBox_Dx->isValid( msg, true ) && ok;
1176     ok = SpinBox_Dy->isValid( msg, true ) && ok;
1177     ok = SpinBox_Dz->isValid( msg, true ) && ok;
1178   } else if ( RadioButton4->isChecked() ) {
1179     ok = SpinBox_Vx->isValid( msg, true ) && ok;
1180     ok = SpinBox_Vy->isValid( msg, true ) && ok;
1181     ok = SpinBox_Vz->isValid( msg, true ) && ok;
1182     ok = SpinBox_VDist->isValid( msg, true ) && ok;
1183   }
1184   ok = SpinBox_NbSteps->isValid( msg, true ) && ok;
1185
1186   if( !ok ) {
1187     QString str( tr( "SMESH_INCORRECT_INPUT" ) );
1188     if ( !msg.isEmpty() )
1189       str += "\n" + msg;
1190     SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
1191     return false;
1192   }
1193   return true;
1194 }
1195
1196 //=================================================================================
1197 // function : onDisplaySimulation
1198 // purpose  : Show/Hide preview
1199 //=================================================================================
1200 void SMESHGUI_ExtrusionDlg::onDisplaySimulation( bool toDisplayPreview ) {
1201   if (myPreviewCheckBox->isChecked() && toDisplayPreview) {
1202     if (myNbOkElements && isValid() && isValuesValid()) {
1203       //Get input vector
1204       SMESH::DirStruct aVector;
1205       getExtrusionVector(aVector);
1206
1207       //Get Number of the steps 
1208       long aNbSteps = (long)SpinBox_NbSteps->value();
1209       
1210       try {
1211         SUIT_OverrideCursor aWaitCursor;
1212         SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditPreviewer();
1213         if( CheckBoxMesh->isChecked() ) {
1214           switch (GetConstructorId()) {
1215             case 0:
1216               {
1217                 aMeshEditor->ExtrusionSweepObject0D(mySelectedObject, aVector, aNbSteps);
1218                                         break;
1219               }
1220             case 1:
1221               {
1222                 aMeshEditor->ExtrusionSweepObject1D(mySelectedObject, aVector, aNbSteps);
1223                                         break;
1224               }
1225             case 2:
1226               {
1227                 aMeshEditor->ExtrusionSweepObject2D(mySelectedObject, aVector, aNbSteps);
1228                                         break;
1229               }
1230           }
1231         }
1232         else
1233           if(GetConstructorId() == 0)
1234             aMeshEditor->ExtrusionSweep0D(myElementsId.inout(), aVector, aNbSteps);
1235           else
1236             aMeshEditor->ExtrusionSweep(myElementsId.inout(), aVector, aNbSteps);
1237         
1238         SMESH::MeshPreviewStruct_var aMeshPreviewStruct = aMeshEditor->GetPreviewData();
1239         mySimulation->SetData(aMeshPreviewStruct._retn());
1240       } catch (...) {
1241         hidePreview();
1242       }
1243     } else {
1244       hidePreview();
1245     }
1246   } else {
1247     hidePreview();
1248   }
1249 }
1250
1251 //=================================================================================
1252 // function : getExtrusionVector()
1253 // purpose  : get direction of the extrusion
1254 //=================================================================================
1255 void SMESHGUI_ExtrusionDlg::getExtrusionVector(SMESH::DirStruct& aVector) {
1256   if ( RadioButton3->isChecked() ) {
1257     aVector.PS.x = SpinBox_Dx->GetValue();
1258     aVector.PS.y = SpinBox_Dy->GetValue();
1259     aVector.PS.z = SpinBox_Dz->GetValue();      
1260   } else if ( RadioButton4->isChecked() ) {
1261     gp_XYZ aNormale(SpinBox_Vx->GetValue(),
1262                     SpinBox_Vy->GetValue(),
1263                     SpinBox_Vz->GetValue());
1264     
1265     
1266     aNormale /= aNormale.Modulus();
1267     double aVDist = (double)SpinBox_VDist->value();
1268     
1269     aVector.PS.x = aNormale.X()*aVDist;
1270     aVector.PS.y = aNormale.Y()*aVDist;
1271     aVector.PS.z = aNormale.Z()*aVDist;
1272   }
1273 }