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