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