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