Salome HOME
83e18035a241c58bf912b98e4d8d3408ce97d764
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_ExtrusionDlg.cxx
1 // SMESH SMESHGUI : GUI for SMESH component
2 //
3 // Copyright (C) 2003  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 // File   : SMESHGUI_ExtrusionDlg.cxx
23 // Author : Michael ZORIN, Open CASCADE S.A.S.
24 //
25
26 // SMESH includes
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
36 #include <SMESH_Actor.h>
37 #include <SMESH_TypeFilter.hxx>
38 #include <SMESH_LogicalFilter.hxx>
39
40 #include <SMDS_Mesh.hxx>
41
42 // SALOME GUI includes
43 #include <SUIT_ResourceMgr.h>
44 #include <SUIT_Desktop.h>
45 #include <SUIT_MessageBox.h>
46 #include <SUIT_Session.h>
47 #include <SUIT_OverrideCursor.h>
48
49 #include <LightApp_Application.h>
50 #include <LightApp_SelectionMgr.h>
51
52 #include <SVTK_ViewModel.h>
53 #include <SVTK_ViewWindow.h>
54
55 #include <SalomeApp_IntSpinBox.h>
56
57 // OCCT includes
58 #include <TColStd_MapOfInteger.hxx>
59 #include <TColStd_IndexedMapOfInteger.hxx>
60
61 // Qt includes
62 #include <QApplication>
63 #include <QButtonGroup>
64 #include <QGroupBox>
65 #include <QLabel>
66 #include <QLineEdit>
67 #include <QPushButton>
68 #include <QRadioButton>
69 #include <QCheckBox>
70 #include <QHBoxLayout>
71 #include <QVBoxLayout>
72 #include <QGridLayout>
73 #include <QKeyEvent>
74
75 // IDL includes
76 #include <SALOMEconfig.h>
77 #include CORBA_SERVER_HEADER(SMESH_Group)
78 #include CORBA_SERVER_HEADER(SMESH_MeshEditor)
79
80 #define SPACING 6
81 #define MARGIN  11
82
83 //=================================================================================
84 // function : SMESHGUI_ExtrusionDlg()
85 // purpose  : constructor
86 //=================================================================================
87 SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
88   : QDialog( SMESH::GetDesktop( theModule ) ),
89     mySMESHGUI( theModule ),
90     mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
91 {
92   QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_EDGE")));
93   QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_TRIANGLE")));
94   QPixmap image2 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
95
96   setModal( false );
97   setAttribute( Qt::WA_DeleteOnClose, true );
98   setWindowTitle(tr("EXTRUSION_ALONG_LINE"));
99   setSizeGripEnabled(true);
100
101   QVBoxLayout* SMESHGUI_ExtrusionDlgLayout = new QVBoxLayout(this);
102   SMESHGUI_ExtrusionDlgLayout->setSpacing(SPACING);
103   SMESHGUI_ExtrusionDlgLayout->setMargin(MARGIN);
104
105   /***************************************************************/
106   ConstructorsBox = new QGroupBox(tr("SMESH_EXTRUSION"), this);
107   GroupConstructors = new QButtonGroup(this);
108   QHBoxLayout* ConstructorsBoxLayout = new QHBoxLayout(ConstructorsBox);
109   ConstructorsBoxLayout->setSpacing(SPACING);
110   ConstructorsBoxLayout->setMargin(MARGIN);
111
112   RadioButton1= new QRadioButton(ConstructorsBox);
113   RadioButton1->setIcon(image0);
114   RadioButton2= new QRadioButton(ConstructorsBox);
115   RadioButton2->setIcon(image1);
116
117   ConstructorsBoxLayout->addWidget(RadioButton1);
118   ConstructorsBoxLayout->addWidget(RadioButton2);
119
120   GroupConstructors->addButton(RadioButton1, 0);
121   GroupConstructors->addButton(RadioButton2, 1);
122
123   /***************************************************************/
124   GroupButtons = new QGroupBox(this);
125   QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons);
126   GroupButtonsLayout->setSpacing(SPACING);
127   GroupButtonsLayout->setMargin(MARGIN);
128
129   buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons);
130   buttonOk->setAutoDefault(true);
131   buttonOk->setDefault(true);
132   buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
133   buttonApply->setAutoDefault(true);
134   buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
135   buttonCancel->setAutoDefault(true);
136   buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons);
137   buttonHelp->setAutoDefault(true);
138
139   GroupButtonsLayout->addWidget(buttonOk);
140   GroupButtonsLayout->addSpacing(10);
141   GroupButtonsLayout->addWidget(buttonApply);
142   GroupButtonsLayout->addSpacing(10);
143   GroupButtonsLayout->addStretch();
144   GroupButtonsLayout->addWidget(buttonCancel);
145   GroupButtonsLayout->addWidget(buttonHelp);
146
147   /***************************************************************/
148   GroupArguments = new QGroupBox(tr("EXTRUSION_1D"), this);
149   QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments);
150   GroupArgumentsLayout->setSpacing(SPACING);
151   GroupArgumentsLayout->setMargin(MARGIN);
152
153   myIdValidator = new SMESHGUI_IdValidator(this);
154
155   // Controls for elements selection
156   TextLabelElements = new QLabel(tr("SMESH_ID_ELEMENTS"), GroupArguments);
157
158   SelectElementsButton = new QPushButton(GroupArguments);
159   SelectElementsButton->setIcon(image2);
160
161   LineEditElements = new QLineEdit(GroupArguments);
162   LineEditElements->setValidator(myIdValidator);
163
164   // Control for the whole mesh selection
165   CheckBoxMesh = new QCheckBox(tr("SMESH_SELECT_WHOLE_MESH"), GroupArguments);
166
167   // Controls for vector selection
168   TextLabelVector = new QLabel(tr("SMESH_VECTOR"), GroupArguments);
169
170   TextLabelDx = new QLabel(tr("SMESH_DX"), GroupArguments);
171   SpinBox_Dx = new SMESHGUI_SpinBox(GroupArguments);
172
173   TextLabelDy = new QLabel(tr("SMESH_DY"), GroupArguments);
174   SpinBox_Dy = new SMESHGUI_SpinBox(GroupArguments);
175
176   TextLabelDz = new QLabel(tr("SMESH_DZ"), GroupArguments);
177   SpinBox_Dz = new SMESHGUI_SpinBox(GroupArguments);
178
179   // Controls for nb. steps defining
180   TextLabelNbSteps = new QLabel(tr("SMESH_NUMBEROFSTEPS"), GroupArguments);
181   SpinBox_NbSteps = new SalomeApp_IntSpinBox(GroupArguments);
182
183   // CheckBox for groups generation
184   MakeGroupsCheck = new QCheckBox(tr("SMESH_MAKE_GROUPS"), GroupArguments);
185
186   GroupArgumentsLayout->addWidget(TextLabelElements,    0, 0);
187   GroupArgumentsLayout->addWidget(SelectElementsButton, 0, 1);
188   GroupArgumentsLayout->addWidget(LineEditElements,     0, 2, 1, 6);
189   GroupArgumentsLayout->addWidget(CheckBoxMesh,         1, 0, 1, 8);
190   GroupArgumentsLayout->addWidget(TextLabelVector,      2, 0);
191   GroupArgumentsLayout->addWidget(TextLabelDx,          2, 2);
192   GroupArgumentsLayout->addWidget(SpinBox_Dx,           2, 3);
193   GroupArgumentsLayout->addWidget(TextLabelDy,          2, 4);
194   GroupArgumentsLayout->addWidget(SpinBox_Dy,           2, 5);
195   GroupArgumentsLayout->addWidget(TextLabelDz,          2, 6);
196   GroupArgumentsLayout->addWidget(SpinBox_Dz,           2, 7);
197   GroupArgumentsLayout->addWidget(TextLabelNbSteps,     3, 0);
198   GroupArgumentsLayout->addWidget(SpinBox_NbSteps,      3, 2, 1, 6);
199   GroupArgumentsLayout->addWidget(MakeGroupsCheck,      4, 0, 1, 8);
200
201   /***************************************************************/
202   SMESHGUI_ExtrusionDlgLayout->addWidget(ConstructorsBox);
203   SMESHGUI_ExtrusionDlgLayout->addWidget(GroupArguments);
204   SMESHGUI_ExtrusionDlgLayout->addWidget(GroupButtons);
205
206   /* Initialisations */
207   SpinBox_Dx->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3);
208   SpinBox_Dy->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3);
209   SpinBox_Dz->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3);
210
211   SpinBox_NbSteps->setRange(1, 999999);
212
213   RadioButton1->setChecked(true);
214   MakeGroupsCheck->setChecked(true);
215
216   mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
217
218   mySMESHGUI->SetActiveDialogBox(this);
219
220   // Costruction of the logical filter for the elements: mesh/sub-mesh/group
221   SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
222   SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter (GROUP);
223
224   QList<SUIT_SelectionFilter*> aListOfFilters;
225   if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
226   if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
227
228   myMeshOrSubMeshOrGroupFilter =
229     new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
230
231   myHelpFileName = "extrusion_page.html";
232
233   Init();
234
235   /***************************************************************/
236   // signals and slots connections
237   connect(buttonOk,     SIGNAL(clicked()), this, SLOT(ClickOnOk()));
238   connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
239   connect(buttonApply,  SIGNAL(clicked()), this, SLOT(ClickOnApply()));
240   connect(buttonHelp,   SIGNAL(clicked()), this, SLOT(ClickOnHelp()));
241
242   // to update state of the Ok & Apply buttons
243   connect(SpinBox_Dx, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
244   connect(SpinBox_Dy, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
245   connect(SpinBox_Dz, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
246
247   connect(GroupConstructors,    SIGNAL(buttonClicked(int)), SLOT(ConstructorsClicked(int)));
248   connect(SelectElementsButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
249   connect(mySMESHGUI,           SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
250   connect(mySelectionMgr,       SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
251   /* to close dialog if study change */
252   connect(mySMESHGUI,           SIGNAL(SignalCloseAllDialogs()),   this, SLOT(ClickOnCancel()));
253   connect(LineEditElements,     SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
254   connect(CheckBoxMesh,         SIGNAL(toggled(bool)),               SLOT(onSelectMesh(bool)));
255
256   /***************************************************************/
257   
258   ConstructorsClicked(0);
259   SelectionIntoArgument();
260 }
261
262 //=================================================================================
263 // function : ~SMESHGUI_ExtrusionDlg()
264 // purpose  : destructor
265 //=================================================================================
266 SMESHGUI_ExtrusionDlg::~SMESHGUI_ExtrusionDlg()
267 {
268 }
269
270 //=================================================================================
271 // function : Init()
272 // purpose  : initialization
273 //=================================================================================
274 void SMESHGUI_ExtrusionDlg::Init (bool ResetControls)
275 {
276   myBusy = false;
277
278   LineEditElements->clear();
279   myNbOkElements = 0;
280
281   myActor = 0;
282   myMesh = SMESH::SMESH_Mesh::_nil();
283
284   if (ResetControls) {
285     SpinBox_NbSteps->setValue(1);
286     SpinBox_Dx->SetValue(0);
287     SpinBox_Dy->SetValue(0);
288     SpinBox_Dz->SetValue(0);
289
290     CheckBoxMesh->setChecked(false);
291     onSelectMesh(false);
292   }
293
294   CheckIsEnable();
295 }
296
297 //=================================================================================
298 // function : CheckIsEnable()
299 // purpose  : Check whether the Ok and Apply buttons should be enabled or not
300 //=================================================================================
301 void SMESHGUI_ExtrusionDlg::CheckIsEnable()
302 {
303   double aX = SpinBox_Dx->GetValue();
304   double aY = SpinBox_Dy->GetValue();
305   double aZ = SpinBox_Dz->GetValue();
306   double aModule = sqrt(aX*aX + aY*aY + aZ*aZ);
307   
308   bool anIsEnable = myNbOkElements > 0 && aModule > 1.0E-38;
309
310   buttonOk->setEnabled(anIsEnable);
311   buttonApply->setEnabled(anIsEnable);
312 }
313
314 //=================================================================================
315 // function : ConstructorsClicked()
316 // purpose  : Radio button management
317 //=================================================================================
318 void SMESHGUI_ExtrusionDlg::ConstructorsClicked (int constructorId)
319 {
320   disconnect(mySelectionMgr, 0, this, 0);
321
322   switch (constructorId) {
323   case 0:
324     {
325       GroupArguments->setTitle(tr("EXTRUSION_1D"));
326       if (!CheckBoxMesh->isChecked())
327         {
328           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
329             aViewWindow->SetSelectionMode(EdgeSelection);
330         }
331       break;
332     }
333   case 1:
334     {
335       GroupArguments->setTitle(tr("EXTRUSION_2D"));
336       if (!CheckBoxMesh->isChecked())
337         {
338           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
339             aViewWindow->SetSelectionMode(FaceSelection);
340         }
341       break;
342     }
343   }
344
345   myEditCurrentArgument = LineEditElements;
346   LineEditElements->setFocus();
347
348   if (CheckBoxMesh->isChecked())
349     onSelectMesh(true);
350
351   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
352 }
353
354 //=================================================================================
355 // function : ClickOnApply()
356 // purpose  : Called when user presses <Apply> button
357 //=================================================================================
358 bool SMESHGUI_ExtrusionDlg::ClickOnApply()
359 {
360   if (mySMESHGUI->isActiveStudyLocked())
361     return false;
362
363   if (!isValid())
364     return false;
365
366   if (myNbOkElements) {
367
368     SMESH::DirStruct aVector;
369     aVector.PS.x = SpinBox_Dx->GetValue();
370     aVector.PS.y = SpinBox_Dy->GetValue();
371     aVector.PS.z = SpinBox_Dz->GetValue();
372
373     long aNbSteps = (long)SpinBox_NbSteps->value();
374
375     QStringList aParameters;
376     aParameters << SpinBox_Dx->text();
377     aParameters << SpinBox_Dy->text();
378     aParameters << SpinBox_Dz->text();
379     aParameters << SpinBox_NbSteps->text();
380
381     try {
382       SUIT_OverrideCursor aWaitCursor;
383       SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
384
385       if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() )
386         SMESH::ListOfGroups_var groups = 
387           aMeshEditor->ExtrusionSweepMakeGroups(myElementsId.inout(), aVector, aNbSteps);
388       else
389         aMeshEditor->ExtrusionSweep(myElementsId.inout(), aVector, aNbSteps);
390
391       myMesh->SetParameters( SMESHGUI::JoinObjectParameters(aParameters) );
392
393     } catch (...) {
394     }
395
396     SMESH::UpdateView();
397     if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() )
398       mySMESHGUI->updateObjBrowser(true); // new groups may appear
399     Init(false);
400     ConstructorsClicked(GetConstructorId());
401     SelectionIntoArgument();
402   }
403   return true;
404 }
405
406 //=================================================================================
407 // function : ClickOnOk()
408 // purpose  : Called when user presses <OK> button
409 //=================================================================================
410 void SMESHGUI_ExtrusionDlg::ClickOnOk()
411 {
412   if (ClickOnApply())
413     ClickOnCancel();
414 }
415
416 //=================================================================================
417 // function : ClickOnCancel()
418 // purpose  : Called when dialog box is closed
419 //=================================================================================
420 void SMESHGUI_ExtrusionDlg::ClickOnCancel()
421 {
422   disconnect(mySelectionMgr, 0, this, 0);
423   mySelectionMgr->clearFilters();
424   //mySelectionMgr->clearSelected();
425   SMESH::SetPickable(); // ???
426   SMESH::SetPointRepresentation(false);
427   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
428     aViewWindow->SetSelectionMode(ActorSelection);
429   mySMESHGUI->ResetState();
430   reject();
431 }
432
433 //=================================================================================
434 // function : ClickOnHelp()
435 // purpose  :
436 //=================================================================================
437 void SMESHGUI_ExtrusionDlg::ClickOnHelp()
438 {
439   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
440   if (app) 
441     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
442   else {
443     QString platform;
444 #ifdef WIN32
445     platform = "winapplication";
446 #else
447     platform = "application";
448 #endif
449     SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
450                              tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
451                              arg(app->resourceMgr()->stringValue("ExternalBrowser", 
452                                                                  platform)).
453                              arg(myHelpFileName));
454   }
455 }
456
457 //=================================================================================
458 // function : onTextChange()
459 // purpose  :
460 //=================================================================================
461 void SMESHGUI_ExtrusionDlg::onTextChange (const QString& theNewText)
462 {
463   QLineEdit* send = (QLineEdit*)sender();
464
465   // return if busy
466   if (myBusy) return;
467
468   // set busy flag
469   myBusy = true;
470
471   if (send == LineEditElements)
472     myNbOkElements = 0;
473
474   // hilight entered elements/nodes
475
476   if (!myIO.IsNull()) {
477     QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts);
478
479     if (send == LineEditElements)
480     {
481       SMDS_Mesh* aMesh = myActor ? myActor->GetObject()->GetMesh() : 0;
482       SMESH::ElementType SMESHType = GetConstructorId() ? SMESH::FACE : SMESH::EDGE;
483       SMDSAbs_ElementType SMDSType = GetConstructorId() ? SMDSAbs_Face: SMDSAbs_Edge;
484
485       myElementsId = new SMESH::long_array;
486       myElementsId->length( aListId.count() );
487       TColStd_MapOfInteger newIndices;
488       for (int i = 0; i < aListId.count(); i++) {
489         int id = aListId[ i ].toInt();
490         bool validId = false;
491         if ( id > 0 ) {
492           if ( aMesh ) {
493             const SMDS_MeshElement * e = aMesh->FindElement( id );
494             validId = ( e && e->GetType() == SMDSType );
495           } else {
496             validId = ( myMesh->GetElementType( id, true ) == SMESHType );
497           }
498         }
499         if ( validId && newIndices.Add( id ))
500           myElementsId[ newIndices.Extent()-1 ] = id;
501       }
502       myElementsId->length( myNbOkElements = newIndices.Extent() );
503       mySelector->AddOrRemoveIndex(myIO, newIndices, false);
504       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
505         aViewWindow->highlight( myIO, true, true );
506     }
507   }
508
509   CheckIsEnable();
510
511   myBusy = false;
512 }
513
514 //=================================================================================
515 // function : SelectionIntoArgument()
516 // purpose  : Called when selection as changed or other case
517 //=================================================================================
518 void SMESHGUI_ExtrusionDlg::SelectionIntoArgument()
519 {
520   if (myBusy) return;
521
522   // return if dialog box is inactive
523   if (!GroupButtons->isEnabled())
524     return;
525
526   // clear
527   myActor = 0;
528   myIO.Nullify();
529   QString aString = "";
530
531   // set busy flag
532   myBusy = true;
533
534   myEditCurrentArgument->setText(aString);
535   myNbOkElements = 0;
536   myBusy = false;
537
538   // get selected mesh
539   SALOME_ListIO aList;
540   mySelectionMgr->selectedObjects(aList, SVTK_Viewer::Type());
541   int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
542   if (nbSel != 1)
543     return;
544
545   Handle(SALOME_InteractiveObject) IO = aList.First();
546   myMesh = SMESH::GetMeshByIO(IO);
547   if (myMesh->_is_nil())
548     return;
549   myIO = IO;
550   myActor = SMESH::FindActorByObject(myMesh);
551
552   if (myEditCurrentArgument == LineEditElements) {
553     int aNbElements = 0;
554
555     // MakeGroups is available if there are groups
556     if ( myMesh->NbGroups() == 0 ) {
557       MakeGroupsCheck->setChecked(false);
558       MakeGroupsCheck->setEnabled(false);
559     } else {
560       MakeGroupsCheck->setEnabled(true);
561     }
562
563     if (CheckBoxMesh->isChecked()) {
564       SMESH::ElementType neededType = GetConstructorId() ? SMESH::FACE : SMESH::EDGE;
565
566       SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
567
568       SMESH::SMESH_Mesh_var mesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO);
569
570       if (!mesh->_is_nil()) { //MESH
571         // get elements from mesh
572           myElementsId = mesh->GetElementsByType(neededType);
573           aNbElements = myElementsId->length();
574       } else {
575         SMESH::SMESH_subMesh_var aSubMesh =
576           SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(IO);
577         
578         if (!aSubMesh->_is_nil()) { //SUBMESH
579           // get IDs from submesh
580           myElementsId = aSubMesh->GetElementsByType(neededType);
581           aNbElements = myElementsId->length();
582         } else {
583           SMESH::SMESH_GroupBase_var aGroup = 
584             SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IO);
585
586           if (!aGroup->_is_nil() && aGroup->GetType() == neededType) { // GROUP
587             // get IDs from smesh group
588             myElementsId = aGroup->GetListOfID();
589             aNbElements = myElementsId->length();
590           }
591         }
592       }
593     } else {
594       // get indices of selcted elements
595       TColStd_IndexedMapOfInteger aMapIndex;
596       mySelector->GetIndex(IO,aMapIndex);
597       aNbElements = aMapIndex.Extent();
598
599       myElementsId = new SMESH::long_array;
600       myElementsId->length( aNbElements );
601       aString = "";
602       for ( int i = 0; i < aNbElements; ++i )
603         aString += QString(" %1").arg( myElementsId[ i ] = aMapIndex( i+1 ) );
604     }
605
606     if (aNbElements < 1)
607       return;
608
609     myNbOkElements = true;
610   }
611
612   myBusy = true;
613   myEditCurrentArgument->setText(aString);
614   myBusy = false;
615
616   // OK
617   CheckIsEnable();
618 }
619
620 //=================================================================================
621 // function : SetEditCurrentArgument()
622 // purpose  :
623 //=================================================================================
624 void SMESHGUI_ExtrusionDlg::SetEditCurrentArgument()
625 {
626   QPushButton* send = (QPushButton*)sender();
627
628   disconnect(mySelectionMgr, 0, this, 0);
629   mySelectionMgr->clearSelected();
630   mySelectionMgr->clearFilters();
631
632   if (send == SelectElementsButton) {
633     myEditCurrentArgument = LineEditElements;
634     if (CheckBoxMesh->isChecked()) {
635       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
636         aViewWindow->SetSelectionMode(ActorSelection);
637       mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
638     } else {
639       int aConstructorId = GetConstructorId();
640       if (aConstructorId == 0)
641         {
642           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
643             aViewWindow->SetSelectionMode(EdgeSelection);
644         }
645       else if (aConstructorId == 1)
646         {
647           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
648             aViewWindow->SetSelectionMode(FaceSelection);
649         }
650     }
651   }
652
653   myEditCurrentArgument->setFocus();
654   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
655   SelectionIntoArgument();
656 }
657
658 //=================================================================================
659 // function : DeactivateActiveDialog()
660 // purpose  : Deactivates this dialog
661 //=================================================================================
662 void SMESHGUI_ExtrusionDlg::DeactivateActiveDialog()
663 {
664   if (ConstructorsBox->isEnabled()) {
665     ConstructorsBox->setEnabled(false);
666     GroupArguments->setEnabled(false);
667     GroupButtons->setEnabled(false);
668     mySMESHGUI->ResetState();
669     mySMESHGUI->SetActiveDialogBox(0);
670   }
671 }
672
673 //=================================================================================
674 // function : ActivateThisDialog()
675 // purpose  : Activates this dialog
676 //=================================================================================
677 void SMESHGUI_ExtrusionDlg::ActivateThisDialog()
678 {
679   // Emit a signal to deactivate the active dialog
680   mySMESHGUI->EmitSignalDeactivateDialog();
681   ConstructorsBox->setEnabled(true);
682   GroupArguments->setEnabled(true);
683   GroupButtons->setEnabled(true);
684
685   mySMESHGUI->SetActiveDialogBox(this);
686
687   ConstructorsClicked(GetConstructorId());
688   SelectionIntoArgument();
689 }
690
691 //=================================================================================
692 // function : enterEvent()
693 // purpose  : Mouse enter event
694 //=================================================================================
695 void SMESHGUI_ExtrusionDlg::enterEvent (QEvent*)
696 {
697   if (!ConstructorsBox->isEnabled())
698     ActivateThisDialog();
699 }
700
701 //=================================================================================
702 // function : onSelectMesh()
703 // purpose  :
704 //=================================================================================
705 void SMESHGUI_ExtrusionDlg::onSelectMesh (bool toSelectMesh)
706 {
707   if (toSelectMesh)
708     TextLabelElements->setText(tr("SMESH_NAME"));
709   else
710     TextLabelElements->setText(tr("SMESH_ID_ELEMENTS"));
711
712   if (myEditCurrentArgument != LineEditElements) {
713     LineEditElements->clear();
714     return;
715   }
716
717   mySelectionMgr->clearFilters();
718
719   if (toSelectMesh) {
720     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
721       aViewWindow->SetSelectionMode(ActorSelection);
722     mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
723     LineEditElements->setReadOnly(true);
724     LineEditElements->setValidator(0);
725   } else {
726     int aConstructorId = GetConstructorId();
727     if (aConstructorId == 0)
728       {
729         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
730           aViewWindow->SetSelectionMode(EdgeSelection);
731       }
732     else if (aConstructorId == 0)
733       {
734         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
735           aViewWindow->SetSelectionMode(FaceSelection);
736       }
737
738     LineEditElements->setReadOnly(false);
739     LineEditElements->setValidator(myIdValidator);
740     onTextChange(LineEditElements->text());
741   }
742
743   SelectionIntoArgument();
744 }
745
746 //=================================================================================
747 // function : GetConstructorId()
748 // purpose  :
749 //=================================================================================
750 int SMESHGUI_ExtrusionDlg::GetConstructorId()
751 {
752   return GroupConstructors->checkedId();
753 }
754
755 //=================================================================================
756 // function : keyPressEvent()
757 // purpose  :
758 //=================================================================================
759 void SMESHGUI_ExtrusionDlg::keyPressEvent( QKeyEvent* e )
760 {
761   QDialog::keyPressEvent( e );
762   if ( e->isAccepted() )
763     return;
764
765   if ( e->key() == Qt::Key_F1 ) {
766     e->accept();
767     ClickOnHelp();
768   }
769 }
770
771 //=================================================================================
772 // function : isValid
773 // purpose  :
774 //=================================================================================
775 bool SMESHGUI_ExtrusionDlg::isValid()
776 {
777   QString msg;
778   bool ok = true;
779   ok = SpinBox_Dx->isValid( msg, true ) && ok;
780   ok = SpinBox_Dy->isValid( msg, true ) && ok;
781   ok = SpinBox_Dz->isValid( msg, true ) && ok;
782   ok = SpinBox_NbSteps->isValid( msg, true ) && ok;
783
784   if( !ok ) {
785     QString str( tr( "SMESH_INCORRECT_INPUT" ) );
786     if ( !msg.isEmpty() )
787       str += "\n" + msg;
788     SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
789     return false;
790   }
791   return true;
792 }