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