Salome HOME
Join modifications from BR_Dev_For_4_0 tag V4_1_1.
[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_path_page.html";
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                 QString platform;
697 #ifdef WIN32
698                 platform = "winapplication";
699 #else
700                 platform = "application";
701 #endif
702     SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
703                            QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
704                            arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(myHelpFileName),
705                            QObject::tr("BUT_OK"));
706   }
707 }
708
709 //=================================================================================
710 // function : reject()
711 // purpose  : Called when dialog box is closed
712 //=================================================================================
713 void SMESHGUI_ExtrusionAlongPathDlg::reject()
714 {
715   disconnect(mySelectionMgr, 0, this, 0);
716   mySelectionMgr->clearFilters();
717   //mySelectionMgr->clearSelected();
718   SMESH::SetPickable(); // ???
719   SMESH::SetPointRepresentation(false);
720   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
721     aViewWindow->SetSelectionMode(ActorSelection);
722   mySMESHGUI->ResetState();
723   QDialog::reject();
724 }
725
726 //=======================================================================
727 // function : onTextChange()
728 // purpose  :
729 //=======================================================================
730 void SMESHGUI_ExtrusionAlongPathDlg::onTextChange (const QString& theNewText)
731 {
732   QLineEdit* send = (QLineEdit*)sender();
733
734   // return if busy
735   if (myBusy) return;
736
737   // set busy flag
738   SetBusy sb (this);
739
740   if (send != StartPointLineEdit && send != ElementsLineEdit)
741     send = ElementsLineEdit;
742
743   if (send == ElementsLineEdit && myEditCurrentArgument == ElementsLineEdit) {
744     // hilight entered elements
745     SMDS_Mesh* aMesh = 0;
746     if (myMeshActor)
747       aMesh = myMeshActor->GetObject()->GetMesh();
748
749     if (aMesh) {
750       //mySelectionMgr->clearSelected();
751       //mySelectionMgr->AddIObject(myMeshActor->getIO());
752       SALOME_ListIO aList;
753       aList.Append(myMeshActor->getIO());
754       mySelectionMgr->setSelectedObjects(aList, false);
755
756       QStringList aListId = QStringList::split(" ", theNewText, false);
757       bool bOk;
758       const Handle(SALOME_InteractiveObject)& anIO = myMeshActor->getIO();
759       TColStd_MapOfInteger newIndices;
760       for (int i = 0; i < aListId.count(); i++) {
761         long ind = aListId[ i ].toLong(&bOk);
762         if (bOk) {
763           const SMDS_MeshElement* e = aMesh->FindElement(ind);
764           if (e) {
765             // check also type of element
766             bool typeMatch = Elements1dRB->isChecked() && e->GetType() == SMDSAbs_Edge ||
767                              Elements2dRB->isChecked() && e->GetType() == SMDSAbs_Face;
768             if (typeMatch)
769               newIndices.Add(e->GetID());
770           }
771         }
772       }
773       mySelector->AddOrRemoveIndex(anIO, newIndices, false);
774       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
775         aViewWindow->highlight( anIO, true, true );
776     }
777   } else if (send == StartPointLineEdit &&
778              myEditCurrentArgument == StartPointLineEdit) {
779     if (!myPathMesh->_is_nil()) {
780       SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
781       SMDS_Mesh* aMesh = 0;
782       if (aPathActor)
783         aMesh = aPathActor->GetObject()->GetMesh();
784       if (aMesh) {
785         //mySelectionMgr->clearSelected();
786         //mySelectionMgr->AddIObject(aPathActor->getIO());
787         SALOME_ListIO aList;
788         aList.Append(aPathActor->getIO());
789         mySelectionMgr->setSelectedObjects(aList, false);
790
791         bool bOk;
792         long ind = theNewText.toLong(&bOk);
793         if (bOk) {
794           const SMDS_MeshNode* n = aMesh->FindNode(ind);
795           if (n) {
796             //if (!mySelectionMgr->IsIndexSelected(aPathActor->getIO(), n->GetID())) {
797             TColStd_MapOfInteger newIndices;
798             newIndices.Add(n->GetID());
799             mySelector->AddOrRemoveIndex( aPathActor->getIO(), newIndices, false );
800             if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
801               aViewWindow->highlight( aPathActor->getIO(), true, true );
802           }
803         }
804       }
805     }
806   }
807 }
808
809 //=================================================================================
810 // function : SelectionIntoArgument()
811 // purpose  : Called when selection as changed or other case
812 //=================================================================================
813 void SMESHGUI_ExtrusionAlongPathDlg::SelectionIntoArgument()
814 {
815   if (myBusy) return;
816
817   // return if dialog box is inactive
818   if (!GroupButtons->isEnabled())
819     return;
820
821   // selected objects count
822   const SALOME_ListIO& aList = mySelector->StoredIObjects();
823   int nbSel = aList.Extent();
824   if (nbSel != 1)
825     return;
826
827   // set busy flag
828   SetBusy sb (this);
829
830   if (myEditCurrentArgument == ElementsLineEdit) {
831     // we are now selecting mesh elements (or whole mesh/submesh/group)
832     // reset
833     ElementsLineEdit->clear();
834     myMesh      = SMESH::SMESH_Mesh::_nil();
835     myIDSource  = SMESH::SMESH_IDSource::_nil();
836     myMeshActor = 0;
837
838     // try to get mesh from selection
839     Handle(SALOME_InteractiveObject) IO = aList.First();
840     myMesh = SMESH::GetMeshByIO(IO);
841     if (myMesh->_is_nil())
842       return;
843
844     // MakeGroups is available if there are groups
845     if ( myMesh->NbGroups() == 0 ) {
846       MakeGroupsCheck->setChecked(false);
847       MakeGroupsCheck->setEnabled(false);
848     } else {
849       MakeGroupsCheck->setEnabled(true);
850     }
851     // find actor
852     myMeshActor = SMESH::FindActorByObject(myMesh);
853     if (!myMeshActor)
854       return;
855
856     if (MeshCheck->isChecked()) {
857       // If "Select whole mesh, submesh or group" check box is on ->
858       // get ID source and put it's name to the edit box
859       QString aString;
860       SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
861
862       myIDSource = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO);
863       ElementsLineEdit->setText(aString);
864     } else {
865       // If "Select whole mesh, submesh or group" check box is off ->
866       // try to get selected elements IDs
867       QString aString;
868       //int aNbUnits = SMESH::GetNameOfSelectedElements(mySelectionMgr, aString);
869       SMESH::GetNameOfSelectedElements(mySelector, IO, aString);
870       ElementsLineEdit->setText(aString);
871     }
872   } else if (myEditCurrentArgument == PathMeshLineEdit) {
873     // we are now selecting path mesh
874     // reset
875     PathMeshLineEdit->clear();
876     myPathMesh = SMESH::SMESH_Mesh::_nil();
877     PathShapeLineEdit->clear();
878     myPathShape = GEOM::GEOM_Object::_nil();
879     StartPointLineEdit->clear();
880
881     // try to get mesh from selection
882     Handle(SALOME_InteractiveObject) IO = aList.First();
883     myPathMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO);
884     if(myPathMesh->_is_nil())
885       return;
886
887     QString aString;
888     SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
889     PathMeshLineEdit->setText(aString);
890   } else if (myEditCurrentArgument == PathShapeLineEdit) {
891     // we are now selecting path mesh
892     // reset
893     PathShapeLineEdit->clear();
894     myPathShape = GEOM::GEOM_Object::_nil();
895     StartPointLineEdit->clear();
896
897     // return if path mesh is not yet selected
898     if (myPathMesh->_is_nil())
899       return;
900
901     // try to get shape from selection
902     Handle(SALOME_InteractiveObject) IO = aList.First();
903     myPathShape = SMESH::IObjectToInterface<GEOM::GEOM_Object>(IO);
904     if (myPathShape->_is_nil())
905       return;
906
907     QString aString;
908     SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
909     PathShapeLineEdit->setText(aString);
910   } else if (myEditCurrentArgument == StartPointLineEdit) {
911     // we are now selecting start point of path
912     // reset
913     StartPointLineEdit->clear();
914
915     // return if path mesh or path shape is not yet selected
916     if (myPathMesh->_is_nil() || myPathShape->_is_nil())
917       return;
918
919     // try to get shape from selection
920     Handle(SALOME_InteractiveObject) IO = aList.First();
921
922     SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
923     if ( !aPathActor )
924       return;
925     
926     QString aString;
927     int aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, aPathActor->getIO(), aString);
928     if (aNbUnits == 1)
929       StartPointLineEdit->setText(aString.stripWhiteSpace());
930
931   } else if (myEditCurrentArgument == XSpin) {
932     // we are now selecting base point
933     // reset is not performed here!
934
935     // return if is not enabled
936     if (!BasePointGrp->isEnabled())
937       return;
938
939     // try to get shape from selection
940     Handle(SALOME_InteractiveObject) IO = aList.First();
941
942     // check if geom vertex is selected
943     GEOM::GEOM_Object_var aGeomObj = SMESH::IObjectToInterface<GEOM::GEOM_Object>(IO);
944     TopoDS_Vertex aVertex;
945     if (!aGeomObj->_is_nil()) {
946       if (aGeomObj->IsShape() && GEOMBase::GetShape(aGeomObj, aVertex) && !aVertex.IsNull()) {
947         gp_Pnt aPnt = BRep_Tool::Pnt(aVertex);
948         XSpin->SetValue(aPnt.X());
949         YSpin->SetValue(aPnt.Y());
950         ZSpin->SetValue(aPnt.Z());
951       }
952       return;
953     }
954
955     // check if smesh node is selected
956     SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(IO);
957     if (aMesh->_is_nil())
958       return;
959
960     QString aString;
961     int aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, myMeshActor->getIO(), aString);
962     // return if more than one node is selected
963     if (aNbUnits != 1)
964       return;
965
966     SMESH_Actor* aMeshActor = SMESH::FindActorByObject(aMesh);
967     if (!aMeshActor)
968       return;
969
970     SMDS_Mesh* mesh = aMeshActor->GetObject()->GetMesh();
971     if (!mesh)
972       return;
973
974     const SMDS_MeshNode* n = mesh->FindNode(aString.toLong());
975     if (!n)
976       return;
977
978     XSpin->SetValue(n->X());
979     YSpin->SetValue(n->Y());
980     ZSpin->SetValue(n->Z());
981   }
982 }
983
984 //=================================================================================
985 // function : SetEditCurrentArgument()
986 // purpose  :
987 //=================================================================================
988 void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument()
989 {
990   QToolButton* send = (QToolButton*)sender();
991   if (send != SelectElementsButton   &&
992       send != SelectPathMeshButton   &&
993       send != SelectPathShapeButton  &&
994       send != SelectStartPointButton &&
995       send != SelectBasePointButton)
996     return;
997   SetEditCurrentArgument(send);
998 }
999
1000 //=================================================================================
1001 // function : SetEditCurrentArgument()
1002 // purpose  :
1003 //=================================================================================
1004 void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument (QToolButton* button)
1005 {
1006   disconnect(mySelectionMgr, 0, this, 0);
1007   mySelectionMgr->clearSelected();
1008   mySelectionMgr->clearFilters();
1009   SMESH::SetPickable();
1010
1011   if (button == SelectElementsButton) {
1012     myEditCurrentArgument = ElementsLineEdit;
1013     SMESH::SetPointRepresentation(false);
1014     if (MeshCheck->isChecked()) {
1015       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1016         aViewWindow->SetSelectionMode(ActorSelection);
1017       mySelectionMgr->installFilter(myElementsFilter);
1018     } else {
1019       if (Elements1dRB->isChecked())
1020         {
1021           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1022             aViewWindow->SetSelectionMode(EdgeSelection);
1023         }
1024       else if (Elements2dRB->isChecked())
1025         {
1026           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1027             aViewWindow->SetSelectionMode(FaceSelection);
1028         }
1029     }
1030   } else if (button == SelectPathMeshButton) {
1031     myEditCurrentArgument = PathMeshLineEdit;
1032     SMESH::SetPointRepresentation(false);
1033     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1034       aViewWindow->SetSelectionMode(ActorSelection);
1035     mySelectionMgr->installFilter(myPathMeshFilter);
1036   }
1037   else if (button == SelectPathShapeButton) {
1038     myEditCurrentArgument = PathShapeLineEdit;
1039     SMESH::SetPointRepresentation(false);
1040     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1041       aViewWindow->SetSelectionMode(ActorSelection);
1042
1043     if (!myPathMesh->_is_nil()) {
1044       GEOM::GEOM_Object_var aMainShape = myPathMesh->GetShapeToMesh();
1045       SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
1046
1047       if (!aMainShape->_is_nil() && aPathActor)
1048         mySelectionMgr->installFilter(new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE, -1,
1049                                                               TopAbs_EDGE, aMainShape));
1050         //SMESH::SetPickable(aPathActor);
1051     }
1052   }
1053   else if (button == SelectStartPointButton) {
1054     myEditCurrentArgument = StartPointLineEdit;
1055     if (!myPathMesh->_is_nil()) {
1056       SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
1057       if (aPathActor) {
1058         SMESH::SetPointRepresentation(true);
1059         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1060           aViewWindow->SetSelectionMode(NodeSelection);
1061         SMESH::SetPickable(aPathActor);
1062       }
1063     }
1064   }
1065   else if (button == SelectBasePointButton) {
1066     myEditCurrentArgument = XSpin;
1067     SMESH::SetPointRepresentation(true);
1068     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1069       aViewWindow->SetSelectionMode(NodeSelection);
1070
1071     SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter(MESHorSUBMESH);
1072     SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter(GROUP);
1073     SMESH_NumberFilter* aVertexFilter      = new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE,
1074                                                                      -1, TopAbs_VERTEX);
1075     QPtrList<SUIT_SelectionFilter> aListOfFilters;
1076     if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
1077     if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
1078     if (aVertexFilter)        aListOfFilters.append(aVertexFilter);
1079
1080     mySelectionMgr->installFilter(new SMESH_LogicalFilter
1081                                   (aListOfFilters, SMESH_LogicalFilter::LO_OR));
1082   }
1083
1084   if (myEditCurrentArgument && !myEditCurrentArgument->hasFocus())
1085     myEditCurrentArgument->setFocus();
1086
1087   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
1088   SelectionIntoArgument();
1089 }
1090
1091 //=================================================================================
1092 // function : DeactivateActiveDialog()
1093 // purpose  : Deactivates this dialog
1094 //=================================================================================
1095 void SMESHGUI_ExtrusionAlongPathDlg::DeactivateActiveDialog()
1096 {
1097   if (GroupConstructors->isEnabled()) {
1098     GroupConstructors->setEnabled(false);
1099     GroupArguments->setEnabled(false);
1100     GroupButtons->setEnabled(false);
1101     mySMESHGUI->ResetState();
1102     mySMESHGUI->SetActiveDialogBox(0);
1103   }
1104 }
1105
1106 //=================================================================================
1107 // function : ActivateThisDialog()
1108 // purpose  : Activates this dialog
1109 //=================================================================================
1110 void SMESHGUI_ExtrusionAlongPathDlg::ActivateThisDialog()
1111 {
1112   // Emit a signal to deactivate the active dialog
1113   mySMESHGUI->EmitSignalDeactivateDialog();
1114   GroupConstructors->setEnabled(true);
1115   GroupArguments->setEnabled(true);
1116   GroupButtons->setEnabled(true);
1117
1118   mySMESHGUI->SetActiveDialogBox(this);
1119
1120   ConstructorsClicked(GetConstructorId());
1121   SelectionIntoArgument();
1122 }
1123
1124 //=================================================================================
1125 // function : enterEvent()
1126 // purpose  : Mouse enter event
1127 //=================================================================================
1128 void SMESHGUI_ExtrusionAlongPathDlg::enterEvent (QEvent*)
1129 {
1130   if (!GroupConstructors->isEnabled())
1131     ActivateThisDialog();
1132 }
1133
1134 //=======================================================================
1135 // function : onSelectMesh()
1136 // purpose  :
1137 //=======================================================================
1138 void SMESHGUI_ExtrusionAlongPathDlg::onSelectMesh()
1139 {
1140   bool toSelectMesh = MeshCheck->isChecked();
1141
1142   ElementsLineEdit->setReadOnly(toSelectMesh);
1143   ElementsLab->setText(toSelectMesh ? tr("SMESH_NAME") : tr("SMESH_ID_ELEMENTS"));
1144   ElementsLineEdit->clear();
1145
1146   SetEditCurrentArgument(SelectElementsButton);
1147 }
1148
1149 //=================================================================================
1150 // function : GetConstructorId()
1151 // purpose  :
1152 //=================================================================================
1153 int SMESHGUI_ExtrusionAlongPathDlg::GetConstructorId()
1154 {
1155   if (GroupConstructors != NULL && GroupConstructors->selected() != NULL)
1156     return GroupConstructors->id(GroupConstructors->selected());
1157   return -1;
1158 }
1159
1160 //=======================================================================
1161 // function : onAnglesCheck()
1162 // purpose  : called when "Use Angles" check box is switched
1163 //=======================================================================
1164 void SMESHGUI_ExtrusionAlongPathDlg::onAnglesCheck()
1165 {
1166   AnglesGrp->setEnabled(AnglesCheck->isChecked());
1167 }
1168
1169 //=======================================================================
1170 // function : onBasePointCheck()
1171 // purpose  : called when "Use Base Point" check box is switched
1172 //=======================================================================
1173 void SMESHGUI_ExtrusionAlongPathDlg::onBasePointCheck()
1174 {
1175   BasePointGrp->setEnabled(BasePointCheck->isChecked());
1176 }
1177
1178 //=======================================================================
1179 // function : OnAngleAdded()
1180 // purpose  : Called when user adds angle to the list
1181 //=======================================================================
1182 void SMESHGUI_ExtrusionAlongPathDlg::OnAngleAdded()
1183 {
1184   AnglesList->insertItem(QString::number(AngleSpin->GetValue()));
1185 }
1186
1187 //=======================================================================
1188 // function : OnAngleRemoved()
1189 // purpose  : Called when user removes angle(s) from the list
1190 //=======================================================================
1191 void SMESHGUI_ExtrusionAlongPathDlg::OnAngleRemoved()
1192 {
1193   QList<QListBoxItem> aList;
1194   aList.setAutoDelete(false);
1195   for (int i = 0; i < AnglesList->count(); i++)
1196     if (AnglesList->isSelected(i))
1197       aList.append(AnglesList->item(i));
1198
1199   for (int i = 0; i < aList.count(); i++)
1200     delete aList.at(i);
1201 }
1202
1203 //=================================================================================
1204 // function : eventFilter()
1205 // purpose  : event filter ???
1206 //=================================================================================
1207 bool SMESHGUI_ExtrusionAlongPathDlg::eventFilter (QObject* object, QEvent* event)
1208 {
1209   if (event->type() == QEvent::KeyPress) {
1210     QKeyEvent* ke = (QKeyEvent*)event;
1211     if (object == AnglesList) {
1212       if (ke->key() == Key_Delete)
1213         OnAngleRemoved();
1214     }
1215   }
1216   else if (event->type() == QEvent::FocusIn) {
1217     if (object == ElementsLineEdit) {
1218       if (myEditCurrentArgument != ElementsLineEdit)
1219         SetEditCurrentArgument(SelectElementsButton);
1220     }
1221     else if (object == StartPointLineEdit) {
1222       if (myEditCurrentArgument != StartPointLineEdit)
1223         SetEditCurrentArgument(SelectStartPointButton);
1224     }
1225     else if (object == XSpin->editor() || object == YSpin->editor() || object == ZSpin->editor()) {
1226       if (myEditCurrentArgument != XSpin)
1227         SetEditCurrentArgument(SelectBasePointButton);
1228     }
1229   }
1230   return QDialog::eventFilter(object, event);
1231 }
1232
1233 //=================================================================================
1234 // function : keyPressEvent()
1235 // purpose  :
1236 //=================================================================================
1237 void SMESHGUI_ExtrusionAlongPathDlg::keyPressEvent( QKeyEvent* e )
1238 {
1239   QDialog::keyPressEvent( e );
1240   if ( e->isAccepted() )
1241     return;
1242
1243   if ( e->key() == Key_F1 )
1244     {
1245       e->accept();
1246       ClickOnHelp();
1247     }
1248 }