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