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