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