Salome HOME
46222594ed97e7242cc0c7d3c3bd6ad8bdbb440a
[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      myViewWindow( SMESH::GetViewWindow( theModule ) ),
102      mySelector( myViewWindow->GetSelector() )
103 {
104   QPixmap edgeImage   (SMESHGUI::resourceMgr()->loadPixmap("SMESH", tr("ICON_DLG_EDGE")));
105   QPixmap faceImage   (SMESHGUI::resourceMgr()->loadPixmap("SMESH", tr("ICON_DLG_TRIANGLE")));
106   QPixmap selectImage (SMESHGUI::resourceMgr()->loadPixmap("SMESH", tr("ICON_SELECT")));
107   QPixmap addImage    (SMESHGUI::resourceMgr()->loadPixmap("SMESH", tr("ICON_APPEND")));
108   QPixmap removeImage (SMESHGUI::resourceMgr()->loadPixmap("SMESH", tr("ICON_REMOVE")));
109
110   myType = -1;
111
112   setCaption(tr("EXTRUSION_ALONG_PATH"));
113   setSizeGripEnabled(TRUE);
114
115   QGridLayout* topLayout = new QGridLayout(this);
116   topLayout->setSpacing(6);
117   topLayout->setMargin(11);
118
119   /***************************************************************/
120   // Elements type group box (1d / 2d elements)
121   GroupConstructors = new QButtonGroup(tr("SMESH_EXTRUSION"), this);
122   GroupConstructors->setColumnLayout(0, Qt::Vertical);
123   GroupConstructors->layout()->setSpacing(0);
124   GroupConstructors->layout()->setMargin(0);
125   QGridLayout* GroupConstructorsLayout = new QGridLayout(GroupConstructors->layout());
126   GroupConstructorsLayout->setAlignment(Qt::AlignTop);
127   GroupConstructorsLayout->setSpacing(6); GroupConstructorsLayout->setMargin(11);
128
129   Elements1dRB = new QRadioButton(GroupConstructors);
130   Elements1dRB->setPixmap(edgeImage);
131   Elements2dRB = new QRadioButton(GroupConstructors);
132   Elements2dRB->setPixmap(faceImage);
133   Elements1dRB->setChecked(true);
134
135   // layouting
136   GroupConstructorsLayout->addWidget(Elements1dRB, 0, 0);
137   GroupConstructorsLayout->addWidget(Elements2dRB, 0, 2);
138
139   /***************************************************************/
140   // Arguments group box
141   GroupArguments = new QGroupBox(tr("EXTRUSION_1D"), this);
142   GroupArguments->setColumnLayout(0, Qt::Vertical);
143   GroupArguments->layout()->setSpacing(0); GroupArguments->layout()->setMargin(0);
144   QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments->layout());
145   GroupArgumentsLayout->setAlignment(Qt::AlignTop);
146   GroupArgumentsLayout->setSpacing(6); GroupArgumentsLayout->setMargin(11);
147
148   // Controls for elements selection
149   ElementsLab = new QLabel(tr("SMESH_ID_ELEMENTS"), GroupArguments);
150
151   SelectElementsButton = new QToolButton(GroupArguments);
152   SelectElementsButton->setPixmap(selectImage);
153
154   ElementsLineEdit = new QLineEdit(GroupArguments);
155   ElementsLineEdit->setValidator(new SMESHGUI_IdValidator(this));
156
157   // Controls for the whole mesh selection
158   MeshCheck = new QCheckBox(tr("SMESH_SELECT_WHOLE_MESH"), GroupArguments);
159
160   // Controls for path selection
161   PathGrp = new QGroupBox(tr("SMESH_PATH"), GroupArguments);
162   PathGrp->setColumnLayout(0, Qt::Vertical);
163   PathGrp->layout()->setSpacing(0); PathGrp->layout()->setMargin(0);
164   QGridLayout* PathGrpLayout = new QGridLayout(PathGrp->layout());
165   PathGrpLayout->setAlignment(Qt::AlignTop);
166   PathGrpLayout->setSpacing(6); PathGrpLayout->setMargin(11);
167
168   // Controls for path mesh selection
169   PathMeshLab = new QLabel(tr("SMESH_PATH_MESH"), PathGrp);
170
171   SelectPathMeshButton = new QToolButton(PathGrp);
172   SelectPathMeshButton->setPixmap(selectImage);
173
174   PathMeshLineEdit = new QLineEdit(PathGrp);
175   PathMeshLineEdit->setReadOnly(true);
176
177   // Controls for path shape selection
178   PathShapeLab = new QLabel(tr("SMESH_PATH_SHAPE"), PathGrp);
179
180   SelectPathShapeButton = new QToolButton(PathGrp);
181   SelectPathShapeButton->setPixmap(selectImage);
182
183   PathShapeLineEdit = new QLineEdit(PathGrp);
184   PathShapeLineEdit->setReadOnly(true);
185
186   // Controls for path starting point selection
187   StartPointLab = new QLabel(tr("SMESH_PATH_START"), PathGrp);
188
189   SelectStartPointButton = new QToolButton(PathGrp);
190   SelectStartPointButton->setPixmap(selectImage);
191
192   StartPointLineEdit = new QLineEdit(PathGrp);
193   StartPointLineEdit->setValidator(new QIntValidator(this));
194
195   // layouting
196   PathGrpLayout->addWidget(PathMeshLab,            0, 0);
197   PathGrpLayout->addWidget(SelectPathMeshButton,   0, 1);
198   PathGrpLayout->addWidget(PathMeshLineEdit,       0, 2);
199   PathGrpLayout->addWidget(PathShapeLab,           1, 0);
200   PathGrpLayout->addWidget(SelectPathShapeButton,  1, 1);
201   PathGrpLayout->addWidget(PathShapeLineEdit,      1, 2);
202   PathGrpLayout->addWidget(StartPointLab,          2, 0);
203   PathGrpLayout->addWidget(SelectStartPointButton, 2, 1);
204   PathGrpLayout->addWidget(StartPointLineEdit,     2, 2);
205
206   // Controls for base point defining
207   BasePointCheck = new QCheckBox(tr("SMESH_USE_BASE_POINT"), GroupArguments);
208
209   BasePointGrp = new QGroupBox(tr("SMESH_BASE_POINT"), GroupArguments);
210   BasePointGrp->setColumnLayout(0, Qt::Vertical);
211   BasePointGrp->layout()->setSpacing(0); BasePointGrp->layout()->setMargin(0);
212   QGridLayout* BasePointGrpLayout = new QGridLayout(BasePointGrp->layout());
213   BasePointGrpLayout->setAlignment(Qt::AlignTop);
214   BasePointGrpLayout->setSpacing(6); BasePointGrpLayout->setMargin(11);
215
216   SelectBasePointButton = new QToolButton(BasePointGrp);
217   SelectBasePointButton->setPixmap(selectImage);
218
219   XLab  = new QLabel(tr("SMESH_X"), BasePointGrp);
220   XSpin = new SMESHGUI_SpinBox(BasePointGrp);
221   YLab  = new QLabel(tr("SMESH_Y"), BasePointGrp);
222   YSpin = new SMESHGUI_SpinBox(BasePointGrp);
223   ZLab  = new QLabel(tr("SMESH_Z"), BasePointGrp);
224   ZSpin = new SMESHGUI_SpinBox(BasePointGrp);
225
226   // layouting
227   BasePointGrpLayout->addWidget(SelectBasePointButton, 0, 0);
228   BasePointGrpLayout->addWidget(XLab,                  0, 1);
229   BasePointGrpLayout->addWidget(XSpin,                 0, 2);
230   BasePointGrpLayout->addWidget(YLab,                  0, 3);
231   BasePointGrpLayout->addWidget(YSpin,                 0, 4);
232   BasePointGrpLayout->addWidget(ZLab,                  0, 5);
233   BasePointGrpLayout->addWidget(ZSpin,                 0, 6);
234
235   // Controls for angles defining
236   AnglesCheck = new QCheckBox(tr("SMESH_USE_ANGLES"), GroupArguments);
237
238   AnglesGrp = new QGroupBox(tr("SMESH_ANGLES"), GroupArguments);
239   AnglesGrp->setColumnLayout(0, Qt::Vertical);
240   AnglesGrp->layout()->setSpacing(0); AnglesGrp->layout()->setMargin(0);
241   QGridLayout* AnglesGrpLayout = new QGridLayout(AnglesGrp->layout());
242   AnglesGrpLayout->setAlignment(Qt::AlignTop);
243   AnglesGrpLayout->setSpacing(6); AnglesGrpLayout->setMargin(11);
244
245   AnglesList = new QListBox(AnglesGrp);
246   AnglesList->setSelectionMode(QListBox::Extended);
247
248   AddAngleButton = new QToolButton(AnglesGrp);
249   AddAngleButton->setPixmap(addImage);
250
251   RemoveAngleButton = new QToolButton(AnglesGrp);
252   RemoveAngleButton->setPixmap(removeImage);
253
254   AngleSpin = new SMESHGUI_SpinBox(AnglesGrp);
255
256   // layouting
257   QVBoxLayout* bLayout = new QVBoxLayout();
258   bLayout->addWidget(AddAngleButton);
259   bLayout->addSpacing(6);
260   bLayout->addWidget(RemoveAngleButton);
261   bLayout->addStretch();
262   AnglesGrpLayout->addMultiCellWidget(AnglesList, 0, 1, 0, 0);
263   AnglesGrpLayout->addMultiCellLayout(bLayout,    0, 1, 1, 1);
264   AnglesGrpLayout->addWidget(         AngleSpin,  0,    2   );
265   AnglesGrpLayout->setRowStretch(1, 10);
266
267   // layouting
268   GroupArgumentsLayout->addWidget(         ElementsLab,            0,    0   );
269   GroupArgumentsLayout->addWidget(         SelectElementsButton,   0,    1   );
270   GroupArgumentsLayout->addWidget(         ElementsLineEdit,       0,    2   );
271   GroupArgumentsLayout->addMultiCellWidget(MeshCheck,              1, 1, 0, 2);
272   GroupArgumentsLayout->addMultiCellWidget(PathGrp,                2, 2, 0, 2);
273   GroupArgumentsLayout->addWidget(         BasePointCheck,         3,    0   );
274   GroupArgumentsLayout->addMultiCellWidget(BasePointGrp,           3, 4, 1, 2);
275   GroupArgumentsLayout->addWidget(         AnglesCheck,            5,    0   );
276   GroupArgumentsLayout->addMultiCellWidget(AnglesGrp,              5, 6, 1, 2);
277   GroupArgumentsLayout->setRowStretch(6, 10);
278
279   /***************************************************************/
280   // common buttons group box
281   GroupButtons = new QGroupBox(this);
282   GroupButtons->setColumnLayout(0, Qt::Vertical);
283   GroupButtons->layout()->setSpacing(0);
284   GroupButtons->layout()->setMargin(0);
285   QGridLayout* GroupButtonsLayout = new QGridLayout(GroupButtons->layout());
286   GroupButtonsLayout->setAlignment(Qt::AlignTop);
287   GroupButtonsLayout->setSpacing(6); GroupButtonsLayout->setMargin(11);
288
289   OkButton = new QPushButton(tr("SMESH_BUT_OK"), GroupButtons);
290   OkButton->setAutoDefault(true);
291   OkButton->setDefault(true);
292
293   ApplyButton = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
294   ApplyButton->setAutoDefault(true);
295
296   CloseButton = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
297   CloseButton->setAutoDefault(true);
298
299   // layouting
300   GroupButtonsLayout->addWidget(OkButton,    0, 0);
301   GroupButtonsLayout->addWidget(ApplyButton, 0, 1);
302   GroupButtonsLayout->addWidget(CloseButton, 0, 3);
303   GroupButtonsLayout->addColSpacing(2, 10);
304   GroupButtonsLayout->setColStretch(2, 10);
305
306   /***************************************************************/
307   // layouting
308   topLayout->addWidget(GroupConstructors, 0, 0);
309   topLayout->addWidget(GroupArguments,    1, 0);
310   topLayout->addWidget(GroupButtons,      2, 0);
311
312   /***************************************************************/
313   // Initialisations
314   XSpin->RangeStepAndValidator(-999999.999, +999999.999, 10.0, 3);
315   YSpin->RangeStepAndValidator(-999999.999, +999999.999, 10.0, 3);
316   ZSpin->RangeStepAndValidator(-999999.999, +999999.999, 10.0, 3);
317   AngleSpin->RangeStepAndValidator(-999999.999, +999999.999, 5.0, 3);
318
319   mySMESHGUI->SetActiveDialogBox(this);
320
321   // Costruction of the logical filter for the elements: mesh/sub-mesh/group
322   SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
323   SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter (GROUP);
324
325   QPtrList<SUIT_SelectionFilter> aListOfFilters;
326   if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
327   if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
328
329   myElementsFilter = new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
330   myPathMeshFilter = new SMESH_TypeFilter (MESH);
331
332   Init();
333
334   /***************************************************************/
335   // signals-slots connections
336   connect(OkButton,     SIGNAL(clicked()), this, SLOT(ClickOnOk()));
337   connect(CloseButton,  SIGNAL(clicked()), this, SLOT(reject()));
338   connect(ApplyButton,  SIGNAL(clicked()), this, SLOT(ClickOnApply()));
339
340   connect(AddAngleButton,    SIGNAL(clicked()), this, SLOT(OnAngleAdded()));
341   connect(RemoveAngleButton, SIGNAL(clicked()), this, SLOT(OnAngleRemoved()));
342
343   connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int)));
344
345   connect(SelectElementsButton,   SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
346   connect(SelectPathMeshButton,   SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
347   connect(SelectPathShapeButton,  SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
348   connect(SelectStartPointButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
349   connect(SelectBasePointButton,  SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
350
351   connect(mySMESHGUI,  SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
352   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()),      this, SLOT(SelectionIntoArgument()));
353   connect(mySMESHGUI,  SIGNAL(SignalCloseAllDialogs()),        this, SLOT(reject()));
354
355   connect(ElementsLineEdit, SIGNAL(textChanged(const QString&)),
356            SLOT(onTextChange(const QString&)));
357   connect(StartPointLineEdit, SIGNAL(textChanged(const QString&)),
358            SLOT(onTextChange(const QString&)));
359
360   connect(MeshCheck,      SIGNAL(toggled(bool)), SLOT(onSelectMesh()));
361   connect(AnglesCheck,    SIGNAL(toggled(bool)), SLOT(onAnglesCheck()));
362   connect(BasePointCheck, SIGNAL(toggled(bool)), SLOT(onBasePointCheck()));
363
364   AnglesList->installEventFilter(this);
365   ElementsLineEdit->installEventFilter(this);
366   StartPointLineEdit->installEventFilter(this);
367   XSpin->editor()->installEventFilter(this);
368   YSpin->editor()->installEventFilter(this);
369   ZSpin->editor()->installEventFilter(this);
370
371   /***************************************************************/
372   // set position and show dialog box
373   int x, y;
374   mySMESHGUI->DefineDlgPosition(this, x, y);
375   this->move(x, y);
376   this->show(); // displays Dialog
377 }
378
379 //=================================================================================
380 // function : ~SMESHGUI_ExtrusionAlongPathDlg()
381 // purpose  : destructor
382 //=================================================================================
383 SMESHGUI_ExtrusionAlongPathDlg::~SMESHGUI_ExtrusionAlongPathDlg()
384 {
385   // no need to delete child widgets, Qt does it all for us
386 }
387
388 //=================================================================================
389 // function : Init()
390 // purpose  : initialization
391 //=================================================================================
392 void SMESHGUI_ExtrusionAlongPathDlg::Init (bool ResetControls)
393 {
394   myBusy = false;
395   myEditCurrentArgument = 0;
396
397   myMesh      = SMESH::SMESH_Mesh::_nil();
398   myIDSource  = SMESH::SMESH_IDSource::_nil();
399   myMeshActor = 0;
400   myPathMesh  = SMESH::SMESH_Mesh::_nil();
401   myPathShape = GEOM::GEOM_Object::_nil();
402
403   ElementsLineEdit->clear();
404   PathMeshLineEdit->clear();
405   PathShapeLineEdit->clear();
406   StartPointLineEdit->clear();
407
408   if (ResetControls) {
409     XSpin->SetValue(0.0);
410     YSpin->SetValue(0.0);
411     ZSpin->SetValue(0.0);
412
413     AngleSpin->SetValue(45);
414     MeshCheck->setChecked(false);
415     ConstructorsClicked(0);
416     onSelectMesh();
417     onAnglesCheck();
418     onBasePointCheck();
419   }
420   SetEditCurrentArgument(0);
421 }
422
423 //=================================================================================
424 // function : ConstructorsClicked()
425 // purpose  : Called when user changes type of elements (1d / 2d)
426 //=================================================================================
427 void SMESHGUI_ExtrusionAlongPathDlg::ConstructorsClicked (int type)
428 {
429   if (myType == type) return;
430
431   disconnect(mySelectionMgr, 0, this, 0);
432
433   if (type == 0)
434     GroupArguments->setTitle(tr("EXTRUSION_1D"));
435   else if (type == 1)
436     GroupArguments->setTitle(tr("EXTRUSION_2D"));
437
438   // clear elements ID list
439   if (!MeshCheck->isChecked()) {
440     ElementsLineEdit->clear();
441   }
442   // set selection mode if necessary
443   if (myEditCurrentArgument == ElementsLineEdit) {
444     mySelectionMgr->clearSelected();
445     mySelectionMgr->clearFilters();
446     SMESH::SetPickable();
447
448     SMESH::SetPointRepresentation(false);
449     if (MeshCheck->isChecked()) {
450       myViewWindow->SetSelectionMode(ActorSelection);
451       mySelectionMgr->installFilter(myElementsFilter);
452     } else {
453       if (type == 0)
454         myViewWindow->SetSelectionMode(EdgeSelection);
455       if (type == 1)
456         myViewWindow->SetSelectionMode(FaceSelection);
457     }
458   }
459   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
460
461   myType = type;
462 }
463
464 //=================================================================================
465 // function : ClickOnApply()
466 // purpose  : Called when user presses <Apply> button
467 //=================================================================================
468 bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply()
469 {
470   if (mySMESHGUI->isActiveStudyLocked())
471     return false;
472
473   if (myMesh->_is_nil() || MeshCheck->isChecked() && myIDSource->_is_nil() ||
474       !myMeshActor || myPathMesh->_is_nil() || myPathShape->_is_nil())
475     return false;
476
477   SMESH::long_array_var anElementsId = new SMESH::long_array;
478
479   if (MeshCheck->isChecked()) {
480     // If "Select whole mesh, submesh or group" check box is on ->
481     // get all elements of the required type from the object selected
482
483     // if MESH object is selected
484     if (!CORBA::is_nil(SMESH::SMESH_Mesh::_narrow(myIDSource))) {
485       // get mesh
486       SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(myIDSource);
487       // get IDs from mesh...
488       if (Elements1dRB->isChecked())
489         // 1d elements
490         anElementsId = aMesh->GetElementsByType(SMESH::EDGE);
491       else if (Elements2dRB->isChecked()) {
492         anElementsId = aMesh->GetElementsByType(SMESH::FACE);
493       }
494     }
495     // SUBMESH is selected
496     if (!CORBA::is_nil(SMESH::SMESH_subMesh::_narrow(myIDSource))) {
497       // get submesh
498       SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(myIDSource);
499       // get IDs from submesh
500       if (Elements1dRB->isChecked())
501         // 1d elements
502         anElementsId = aSubMesh->GetElementsByType(SMESH::EDGE);
503       else if (Elements2dRB->isChecked())
504         // 2d elements
505         anElementsId = aSubMesh->GetElementsByType(SMESH::FACE);
506     }
507     // GROUP is selected
508     if (!CORBA::is_nil(SMESH::SMESH_GroupBase::_narrow(myIDSource))) {
509       // get smesh group
510       SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(myIDSource);
511       // get IDs from group
512       // 1d elements or 2d elements
513       if (Elements1dRB->isChecked() && aGroup->GetType() == SMESH::EDGE ||
514            Elements2dRB->isChecked() && aGroup->GetType() == SMESH::FACE)
515         anElementsId = aGroup->GetListOfID();
516     }
517   } else {
518     // If "Select whole mesh, submesh or group" check box is off ->
519     // use only elements of given type selected by user
520
521     SMDS_Mesh* aMesh = myMeshActor->GetObject()->GetMesh();
522     if (aMesh) {
523       QStringList aListElementsId = QStringList::split(" ", ElementsLineEdit->text(), false);
524       anElementsId = new SMESH::long_array;
525       anElementsId->length(aListElementsId.count());
526       bool bOk;
527       int j = 0;
528       for (int i = 0; i < aListElementsId.count(); i++) {
529         long ind = aListElementsId[ i ].toLong(&bOk);
530         if  (bOk) {
531           const SMDS_MeshElement* e = aMesh->FindElement(ind);
532           if (e) {
533             bool typeMatch = Elements1dRB->isChecked() && e->GetType() == SMDSAbs_Edge ||
534                              Elements2dRB->isChecked() && e->GetType() == SMDSAbs_Face;
535             if (typeMatch)
536               anElementsId[ j++ ] = ind;
537           }
538         }
539       }
540       anElementsId->length(j);
541     }
542   }
543
544   if (anElementsId->length() <= 0) {
545     return false;
546   }
547
548   if (StartPointLineEdit->text().stripWhiteSpace().isEmpty()) {
549     return false;
550   }
551
552   bool bOk;
553   long aNodeStart = StartPointLineEdit->text().toLong(&bOk);
554   if (!bOk) {
555     return false;
556   }
557
558   // get angles
559   SMESH::double_array_var anAngles = new SMESH::double_array;
560   if (AnglesCheck->isChecked()) {
561     anAngles->length(AnglesList->count());
562     int j = 0;
563     bool bOk;
564     for (int i = 0; i < AnglesList->count(); i++) {
565       double angle = AnglesList->text(i).toDouble(&bOk);
566       if  (bOk)
567         anAngles[ j++ ] = angle*PI/180;
568     }
569     anAngles->length(j);
570   }
571
572   // get base point
573   SMESH::PointStruct aBasePoint;
574   if (BasePointCheck->isChecked()) {
575     aBasePoint.x = XSpin->GetValue();
576     aBasePoint.y = YSpin->GetValue();
577     aBasePoint.z = ZSpin->GetValue();
578   }
579
580   try {
581     SUIT_OverrideCursor wc;
582     SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
583     SMESH::SMESH_MeshEditor::Extrusion_Error retVal =
584       aMeshEditor->ExtrusionAlongPath(anElementsId.inout(), myPathMesh, myPathShape, aNodeStart,
585                                        AnglesCheck->isChecked(), anAngles.inout(),
586                                        BasePointCheck->isChecked(), aBasePoint);
587
588     //wc.stop();
589     wc.suspend();
590     switch (retVal) {
591     case SMESH::SMESH_MeshEditor::EXTR_NO_ELEMENTS:
592       SUIT_MessageBox::warn1(SMESHGUI::desktop(),
593                              tr("SMESH_ERROR"),
594                              tr("NO_ELEMENTS_SELECTED"),
595                              tr("SMESH_BUT_OK"));
596       return false; break;
597     case SMESH::SMESH_MeshEditor::EXTR_PATH_NOT_EDGE:
598       SUIT_MessageBox::warn1(SMESHGUI::desktop(),
599                              tr("SMESH_ERROR"),
600                              tr("SELECTED_PATH_IS_NOT_EDGE"),
601                              tr("SMESH_BUT_OK"));
602       return false; break;
603     case SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE:
604       SUIT_MessageBox::warn1(SMESHGUI::desktop(),
605                              tr("SMESH_ERROR"),
606                              tr("BAD_SHAPE_TYPE"),
607                              tr("SMESH_BUT_OK"));
608       return false; break;
609     case SMESH::SMESH_MeshEditor::EXTR_BAD_STARTING_NODE:
610       SUIT_MessageBox::warn1(SMESHGUI::desktop(),
611                              tr("SMESH_ERROR"),
612                              tr("EXTR_BAD_STARTING_NODE"),
613                              tr("SMESH_BUT_OK"));
614       return false; break;
615     case SMESH::SMESH_MeshEditor::EXTR_BAD_ANGLES_NUMBER:
616       SUIT_MessageBox::warn1(SMESHGUI::desktop(),
617                              tr("SMESH_ERROR"),
618                              tr("WRONG_ANGLES_NUMBER"),
619                              tr("SMESH_BUT_OK"));
620       return false; break;
621     case SMESH::SMESH_MeshEditor::EXTR_CANT_GET_TANGENT:
622       SUIT_MessageBox::warn1(SMESHGUI::desktop(),
623                              tr("SMESH_ERROR"),
624                              tr("CANT_GET_TANGENT"),
625                              tr("SMESH_BUT_OK"));
626       return false; break;
627     case SMESH::SMESH_MeshEditor::EXTR_OK:
628       break;
629     }
630   } catch (...) {
631     return false;
632   }
633
634   mySelectionMgr->clearSelected();
635   SMESH::UpdateView();
636   Init(false);
637   ConstructorsClicked(GetConstructorId());
638   return true;
639 }
640
641 //=================================================================================
642 // function : ClickOnOk()
643 // purpose  : Called when user presses <OK> button
644 //=================================================================================
645 void SMESHGUI_ExtrusionAlongPathDlg::ClickOnOk()
646 {
647   if (ClickOnApply())
648     reject();
649 }
650
651 //=================================================================================
652 // function : reject()
653 // purpose  : Called when dialog box is closed
654 //=================================================================================
655 void SMESHGUI_ExtrusionAlongPathDlg::reject()
656 {
657   disconnect(mySelectionMgr, 0, this, 0);
658   mySelectionMgr->clearFilters();
659   mySelectionMgr->clearSelected();
660   SMESH::SetPickable(); // ???
661   SMESH::SetPointRepresentation(false);
662   myViewWindow->SetSelectionMode(ActorSelection);
663   mySMESHGUI->ResetState();
664   QDialog::reject();
665 }
666
667 //=======================================================================
668 // function : onTextChange()
669 // purpose  :
670 //=======================================================================
671 void SMESHGUI_ExtrusionAlongPathDlg::onTextChange (const QString& theNewText)
672 {
673   QLineEdit* send = (QLineEdit*)sender();
674
675   // return if busy
676   if (myBusy) return;
677
678   // set busy flag
679   SetBusy sb (this);
680
681   if (send != StartPointLineEdit && send != ElementsLineEdit)
682     send = ElementsLineEdit;
683
684   if (send == ElementsLineEdit && myEditCurrentArgument == ElementsLineEdit) {
685     // hilight entered elements
686     SMDS_Mesh* aMesh = 0;
687     if (myMeshActor)
688       aMesh = myMeshActor->GetObject()->GetMesh();
689
690     if (aMesh) {
691       //mySelectionMgr->clearSelected();
692       //mySelectionMgr->AddIObject(myMeshActor->getIO());
693       SALOME_ListIO aList;
694       aList.Append(myMeshActor->getIO());
695       mySelectionMgr->setSelectedObjects(aList, false);
696
697       QStringList aListId = QStringList::split(" ", theNewText, false);
698       bool bOk;
699       const Handle(SALOME_InteractiveObject)& anIO = myMeshActor->getIO();
700       TColStd_IndexedMapOfInteger selectedIndices;
701       TColStd_MapOfInteger newIndices;
702       mySelector->GetIndex(anIO, selectedIndices);
703       for (int i = 0; i < aListId.count(); i++) {
704         long ind = aListId[ i ].toLong(&bOk);
705         if (bOk) {
706           const SMDS_MeshElement* e = aMesh->FindElement(ind);
707           if (e) {
708             // check also type of element
709             bool typeMatch = Elements1dRB->isChecked() && e->GetType() == SMDSAbs_Edge ||
710                              Elements2dRB->isChecked() && e->GetType() == SMDSAbs_Face;
711             if (typeMatch) {
712               if (selectedIndices.Add(e->GetID())) {
713                 newIndices.Add(e->GetID());
714               }
715             }
716           }
717         }
718       }
719       if (newIndices.Extent() > 0) {
720         mySelector->AddOrRemoveIndex(anIO, newIndices, true);
721         myViewWindow->highlight( anIO, true, true );
722       }
723     }
724   } else if (send == StartPointLineEdit &&
725              myEditCurrentArgument == StartPointLineEdit) {
726     if (!myPathMesh->_is_nil()) {
727       SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
728       SMDS_Mesh* aMesh = 0;
729       if (aPathActor)
730         aMesh = aPathActor->GetObject()->GetMesh();
731       if (aMesh) {
732         //mySelectionMgr->clearSelected();
733         //mySelectionMgr->AddIObject(aPathActor->getIO());
734         SALOME_ListIO aList;
735         aList.Append(aPathActor->getIO());
736         mySelectionMgr->setSelectedObjects(aList, false);
737
738         bool bOk;
739         long ind = theNewText.toLong(&bOk);
740         if (bOk) {
741           const SMDS_MeshNode* n = aMesh->FindNode(ind);
742           if (n) {
743             //if (!mySelectionMgr->IsIndexSelected(aPathActor->getIO(), n->GetID())) {
744             TColStd_IndexedMapOfInteger selectedIndices;
745             TColStd_MapOfInteger newIndices;
746             mySelector->GetIndex(aPathActor->getIO(), selectedIndices);
747             if (selectedIndices.Add(n->GetID())) {
748               newIndices.Add(n->GetID());
749               mySelector->AddOrRemoveIndex( aPathActor->getIO(), newIndices, true );
750               myViewWindow->highlight( aPathActor->getIO(), true, true );
751             }
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       myViewWindow->SetSelectionMode(ActorSelection);
954       mySelectionMgr->installFilter(myElementsFilter);
955     } else {
956       if (Elements1dRB->isChecked())
957         myViewWindow->SetSelectionMode(EdgeSelection);
958       else if (Elements2dRB->isChecked())
959         myViewWindow->SetSelectionMode(FaceSelection);
960     }
961   } else if (button == SelectPathMeshButton) {
962     myEditCurrentArgument = PathMeshLineEdit;
963     SMESH::SetPointRepresentation(false);
964     myViewWindow->SetSelectionMode(ActorSelection);
965     mySelectionMgr->installFilter(myPathMeshFilter);
966   }
967   else if (button == SelectPathShapeButton) {
968     myEditCurrentArgument = PathShapeLineEdit;
969     SMESH::SetPointRepresentation(false);
970     myViewWindow->SetSelectionMode(ActorSelection);
971
972     if (!myPathMesh->_is_nil()) {
973       GEOM::GEOM_Object_var aMainShape = myPathMesh->GetShapeToMesh();
974       SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
975
976       if (!aMainShape->_is_nil() && aPathActor)
977         mySelectionMgr->installFilter(new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE, -1,
978                                                               TopAbs_EDGE, aMainShape));
979         //SMESH::SetPickable(aPathActor);
980     }
981   }
982   else if (button == SelectStartPointButton) {
983     myEditCurrentArgument = StartPointLineEdit;
984     if (!myPathMesh->_is_nil()) {
985       SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh);
986       if (aPathActor) {
987         SMESH::SetPointRepresentation(true);
988         myViewWindow->SetSelectionMode(NodeSelection);
989         SMESH::SetPickable(aPathActor);
990       }
991     }
992   }
993   else if (button == SelectBasePointButton) {
994     myEditCurrentArgument = XSpin;
995     SMESH::SetPointRepresentation(true);
996     myViewWindow->SetSelectionMode(NodeSelection);
997
998     SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter(MESHorSUBMESH);
999     SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter(GROUP);
1000     SMESH_NumberFilter* aVertexFilter      = new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE,
1001                                                                      -1, TopAbs_VERTEX);
1002     QPtrList<SUIT_SelectionFilter> aListOfFilters;
1003     if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
1004     if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
1005     if (aVertexFilter)        aListOfFilters.append(aVertexFilter);
1006
1007     mySelectionMgr->installFilter(new SMESH_LogicalFilter
1008                                   (aListOfFilters, SMESH_LogicalFilter::LO_OR));
1009   }
1010
1011   if (myEditCurrentArgument && !myEditCurrentArgument->hasFocus())
1012     myEditCurrentArgument->setFocus();
1013
1014   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
1015   SelectionIntoArgument();
1016 }
1017
1018 //=================================================================================
1019 // function : DeactivateActiveDialog()
1020 // purpose  : Deactivates this dialog
1021 //=================================================================================
1022 void SMESHGUI_ExtrusionAlongPathDlg::DeactivateActiveDialog()
1023 {
1024   if (GroupConstructors->isEnabled()) {
1025     GroupConstructors->setEnabled(false);
1026     GroupArguments->setEnabled(false);
1027     GroupButtons->setEnabled(false);
1028     mySMESHGUI->ResetState();
1029     mySMESHGUI->SetActiveDialogBox(0);
1030   }
1031 }
1032
1033 //=================================================================================
1034 // function : ActivateThisDialog()
1035 // purpose  : Activates this dialog
1036 //=================================================================================
1037 void SMESHGUI_ExtrusionAlongPathDlg::ActivateThisDialog()
1038 {
1039   // Emit a signal to deactivate the active dialog
1040   mySMESHGUI->EmitSignalDeactivateDialog();
1041   GroupConstructors->setEnabled(true);
1042   GroupArguments->setEnabled(true);
1043   GroupButtons->setEnabled(true);
1044
1045   mySMESHGUI->SetActiveDialogBox(this);
1046
1047   ConstructorsClicked(GetConstructorId());
1048   SelectionIntoArgument();
1049 }
1050
1051 //=================================================================================
1052 // function : enterEvent()
1053 // purpose  : Mouse enter event
1054 //=================================================================================
1055 void SMESHGUI_ExtrusionAlongPathDlg::enterEvent (QEvent*)
1056 {
1057   if (!GroupConstructors->isEnabled())
1058     ActivateThisDialog();
1059 }
1060
1061 //=======================================================================
1062 // function : onSelectMesh()
1063 // purpose  :
1064 //=======================================================================
1065 void SMESHGUI_ExtrusionAlongPathDlg::onSelectMesh()
1066 {
1067   bool toSelectMesh = MeshCheck->isChecked();
1068
1069   ElementsLineEdit->setReadOnly(toSelectMesh);
1070   ElementsLab->setText(toSelectMesh ? tr("SMESH_NAME") : tr("SMESH_ID_ELEMENTS"));
1071   ElementsLineEdit->clear();
1072
1073   SetEditCurrentArgument(SelectElementsButton);
1074 }
1075
1076 //=================================================================================
1077 // function : GetConstructorId()
1078 // purpose  :
1079 //=================================================================================
1080 int SMESHGUI_ExtrusionAlongPathDlg::GetConstructorId()
1081 {
1082   if (GroupConstructors != NULL && GroupConstructors->selected() != NULL)
1083     return GroupConstructors->id(GroupConstructors->selected());
1084   return -1;
1085 }
1086
1087 //=======================================================================
1088 // function : onAnglesCheck()
1089 // purpose  : called when "Use Angles" check box is switched
1090 //=======================================================================
1091 void SMESHGUI_ExtrusionAlongPathDlg::onAnglesCheck()
1092 {
1093   AnglesGrp->setEnabled(AnglesCheck->isChecked());
1094 }
1095
1096 //=======================================================================
1097 // function : onBasePointCheck()
1098 // purpose  : called when "Use Base Point" check box is switched
1099 //=======================================================================
1100 void SMESHGUI_ExtrusionAlongPathDlg::onBasePointCheck()
1101 {
1102   BasePointGrp->setEnabled(BasePointCheck->isChecked());
1103 }
1104
1105 //=======================================================================
1106 // function : OnAngleAdded()
1107 // purpose  : Called when user adds angle to the list
1108 //=======================================================================
1109 void SMESHGUI_ExtrusionAlongPathDlg::OnAngleAdded()
1110 {
1111   AnglesList->insertItem(QString::number(AngleSpin->GetValue()));
1112 }
1113
1114 //=======================================================================
1115 // function : OnAngleRemoved()
1116 // purpose  : Called when user removes angle(s) from the list
1117 //=======================================================================
1118 void SMESHGUI_ExtrusionAlongPathDlg::OnAngleRemoved()
1119 {
1120   QList<QListBoxItem> aList;
1121   aList.setAutoDelete(false);
1122   for (int i = 0; i < AnglesList->count(); i++)
1123     if (AnglesList->isSelected(i))
1124       aList.append(AnglesList->item(i));
1125
1126   for (int i = 0; i < aList.count(); i++)
1127     delete aList.at(i);
1128 }
1129
1130 //=================================================================================
1131 // function : eventFilter()
1132 // purpose  : event filter ???
1133 //=================================================================================
1134 bool SMESHGUI_ExtrusionAlongPathDlg::eventFilter (QObject* object, QEvent* event)
1135 {
1136   if (event->type() == QEvent::KeyPress) {
1137     QKeyEvent* ke = (QKeyEvent*)event;
1138     if (object == AnglesList) {
1139       if (ke->key() == Key_Delete)
1140         OnAngleRemoved();
1141     }
1142   }
1143   else if (event->type() == QEvent::FocusIn) {
1144     if (object == ElementsLineEdit) {
1145       if (myEditCurrentArgument != ElementsLineEdit)
1146         SetEditCurrentArgument(SelectElementsButton);
1147     }
1148     else if (object == StartPointLineEdit) {
1149       if (myEditCurrentArgument != StartPointLineEdit)
1150         SetEditCurrentArgument(SelectStartPointButton);
1151     }
1152     else if (object == XSpin->editor() || object == YSpin->editor() || object == ZSpin->editor()) {
1153       if (myEditCurrentArgument != XSpin)
1154         SetEditCurrentArgument(SelectBasePointButton);
1155     }
1156   }
1157   return QDialog::eventFilter(object, event);
1158 }