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