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