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