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