Salome HOME
PR: merged from V5_1_4rc1
[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   myElemFilterBtn = new QPushButton( tr( "SMESH_BUT_FILTER" ), GroupArguments );
142   connect(myElemFilterBtn,   SIGNAL(clicked()), this, SLOT(setElemFilters()));
143
144   // Control for the whole mesh selection
145   CheckBoxMesh = new QCheckBox(tr("SMESH_SELECT_WHOLE_MESH"), GroupArguments);
146
147   // Controls for nodes selection
148   TextLabelNodes = new QLabel(tr("FIXED_NODES_IDS"), GroupArguments);
149
150   SelectNodesButton  = new QPushButton(GroupArguments);
151   SelectNodesButton->setIcon(image1);
152
153   LineEditNodes  = new QLineEdit(GroupArguments);
154   LineEditNodes->setValidator(myIdValidator);
155   QPushButton* filterNodeBtn = new QPushButton( tr( "SMESH_BUT_FILTER" ), GroupArguments );
156   connect(filterNodeBtn,   SIGNAL(clicked()), this, SLOT(setNodeFilters()));
157
158   // Controls for method selection
159   TextLabelMethod = new QLabel(tr("METHOD"), GroupArguments);
160
161   ComboBoxMethod = new QComboBox(GroupArguments);
162
163   // Controls for iteration limit defining
164   TextLabelLimit = new QLabel(tr("ITERATION_LIMIT"), GroupArguments);
165
166   SpinBox_IterationLimit = new SalomeApp_IntSpinBox(GroupArguments);
167
168   // Controls for max. aspect ratio defining
169   TextLabelAspectRatio = new QLabel(tr("MAX_ASPECT_RATIO"), GroupArguments);
170
171   SpinBox_AspectRatio = new SMESHGUI_SpinBox(GroupArguments);
172
173   // Check box "Is Parametric"
174   CheckBoxParametric = new QCheckBox( tr("IS_PARAMETRIC"), GroupArguments );
175
176   GroupArgumentsLayout->addWidget(TextLabelElements,      0, 0);
177   GroupArgumentsLayout->addWidget(SelectElementsButton,   0, 1);
178   GroupArgumentsLayout->addWidget(LineEditElements,       0, 2);
179   GroupArgumentsLayout->addWidget(myElemFilterBtn,        0, 3);
180   GroupArgumentsLayout->addWidget(CheckBoxMesh,           1, 0, 1, 4);
181   GroupArgumentsLayout->addWidget(TextLabelNodes,         2, 0);
182   GroupArgumentsLayout->addWidget(SelectNodesButton,      2, 1);
183   GroupArgumentsLayout->addWidget(LineEditNodes,          2, 2);
184   GroupArgumentsLayout->addWidget(filterNodeBtn,          2, 3);
185   GroupArgumentsLayout->addWidget(TextLabelMethod,        3, 0);
186   GroupArgumentsLayout->addWidget(ComboBoxMethod,         3, 2, 1, 2);
187   GroupArgumentsLayout->addWidget(TextLabelLimit,         4, 0);
188   GroupArgumentsLayout->addWidget(SpinBox_IterationLimit, 4, 2, 1, 2);
189   GroupArgumentsLayout->addWidget(TextLabelAspectRatio,   5, 0);
190   GroupArgumentsLayout->addWidget(SpinBox_AspectRatio,    5, 2, 1, 2);
191   GroupArgumentsLayout->addWidget(CheckBoxParametric,     6, 0, 1, 4);
192
193   /***************************************************************/
194   GroupButtons = new QGroupBox(this);
195   QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons);
196   GroupButtonsLayout->setSpacing(SPACING);
197   GroupButtonsLayout->setMargin(MARGIN);
198
199   buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons);
200   buttonOk->setAutoDefault(true);
201   buttonOk->setDefault(true);
202   buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
203   buttonApply->setAutoDefault(true);
204   buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
205   buttonCancel->setAutoDefault(true);
206   buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons);
207   buttonHelp->setAutoDefault(true);
208
209   GroupButtonsLayout->addWidget(buttonOk);
210   GroupButtonsLayout->addSpacing(10);
211   GroupButtonsLayout->addWidget(buttonApply);
212   GroupButtonsLayout->addSpacing(10);
213   GroupButtonsLayout->addStretch();
214   GroupButtonsLayout->addWidget(buttonCancel);
215   GroupButtonsLayout->addWidget(buttonHelp);
216
217   /***************************************************************/
218   SMESHGUI_SmoothingDlgLayout->addWidget(GroupConstructors);
219   SMESHGUI_SmoothingDlgLayout->addWidget(GroupArguments);
220   SMESHGUI_SmoothingDlgLayout->addWidget(GroupButtons);
221
222   /***************************************************************/
223   /* Initialisations */
224   ComboBoxMethod->addItem(tr("LAPLACIAN"));
225   ComboBoxMethod->addItem(tr("CENTROIDAL"));
226
227   ComboBoxMethod->setCurrentIndex(0);
228
229   CheckBoxParametric->setChecked( true );
230   
231   SpinBox_IterationLimit->setRange(1, 999999);
232   SpinBox_IterationLimit->setValue(20);
233   SpinBox_AspectRatio->RangeStepAndValidator(0.0, +999999.999, 0.1, "parametric_precision");
234   SpinBox_AspectRatio->SetValue(1.1);
235
236   GroupArguments->show();
237   myConstructorId = 0;
238   Constructor1->setChecked(true);
239   
240   mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
241
242   mySMESHGUI->SetActiveDialogBox(this);
243
244   // Costruction of the logical filter for the elements: mesh/sub-mesh/group
245   SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
246   SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter (GROUP);
247
248   QList<SUIT_SelectionFilter*> aListOfFilters;
249   if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
250   if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
251
252   myMeshOrSubMeshOrGroupFilter =
253     new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
254
255   myHelpFileName = "smoothing_page.html";
256
257   Init();
258
259   /***************************************************************/
260   // signals and slots connections
261   connect(buttonOk, SIGNAL(clicked()),     this, SLOT(ClickOnOk()));
262   connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
263   connect(buttonApply, SIGNAL(clicked()),  this, SLOT(ClickOnApply()));
264   connect(buttonHelp, SIGNAL(clicked()), this, SLOT(ClickOnHelp()));
265
266   connect(SelectElementsButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
267   connect(SelectNodesButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
268   connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
269   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
270   /* to close dialog if study change */
271   connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
272   connect(LineEditElements, SIGNAL(textChanged(const QString&)),
273            SLOT(onTextChange(const QString&)));
274   connect(LineEditNodes, SIGNAL(textChanged(const QString&)),
275            SLOT(onTextChange(const QString&)));
276   connect(CheckBoxMesh, SIGNAL(toggled(bool)),
277            SLOT(onSelectMesh(bool)));
278 }
279
280 //=================================================================================
281 // function : ~SMESHGUI_SmoothingDlg()
282 // purpose  : destructor
283 //=================================================================================
284 SMESHGUI_SmoothingDlg::~SMESHGUI_SmoothingDlg()
285 {
286   // no need to delete child widgets, Qt does it all for us
287   if ( myFilterDlg != 0 ) {
288     myFilterDlg->setParent( 0 );
289     delete myFilterDlg;
290   }
291 }
292
293 //=================================================================================
294 // function : Init()
295 // purpose  : initialization
296 //=================================================================================
297 void SMESHGUI_SmoothingDlg::Init()
298 {
299   myBusy = false;
300
301 //   ComboBoxMethod->setCurrentItem(0);
302
303 //   SpinBox_IterationLimit->setValue(20);
304 //   SpinBox_AspectRatio->SetValue(1.1);
305
306   myEditCurrentArgument = LineEditElements;
307   LineEditElements->setFocus();
308   LineEditElements->clear();
309   LineEditNodes->clear();
310   myElementsId = "";
311   myNbOkElements = 0;
312   myNbOkNodes = 0;
313   myActor     = 0;
314   myMesh = SMESH::SMESH_Mesh::_nil();
315
316   CheckBoxMesh->setChecked(false);
317   onSelectMesh(false);
318 }
319
320 //=================================================================================
321 // function : ClickOnApply()
322 // purpose  : Called when user presses <Apply> button
323 //=================================================================================
324 bool SMESHGUI_SmoothingDlg::ClickOnApply()
325 {
326   if (mySMESHGUI->isActiveStudyLocked())
327     return false;
328
329   if (!isValid())
330     return false;
331
332   if (myNbOkElements && (myNbOkNodes || LineEditNodes->text().trimmed().isEmpty())) {
333     QStringList aListElementsId = myElementsId.split(" ", QString::SkipEmptyParts);
334     QStringList aListNodesId    = LineEditNodes->text().split(" ", QString::SkipEmptyParts);
335
336     SMESH::long_array_var anElementsId = new SMESH::long_array;
337     SMESH::long_array_var aNodesId = new SMESH::long_array;
338
339     anElementsId->length(aListElementsId.count());
340     for (int i = 0; i < aListElementsId.count(); i++)
341       anElementsId[i] = aListElementsId[i].toInt();
342
343     if ( myNbOkNodes && aListNodesId.count() > 0 ) {
344       aNodesId->length(aListNodesId.count());
345       for (int i = 0; i < aListNodesId.count(); i++)
346         aNodesId[i] = aListNodesId[i].toInt();
347     } else {
348       aNodesId->length(0);
349     }
350
351     long anIterationLimit = (long)SpinBox_IterationLimit->value();
352     double aMaxAspectRatio = SpinBox_AspectRatio->GetValue();
353
354     QStringList aParameters;
355     aParameters << SpinBox_IterationLimit->text();
356     aParameters << SpinBox_AspectRatio->text();
357
358     SMESH::SMESH_MeshEditor::Smooth_Method aMethod = SMESH::SMESH_MeshEditor::LAPLACIAN_SMOOTH;
359     if (ComboBoxMethod->currentIndex() > 0)
360       aMethod =  SMESH::SMESH_MeshEditor::CENTROIDAL_SMOOTH;
361
362     bool aResult = false;
363     try {
364       SUIT_OverrideCursor aWaitCursor;
365       SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
366
367       if ( CheckBoxParametric->isChecked() ) {
368         if(CheckBoxMesh->isChecked())
369           aResult = aMeshEditor->SmoothParametricObject(mySelectedObject, aNodesId.inout(),
370                                                         anIterationLimit, aMaxAspectRatio, aMethod);
371         else
372           aResult = aMeshEditor->SmoothParametric(anElementsId.inout(), aNodesId.inout(),
373                                                   anIterationLimit, aMaxAspectRatio, aMethod);
374       }
375       else {
376         if(CheckBoxMesh->isChecked())
377           aResult = aMeshEditor->SmoothObject(mySelectedObject, aNodesId.inout(),
378                                               anIterationLimit, aMaxAspectRatio, aMethod);
379         else
380           aResult = aMeshEditor->Smooth(anElementsId.inout(), aNodesId.inout(),
381                                         anIterationLimit, aMaxAspectRatio, aMethod);
382       }
383
384       myMesh->SetParameters( aParameters.join(":").toLatin1().constData() );
385
386     } catch (...) {
387     }
388
389     if (aResult) {
390       if ( myActor ) {
391         Handle(SALOME_InteractiveObject) anIO = myActor->getIO();
392         SALOME_ListIO aList;
393         aList.Append(anIO);
394         mySelectionMgr->setSelectedObjects(aList, false);
395       }
396
397       SMESH::UpdateView();
398       Init();
399
400       mySelectedObject = SMESH::SMESH_IDSource::_nil();
401     }
402   }
403
404   return true;
405 }
406
407 //=================================================================================
408 // function : ClickOnOk()
409 // purpose  : Called when user presses <OK> button
410 //=================================================================================
411 void SMESHGUI_SmoothingDlg::ClickOnOk()
412 {
413   if( ClickOnApply() )
414     ClickOnCancel();
415 }
416
417 //=================================================================================
418 // function : ClickOnCancel()
419 // purpose  : Called when dialog box is closed
420 //=================================================================================
421 void SMESHGUI_SmoothingDlg::ClickOnCancel()
422 {
423   disconnect(mySelectionMgr, 0, this, 0);
424   mySelectionMgr->clearFilters();
425   //mySelectionMgr->clearSelected();
426   if (SMESH::GetCurrentVtkView()) {
427     SMESH::RemoveFilters(); // PAL6938 -- clean all mesh entity filters
428     SMESH::SetPointRepresentation(false);
429     SMESH::SetPickable();
430   }
431   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
432     aViewWindow->SetSelectionMode(ActorSelection);
433   mySMESHGUI->ResetState();
434   reject();
435 }
436
437 //=================================================================================
438 // function : ClickOnHelp()
439 // purpose  :
440 //=================================================================================
441 void SMESHGUI_SmoothingDlg::ClickOnHelp()
442 {
443   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
444   if (app) 
445     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
446   else {
447     QString platform;
448 #ifdef WIN32
449     platform = "winapplication";
450 #else
451     platform = "application";
452 #endif
453     SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
454                              tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
455                              arg(app->resourceMgr()->stringValue("ExternalBrowser",
456                                                                  platform)).
457                              arg(myHelpFileName));
458   }
459 }
460
461 //=======================================================================
462 // function : onTextChange()
463 // purpose  :
464 //=======================================================================
465 void SMESHGUI_SmoothingDlg::onTextChange (const QString& theNewText)
466 {
467   QLineEdit* send = (QLineEdit*)sender();
468
469   // return if busy
470   if (myBusy) return;
471
472   // set busy flag
473   myBusy = true;
474
475   if (send == LineEditElements)
476     myNbOkElements = 0;
477   else if (send == LineEditNodes)
478     myNbOkNodes = 0;
479
480   buttonOk->setEnabled(false);
481   buttonApply->setEnabled(false);
482
483   // hilight entered elements/nodes
484   SMDS_Mesh* aMesh = 0;
485   if (myActor)
486     aMesh = myActor->GetObject()->GetMesh();
487
488   if (aMesh) {
489     
490     QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts);
491
492     if (send == LineEditElements) {
493       const Handle(SALOME_InteractiveObject)& anIO = myActor->getIO();
494       TColStd_MapOfInteger newIndices;
495       for (int i = 0; i < aListId.count(); i++) {
496         const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt());
497         if (e)
498           newIndices.Add(e->GetID());
499         myNbOkElements++;
500       }
501       mySelector->AddOrRemoveIndex(anIO, newIndices, false);
502       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
503         aViewWindow->highlight( anIO, true, true );
504       myElementsId = theNewText;
505
506     } else if (send == LineEditNodes) {
507       TColStd_MapOfInteger newIndices;
508       
509       for (int i = 0; i < aListId.count(); i++) {
510         const SMDS_MeshNode * n = aMesh->FindNode(aListId[ i ].toInt());
511         if (n)
512           newIndices.Add(n->GetID());
513         myNbOkNodes++;
514       }
515       mySelector->AddOrRemoveIndex(myActor->getIO(), newIndices, false);
516       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
517         aViewWindow->highlight( myActor->getIO(), true, true );
518     }
519   }
520
521   if (myNbOkElements && (myNbOkNodes || LineEditNodes->text().trimmed().isEmpty())) {
522     buttonOk->setEnabled(true);
523     buttonApply->setEnabled(true);
524   }
525
526   myBusy = false;
527 }
528
529 //=================================================================================
530 // function : SelectionIntoArgument()
531 // purpose  : Called when selection as changed or other case
532 //=================================================================================
533 void SMESHGUI_SmoothingDlg::SelectionIntoArgument()
534 {
535   if (myBusy) return;
536
537   // clear
538   QString aString = "";
539
540   myBusy = true;
541   if (myEditCurrentArgument == LineEditElements ||
542       myEditCurrentArgument == LineEditNodes) {
543     myEditCurrentArgument->setText(aString);
544     if (myEditCurrentArgument == LineEditElements)
545       myNbOkElements = 0;
546     else
547       myNbOkNodes = 0;
548     buttonOk->setEnabled(false);
549     buttonApply->setEnabled(false);
550     myActor = 0;
551   }
552   myBusy = false;
553
554   if (!GroupButtons->isEnabled()) // inactive
555     return;
556
557   // get selected mesh
558   SALOME_ListIO aList;
559   mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type());
560   int nbSel = aList.Extent();
561   if (nbSel != 1)
562     return;
563
564   Handle(SALOME_InteractiveObject) IO = aList.First();
565   myMesh = SMESH::GetMeshByIO(IO);
566   if (myMesh->_is_nil())
567     return;
568
569   myActor = SMESH::FindActorByObject(myMesh);
570   if (!myActor && !CheckBoxMesh->isChecked())
571     return;
572
573   int aNbUnits = 0;
574
575   if (myEditCurrentArgument == LineEditElements) {
576     myElementsId = "";
577
578     if (CheckBoxMesh->isChecked()) {
579       SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
580
581       if (!SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO)->_is_nil())
582         mySelectedObject = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO);
583       else
584         return;
585     } else {
586       aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, IO, aString);
587       myElementsId = aString;
588       if (aNbUnits < 1)
589         return;
590     }
591   } else if (myEditCurrentArgument == LineEditNodes && !myMesh->_is_nil() && myActor) {
592     myNbOkNodes = 0;
593     aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, IO, aString);
594   } else {
595   }
596
597   myBusy = true;
598   myEditCurrentArgument->setText(aString);
599   myEditCurrentArgument->repaint();
600   myEditCurrentArgument->setEnabled(false); // to update lineedit IPAL 19809
601   myEditCurrentArgument->setEnabled(true); 
602   myBusy = false;
603
604   // OK
605   if (myEditCurrentArgument == LineEditElements)
606     myNbOkElements = true;
607   else if (myEditCurrentArgument == LineEditNodes)
608     myNbOkNodes = true;
609
610   if (myNbOkElements && (myNbOkNodes || LineEditNodes->text().trimmed().isEmpty())) {
611     buttonOk->setEnabled(true);
612     buttonApply->setEnabled(true);
613   }
614 }
615
616 //=================================================================================
617 // function : SetEditCurrentArgument()
618 // purpose  :
619 //=================================================================================
620 void SMESHGUI_SmoothingDlg::SetEditCurrentArgument()
621 {
622   QPushButton* send = (QPushButton*)sender();
623
624   switch (myConstructorId) {
625   case 0: /* default constructor */
626     {
627       disconnect(mySelectionMgr, 0, this, 0);
628       mySelectionMgr->clearSelected();
629       mySelectionMgr->clearFilters();
630
631       if (send == SelectElementsButton) {
632         myEditCurrentArgument = LineEditElements;
633         SMESH::SetPointRepresentation(false);
634         if (CheckBoxMesh->isChecked()) {
635           //          mySelectionMgr->setSelectionModes(ActorSelection);
636           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
637             aViewWindow->SetSelectionMode(ActorSelection);
638           mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
639         } else {
640           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
641             aViewWindow->SetSelectionMode(FaceSelection);
642         }
643       } else if (send == SelectNodesButton) {
644         LineEditNodes->clear();
645         myEditCurrentArgument = LineEditNodes;
646         SMESH::SetPointRepresentation(true);
647         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) {
648           aViewWindow->SetSelectionMode(NodeSelection);
649         }
650       }
651
652       myEditCurrentArgument->setFocus();
653       connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
654       SelectionIntoArgument();
655       break;
656     }
657   }
658 }
659
660 //=================================================================================
661 // function : DeactivateActiveDialog()
662 // purpose  : Deactivates this dialog
663 //=================================================================================
664 void SMESHGUI_SmoothingDlg::DeactivateActiveDialog()
665 {
666   if (GroupConstructors->isEnabled()) {
667     GroupConstructors->setEnabled(false);
668     GroupArguments->setEnabled(false);
669     GroupButtons->setEnabled(false);
670     mySMESHGUI->ResetState();
671     mySMESHGUI->SetActiveDialogBox(0);
672   }
673 }
674
675 //=================================================================================
676 // function : ActivateThisDialog()
677 // purpose  : Activates this dialog
678 //=================================================================================
679 void SMESHGUI_SmoothingDlg::ActivateThisDialog()
680 {
681   // Emit a signal to deactivate the active dialog
682   mySMESHGUI->EmitSignalDeactivateDialog();
683   GroupConstructors->setEnabled(true);
684   GroupArguments->setEnabled(true);
685   GroupButtons->setEnabled(true);
686
687   mySMESHGUI->SetActiveDialogBox(this);
688   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
689     aViewWindow->SetSelectionMode(FaceSelection);
690   SelectionIntoArgument();
691 }
692
693 //=================================================================================
694 // function : enterEvent()
695 // purpose  : Mouse enter event
696 //=================================================================================
697 void SMESHGUI_SmoothingDlg::enterEvent (QEvent*)
698 {
699   if (!GroupConstructors->isEnabled())
700     ActivateThisDialog();
701 }
702
703 //=================================================================================
704 // function : closeEvent()
705 // purpose  :
706 //=================================================================================
707 void SMESHGUI_SmoothingDlg::closeEvent (QCloseEvent*)
708 {
709   /* same than click on cancel button */
710   ClickOnCancel();
711 }
712
713 //=======================================================================
714 // function : hideEvent()
715 // purpose  : caused by ESC key
716 //=======================================================================
717 void SMESHGUI_SmoothingDlg::hideEvent (QHideEvent*)
718 {
719   if (!isMinimized())
720     ClickOnCancel();
721 }
722
723 //=======================================================================
724 // function : onSelectMesh()
725 // purpose  :
726 //=======================================================================
727 void SMESHGUI_SmoothingDlg::onSelectMesh (bool toSelectMesh)
728 {
729   if (toSelectMesh)
730     TextLabelElements->setText(tr("SMESH_NAME"));
731   else
732     TextLabelElements->setText(tr("SMESH_ID_ELEMENTS"));
733   myElemFilterBtn->setEnabled(!toSelectMesh);
734
735   if (myEditCurrentArgument != LineEditElements &&
736       myEditCurrentArgument != LineEditNodes) {
737     LineEditElements->clear();
738     LineEditNodes->clear();
739     return;
740   }
741
742   mySelectionMgr->clearFilters();
743   SMESH::SetPointRepresentation(false);
744
745   if (toSelectMesh) {
746     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
747       aViewWindow->SetSelectionMode(ActorSelection);
748     //    mySelectionMgr->setSelectionModes(ActorSelection);
749     mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
750     myEditCurrentArgument->setReadOnly(true);
751     myEditCurrentArgument->setValidator(0);
752   } else {
753     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
754       aViewWindow->SetSelectionMode(myEditCurrentArgument == LineEditElements ? FaceSelection 
755                                                                               : NodeSelection );
756     myEditCurrentArgument->setReadOnly(false);
757     LineEditElements->setValidator(myIdValidator);
758     onTextChange(myEditCurrentArgument->text());
759   }
760
761   SelectionIntoArgument();
762 }
763
764 //=================================================================================
765 // function : keyPressEvent()
766 // purpose  :
767 //=================================================================================
768 void SMESHGUI_SmoothingDlg::keyPressEvent( QKeyEvent* e )
769 {
770   QDialog::keyPressEvent( e );
771   if ( e->isAccepted() )
772     return;
773
774   if ( e->key() == Qt::Key_F1 ) {
775     e->accept();
776     ClickOnHelp();
777   }
778 }
779
780 //=================================================================================
781 // function : setFilters()
782 // purpose  : activate filter dialog
783 //=================================================================================
784 void SMESHGUI_SmoothingDlg::setFilters( const bool theIsElem )
785 {
786   if(myMesh->_is_nil()) {
787     SUIT_MessageBox::critical(this,
788                               tr("SMESH_ERROR"),
789                               tr("NO_MESH_SELECTED"));
790    return;
791   }
792   if ( !myFilterDlg )
793   {
794     QList<int> types;  
795     types.append( SMESH::NODE );
796     types.append( SMESH::ALL );
797     myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, types );
798   }
799   myFilterDlg->Init( theIsElem ? SMESH::ALL : SMESH::NODE );
800
801   myFilterDlg->SetSelection();
802   myFilterDlg->SetMesh( myMesh );
803   myFilterDlg->SetSourceWg( theIsElem ? LineEditElements : LineEditNodes );
804
805   myFilterDlg->show();
806 }
807
808 //=================================================================================
809 // function : setElemFilters()
810 // purpose  : SLOT. Called when element "Filter" button pressed.
811 //=================================================================================
812 void SMESHGUI_SmoothingDlg::setElemFilters()
813 {
814   setFilters( true );
815 }
816
817 //=================================================================================
818 // function : setNodeFilters()
819 // purpose  : SLOT. Called when node "Filter" button pressed.
820 //=================================================================================
821 void SMESHGUI_SmoothingDlg::setNodeFilters()
822 {
823   setFilters( false );
824 }
825
826 //=================================================================================
827 // function : isValid
828 // purpose  :
829 //=================================================================================
830 bool SMESHGUI_SmoothingDlg::isValid()
831 {
832   QString msg;
833   bool ok = true;
834   ok = SpinBox_IterationLimit->isValid( msg, true ) && ok;
835   ok = SpinBox_AspectRatio->isValid( msg, true ) && ok;
836
837   if( !ok ) {
838     QString str( tr( "SMESH_INCORRECT_INPUT" ) );
839     if ( !msg.isEmpty() )
840       str += "\n" + msg;
841     SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
842     return false;
843   }
844   return true;
845 }