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