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