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