Salome HOME
672c679758514f80fd9dd77a137dd4e207c9f569
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_ExtrusionDlg.cxx
1 // Copyright (C) 2007-2014  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, or (at your option) any later version.
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(reject()));
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(reject()));
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     reject();
668 }
669
670 //=================================================================================
671 // function : reject()
672 // purpose  : Called when dialog box is closed
673 //=================================================================================
674 void SMESHGUI_ExtrusionDlg::reject()
675 {
676   disconnect(mySelectionMgr, 0, this, 0);
677   mySelectionMgr->clearFilters();
678   //mySelectionMgr->clearSelected();
679   if (SMESH::GetCurrentVtkView()) {
680     SMESH::RemoveFilters(); // PAL6938 -- clean all mesh entity filters
681     SMESH::SetPointRepresentation(false);
682     SMESH::SetPickable();
683   }
684   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
685     aViewWindow->SetSelectionMode(ActorSelection);
686   mySMESHGUI->ResetState();
687
688   QDialog::reject();
689 }
690
691 //=================================================================================
692 // function : ClickOnHelp()
693 // purpose  :
694 //=================================================================================
695 void SMESHGUI_ExtrusionDlg::ClickOnHelp()
696 {
697   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
698   if (app) 
699     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
700   else {
701     QString platform;
702 #ifdef WIN32
703     platform = "winapplication";
704 #else
705     platform = "application";
706 #endif
707     SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
708                              tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
709                              arg(app->resourceMgr()->stringValue("ExternalBrowser", 
710                                                                  platform)).
711                              arg(myHelpFileName));
712   }
713 }
714
715 //=================================================================================
716 // function : onTextChange()
717 // purpose  :
718 //=================================================================================
719 void SMESHGUI_ExtrusionDlg::onTextChange (const QString& theNewText)
720 {
721   QLineEdit* send = (QLineEdit*)sender();
722
723   // return if busy
724   if (myBusy) return;
725
726   // set busy flag
727   myBusy = true;
728
729   if (send == LineEditElements)
730     myNbOkElements = 0;
731
732   // hilight entered elements/nodes
733
734   if (!myIO.IsNull()) {
735     QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts);
736
737     if (send == LineEditElements)
738     {
739       SMDS_Mesh* aMesh = myActor ? myActor->GetObject()->GetMesh() : 0;
740       SMESH::ElementType SMESHType;
741       SMDSAbs_ElementType SMDSType;
742       switch (GetConstructorId()) {
743       case 0:
744         {
745           SMESHType = SMESH::NODE;
746           SMDSType = SMDSAbs_Node;
747           break;
748         }
749       case 1:
750         {
751           SMESHType = SMESH::EDGE;
752           SMDSType = SMDSAbs_Edge;
753           break;                  
754         }
755       case 2:
756         {
757           SMESHType = SMESH::FACE;
758           SMDSType = SMDSAbs_Face;
759           break;
760         }
761       }
762       myElementsId = new SMESH::long_array;
763       myElementsId->length( aListId.count() );
764       TColStd_MapOfInteger newIndices;
765       for (int i = 0; i < aListId.count(); i++) {
766         int id = aListId[ i ].toInt();
767         bool validId = false;
768         if ( id > 0 ) {
769           if ( aMesh ) {
770             const SMDS_MeshElement * e;
771             if (SMDSType == SMDSAbs_Node)
772               e = aMesh->FindNode( id ); 
773             else
774               e = aMesh->FindElement( id );
775             validId = ( e && e->GetType() == SMDSType );
776           } else {
777             validId = ( myMesh->GetElementType( id, true ) == SMESHType );
778           }
779         }
780         if ( validId && newIndices.Add( id ))
781           myElementsId[ newIndices.Extent()-1 ] = id;
782       }
783       myElementsId->length( myNbOkElements = newIndices.Extent() );
784       mySelector->AddOrRemoveIndex(myIO, newIndices, false);
785       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
786         aViewWindow->highlight( myIO, true, true );
787     }
788   }
789
790   CheckIsEnable();
791
792   onDisplaySimulation(true);
793
794   myBusy = false;
795 }
796
797 //=================================================================================
798 // function : SelectionIntoArgument()
799 // purpose  : Called when selection as changed or other case
800 //=================================================================================
801 void SMESHGUI_ExtrusionDlg::SelectionIntoArgument()
802 {
803   if (myBusy) return;
804
805   // return if dialog box is inactive
806   if (!GroupButtons->isEnabled())
807     return;
808
809   // clear
810   if(myEditCurrentArgument != (QWidget*)SpinBox_Vx) {
811     myActor = 0;
812     Handle(SALOME_InteractiveObject) resIO = myIO;
813     myIO.Nullify();
814   }
815
816   QString aString = "";
817   // set busy flag
818   if(myEditCurrentArgument == (QWidget*)LineEditElements) {
819     myBusy = true;
820     LineEditElements->setText(aString);
821     myNbOkElements = 0;
822     myBusy = false;
823   }
824   // get selected mesh
825   SALOME_ListIO aList;
826   mySelectionMgr->selectedObjects(aList);
827   int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
828   if (nbSel != 1)
829     return;
830
831   Handle(SALOME_InteractiveObject) IO = aList.First();
832
833   if(myEditCurrentArgument != (QWidget*)SpinBox_Vx) {
834     myMesh = SMESH::GetMeshByIO(IO);
835     if (myMesh->_is_nil())
836       return;
837     myIO = IO;
838     myActor = SMESH::FindActorByObject(myMesh);
839   }
840
841   if (myEditCurrentArgument == (QWidget*)LineEditElements) {    
842     int aNbElements = 0;
843
844     // MakeGroups is available if there are groups
845     if ( myMesh->NbGroups() == 0 ) {
846       MakeGroupsCheck->setChecked(false);
847       MakeGroupsCheck->setEnabled(false);
848     } else {
849       MakeGroupsCheck->setEnabled(true);
850     }
851
852     if (CheckBoxMesh->isChecked()) {
853       SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
854
855       if (!SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO)->_is_nil())
856         mySelectedObject = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO);
857       else
858         return;
859     } else {
860       // get indices of selcted elements
861       TColStd_IndexedMapOfInteger aMapIndex;
862       mySelector->GetIndex(IO,aMapIndex);
863       aNbElements = aMapIndex.Extent();
864
865       if (aNbElements < 1)
866         return;
867
868       myElementsId = new SMESH::long_array;
869       myElementsId->length( aNbElements );
870       aString = "";
871       for ( int i = 0; i < aNbElements; ++i )
872         aString += QString(" %1").arg( myElementsId[ i ] = aMapIndex( i+1 ) );
873     }
874
875     myNbOkElements = true;
876
877     myBusy = true;
878     ((QLineEdit*)myEditCurrentArgument)->setText(aString);
879     myBusy = false;
880   }
881   else if(myEditCurrentArgument == (QWidget*)SpinBox_Vx){
882     TColStd_IndexedMapOfInteger aMapIndex;
883     mySelector->GetIndex(IO,aMapIndex);
884     int aNbElements = aMapIndex.Extent();
885     SMESH::SMESH_Mesh_var aMesh_var = SMESH::GetMeshByIO(IO);
886     SMESH_Actor* anActor = SMESH::FindActorByObject(aMesh_var);
887     SMDS_Mesh* aMesh =  anActor ? anActor->GetObject()->GetMesh() : 0;
888
889     if(aNbElements != 1 || !aMesh)
890       return;
891     
892     const SMDS_MeshFace* face = dynamic_cast<const SMDS_MeshFace*>(aMesh->FindElement(aMapIndex(aNbElements)));
893
894     if (!face)
895       return;
896
897     gp_XYZ aNormale = SMESH::getNormale(face);
898     SpinBox_Vx->SetValue(aNormale.X());
899     SpinBox_Vy->SetValue(aNormale.Y());
900     SpinBox_Vz->SetValue(aNormale.Z());
901     
902   }
903   
904   onDisplaySimulation(true);
905   
906   // OK
907   CheckIsEnable();
908 }
909
910 //=================================================================================
911 // function : SetEditCurrentArgument()
912 // purpose  :
913 //=================================================================================
914 void SMESHGUI_ExtrusionDlg::SetEditCurrentArgument()
915 {
916   QPushButton* send = (QPushButton*)sender();
917
918   disconnect(mySelectionMgr, 0, this, 0);
919   mySelectionMgr->clearSelected();
920   mySelectionMgr->clearFilters();
921
922   if (send == SelectElementsButton) {
923     myEditCurrentArgument = (QWidget*)LineEditElements;
924     if (CheckBoxMesh->isChecked())
925     {
926       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
927         aViewWindow->SetSelectionMode(ActorSelection);
928       switch( GetConstructorId() ) {
929       case 0: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter0D); break;
930       case 1: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter1D); break;
931       case 2: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter2D); break;
932       }
933     }
934     else
935     {
936       int aConstructorId = GetConstructorId();
937       switch(aConstructorId) {
938       case 0:
939         {
940           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
941             aViewWindow->SetSelectionMode(NodeSelection);
942           break;
943         }
944       case 1:
945         {
946           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
947             aViewWindow->SetSelectionMode(EdgeSelection);
948           break;
949         }
950       case 2:
951         {
952           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
953             aViewWindow->SetSelectionMode(FaceSelection);
954           break;
955         }
956       }
957     }
958   }
959   else if (send == SelectVectorButton){
960     myEditCurrentArgument = (QWidget*)SpinBox_Vx;
961     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
962       aViewWindow->SetSelectionMode(FaceSelection);
963   }
964   
965   myEditCurrentArgument->setFocus();
966   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
967   SelectionIntoArgument();
968 }
969
970 //=================================================================================
971 // function : DeactivateActiveDialog()
972 // purpose  : Deactivates this dialog
973 //=================================================================================
974 void SMESHGUI_ExtrusionDlg::DeactivateActiveDialog()
975 {
976   if (ConstructorsBox->isEnabled()) {
977     ConstructorsBox->setEnabled(false);
978     GroupArguments->setEnabled(false);
979     GroupButtons->setEnabled(false);
980     mySMESHGUI->ResetState();
981     mySMESHGUI->SetActiveDialogBox(0);
982   }
983 }
984
985 //=================================================================================
986 // function : ActivateThisDialog()
987 // purpose  : Activates this dialog
988 //=================================================================================
989 void SMESHGUI_ExtrusionDlg::ActivateThisDialog()
990 {
991   // Emit a signal to deactivate the active dialog
992   mySMESHGUI->EmitSignalDeactivateDialog();
993   ConstructorsBox->setEnabled(true);
994   GroupArguments->setEnabled(true);
995   GroupButtons->setEnabled(true);
996
997   mySMESHGUI->SetActiveDialogBox(this);
998
999   ConstructorsClicked(GetConstructorId());
1000   SelectionIntoArgument();
1001 }
1002
1003 //=================================================================================
1004 // function : enterEvent()
1005 // purpose  : Mouse enter event
1006 //=================================================================================
1007 void SMESHGUI_ExtrusionDlg::enterEvent (QEvent*)
1008 {
1009   if (!ConstructorsBox->isEnabled())
1010     ActivateThisDialog();
1011 }
1012
1013 //=================================================================================
1014 // function : onSelectMesh()
1015 // purpose  :
1016 //=================================================================================
1017 void SMESHGUI_ExtrusionDlg::onSelectMesh (bool toSelectMesh)
1018 {
1019   if (toSelectMesh) {
1020     myIDs = LineEditElements->text();
1021     TextLabelElements->setText(tr("SMESH_NAME"));
1022   }
1023   else
1024     TextLabelElements->setText(tr("SMESH_ID_ELEMENTS"));
1025
1026   myFilterBtn->setEnabled(!toSelectMesh);
1027
1028   if (myEditCurrentArgument != LineEditElements) {
1029     LineEditElements->clear();
1030     return;
1031   }
1032
1033   mySelectionMgr->clearFilters();
1034
1035   if (toSelectMesh)
1036   {
1037     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1038       aViewWindow->SetSelectionMode(ActorSelection);
1039     switch( GetConstructorId() ) {
1040     case 0: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter0D); break;
1041     case 1: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter1D); break;
1042     case 2: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter2D); break;
1043     }
1044     LineEditElements->setReadOnly(true);
1045     LineEditElements->setValidator(0);
1046   }
1047   else
1048   {
1049     int aConstructorId = GetConstructorId();
1050     switch(aConstructorId) {
1051       case 0:
1052         {
1053           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1054             aViewWindow->SetSelectionMode(NodeSelection);
1055           break;
1056         }
1057       case 1:
1058         {
1059           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1060             aViewWindow->SetSelectionMode(EdgeSelection);
1061           break;
1062         }
1063       case 2:
1064         {
1065           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1066             aViewWindow->SetSelectionMode(FaceSelection);
1067           break;
1068         }
1069     }
1070     LineEditElements->setReadOnly(false);
1071     LineEditElements->setValidator(myIdValidator);
1072     onTextChange(LineEditElements->text());
1073   }
1074
1075   SelectionIntoArgument();
1076
1077   if (!toSelectMesh)
1078     LineEditElements->setText( myIDs );
1079 }
1080
1081 //=================================================================================
1082 // function : GetConstructorId()
1083 // purpose  :
1084 //=================================================================================
1085 int SMESHGUI_ExtrusionDlg::GetConstructorId()
1086 {
1087   return GroupConstructors->checkedId();
1088 }
1089
1090 //=================================================================================
1091 // function : keyPressEvent()
1092 // purpose  :
1093 //=================================================================================
1094 void SMESHGUI_ExtrusionDlg::keyPressEvent( QKeyEvent* e )
1095 {
1096   QDialog::keyPressEvent( e );
1097   if ( e->isAccepted() )
1098     return;
1099
1100   if ( e->key() == Qt::Key_F1 ) {
1101     e->accept();
1102     ClickOnHelp();
1103   }
1104 }
1105
1106 //=================================================================================
1107 // function : setFilters()
1108 // purpose  : SLOT. Called when "Filter" button pressed.
1109 //=================================================================================
1110 void SMESHGUI_ExtrusionDlg::setFilters()
1111 {
1112   if(myMesh->_is_nil()) {
1113     SUIT_MessageBox::critical(this,
1114                               tr("SMESH_ERROR"),
1115                               tr("NO_MESH_SELECTED"));
1116    return;
1117   }
1118   if ( !myFilterDlg )
1119   {
1120     QList<int> types;  
1121     types.append( SMESH::NODE );
1122     types.append( SMESH::EDGE );
1123     types.append( SMESH::FACE );
1124     myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, types );
1125   }
1126   switch( GetConstructorId() ){
1127     case 0: 
1128       {
1129       myFilterDlg->Init( SMESH::NODE );
1130         break;
1131       }
1132     case 1:
1133       {
1134       myFilterDlg->Init( SMESH::EDGE );
1135         break;
1136       }
1137     case 2:
1138       {
1139       myFilterDlg->Init( SMESH::FACE );
1140         break;
1141       }
1142   }
1143   
1144
1145   myFilterDlg->SetSelection();
1146   myFilterDlg->SetMesh( myMesh );
1147   myFilterDlg->SetSourceWg( LineEditElements );
1148
1149   myFilterDlg->show();
1150 }
1151
1152 //=================================================================================
1153 // function : isValid
1154 // purpose  :
1155 //=================================================================================
1156 bool SMESHGUI_ExtrusionDlg::isValid()
1157 {
1158   QString msg;
1159   bool ok = true;
1160   if ( RadioButton3->isChecked() ) {
1161     ok = SpinBox_Dx->isValid( msg, true ) && ok;
1162     ok = SpinBox_Dy->isValid( msg, true ) && ok;
1163     ok = SpinBox_Dz->isValid( msg, true ) && ok;
1164   } else if ( RadioButton4->isChecked() ) {
1165     ok = SpinBox_Vx->isValid( msg, true ) && ok;
1166     ok = SpinBox_Vy->isValid( msg, true ) && ok;
1167     ok = SpinBox_Vz->isValid( msg, true ) && ok;
1168     ok = SpinBox_VDist->isValid( msg, true ) && ok;
1169   }
1170   ok = SpinBox_NbSteps->isValid( msg, true ) && ok;
1171
1172   if( !ok ) {
1173     QString str( tr( "SMESH_INCORRECT_INPUT" ) );
1174     if ( !msg.isEmpty() )
1175       str += "\n" + msg;
1176     SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
1177     return false;
1178   }
1179   return true;
1180 }
1181
1182 //=================================================================================
1183 // function : onDisplaySimulation
1184 // purpose  : Show/Hide preview
1185 //=================================================================================
1186 void SMESHGUI_ExtrusionDlg::onDisplaySimulation( bool toDisplayPreview ) {
1187   if (myPreviewCheckBox->isChecked() && toDisplayPreview) {
1188     if (myNbOkElements && isValid() && isValuesValid()) {
1189       //Get input vector
1190       SMESH::DirStruct aVector;
1191       getExtrusionVector(aVector);
1192
1193       //Get Number of the steps 
1194       long aNbSteps = (long)SpinBox_NbSteps->value();
1195       
1196       try {
1197         SUIT_OverrideCursor aWaitCursor;
1198         SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditPreviewer();
1199         if( CheckBoxMesh->isChecked() ) {
1200           switch (GetConstructorId()) {
1201             case 0:
1202               {
1203                 aMeshEditor->ExtrusionSweepObject0D(mySelectedObject, aVector, aNbSteps);
1204                                         break;
1205               }
1206             case 1:
1207               {
1208                 aMeshEditor->ExtrusionSweepObject1D(mySelectedObject, aVector, aNbSteps);
1209                                         break;
1210               }
1211             case 2:
1212               {
1213                 aMeshEditor->ExtrusionSweepObject2D(mySelectedObject, aVector, aNbSteps);
1214                                         break;
1215               }
1216           }
1217         }
1218         else
1219           if(GetConstructorId() == 0)
1220             aMeshEditor->ExtrusionSweep0D(myElementsId.inout(), aVector, aNbSteps);
1221           else
1222             aMeshEditor->ExtrusionSweep(myElementsId.inout(), aVector, aNbSteps);
1223         
1224         SMESH::MeshPreviewStruct_var aMeshPreviewStruct = aMeshEditor->GetPreviewData();
1225         mySimulation->SetData(aMeshPreviewStruct._retn());
1226       } catch (...) {
1227         hidePreview();
1228       }
1229     } else {
1230       hidePreview();
1231     }
1232   } else {
1233     hidePreview();
1234   }
1235 }
1236
1237 //=================================================================================
1238 // function : getExtrusionVector()
1239 // purpose  : get direction of the extrusion
1240 //=================================================================================
1241 void SMESHGUI_ExtrusionDlg::getExtrusionVector(SMESH::DirStruct& aVector) {
1242   if ( RadioButton3->isChecked() ) {
1243     aVector.PS.x = SpinBox_Dx->GetValue();
1244     aVector.PS.y = SpinBox_Dy->GetValue();
1245     aVector.PS.z = SpinBox_Dz->GetValue();      
1246   } else if ( RadioButton4->isChecked() ) {
1247     gp_XYZ aNormale(SpinBox_Vx->GetValue(),
1248                     SpinBox_Vy->GetValue(),
1249                     SpinBox_Vz->GetValue());
1250     
1251     
1252     aNormale /= aNormale.Modulus();
1253     double aVDist = (double)SpinBox_VDist->value();
1254     
1255     aVector.PS.x = aNormale.X()*aVDist;
1256     aVector.PS.y = aNormale.Y()*aVDist;
1257     aVector.PS.z = aNormale.Z()*aVDist;
1258   }
1259 }