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