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