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