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