Salome HOME
f284df459bf8794c7d14aa7827ca9730dd088be3
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_SmoothingDlg.cxx
1 // SMESH SMESHGUI : GUI for SMESH component
2 //
3 // Copyright (C) 2003  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 // File   : SMESHGUI_SmoothingDlg.cxx
23 // Author : Michael ZORIN, Open CASCADE S.A.S.
24 //
25
26 // SMESH includes
27 #include "SMESHGUI_SmoothingDlg.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
36 #include <SMESH_Actor.h>
37 #include <SMESH_TypeFilter.hxx>
38 #include <SMESH_LogicalFilter.hxx>
39
40 #include <SMDS_Mesh.hxx>
41
42 // SALOME GUI includes
43 #include <SUIT_ResourceMgr.h>
44 #include <SUIT_OverrideCursor.h>
45 #include <SUIT_Desktop.h>
46 #include <SUIT_Session.h>
47 #include <SUIT_MessageBox.h>
48
49 #include <LightApp_Application.h>
50 #include <LightApp_SelectionMgr.h>
51
52 #include <SVTK_ViewModel.h>
53 #include <SVTK_Selector.h>
54 #include <SVTK_ViewWindow.h>
55 #include <SVTK_Selection.h>
56 #include <SALOME_ListIO.hxx>
57
58 // OCCT includes
59 #include <TColStd_MapOfInteger.hxx>
60
61 // Qt includes
62 #include <QApplication>
63 #include <QGroupBox>
64 #include <QLabel>
65 #include <QLineEdit>
66 #include <QPushButton>
67 #include <QRadioButton>
68 #include <QComboBox>
69 #include <QCheckBox>
70 #include <QSpinBox>
71 #include <QHBoxLayout>
72 #include <QVBoxLayout>
73 #include <QGridLayout>
74 #include <QKeyEvent>
75 #include <QButtonGroup>
76
77 // IDL includes
78 #include <SALOMEconfig.h>
79 #include CORBA_SERVER_HEADER(SMESH_Group)
80 #include CORBA_SERVER_HEADER(SMESH_MeshEditor)
81
82 #define SPACING 6
83 #define MARGIN  11
84
85 //=================================================================================
86 // function : SMESHGUI_SmoothingDlg()
87 // purpose  : constructor
88 //=================================================================================
89 SMESHGUI_SmoothingDlg::SMESHGUI_SmoothingDlg( SMESHGUI* theModule )
90   : QDialog( SMESH::GetDesktop( theModule ) ),
91     mySMESHGUI( theModule ),
92     mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
93 {
94   QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_SMOOTHING")));
95   QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
96
97   setModal(false);
98   setAttribute(Qt::WA_DeleteOnClose, true);
99   setWindowTitle(tr("SMESH_SMOOTHING"));
100   setSizeGripEnabled(true);
101
102   /***************************************************************/
103   QVBoxLayout* SMESHGUI_SmoothingDlgLayout = new QVBoxLayout(this);
104   SMESHGUI_SmoothingDlgLayout->setSpacing(SPACING);
105   SMESHGUI_SmoothingDlgLayout->setMargin(MARGIN);
106
107   /***************************************************************/
108   GroupConstructors = new QGroupBox(tr("SMESH_SMOOTHING"), this);
109   QButtonGroup* ButtonGroup = new QButtonGroup(this);
110   QHBoxLayout* GroupConstructorsLayout = new QHBoxLayout(GroupConstructors);
111   GroupConstructorsLayout->setSpacing(SPACING);
112   GroupConstructorsLayout->setMargin(MARGIN);
113
114   Constructor1 = new QRadioButton(GroupConstructors);
115   Constructor1->setIcon(image0);
116   Constructor1->setChecked(true);
117   GroupConstructorsLayout->addWidget(Constructor1);
118   ButtonGroup->addButton(Constructor1, 0);
119
120   /***************************************************************/
121   GroupArguments = new QGroupBox(tr("SMESH_ARGUMENTS"), this);
122   QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments);
123   GroupArgumentsLayout->setSpacing(SPACING);
124   GroupArgumentsLayout->setMargin(MARGIN);
125
126   myIdValidator = new SMESHGUI_IdValidator(this);
127
128   // Controls for elements selection
129   TextLabelElements = new QLabel(tr("SMESH_ID_ELEMENTS"), GroupArguments);
130
131   SelectElementsButton = new QPushButton(GroupArguments);
132   SelectElementsButton->setIcon(image1);
133
134   LineEditElements = new QLineEdit(GroupArguments);
135   LineEditElements->setValidator(myIdValidator);
136
137   // Control for the whole mesh selection
138   CheckBoxMesh = new QCheckBox(tr("SMESH_SELECT_WHOLE_MESH"), GroupArguments);
139
140   // Controls for nodes selection
141   TextLabelNodes = new QLabel(tr("FIXED_NODES_IDS"), GroupArguments);
142
143   SelectNodesButton  = new QPushButton(GroupArguments);
144   SelectNodesButton->setIcon(image1);
145
146   LineEditNodes  = new QLineEdit(GroupArguments);
147   LineEditNodes->setValidator(myIdValidator);
148
149   // Controls for method selection
150   TextLabelMethod = new QLabel(tr("METHOD"), GroupArguments);
151
152   ComboBoxMethod = new QComboBox(GroupArguments);
153
154   // Controls for iteration limit defining
155   TextLabelLimit = new QLabel(tr("ITERATION_LIMIT"), GroupArguments);
156
157   SpinBox_IterationLimit = new QSpinBox(GroupArguments);
158
159   // Controls for max. aspect ratio defining
160   TextLabelAspectRatio = new QLabel(tr("MAX_ASPECT_RATIO"), GroupArguments);
161
162   SpinBox_AspectRatio = new SMESHGUI_SpinBox(GroupArguments);
163
164   // Check box "Is Parametric"
165   CheckBoxParametric = new QCheckBox( tr("IS_PARAMETRIC"), GroupArguments );
166
167   GroupArgumentsLayout->addWidget(TextLabelElements,      0, 0);
168   GroupArgumentsLayout->addWidget(SelectElementsButton,   0, 1);
169   GroupArgumentsLayout->addWidget(LineEditElements,       0, 2);
170   GroupArgumentsLayout->addWidget(CheckBoxMesh,           1, 0, 1, 3);
171   GroupArgumentsLayout->addWidget(TextLabelNodes,         2, 0);
172   GroupArgumentsLayout->addWidget(SelectNodesButton,      2, 1);
173   GroupArgumentsLayout->addWidget(LineEditNodes,          2, 2);
174   GroupArgumentsLayout->addWidget(TextLabelMethod,        3, 0);
175   GroupArgumentsLayout->addWidget(ComboBoxMethod,         3, 2);
176   GroupArgumentsLayout->addWidget(TextLabelLimit,         4, 0);
177   GroupArgumentsLayout->addWidget(SpinBox_IterationLimit, 4, 2);
178   GroupArgumentsLayout->addWidget(TextLabelAspectRatio,   5, 0);
179   GroupArgumentsLayout->addWidget(SpinBox_AspectRatio,    5, 2);
180   GroupArgumentsLayout->addWidget(CheckBoxParametric,     6, 0, 1, 3);
181
182   /***************************************************************/
183   GroupButtons = new QGroupBox(this);
184   QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons);
185   GroupButtonsLayout->setSpacing(SPACING);
186   GroupButtonsLayout->setMargin(MARGIN);
187
188   buttonOk = new QPushButton(tr("SMESH_BUT_OK"), GroupButtons);
189   buttonOk->setAutoDefault(true);
190   buttonOk->setDefault(true);
191   buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
192   buttonApply->setAutoDefault(true);
193   buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
194   buttonCancel->setAutoDefault(true);
195   buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons);
196   buttonHelp->setAutoDefault(true);
197
198   GroupButtonsLayout->addWidget(buttonOk);
199   GroupButtonsLayout->addSpacing(10);
200   GroupButtonsLayout->addWidget(buttonApply);
201   GroupButtonsLayout->addSpacing(10);
202   GroupButtonsLayout->addStretch();
203   GroupButtonsLayout->addWidget(buttonCancel);
204   GroupButtonsLayout->addWidget(buttonHelp);
205
206   /***************************************************************/
207   SMESHGUI_SmoothingDlgLayout->addWidget(GroupConstructors);
208   SMESHGUI_SmoothingDlgLayout->addWidget(GroupArguments);
209   SMESHGUI_SmoothingDlgLayout->addWidget(GroupButtons);
210
211   /***************************************************************/
212   /* Initialisations */
213   ComboBoxMethod->addItem(tr("LAPLACIAN"));
214   ComboBoxMethod->addItem(tr("CENTROIDAL"));
215
216   ComboBoxMethod->setCurrentIndex(0);
217
218   CheckBoxParametric->setChecked( true );
219   
220   SpinBox_IterationLimit->setRange(1, 999999);
221   SpinBox_IterationLimit->setValue(20);
222   SpinBox_AspectRatio->RangeStepAndValidator(0.0, +999999.999, 0.1, 3);
223   SpinBox_AspectRatio->SetValue(1.1);
224
225   GroupArguments->show();
226   myConstructorId = 0;
227   Constructor1->setChecked(true);
228   
229   mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
230
231   mySMESHGUI->SetActiveDialogBox(this);
232
233   // Costruction of the logical filter for the elements: mesh/sub-mesh/group
234   SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
235   SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter (GROUP);
236
237   QList<SUIT_SelectionFilter*> aListOfFilters;
238   if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
239   if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
240
241   myMeshOrSubMeshOrGroupFilter =
242     new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
243
244   myHelpFileName = "smoothing_page.html";
245
246   Init();
247
248   /***************************************************************/
249   // signals and slots connections
250   connect(buttonOk, SIGNAL(clicked()),     this, SLOT(ClickOnOk()));
251   connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
252   connect(buttonApply, SIGNAL(clicked()),  this, SLOT(ClickOnApply()));
253   connect(buttonHelp, SIGNAL(clicked()), this, SLOT(ClickOnHelp()));
254
255   connect(SelectElementsButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
256   connect(SelectNodesButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
257   connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
258   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
259   /* to close dialog if study change */
260   connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
261   connect(LineEditElements, SIGNAL(textChanged(const QString&)),
262            SLOT(onTextChange(const QString&)));
263   connect(LineEditNodes, SIGNAL(textChanged(const QString&)),
264            SLOT(onTextChange(const QString&)));
265   connect(CheckBoxMesh, SIGNAL(toggled(bool)),
266            SLOT(onSelectMesh(bool)));
267 }
268
269 //=================================================================================
270 // function : ~SMESHGUI_SmoothingDlg()
271 // purpose  : destructor
272 //=================================================================================
273 SMESHGUI_SmoothingDlg::~SMESHGUI_SmoothingDlg()
274 {
275   // no need to delete child widgets, Qt does it all for us
276 }
277
278 //=================================================================================
279 // function : Init()
280 // purpose  : initialization
281 //=================================================================================
282 void SMESHGUI_SmoothingDlg::Init()
283 {
284   myBusy = false;
285
286 //   ComboBoxMethod->setCurrentItem(0);
287
288 //   SpinBox_IterationLimit->setValue(20);
289 //   SpinBox_AspectRatio->SetValue(1.1);
290
291   myEditCurrentArgument = LineEditElements;
292   LineEditElements->setFocus();
293   LineEditElements->clear();
294   LineEditNodes->clear();
295   myElementsId = "";
296   myNbOkElements = 0;
297   myNbOkNodes = 0;
298   myActor     = 0;
299   myMesh = SMESH::SMESH_Mesh::_nil();
300
301   CheckBoxMesh->setChecked(false);
302   onSelectMesh(false);
303 }
304
305 //=================================================================================
306 // function : ClickOnApply()
307 // purpose  : Called when user presses <Apply> button
308 //=================================================================================
309 void SMESHGUI_SmoothingDlg::ClickOnApply()
310 {
311   if (mySMESHGUI->isActiveStudyLocked())
312     return;
313
314   if (myNbOkElements &&
315       (myNbOkNodes || LineEditNodes->text().trimmed().isEmpty())) {
316     QStringList aListElementsId = myElementsId.split(" ", QString::SkipEmptyParts);
317     QStringList aListNodesId    = LineEditNodes->text().split(" ", QString::SkipEmptyParts);
318
319     SMESH::long_array_var anElementsId = new SMESH::long_array;
320     SMESH::long_array_var aNodesId = new SMESH::long_array;
321
322     anElementsId->length(aListElementsId.count());
323     for (int i = 0; i < aListElementsId.count(); i++)
324       anElementsId[i] = aListElementsId[i].toInt();
325
326     if (myNbOkNodes) {
327       aNodesId->length(aListNodesId.count());
328       for (int i = 0; i < aListNodesId.count(); i++)
329         aNodesId[i] = aListNodesId[i].toInt();
330     } else {
331       aNodesId->length(0);
332     }
333
334     long anIterationLimit = (long)SpinBox_IterationLimit->value();
335     double aMaxAspectRatio = SpinBox_AspectRatio->GetValue();
336
337     SMESH::SMESH_MeshEditor::Smooth_Method aMethod = SMESH::SMESH_MeshEditor::LAPLACIAN_SMOOTH;
338     if (ComboBoxMethod->currentIndex() > 0)
339       aMethod =  SMESH::SMESH_MeshEditor::CENTROIDAL_SMOOTH;
340
341     bool aResult = false;
342     try {
343       SUIT_OverrideCursor aWaitCursor;
344       SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
345
346       if ( CheckBoxParametric->isChecked() )
347         aResult = aMeshEditor->SmoothParametric(anElementsId.inout(), aNodesId.inout(),
348                                                 anIterationLimit, aMaxAspectRatio, aMethod);
349       else
350         aResult = aMeshEditor->Smooth(anElementsId.inout(), aNodesId.inout(),
351                                       anIterationLimit, aMaxAspectRatio, aMethod);
352     } catch (...) {
353     }
354
355     if (aResult) {
356       Handle(SALOME_InteractiveObject) anIO = myActor->getIO();
357
358       SALOME_ListIO aList;
359       aList.Append(anIO);
360       mySelectionMgr->setSelectedObjects(aList, false);
361       SMESH::UpdateView();
362       Init();
363     }
364   }
365 }
366
367 //=================================================================================
368 // function : ClickOnOk()
369 // purpose  : Called when user presses <OK> button
370 //=================================================================================
371 void SMESHGUI_SmoothingDlg::ClickOnOk()
372 {
373   ClickOnApply();
374   ClickOnCancel();
375 }
376
377 //=================================================================================
378 // function : ClickOnCancel()
379 // purpose  : Called when dialog box is closed
380 //=================================================================================
381 void SMESHGUI_SmoothingDlg::ClickOnCancel()
382 {
383   disconnect(mySelectionMgr, 0, this, 0);
384   mySelectionMgr->clearFilters();
385   //mySelectionMgr->clearSelected();
386   SMESH::SetPickable(); // ???
387   SMESH::SetPointRepresentation(false);
388   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
389     aViewWindow->SetSelectionMode(ActorSelection);
390   mySMESHGUI->ResetState();
391   reject();
392 }
393
394 //=================================================================================
395 // function : ClickOnHelp()
396 // purpose  :
397 //=================================================================================
398 void SMESHGUI_SmoothingDlg::ClickOnHelp()
399 {
400   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
401   if (app) 
402     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
403   else {
404     QString platform;
405 #ifdef WIN32
406     platform = "winapplication";
407 #else
408     platform = "application";
409 #endif
410     SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
411                              tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
412                              arg(app->resourceMgr()->stringValue("ExternalBrowser",
413                                                                  platform)).
414                              arg(myHelpFileName));
415   }
416 }
417
418 //=======================================================================
419 // function : onTextChange()
420 // purpose  :
421 //=======================================================================
422 void SMESHGUI_SmoothingDlg::onTextChange (const QString& theNewText)
423 {
424   QLineEdit* send = (QLineEdit*)sender();
425
426   // return if busy
427   if (myBusy) return;
428
429   // set busy flag
430   myBusy = true;
431
432   if (send == LineEditElements)
433     myNbOkElements = 0;
434   else if (send == LineEditNodes)
435     myNbOkNodes = 0;
436
437   buttonOk->setEnabled(false);
438   buttonApply->setEnabled(false);
439
440   // hilight entered elements/nodes
441   SMDS_Mesh* aMesh = 0;
442   if (myActor)
443     aMesh = myActor->GetObject()->GetMesh();
444
445   if (aMesh) {
446     
447     QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts);
448
449     if (send == LineEditElements) {
450       const Handle(SALOME_InteractiveObject)& anIO = myActor->getIO();
451       TColStd_MapOfInteger newIndices;
452       for (int i = 0; i < aListId.count(); i++) {
453         const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt());
454         if (e)
455           newIndices.Add(e->GetID());
456         myNbOkElements++;
457       }
458       mySelector->AddOrRemoveIndex(anIO, newIndices, false);
459       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
460         aViewWindow->highlight( anIO, true, true );
461       myElementsId = theNewText;
462
463     } else if (send == LineEditNodes) {
464       TColStd_MapOfInteger newIndices;
465       
466       for (int i = 0; i < aListId.count(); i++) {
467         const SMDS_MeshNode * n = aMesh->FindNode(aListId[ i ].toInt());
468         if (n)
469           newIndices.Add(n->GetID());
470         myNbOkNodes++;
471       }
472       mySelector->AddOrRemoveIndex(myActor->getIO(), newIndices, false);
473       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
474         aViewWindow->highlight( myActor->getIO(), true, true );
475     }
476   }
477
478   if (myNbOkElements && (myNbOkNodes || LineEditNodes->text().trimmed().isEmpty())) {
479     buttonOk->setEnabled(true);
480     buttonApply->setEnabled(true);
481   }
482
483   myBusy = false;
484 }
485
486 //=================================================================================
487 // function : SelectionIntoArgument()
488 // purpose  : Called when selection as changed or other case
489 //=================================================================================
490 void SMESHGUI_SmoothingDlg::SelectionIntoArgument()
491 {
492   if (myBusy) return;
493
494   // clear
495   myActor = 0;
496   QString aString = "";
497
498   myBusy = true;
499   if (myEditCurrentArgument == (QWidget*)LineEditElements) {
500     LineEditElements->setText(aString);
501     myNbOkElements = 0;
502     buttonOk->setEnabled(false);
503     buttonApply->setEnabled(false);
504   }
505   myBusy = false;
506
507   if (!GroupButtons->isEnabled()) // inactive
508     return;
509
510   // get selected mesh
511   SALOME_ListIO aList;
512   mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type());
513   int nbSel = aList.Extent();
514   if (nbSel != 1)
515     return;
516
517   Handle(SALOME_InteractiveObject) IO = aList.First();
518   myMesh = SMESH::GetMeshByIO(IO);
519   if (myMesh->_is_nil())
520     return;
521
522   myActor = SMESH::FindActorByObject(myMesh);
523   if (!myActor)
524     return;
525
526   int aNbUnits = 0;
527
528   if (myEditCurrentArgument == LineEditElements) {
529     myElementsId = "";
530
531     if (CheckBoxMesh->isChecked()) {
532       SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
533
534       if (!SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO)->_is_nil()) { //MESH
535         // get IDs from mesh
536         SMDS_Mesh* aSMDSMesh = myActor->GetObject()->GetMesh();
537         if (!aSMDSMesh)
538           return;
539
540         for (int i = aSMDSMesh->MinElementID(); i <= aSMDSMesh->MaxElementID(); i++ ) {
541           const SMDS_MeshElement * e = aSMDSMesh->FindElement(i);
542           if (e) {
543             myElementsId += QString(" %1").arg(i);
544             aNbUnits++;
545           }
546         }
547       } else if (!SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(IO)->_is_nil()) { //SUBMESH
548         // get submesh
549         SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(IO);
550
551         // get IDs from submesh
552         SMESH::long_array_var anElementsIds = new SMESH::long_array;
553         anElementsIds = aSubMesh->GetElementsId();
554         for (int i = 0; i < anElementsIds->length(); i++) {
555           myElementsId += QString(" %1").arg(anElementsIds[i]);
556         }
557         aNbUnits = anElementsIds->length();
558       } else { // GROUP
559         // get smesh group
560         SMESH::SMESH_GroupBase_var aGroup =
561           SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IO);
562         if (aGroup->_is_nil())
563           return;
564
565         // get IDs from smesh group
566         SMESH::long_array_var anElementsIds = new SMESH::long_array;
567         anElementsIds = aGroup->GetListOfID();
568         for (int i = 0; i < anElementsIds->length(); i++) {
569           myElementsId += QString(" %1").arg(anElementsIds[i]);
570         }
571         aNbUnits = anElementsIds->length();
572       }
573     } else {
574       aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, IO, aString);
575       myElementsId = aString;
576     }
577   } else if (myEditCurrentArgument == LineEditNodes && !myMesh->_is_nil() && myActor) {
578     myNbOkNodes = 0;
579     aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, IO, aString);
580   } else {
581   }
582
583   if (aNbUnits < 1)
584     return;
585
586   myBusy = true;
587   myEditCurrentArgument->setText(aString);
588   myBusy = false;
589
590   // OK
591   if (myEditCurrentArgument == LineEditElements)
592     myNbOkElements = true;
593   else if (myEditCurrentArgument == LineEditNodes)
594     myNbOkNodes = true;
595
596   if (myNbOkElements) {
597     buttonOk->setEnabled(true);
598     buttonApply->setEnabled(true);
599   }
600 }
601
602 //=================================================================================
603 // function : SetEditCurrentArgument()
604 // purpose  :
605 //=================================================================================
606 void SMESHGUI_SmoothingDlg::SetEditCurrentArgument()
607 {
608   QPushButton* send = (QPushButton*)sender();
609
610   switch (myConstructorId) {
611   case 0: /* default constructor */
612     {
613       disconnect(mySelectionMgr, 0, this, 0);
614       mySelectionMgr->clearSelected();
615       mySelectionMgr->clearFilters();
616
617       if (send == SelectElementsButton) {
618         myEditCurrentArgument = LineEditElements;
619         SMESH::SetPointRepresentation(false);
620         if (CheckBoxMesh->isChecked()) {
621           mySelectionMgr->setSelectionModes(ActorSelection);
622           mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
623         } else {
624           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
625             aViewWindow->SetSelectionMode(CellSelection);
626         }
627       } else if (send == SelectNodesButton) {
628         myEditCurrentArgument = LineEditNodes;
629         SMESH::SetPointRepresentation(true);
630         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
631           aViewWindow->SetSelectionMode(NodeSelection);
632       }
633
634       myEditCurrentArgument->setFocus();
635       connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
636       SelectionIntoArgument();
637       break;
638     }
639   }
640 }
641
642 //=================================================================================
643 // function : DeactivateActiveDialog()
644 // purpose  : Deactivates this dialog
645 //=================================================================================
646 void SMESHGUI_SmoothingDlg::DeactivateActiveDialog()
647 {
648   if (GroupConstructors->isEnabled()) {
649     GroupConstructors->setEnabled(false);
650     GroupArguments->setEnabled(false);
651     GroupButtons->setEnabled(false);
652     mySMESHGUI->ResetState();
653     mySMESHGUI->SetActiveDialogBox(0);
654   }
655 }
656
657 //=================================================================================
658 // function : ActivateThisDialog()
659 // purpose  : Activates this dialog
660 //=================================================================================
661 void SMESHGUI_SmoothingDlg::ActivateThisDialog()
662 {
663   // Emit a signal to deactivate the active dialog
664   mySMESHGUI->EmitSignalDeactivateDialog();
665   GroupConstructors->setEnabled(true);
666   GroupArguments->setEnabled(true);
667   GroupButtons->setEnabled(true);
668
669   mySMESHGUI->SetActiveDialogBox(this);
670   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
671     aViewWindow->SetSelectionMode(CellSelection);
672   SelectionIntoArgument();
673 }
674
675 //=================================================================================
676 // function : enterEvent()
677 // purpose  : Mouse enter event
678 //=================================================================================
679 void SMESHGUI_SmoothingDlg::enterEvent (QEvent*)
680 {
681   if (!GroupConstructors->isEnabled())
682     ActivateThisDialog();
683 }
684
685 //=================================================================================
686 // function : closeEvent()
687 // purpose  :
688 //=================================================================================
689 void SMESHGUI_SmoothingDlg::closeEvent (QCloseEvent*)
690 {
691   /* same than click on cancel button */
692   ClickOnCancel();
693 }
694
695 //=======================================================================
696 // function : hideEvent()
697 // purpose  : caused by ESC key
698 //=======================================================================
699 void SMESHGUI_SmoothingDlg::hideEvent (QHideEvent*)
700 {
701   if (!isMinimized())
702     ClickOnCancel();
703 }
704
705 //=======================================================================
706 // function : onSelectMesh()
707 // purpose  :
708 //=======================================================================
709 void SMESHGUI_SmoothingDlg::onSelectMesh (bool toSelectMesh)
710 {
711   if (toSelectMesh)
712     TextLabelElements->setText(tr("SMESH_NAME"));
713   else
714     TextLabelElements->setText(tr("SMESH_ID_ELEMENTS"));
715
716   if (myEditCurrentArgument != LineEditElements) {
717     LineEditElements->clear();
718     return;
719   }
720
721   mySelectionMgr->clearFilters();
722   SMESH::SetPointRepresentation(false);
723
724   if (toSelectMesh) {
725     mySelectionMgr->setSelectionModes(ActorSelection);
726     mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
727     LineEditElements->setReadOnly(true);
728     LineEditElements->setValidator(0);
729   } else {
730     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
731       aViewWindow->SetSelectionMode(CellSelection);
732     LineEditElements->setReadOnly(false);
733     LineEditElements->setValidator(myIdValidator);
734     onTextChange(LineEditElements->text());
735   }
736
737   SelectionIntoArgument();
738 }
739
740 //=================================================================================
741 // function : keyPressEvent()
742 // purpose  :
743 //=================================================================================
744 void SMESHGUI_SmoothingDlg::keyPressEvent( QKeyEvent* e )
745 {
746   QDialog::keyPressEvent( e );
747   if ( e->isAccepted() )
748     return;
749
750   if ( e->key() == Qt::Key_F1 ) {
751     e->accept();
752     ClickOnHelp();
753   }
754 }