Salome HOME
Porting SMESH module to Qt 4
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_ExtrusionAlongPathDlg.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_ExtrusionAlongPathDlg.cxx
23 // Author : Vadim SANDLER, Open CASCADE S.A.S.
24 //
25
26 // SMESH includes
27 #include "SMESHGUI_ExtrusionAlongPathDlg.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_NumberFilter.hxx>
39 #include <SMESH_LogicalFilter.hxx>
40
41 #include <SMDS_Mesh.hxx>
42
43 // SALOME GEOM includes
44 #include <GEOMBase.h>
45
46 // SALOME GUI includes
47 #include <SUIT_ResourceMgr.h>
48 #include <SUIT_OverrideCursor.h>
49 #include <SUIT_Desktop.h>
50 #include <SUIT_MessageBox.h>
51 #include <SUIT_Session.h>
52
53 #include <LightApp_Application.h>
54 #include <LightApp_SelectionMgr.h>
55
56 #include <SVTK_ViewWindow.h>
57
58 // OCCT includes
59 #include <BRep_Tool.hxx>
60 #include <TopoDS_Vertex.hxx>
61 #include <gp_Pnt.hxx>
62 #include <TColStd_MapOfInteger.hxx>
63
64 // Qt includes
65 #include <QButtonGroup>
66 #include <QGroupBox>
67 #include <QLabel>
68 #include <QLineEdit>
69 #include <QPushButton>
70 #include <QToolButton>
71 #include <QRadioButton>
72 #include <QCheckBox>
73 #include <QListWidget>
74 #include <QVBoxLayout>
75 #include <QHBoxLayout>
76 #include <QGridLayout>
77 #include <QKeyEvent>
78
79 // IDL includes
80 #include <SALOMEconfig.h>
81 #include CORBA_SERVER_HEADER(SMESH_Group)
82 #include CORBA_SERVER_HEADER(SMESH_MeshEditor)
83
84 #define SPACING 6
85 #define MARGIN  11
86
87 class SMESHGUI_ExtrusionAlongPathDlg::SetBusy
88 {
89 public:
90   SetBusy( SMESHGUI_ExtrusionAlongPathDlg* _dlg )
91   {
92     myDlg = _dlg; 
93     myDlg->myBusy = true;
94   }
95   
96   ~SetBusy()
97   { 
98     myDlg->myBusy = false;
99   }
100   
101 private:
102   SMESHGUI_ExtrusionAlongPathDlg* myDlg;
103 };
104
105 //=================================================================================
106 // function : SMESHGUI_ExtrusionAlongPathDlg()
107 // purpose  : constructor
108 //=================================================================================
109 SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theModule )
110   : QDialog( SMESH::GetDesktop( theModule ) ),
111     mySMESHGUI( theModule ),
112     mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
113 {
114   SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI );
115   QPixmap edgeImage   ( mgr->loadPixmap("SMESH", tr("ICON_DLG_EDGE")));
116   QPixmap faceImage   ( mgr->loadPixmap("SMESH", tr("ICON_DLG_TRIANGLE")));
117   QPixmap selectImage ( mgr->loadPixmap("SMESH", tr("ICON_SELECT")));
118   QPixmap addImage    ( mgr->loadPixmap("SMESH", tr("ICON_APPEND")));
119   QPixmap removeImage ( mgr->loadPixmap("SMESH", tr("ICON_REMOVE")));
120
121   myType = -1;
122
123   setModal( false );
124   setAttribute( Qt::WA_DeleteOnClose, true );
125   setWindowTitle(tr("EXTRUSION_ALONG_PATH"));
126   setSizeGripEnabled(true);
127
128   QVBoxLayout* topLayout = new QVBoxLayout(this);
129   topLayout->setSpacing(SPACING);
130   topLayout->setMargin(MARGIN);
131
132   /***************************************************************/
133   // Elements type group box (1d / 2d elements)
134   ConstructorsBox = new QGroupBox(tr("SMESH_EXTRUSION"), this);
135   GroupConstructors = new QButtonGroup(this);
136   QHBoxLayout* ConstructorsBoxLayout = new QHBoxLayout(ConstructorsBox);
137   ConstructorsBoxLayout->setSpacing(SPACING); ConstructorsBoxLayout->setMargin(MARGIN);
138
139   Elements1dRB = new QRadioButton(ConstructorsBox);
140   Elements1dRB->setIcon(edgeImage);
141   Elements2dRB = new QRadioButton(ConstructorsBox);
142   Elements2dRB->setIcon(faceImage);
143   Elements1dRB->setChecked(true);
144
145   // layouting
146   ConstructorsBoxLayout->addWidget(Elements1dRB);
147   ConstructorsBoxLayout->addWidget(Elements2dRB);
148   GroupConstructors->addButton(Elements1dRB,  0);
149   GroupConstructors->addButton(Elements2dRB, 1);
150
151   /***************************************************************/
152   // Arguments group box
153   GroupArguments = new QGroupBox(tr("EXTRUSION_1D"), this);
154   QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments);
155   GroupArgumentsLayout->setSpacing(SPACING); GroupArgumentsLayout->setMargin(MARGIN);
156
157   // Controls for elements selection
158   ElementsLab = new QLabel(tr("SMESH_ID_ELEMENTS"), GroupArguments);
159
160   SelectElementsButton = new QToolButton(GroupArguments);
161   SelectElementsButton->setIcon(selectImage);
162
163   ElementsLineEdit = new QLineEdit(GroupArguments);
164   ElementsLineEdit->setValidator(new SMESHGUI_IdValidator(this));
165
166   // Controls for the whole mesh selection
167   MeshCheck = new QCheckBox(tr("SMESH_SELECT_WHOLE_MESH"), GroupArguments);
168
169   // Controls for path selection
170   PathGrp = new QGroupBox(tr("SMESH_PATH"), GroupArguments);
171   QGridLayout* PathGrpLayout = new QGridLayout(PathGrp);
172   PathGrpLayout->setSpacing(SPACING); PathGrpLayout->setMargin(MARGIN);
173
174   // Controls for path mesh selection
175   QLabel* PathMeshLab = new QLabel(tr("SMESH_PATH_MESH"), PathGrp);
176
177   SelectPathMeshButton = new QToolButton(PathGrp);
178   SelectPathMeshButton->setIcon(selectImage);
179
180   PathMeshLineEdit = new QLineEdit(PathGrp);
181   PathMeshLineEdit->setReadOnly(true);
182
183   // Controls for path shape selection
184   QLabel* PathShapeLab = new QLabel(tr("SMESH_PATH_SHAPE"), PathGrp);
185
186   SelectPathShapeButton = new QToolButton(PathGrp);
187   SelectPathShapeButton->setIcon(selectImage);
188
189   PathShapeLineEdit = new QLineEdit(PathGrp);
190   PathShapeLineEdit->setReadOnly(true);
191
192   // Controls for path starting point selection
193   QLabel* StartPointLab = new QLabel(tr("SMESH_PATH_START"), PathGrp);
194
195   SelectStartPointButton = new QToolButton(PathGrp);
196   SelectStartPointButton->setIcon(selectImage);
197
198   StartPointLineEdit = new QLineEdit(PathGrp);
199   StartPointLineEdit->setValidator(new QIntValidator(this));
200
201   // layouting
202   PathGrpLayout->addWidget(PathMeshLab,            0, 0);
203   PathGrpLayout->addWidget(SelectPathMeshButton,   0, 1);
204   PathGrpLayout->addWidget(PathMeshLineEdit,       0, 2);
205   PathGrpLayout->addWidget(PathShapeLab,           1, 0);
206   PathGrpLayout->addWidget(SelectPathShapeButton,  1, 1);
207   PathGrpLayout->addWidget(PathShapeLineEdit,      1, 2);
208   PathGrpLayout->addWidget(StartPointLab,          2, 0);
209   PathGrpLayout->addWidget(SelectStartPointButton, 2, 1);
210   PathGrpLayout->addWidget(StartPointLineEdit,     2, 2);
211
212   BasePointGrp = new QGroupBox(tr("SMESH_BASE_POINT"), GroupArguments);
213   BasePointGrp->setCheckable(true);
214   BasePointGrp->setChecked(false);
215   QHBoxLayout* BasePointGrpLayout = new QHBoxLayout(BasePointGrp);
216   BasePointGrpLayout->setSpacing(SPACING); BasePointGrpLayout->setMargin(MARGIN);
217
218   SelectBasePointButton = new QToolButton(BasePointGrp);
219   SelectBasePointButton->setIcon(selectImage);
220
221   QLabel* XLab  = new QLabel(tr("SMESH_X"), BasePointGrp);
222   XSpin = new SMESHGUI_SpinBox(BasePointGrp);
223   QLabel* YLab  = new QLabel(tr("SMESH_Y"), BasePointGrp);
224   YSpin = new SMESHGUI_SpinBox(BasePointGrp);
225   QLabel* ZLab  = new QLabel(tr("SMESH_Z"), BasePointGrp);
226   ZSpin = new SMESHGUI_SpinBox(BasePointGrp);
227
228   // layouting
229   BasePointGrpLayout->addWidget(SelectBasePointButton);
230   BasePointGrpLayout->addWidget(XLab);
231   BasePointGrpLayout->addWidget(XSpin);
232   BasePointGrpLayout->addWidget(YLab);
233   BasePointGrpLayout->addWidget(YSpin);
234   BasePointGrpLayout->addWidget(ZLab);
235   BasePointGrpLayout->addWidget(ZSpin);
236
237   AnglesGrp = new QGroupBox(tr("SMESH_ANGLES"), GroupArguments);
238   AnglesGrp->setCheckable(true);
239   AnglesGrp->setChecked(false);
240   QGridLayout* AnglesGrpLayout = new QGridLayout(AnglesGrp);
241   AnglesGrpLayout->setSpacing(SPACING); AnglesGrpLayout->setMargin(MARGIN);
242
243   AnglesList = new QListWidget(AnglesGrp);
244   AnglesList->setSelectionMode(QListWidget::ExtendedSelection);
245
246   AddAngleButton = new QToolButton(AnglesGrp);
247   AddAngleButton->setIcon(addImage);
248
249   RemoveAngleButton = new QToolButton(AnglesGrp);
250   RemoveAngleButton->setIcon(removeImage);
251
252   AngleSpin = new SMESHGUI_SpinBox(AnglesGrp);
253
254   // layouting
255   AnglesGrpLayout->addWidget(AnglesList,        0, 0, 4, 1);
256   AnglesGrpLayout->addWidget(AddAngleButton,    0, 1);
257   AnglesGrpLayout->addWidget(RemoveAngleButton, 2, 1);
258   AnglesGrpLayout->addWidget(AngleSpin,         0, 2);
259   AnglesGrpLayout->setRowMinimumHeight(1, 10);
260   AnglesGrpLayout->setRowStretch(3, 10);
261
262   // CheckBox for groups generation
263   MakeGroupsCheck = new QCheckBox(tr("SMESH_MAKE_GROUPS"), GroupArguments);
264   MakeGroupsCheck->setChecked(true);
265
266   // layouting
267   GroupArgumentsLayout->addWidget(ElementsLab,          0, 0);
268   GroupArgumentsLayout->addWidget(SelectElementsButton, 0, 1);
269   GroupArgumentsLayout->addWidget(ElementsLineEdit,     0, 2);
270   GroupArgumentsLayout->addWidget(MeshCheck,            1, 0, 1, 3);
271   GroupArgumentsLayout->addWidget(PathGrp,              2, 0, 1, 3);
272   GroupArgumentsLayout->addWidget(BasePointGrp,         3, 0, 1, 3);
273   GroupArgumentsLayout->addWidget(AnglesGrp,            4, 0, 1, 3);
274   GroupArgumentsLayout->addWidget(MakeGroupsCheck,      5, 0, 1, 3);
275
276   /***************************************************************/
277   // common buttons group box
278   GroupButtons = new QGroupBox(this);
279   QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons);
280   GroupButtonsLayout->setSpacing(SPACING); GroupButtonsLayout->setMargin(MARGIN);
281
282   OkButton = new QPushButton(tr("SMESH_BUT_OK"), GroupButtons);
283   OkButton->setAutoDefault(true);
284   OkButton->setDefault(true);
285
286   ApplyButton = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
287   ApplyButton->setAutoDefault(true);
288
289   CloseButton = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
290   CloseButton->setAutoDefault(true);
291
292   HelpButton = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons);
293   HelpButton->setAutoDefault(true);
294
295   // layouting
296   GroupButtonsLayout->addWidget(OkButton);
297   GroupButtonsLayout->addSpacing(10);
298   GroupButtonsLayout->addWidget(ApplyButton);
299   GroupButtonsLayout->addSpacing(10);
300   GroupButtonsLayout->addStretch();
301   GroupButtonsLayout->addWidget(CloseButton);
302   GroupButtonsLayout->addWidget(HelpButton);
303
304   /***************************************************************/
305   // layouting
306   topLayout->addWidget(ConstructorsBox);
307   topLayout->addWidget(GroupArguments);
308   topLayout->addWidget(GroupButtons);
309
310   /***************************************************************/
311   // Initialisations
312   XSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3);
313   YSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3);
314   ZSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3);
315   AngleSpin->RangeStepAndValidator(-180.0, 180.0, 5.0, 3);
316
317   mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
318
319   mySMESHGUI->SetActiveDialogBox(this);
320
321   // Costruction of the logical filter for the elements: mesh/sub-mesh/group
322   SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
323   SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter (GROUP);
324
325   QList<SUIT_SelectionFilter*> aListOfFilters;
326   if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
327   if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
328
329   myElementsFilter = new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
330   myPathMeshFilter = new SMESH_TypeFilter (MESH);
331
332   myHelpFileName = "extrusion_along_path_page.html";
333
334   Init();
335
336   /***************************************************************/
337   // signals-slots connections
338   connect(OkButton,     SIGNAL(clicked()), this, SLOT(ClickOnOk()));
339   connect(CloseButton,  SIGNAL(clicked()), this, SLOT(reject()));
340   connect(ApplyButton,  SIGNAL(clicked()), this, SLOT(ClickOnApply()));
341   connect(HelpButton,   SIGNAL(clicked()), this, SLOT(ClickOnHelp()));
342
343   connect(AddAngleButton,    SIGNAL(clicked()), this, SLOT(OnAngleAdded()));
344   connect(RemoveAngleButton, SIGNAL(clicked()), this, SLOT(OnAngleRemoved()));
345
346   connect(GroupConstructors, SIGNAL(buttonClicked(int)), SLOT(ConstructorsClicked(int)));
347
348   connect(SelectElementsButton,   SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
349   connect(SelectPathMeshButton,   SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
350   connect(SelectPathShapeButton,  SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
351   connect(SelectStartPointButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
352   connect(SelectBasePointButton,  SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
353
354   connect(mySMESHGUI,  SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
355   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()),      this, SLOT(SelectionIntoArgument()));
356   connect(mySMESHGUI,  SIGNAL(SignalCloseAllDialogs()),        this, SLOT(reject()));
357
358   connect(ElementsLineEdit, SIGNAL(textChanged(const QString&)),
359           SLOT(onTextChange(const QString&)));
360   connect(StartPointLineEdit, SIGNAL(textChanged(const QString&)),
361           SLOT(onTextChange(const QString&)));
362
363   connect(MeshCheck,      SIGNAL(toggled(bool)), SLOT(onSelectMesh()));
364
365   AnglesList->installEventFilter(this);
366   ElementsLineEdit->installEventFilter(this);
367   StartPointLineEdit->installEventFilter(this);
368   XSpin->editor()->installEventFilter(this);
369   YSpin->editor()->installEventFilter(this);
370   ZSpin->editor()->installEventFilter(this);
371 }
372
373 //=================================================================================
374 // function : ~SMESHGUI_ExtrusionAlongPathDlg()
375 // purpose  : destructor
376 //=================================================================================
377 SMESHGUI_ExtrusionAlongPathDlg::~SMESHGUI_ExtrusionAlongPathDlg()
378 {
379   // no need to delete child widgets, Qt does it all for us
380 }
381
382 //=================================================================================
383 // function : Init()
384 // purpose  : initialization
385 //=================================================================================
386 void SMESHGUI_ExtrusionAlongPathDlg::Init (bool ResetControls)
387 {
388   myBusy = false;
389   myEditCurrentArgument = 0;
390
391   myMesh      = SMESH::SMESH_Mesh::_nil();
392   myIDSource  = SMESH::SMESH_IDSource::_nil();
393   myMeshActor = 0;
394   myPathMesh  = SMESH::SMESH_Mesh::_nil();
395   myPathShape = GEOM::GEOM_Object::_nil();
396
397   ElementsLineEdit->clear();
398   PathMeshLineEdit->clear();
399   PathShapeLineEdit->clear();
400   StartPointLineEdit->clear();
401
402   if (ResetControls) {
403     XSpin->SetValue(0.0);
404     YSpin->SetValue(0.0);
405     ZSpin->SetValue(0.0);
406
407     AngleSpin->SetValue(45);
408     MeshCheck->setChecked(false);
409     ConstructorsClicked(0);
410     onSelectMesh();
411   }
412   SetEditCurrentArgument(0);
413 }
414
415 //=================================================================================
416 // function : ConstructorsClicked()
417 // purpose  : Called when user changes type of elements (1d / 2d)
418 //=================================================================================
419 void SMESHGUI_ExtrusionAlongPathDlg::ConstructorsClicked (int type)
420 {
421   if (myType == type) return;
422
423   disconnect(mySelectionMgr, 0, this, 0);
424
425   if (type == 0)
426     GroupArguments->setTitle(tr("EXTRUSION_1D"));
427   else if (type == 1)
428     GroupArguments->setTitle(tr("EXTRUSION_2D"));
429
430   // clear elements ID list
431   if (!MeshCheck->isChecked()) {
432     ElementsLineEdit->clear();
433   }
434   // set selection mode if necessary
435   if (myEditCurrentArgument == ElementsLineEdit) {
436     mySelectionMgr->clearSelected();
437     mySelectionMgr->clearFilters();
438     SMESH::SetPickable();
439
440     SMESH::SetPointRepresentation(false);
441     if (MeshCheck->isChecked()) {
442       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
443         aViewWindow->SetSelectionMode(ActorSelection);
444       mySelectionMgr->installFilter(myElementsFilter);
445     } else {
446       if (type == 0)
447         {
448           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
449             aViewWindow->SetSelectionMode(EdgeSelection);
450         }
451       if (type == 1)
452         {
453           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
454             aViewWindow->SetSelectionMode(FaceSelection);
455         }
456     }
457   }
458   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
459
460   myType = type;
461 }
462
463 //=================================================================================
464 // function : ClickOnApply()
465 // purpose  : Called when user presses <Apply> button
466 //=================================================================================
467 bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply()
468 {
469   if (mySMESHGUI->isActiveStudyLocked())
470     return false;
471
472   if (myMesh->_is_nil() || MeshCheck->isChecked() && myIDSource->_is_nil() ||
473       !myMeshActor || myPathMesh->_is_nil() || myPathShape->_is_nil())
474     return false;
475
476   SMESH::long_array_var anElementsId = new SMESH::long_array;
477
478   if (MeshCheck->isChecked()) {
479     // If "Select whole mesh, submesh or group" check box is on ->
480     // get all elements of the required type from the object selected
481
482     // if MESH object is selected
483     if (!CORBA::is_nil(SMESH::SMESH_Mesh::_narrow(myIDSource))) {
484       // get mesh
485       SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(myIDSource);
486       // get IDs from mesh...
487       if (Elements1dRB->isChecked())
488         // 1d elements
489         anElementsId = aMesh->GetElementsByType(SMESH::EDGE);
490       else if (Elements2dRB->isChecked()) {
491         anElementsId = aMesh->GetElementsByType(SMESH::FACE);
492       }
493     }
494     // SUBMESH is selected
495     if (!CORBA::is_nil(SMESH::SMESH_subMesh::_narrow(myIDSource))) {
496       // get submesh
497       SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(myIDSource);
498       // get IDs from submesh
499       if (Elements1dRB->isChecked())
500         // 1d elements
501         anElementsId = aSubMesh->GetElementsByType(SMESH::EDGE);
502       else if (Elements2dRB->isChecked())
503         // 2d elements
504         anElementsId = aSubMesh->GetElementsByType(SMESH::FACE);
505     }
506     // GROUP is selected
507     if (!CORBA::is_nil(SMESH::SMESH_GroupBase::_narrow(myIDSource))) {
508       // get smesh group
509       SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(myIDSource);
510       // get IDs from group
511       // 1d elements or 2d elements
512       if (Elements1dRB->isChecked() && aGroup->GetType() == SMESH::EDGE ||
513           Elements2dRB->isChecked() && aGroup->GetType() == SMESH::FACE)
514         anElementsId = aGroup->GetListOfID();
515     }
516   } else {
517     // If "Select whole mesh, submesh or group" check box is off ->
518     // use only elements of given type selected by user
519
520     SMDS_Mesh* aMesh = myMeshActor->GetObject()->GetMesh();
521     if (aMesh) {
522       QStringList aListElementsId = ElementsLineEdit->text().split(" ", QString::SkipEmptyParts);
523       anElementsId = new SMESH::long_array;
524       anElementsId->length(aListElementsId.count());
525       bool bOk;
526       int j = 0;
527       for (int i = 0; i < aListElementsId.count(); i++) {
528         long ind = aListElementsId[ i ].toLong(&bOk);
529         if  (bOk) {
530           const SMDS_MeshElement* e = aMesh->FindElement(ind);
531           if (e) {
532             bool typeMatch = Elements1dRB->isChecked() && e->GetType() == SMDSAbs_Edge ||
533                              Elements2dRB->isChecked() && e->GetType() == SMDSAbs_Face;
534             if (typeMatch)
535               anElementsId[ j++ ] = ind;
536           }
537         }
538       }
539       anElementsId->length(j);
540     }
541   }
542
543   if (anElementsId->length() <= 0) {
544     return false;
545   }
546
547   if (StartPointLineEdit->text().trimmed().isEmpty()) {
548     return false;
549   }
550
551   bool bOk;
552   long aNodeStart = StartPointLineEdit->text().toLong(&bOk);
553   if (!bOk) {
554     return false;
555   }
556
557   // get angles
558   SMESH::double_array_var anAngles = new SMESH::double_array;
559   if (AnglesGrp->isChecked()) {
560     anAngles->length(AnglesList->count());
561     int j = 0;
562     bool bOk;
563     for (int i = 0; i < AnglesList->count(); i++) {
564       double angle = AnglesList->item(i)->text().toDouble(&bOk);
565       if  (bOk)
566         anAngles[ j++ ] = angle*PI/180;
567     }
568     anAngles->length(j);
569   }
570
571   // get base point
572   SMESH::PointStruct aBasePoint;
573   if (BasePointGrp->isChecked()) {
574     aBasePoint.x = XSpin->GetValue();
575     aBasePoint.y = YSpin->GetValue();
576     aBasePoint.z = ZSpin->GetValue();
577   }
578
579   try {
580     SUIT_OverrideCursor wc;
581     SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
582     SMESH::SMESH_MeshEditor::Extrusion_Error retVal;
583     if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() )
584       SMESH::ListOfGroups_var groups = 
585         aMeshEditor->ExtrusionAlongPathMakeGroups(anElementsId.inout(), myPathMesh,
586                                                   myPathShape, aNodeStart,
587                                                   AnglesGrp->isChecked(), anAngles.inout(),
588                                                   BasePointGrp->isChecked(), aBasePoint, retVal);
589     else
590       retVal = aMeshEditor->ExtrusionAlongPath(anElementsId.inout(), myPathMesh,
591                                                myPathShape, aNodeStart,
592                                                AnglesGrp->isChecked(), anAngles.inout(),
593                                                BasePointGrp->isChecked(), aBasePoint);
594
595     //wc.stop();
596     wc.suspend();
597     switch (retVal) {
598     case SMESH::SMESH_MeshEditor::EXTR_NO_ELEMENTS:
599       SUIT_MessageBox::warning(this,
600                                tr("SMESH_ERROR"),
601                                tr("NO_ELEMENTS_SELECTED"));
602       return false; break;
603     case SMESH::SMESH_MeshEditor::EXTR_PATH_NOT_EDGE:
604       SUIT_MessageBox::warning(this,
605                                tr("SMESH_ERROR"),
606                                tr("SELECTED_PATH_IS_NOT_EDGE"));
607       return false; break;
608     case SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE:
609       SUIT_MessageBox::warning(this,
610                                tr("SMESH_ERROR"),
611                                tr("BAD_SHAPE_TYPE"));
612       return false; break;
613     case SMESH::SMESH_MeshEditor::EXTR_BAD_STARTING_NODE:
614       SUIT_MessageBox::warning(this,
615                                tr("SMESH_ERROR"),
616                                tr("EXTR_BAD_STARTING_NODE"));
617       return false; break;
618     case SMESH::SMESH_MeshEditor::EXTR_BAD_ANGLES_NUMBER:
619       SUIT_MessageBox::warning(this,
620                                tr("SMESH_ERROR"),
621                                tr("WRONG_ANGLES_NUMBER"));
622       return false; break;
623     case SMESH::SMESH_MeshEditor::EXTR_CANT_GET_TANGENT:
624       SUIT_MessageBox::warning(this,
625                                tr("SMESH_ERROR"),
626                                tr("CANT_GET_TANGENT"));
627       return false; break;
628     case SMESH::SMESH_MeshEditor::EXTR_OK:
629       break;
630     }
631   } catch (...) {
632     return false;
633   }
634
635   //mySelectionMgr->clearSelected();
636   SMESH::Update( myMeshActor->getIO(), myMeshActor->GetVisibility() );
637   if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() )
638     mySMESHGUI->updateObjBrowser(true); // new groups may appear
639   //SMESH::UpdateView();
640   Init(false);
641   ConstructorsClicked(GetConstructorId());
642   return true;
643 }
644
645 //=================================================================================
646 // function : ClickOnOk()
647 // purpose  : Called when user presses <OK> button
648 //=================================================================================
649 void SMESHGUI_ExtrusionAlongPathDlg::ClickOnOk()
650 {
651   if (ClickOnApply())
652     reject();
653 }
654
655 //=================================================================================
656 // function : ClickOnHelp()
657 // purpose  :
658 //=================================================================================
659 void SMESHGUI_ExtrusionAlongPathDlg::ClickOnHelp()
660 {
661   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
662   if (app) 
663     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
664   else {
665     QString platform;
666 #ifdef WIN32
667     platform = "winapplication";
668 #else
669     platform = "application";
670 #endif
671     SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
672                              tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
673                              arg(app->resourceMgr()->stringValue("ExternalBrowser", 
674                                                                  platform)).
675                              arg(myHelpFileName));
676   }
677 }
678
679 //=================================================================================
680 // function : reject()
681 // purpose  : Called when dialog box is closed
682 //=================================================================================
683 void SMESHGUI_ExtrusionAlongPathDlg::reject()
684 {
685   disconnect(mySelectionMgr, 0, this, 0);
686   mySelectionMgr->clearFilters();
687   //mySelectionMgr->clearSelected();
688   SMESH::SetPickable(); // ???
689   SMESH::SetPointRepresentation(false);
690   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
691     aViewWindow->SetSelectionMode(ActorSelection);
692   mySMESHGUI->ResetState();
693   QDialog::reject();
694 }
695
696 //=======================================================================
697 // function : onTextChange()
698 // purpose  :
699 //=======================================================================
700 void SMESHGUI_ExtrusionAlongPathDlg::onTextChange (const QString& theNewText)
701 {
702   QLineEdit* send = (QLineEdit*)sender();
703
704   // return if busy
705   if (myBusy) return;
706
707   // set busy flag
708   SetBusy sb (this);
709
710   if (send != StartPointLineEdit && send != ElementsLineEdit)
711     send = ElementsLineEdit;
712
713   if (send == ElementsLineEdit && myEditCurrentArgument == ElementsLineEdit) {
714     // hilight entered elements
715     SMDS_Mesh* aMesh = 0;
716     if (myMeshActor)
717       aMesh = myMeshActor->GetObject()->GetMesh();
718
719     if (aMesh) {
720       //mySelectionMgr->clearSelected();
721       //mySelectionMgr->AddIObject(myMeshActor->getIO());
722       SALOME_ListIO aList;
723       aList.Append(myMeshActor->getIO());
724       mySelectionMgr->setSelectedObjects(aList, false);
725
726       QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts);
727       bool bOk;
728       const Handle(SALOME_InteractiveObject)& anIO = myMeshActor->getIO();
729       TColStd_MapOfInteger newIndices;
730       for (int i = 0; i < aListId.count(); i++) {
731         long ind = aListId[ i ].toLong(&bOk);
732         if (bOk) {
733           const SMDS_MeshElement* e = aMesh->FindElement(ind);
734           if (e) {
735             // check also type of element
736             bool typeMatch = Elements1dRB->isChecked() && e->GetType() == SMDSAbs_Edge ||
737                              Elements2dRB->isChecked() && e->GetType() == SMDSAbs_Face;
738             if (typeMatch)
739               newIndices.Add(e->GetID());
740           }
741         }
742       }
743       mySelector->AddOrRemoveIndex(anIO, newIndices, false);
744       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
745         aViewWindow->highlight( anIO, true, true );
746     }
747   } else if (send == StartPointLineEdit &&
748              myEditCurrentArgument == StartPointLineEdit) {
749     if (!myPathMesh->_is_nil()) {
750       SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
751       SMDS_Mesh* aMesh = 0;
752       if (aPathActor)
753         aMesh = aPathActor->GetObject()->GetMesh();
754       if (aMesh) {
755         //mySelectionMgr->clearSelected();
756         //mySelectionMgr->AddIObject(aPathActor->getIO());
757         SALOME_ListIO aList;
758         aList.Append(aPathActor->getIO());
759         mySelectionMgr->setSelectedObjects(aList, false);
760
761         bool bOk;
762         long ind = theNewText.toLong(&bOk);
763         if (bOk) {
764           const SMDS_MeshNode* n = aMesh->FindNode(ind);
765           if (n) {
766             //if (!mySelectionMgr->IsIndexSelected(aPathActor->getIO(), n->GetID())) {
767             TColStd_MapOfInteger newIndices;
768             newIndices.Add(n->GetID());
769             mySelector->AddOrRemoveIndex( aPathActor->getIO(), newIndices, false );
770             if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
771               aViewWindow->highlight( aPathActor->getIO(), true, true );
772           }
773         }
774       }
775     }
776   }
777 }
778
779 //=================================================================================
780 // function : SelectionIntoArgument()
781 // purpose  : Called when selection as changed or other case
782 //=================================================================================
783 void SMESHGUI_ExtrusionAlongPathDlg::SelectionIntoArgument()
784 {
785   if (myBusy) return;
786
787   // return if dialog box is inactive
788   if (!GroupButtons->isEnabled())
789     return;
790
791   // selected objects count
792   const SALOME_ListIO& aList = mySelector->StoredIObjects();
793   int nbSel = aList.Extent();
794   if (nbSel != 1)
795     return;
796
797   // set busy flag
798   SetBusy sb (this);
799
800   if (myEditCurrentArgument == ElementsLineEdit) {
801     // we are now selecting mesh elements (or whole mesh/submesh/group)
802     // reset
803     ElementsLineEdit->clear();
804     myMesh      = SMESH::SMESH_Mesh::_nil();
805     myIDSource  = SMESH::SMESH_IDSource::_nil();
806     myMeshActor = 0;
807
808     // try to get mesh from selection
809     Handle(SALOME_InteractiveObject) IO = aList.First();
810     myMesh = SMESH::GetMeshByIO(IO);
811     if (myMesh->_is_nil())
812       return;
813
814     // MakeGroups is available if there are groups
815     if ( myMesh->NbGroups() == 0 ) {
816       MakeGroupsCheck->setChecked(false);
817       MakeGroupsCheck->setEnabled(false);
818     } else {
819       MakeGroupsCheck->setEnabled(true);
820     }
821     // find actor
822     myMeshActor = SMESH::FindActorByObject(myMesh);
823     if (!myMeshActor)
824       return;
825
826     if (MeshCheck->isChecked()) {
827       // If "Select whole mesh, submesh or group" check box is on ->
828       // get ID source and put it's name to the edit box
829       QString aString;
830       SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
831
832       myIDSource = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO);
833       ElementsLineEdit->setText(aString);
834     } else {
835       // If "Select whole mesh, submesh or group" check box is off ->
836       // try to get selected elements IDs
837       QString aString;
838       //int aNbUnits = SMESH::GetNameOfSelectedElements(mySelectionMgr, aString);
839       SMESH::GetNameOfSelectedElements(mySelector, IO, aString);
840       ElementsLineEdit->setText(aString);
841     }
842   } else if (myEditCurrentArgument == PathMeshLineEdit) {
843     // we are now selecting path mesh
844     // reset
845     PathMeshLineEdit->clear();
846     myPathMesh = SMESH::SMESH_Mesh::_nil();
847     PathShapeLineEdit->clear();
848     myPathShape = GEOM::GEOM_Object::_nil();
849     StartPointLineEdit->clear();
850
851     // try to get mesh from selection
852     Handle(SALOME_InteractiveObject) IO = aList.First();
853     myPathMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO);
854     if(myPathMesh->_is_nil())
855       return;
856
857     QString aString;
858     SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
859     PathMeshLineEdit->setText(aString);
860   } else if (myEditCurrentArgument == PathShapeLineEdit) {
861     // we are now selecting path mesh
862     // reset
863     PathShapeLineEdit->clear();
864     myPathShape = GEOM::GEOM_Object::_nil();
865     StartPointLineEdit->clear();
866
867     // return if path mesh is not yet selected
868     if (myPathMesh->_is_nil())
869       return;
870
871     // try to get shape from selection
872     Handle(SALOME_InteractiveObject) IO = aList.First();
873     myPathShape = SMESH::IObjectToInterface<GEOM::GEOM_Object>(IO);
874     if (myPathShape->_is_nil())
875       return;
876
877     QString aString;
878     SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
879     PathShapeLineEdit->setText(aString);
880   } else if (myEditCurrentArgument == StartPointLineEdit) {
881     // we are now selecting start point of path
882     // reset
883     StartPointLineEdit->clear();
884
885     // return if path mesh or path shape is not yet selected
886     if (myPathMesh->_is_nil() || myPathShape->_is_nil())
887       return;
888
889     // try to get shape from selection
890     Handle(SALOME_InteractiveObject) IO = aList.First();
891
892     SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
893     if ( !aPathActor )
894       return;
895     
896     QString aString;
897     int aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, aPathActor->getIO(), aString);
898     if (aNbUnits == 1)
899       StartPointLineEdit->setText(aString.trimmed());
900
901   } else if (myEditCurrentArgument == XSpin) {
902     // we are now selecting base point
903     // reset is not performed here!
904
905     // return if is not enabled
906     if (!BasePointGrp->isChecked())
907       return;
908
909     // try to get shape from selection
910     Handle(SALOME_InteractiveObject) IO = aList.First();
911
912     // check if geom vertex is selected
913     GEOM::GEOM_Object_var aGeomObj = SMESH::IObjectToInterface<GEOM::GEOM_Object>(IO);
914     TopoDS_Vertex aVertex;
915     if (!aGeomObj->_is_nil()) {
916       if (aGeomObj->IsShape() && GEOMBase::GetShape(aGeomObj, aVertex) && !aVertex.IsNull()) {
917         gp_Pnt aPnt = BRep_Tool::Pnt(aVertex);
918         XSpin->SetValue(aPnt.X());
919         YSpin->SetValue(aPnt.Y());
920         ZSpin->SetValue(aPnt.Z());
921       }
922       return;
923     }
924
925     // check if smesh node is selected
926     SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(IO);
927     if (aMesh->_is_nil())
928       return;
929
930     QString aString;
931     int aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, myMeshActor->getIO(), aString);
932     // return if more than one node is selected
933     if (aNbUnits != 1)
934       return;
935
936     SMESH_Actor* aMeshActor = SMESH::FindActorByObject(aMesh);
937     if (!aMeshActor)
938       return;
939
940     SMDS_Mesh* mesh = aMeshActor->GetObject()->GetMesh();
941     if (!mesh)
942       return;
943
944     const SMDS_MeshNode* n = mesh->FindNode(aString.toLong());
945     if (!n)
946       return;
947
948     XSpin->SetValue(n->X());
949     YSpin->SetValue(n->Y());
950     ZSpin->SetValue(n->Z());
951   }
952 }
953
954 //=================================================================================
955 // function : SetEditCurrentArgument()
956 // purpose  :
957 //=================================================================================
958 void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument()
959 {
960   QToolButton* send = (QToolButton*)sender();
961   if (send != SelectElementsButton   &&
962       send != SelectPathMeshButton   &&
963       send != SelectPathShapeButton  &&
964       send != SelectStartPointButton &&
965       send != SelectBasePointButton)
966     return;
967   SetEditCurrentArgument(send);
968 }
969
970 //=================================================================================
971 // function : SetEditCurrentArgument()
972 // purpose  :
973 //=================================================================================
974 void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument (QToolButton* button)
975 {
976   disconnect(mySelectionMgr, 0, this, 0);
977   mySelectionMgr->clearSelected();
978   mySelectionMgr->clearFilters();
979   SMESH::SetPickable();
980
981   if (button == SelectElementsButton) {
982     myEditCurrentArgument = ElementsLineEdit;
983     SMESH::SetPointRepresentation(false);
984     if (MeshCheck->isChecked()) {
985       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
986         aViewWindow->SetSelectionMode(ActorSelection);
987       mySelectionMgr->installFilter(myElementsFilter);
988     } else {
989       if (Elements1dRB->isChecked())
990         {
991           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
992             aViewWindow->SetSelectionMode(EdgeSelection);
993         }
994       else if (Elements2dRB->isChecked())
995         {
996           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
997             aViewWindow->SetSelectionMode(FaceSelection);
998         }
999     }
1000   } else if (button == SelectPathMeshButton) {
1001     myEditCurrentArgument = PathMeshLineEdit;
1002     SMESH::SetPointRepresentation(false);
1003     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1004       aViewWindow->SetSelectionMode(ActorSelection);
1005     mySelectionMgr->installFilter(myPathMeshFilter);
1006   }
1007   else if (button == SelectPathShapeButton) {
1008     myEditCurrentArgument = PathShapeLineEdit;
1009     SMESH::SetPointRepresentation(false);
1010     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1011       aViewWindow->SetSelectionMode(ActorSelection);
1012
1013     if (!myPathMesh->_is_nil()) {
1014       GEOM::GEOM_Object_var aMainShape = myPathMesh->GetShapeToMesh();
1015       SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
1016
1017       if (!aMainShape->_is_nil() && aPathActor)
1018         mySelectionMgr->installFilter(new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE, -1,
1019                                                               TopAbs_EDGE, aMainShape));
1020         //SMESH::SetPickable(aPathActor);
1021     }
1022   }
1023   else if (button == SelectStartPointButton) {
1024     myEditCurrentArgument = StartPointLineEdit;
1025     if (!myPathMesh->_is_nil()) {
1026       SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
1027       if (aPathActor) {
1028         SMESH::SetPointRepresentation(true);
1029         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1030           aViewWindow->SetSelectionMode(NodeSelection);
1031         SMESH::SetPickable(aPathActor);
1032       }
1033     }
1034   }
1035   else if (button == SelectBasePointButton) {
1036     myEditCurrentArgument = XSpin;
1037     SMESH::SetPointRepresentation(true);
1038     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1039       aViewWindow->SetSelectionMode(NodeSelection);
1040
1041     SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter(MESHorSUBMESH);
1042     SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter(GROUP);
1043     SMESH_NumberFilter* aVertexFilter      = new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE,
1044                                                                      -1, TopAbs_VERTEX);
1045     QList<SUIT_SelectionFilter*> aListOfFilters;
1046     if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
1047     if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
1048     if (aVertexFilter)        aListOfFilters.append(aVertexFilter);
1049
1050     mySelectionMgr->installFilter(new SMESH_LogicalFilter
1051                                   (aListOfFilters, SMESH_LogicalFilter::LO_OR));
1052   }
1053
1054   if (myEditCurrentArgument && !myEditCurrentArgument->hasFocus())
1055     myEditCurrentArgument->setFocus();
1056
1057   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
1058   SelectionIntoArgument();
1059 }
1060
1061 //=================================================================================
1062 // function : DeactivateActiveDialog()
1063 // purpose  : Deactivates this dialog
1064 //=================================================================================
1065 void SMESHGUI_ExtrusionAlongPathDlg::DeactivateActiveDialog()
1066 {
1067   if (ConstructorsBox->isEnabled()) {
1068     ConstructorsBox->setEnabled(false);
1069     GroupArguments->setEnabled(false);
1070     GroupButtons->setEnabled(false);
1071     mySMESHGUI->ResetState();
1072     mySMESHGUI->SetActiveDialogBox(0);
1073   }
1074 }
1075
1076 //=================================================================================
1077 // function : ActivateThisDialog()
1078 // purpose  : Activates this dialog
1079 //=================================================================================
1080 void SMESHGUI_ExtrusionAlongPathDlg::ActivateThisDialog()
1081 {
1082   // Emit a signal to deactivate the active dialog
1083   mySMESHGUI->EmitSignalDeactivateDialog();
1084   ConstructorsBox->setEnabled(true);
1085   GroupArguments->setEnabled(true);
1086   GroupButtons->setEnabled(true);
1087
1088   mySMESHGUI->SetActiveDialogBox(this);
1089
1090   ConstructorsClicked(GetConstructorId());
1091   SelectionIntoArgument();
1092 }
1093
1094 //=================================================================================
1095 // function : enterEvent()
1096 // purpose  : Mouse enter event
1097 //=================================================================================
1098 void SMESHGUI_ExtrusionAlongPathDlg::enterEvent (QEvent*)
1099 {
1100   if (!ConstructorsBox->isEnabled())
1101     ActivateThisDialog();
1102 }
1103
1104 //=======================================================================
1105 // function : onSelectMesh()
1106 // purpose  :
1107 //=======================================================================
1108 void SMESHGUI_ExtrusionAlongPathDlg::onSelectMesh()
1109 {
1110   bool toSelectMesh = MeshCheck->isChecked();
1111
1112   ElementsLineEdit->setReadOnly(toSelectMesh);
1113   ElementsLab->setText(toSelectMesh ? tr("SMESH_NAME") : tr("SMESH_ID_ELEMENTS"));
1114   ElementsLineEdit->clear();
1115
1116   SetEditCurrentArgument(SelectElementsButton);
1117 }
1118
1119 //=================================================================================
1120 // function : GetConstructorId()
1121 // purpose  :
1122 //=================================================================================
1123 int SMESHGUI_ExtrusionAlongPathDlg::GetConstructorId()
1124 {
1125   return GroupConstructors->checkedId();
1126 }
1127
1128 //=======================================================================
1129 // function : OnAngleAdded()
1130 // purpose  : Called when user adds angle to the list
1131 //=======================================================================
1132 void SMESHGUI_ExtrusionAlongPathDlg::OnAngleAdded()
1133 {
1134   AnglesList->addItem(QString::number(AngleSpin->GetValue()));
1135 }
1136
1137 //=======================================================================
1138 // function : OnAngleRemoved()
1139 // purpose  : Called when user removes angle(s) from the list
1140 //=======================================================================
1141 void SMESHGUI_ExtrusionAlongPathDlg::OnAngleRemoved()
1142 {
1143   QList<QListWidgetItem*> aList = AnglesList->selectedItems();
1144   QListWidgetItem* anItem;
1145   foreach(anItem, aList) delete anItem;
1146 }
1147
1148 //=================================================================================
1149 // function : eventFilter()
1150 // purpose  : event filter ???
1151 //=================================================================================
1152 bool SMESHGUI_ExtrusionAlongPathDlg::eventFilter (QObject* object, QEvent* event)
1153 {
1154   if (event->type() == QEvent::KeyPress) {
1155     QKeyEvent* ke = (QKeyEvent*)event;
1156     if (object == AnglesList) {
1157       if (ke->key() == Qt::Key_Delete)
1158         OnAngleRemoved();
1159     }
1160   }
1161   else if (event->type() == QEvent::FocusIn) {
1162     if (object == ElementsLineEdit) {
1163       if (myEditCurrentArgument != ElementsLineEdit)
1164         SetEditCurrentArgument(SelectElementsButton);
1165     }
1166     else if (object == StartPointLineEdit) {
1167       if (myEditCurrentArgument != StartPointLineEdit)
1168         SetEditCurrentArgument(SelectStartPointButton);
1169     }
1170     else if (object == XSpin->editor() || object == YSpin->editor() || object == ZSpin->editor()) {
1171       if (myEditCurrentArgument != XSpin)
1172         SetEditCurrentArgument(SelectBasePointButton);
1173     }
1174   }
1175   return QDialog::eventFilter(object, event);
1176 }
1177
1178 //=================================================================================
1179 // function : keyPressEvent()
1180 // purpose  :
1181 //=================================================================================
1182 void SMESHGUI_ExtrusionAlongPathDlg::keyPressEvent( QKeyEvent* e )
1183 {
1184   QDialog::keyPressEvent( e );
1185   if ( e->isAccepted() )
1186     return;
1187
1188   if ( e->key() == Qt::Key_F1 ) {
1189     e->accept();
1190     ClickOnHelp();
1191   }
1192 }