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