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