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