Salome HOME
1f5bd1e041964188872e4aab0fc84f7ceccb7585
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_SmoothingDlg.cxx
1 //  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 // SMESH SMESHGUI : GUI for SMESH component
23 // File   : SMESHGUI_SmoothingDlg.cxx
24 // Author : Michael ZORIN, Open CASCADE S.A.S.
25 // SMESH includes
26 //
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 #include "SMESHGUI_FilterDlg.h"
36
37 #include <SMESH_Actor.h>
38 #include <SMESH_TypeFilter.hxx>
39 #include <SMESH_LogicalFilter.hxx>
40
41 #include <SMDS_Mesh.hxx>
42
43 // SALOME GUI includes
44 #include <SUIT_ResourceMgr.h>
45 #include <SUIT_OverrideCursor.h>
46 #include <SUIT_Desktop.h>
47 #include <SUIT_Session.h>
48 #include <SUIT_MessageBox.h>
49
50 #include <LightApp_Application.h>
51 #include <LightApp_SelectionMgr.h>
52
53 #include <SalomeApp_IntSpinBox.h>
54
55 #include <SVTK_ViewModel.h>
56 #include <SVTK_Selector.h>
57 #include <SVTK_ViewWindow.h>
58 #include <SVTK_Selection.h>
59 #include <SALOME_ListIO.hxx>
60
61 // OCCT includes
62 #include <TColStd_MapOfInteger.hxx>
63
64 // Qt includes
65 #include <QApplication>
66 #include <QGroupBox>
67 #include <QLabel>
68 #include <QLineEdit>
69 #include <QPushButton>
70 #include <QRadioButton>
71 #include <QComboBox>
72 #include <QCheckBox>
73 #include <QHBoxLayout>
74 #include <QVBoxLayout>
75 #include <QGridLayout>
76 #include <QKeyEvent>
77 #include <QButtonGroup>
78
79 // IDL includes
80 #include <SALOMEconfig.h>
81 #include CORBA_SERVER_HEADER(SMESH_Group)
82 #include CORBA_SERVER_HEADER(SMESH_MeshEditor)
83
84 #define SPACING 6
85 #define MARGIN  11
86
87 //=================================================================================
88 // function : SMESHGUI_SmoothingDlg()
89 // purpose  : constructor
90 //=================================================================================
91 SMESHGUI_SmoothingDlg::SMESHGUI_SmoothingDlg( SMESHGUI* theModule )
92   : QDialog( SMESH::GetDesktop( theModule ) ),
93     SMESHGUI_Helper( 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, 3);
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       //asl: myMesh->SetParameters( aParameters.join(":").toLatin1().constData() );
385
386     } catch (...) {
387     }
388
389     if (aResult) {
390       Handle(SALOME_InteractiveObject) anIO = myActor->getIO();
391
392       SALOME_ListIO aList;
393       aList.Append(anIO);
394       mySelectionMgr->setSelectedObjects(aList, false);
395       SMESH::UpdateView();
396       Init();
397
398       mySelectedObject = SMESH::SMESH_IDSource::_nil();
399     }
400   }
401
402   return true;
403 }
404
405 //=================================================================================
406 // function : ClickOnOk()
407 // purpose  : Called when user presses <OK> button
408 //=================================================================================
409 void SMESHGUI_SmoothingDlg::ClickOnOk()
410 {
411   if( ClickOnApply() )
412     ClickOnCancel();
413 }
414
415 //=================================================================================
416 // function : ClickOnCancel()
417 // purpose  : Called when dialog box is closed
418 //=================================================================================
419 void SMESHGUI_SmoothingDlg::ClickOnCancel()
420 {
421   disconnect(mySelectionMgr, 0, this, 0);
422   mySelectionMgr->clearFilters();
423   //mySelectionMgr->clearSelected();
424   if (SMESH::GetCurrentVtkView()) {
425     SMESH::RemoveFilters(); // PAL6938 -- clean all mesh entity filters
426     SMESH::SetPointRepresentation(false);
427     SMESH::SetPickable();
428   }
429   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
430     aViewWindow->SetSelectionMode(ActorSelection);
431   mySMESHGUI->ResetState();
432   reject();
433 }
434
435 //=================================================================================
436 // function : ClickOnHelp()
437 // purpose  :
438 //=================================================================================
439 void SMESHGUI_SmoothingDlg::ClickOnHelp()
440 {
441   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
442   if (app) 
443     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
444   else {
445     QString platform;
446 #ifdef WIN32
447     platform = "winapplication";
448 #else
449     platform = "application";
450 #endif
451     SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
452                              tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
453                              arg(app->resourceMgr()->stringValue("ExternalBrowser",
454                                                                  platform)).
455                              arg(myHelpFileName));
456   }
457 }
458
459 //=======================================================================
460 // function : onTextChange()
461 // purpose  :
462 //=======================================================================
463 void SMESHGUI_SmoothingDlg::onTextChange (const QString& theNewText)
464 {
465   QLineEdit* send = (QLineEdit*)sender();
466
467   // return if busy
468   if (myBusy) return;
469
470   // set busy flag
471   myBusy = true;
472
473   if (send == LineEditElements)
474     myNbOkElements = 0;
475   else if (send == LineEditNodes)
476     myNbOkNodes = 0;
477
478   buttonOk->setEnabled(false);
479   buttonApply->setEnabled(false);
480
481   // hilight entered elements/nodes
482   SMDS_Mesh* aMesh = 0;
483   if (myActor)
484     aMesh = myActor->GetObject()->GetMesh();
485
486   if (aMesh) {
487     
488     QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts);
489
490     if (send == LineEditElements) {
491       const Handle(SALOME_InteractiveObject)& anIO = myActor->getIO();
492       TColStd_MapOfInteger newIndices;
493       for (int i = 0; i < aListId.count(); i++) {
494         const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt());
495         if (e)
496           newIndices.Add(e->GetID());
497         myNbOkElements++;
498       }
499       mySelector->AddOrRemoveIndex(anIO, newIndices, false);
500       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
501         aViewWindow->highlight( anIO, true, true );
502       myElementsId = theNewText;
503
504     } else if (send == LineEditNodes) {
505       TColStd_MapOfInteger newIndices;
506       
507       for (int i = 0; i < aListId.count(); i++) {
508         const SMDS_MeshNode * n = aMesh->FindNode(aListId[ i ].toInt());
509         if (n)
510           newIndices.Add(n->GetID());
511         myNbOkNodes++;
512       }
513       mySelector->AddOrRemoveIndex(myActor->getIO(), newIndices, false);
514       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
515         aViewWindow->highlight( myActor->getIO(), true, true );
516     }
517   }
518
519   if (myNbOkElements && (myNbOkNodes || LineEditNodes->text().trimmed().isEmpty())) {
520     buttonOk->setEnabled(true);
521     buttonApply->setEnabled(true);
522   }
523
524   myBusy = false;
525 }
526
527 //=================================================================================
528 // function : SelectionIntoArgument()
529 // purpose  : Called when selection as changed or other case
530 //=================================================================================
531 void SMESHGUI_SmoothingDlg::SelectionIntoArgument()
532 {
533   if (myBusy) return;
534
535   // clear
536   QString aString = "";
537
538   myBusy = true;
539   if (myEditCurrentArgument == LineEditElements ||
540       myEditCurrentArgument == LineEditNodes) {
541     myEditCurrentArgument->setText(aString);
542     if (myEditCurrentArgument == LineEditElements)
543       myNbOkElements = 0;
544     else
545       myNbOkNodes = 0;
546     buttonOk->setEnabled(false);
547     buttonApply->setEnabled(false);
548     myActor = 0;
549   }
550   myBusy = false;
551
552   if (!GroupButtons->isEnabled()) // inactive
553     return;
554
555   // get selected mesh
556   SALOME_ListIO aList;
557   mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type());
558   int nbSel = aList.Extent();
559   if (nbSel != 1)
560     return;
561
562   Handle(SALOME_InteractiveObject) IO = aList.First();
563   myMesh = SMESH::GetMeshByIO(IO);
564   if (myMesh->_is_nil())
565     return;
566
567   myActor = SMESH::FindActorByObject(myMesh);
568   if (!myActor)
569     return;
570
571   int aNbUnits = 0;
572
573   if (myEditCurrentArgument == LineEditElements) {
574     myElementsId = "";
575
576     if (CheckBoxMesh->isChecked()) {
577       SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
578
579       if (!SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO)->_is_nil())
580         mySelectedObject = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO);
581       else
582         return;
583     } else {
584       aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, IO, aString);
585       myElementsId = aString;
586       if (aNbUnits < 1)
587         return;
588     }
589   } else if (myEditCurrentArgument == LineEditNodes && !myMesh->_is_nil() && myActor) {
590     myNbOkNodes = 0;
591     aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, IO, aString);
592   } else {
593   }
594
595   myBusy = true;
596   myEditCurrentArgument->setText(aString);
597   myEditCurrentArgument->repaint();
598   myEditCurrentArgument->setEnabled(false); // to update lineedit IPAL 19809
599   myEditCurrentArgument->setEnabled(true); 
600   myBusy = false;
601
602   // OK
603   if (myEditCurrentArgument == LineEditElements)
604     myNbOkElements = true;
605   else if (myEditCurrentArgument == LineEditNodes)
606     myNbOkNodes = true;
607
608   if (myNbOkElements && (myNbOkNodes || LineEditNodes->text().trimmed().isEmpty())) {
609     buttonOk->setEnabled(true);
610     buttonApply->setEnabled(true);
611   }
612 }
613
614 //=================================================================================
615 // function : SetEditCurrentArgument()
616 // purpose  :
617 //=================================================================================
618 void SMESHGUI_SmoothingDlg::SetEditCurrentArgument()
619 {
620   QPushButton* send = (QPushButton*)sender();
621
622   switch (myConstructorId) {
623   case 0: /* default constructor */
624     {
625       disconnect(mySelectionMgr, 0, this, 0);
626       mySelectionMgr->clearSelected();
627       mySelectionMgr->clearFilters();
628
629       if (send == SelectElementsButton) {
630         myEditCurrentArgument = LineEditElements;
631         SMESH::SetPointRepresentation(false);
632         if (CheckBoxMesh->isChecked()) {
633           //          mySelectionMgr->setSelectionModes(ActorSelection);
634           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
635             aViewWindow->SetSelectionMode(ActorSelection);
636           mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
637         } else {
638           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
639             aViewWindow->SetSelectionMode(FaceSelection);
640         }
641       } else if (send == SelectNodesButton) {
642         LineEditNodes->clear();
643         myEditCurrentArgument = LineEditNodes;
644         SMESH::SetPointRepresentation(true);
645         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) {
646           aViewWindow->SetSelectionMode(NodeSelection);
647         }
648       }
649
650       myEditCurrentArgument->setFocus();
651       connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
652       SelectionIntoArgument();
653       break;
654     }
655   }
656 }
657
658 //=================================================================================
659 // function : DeactivateActiveDialog()
660 // purpose  : Deactivates this dialog
661 //=================================================================================
662 void SMESHGUI_SmoothingDlg::DeactivateActiveDialog()
663 {
664   if (GroupConstructors->isEnabled()) {
665     GroupConstructors->setEnabled(false);
666     GroupArguments->setEnabled(false);
667     GroupButtons->setEnabled(false);
668     mySMESHGUI->ResetState();
669     mySMESHGUI->SetActiveDialogBox(0);
670   }
671 }
672
673 //=================================================================================
674 // function : ActivateThisDialog()
675 // purpose  : Activates this dialog
676 //=================================================================================
677 void SMESHGUI_SmoothingDlg::ActivateThisDialog()
678 {
679   // Emit a signal to deactivate the active dialog
680   mySMESHGUI->EmitSignalDeactivateDialog();
681   GroupConstructors->setEnabled(true);
682   GroupArguments->setEnabled(true);
683   GroupButtons->setEnabled(true);
684
685   mySMESHGUI->SetActiveDialogBox(this);
686   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
687     aViewWindow->SetSelectionMode(FaceSelection);
688   SelectionIntoArgument();
689 }
690
691 //=================================================================================
692 // function : enterEvent()
693 // purpose  : Mouse enter event
694 //=================================================================================
695 void SMESHGUI_SmoothingDlg::enterEvent (QEvent*)
696 {
697   if (!GroupConstructors->isEnabled())
698     ActivateThisDialog();
699 }
700
701 //=================================================================================
702 // function : closeEvent()
703 // purpose  :
704 //=================================================================================
705 void SMESHGUI_SmoothingDlg::closeEvent (QCloseEvent*)
706 {
707   /* same than click on cancel button */
708   ClickOnCancel();
709 }
710
711 //=======================================================================
712 // function : hideEvent()
713 // purpose  : caused by ESC key
714 //=======================================================================
715 void SMESHGUI_SmoothingDlg::hideEvent (QHideEvent*)
716 {
717   if (!isMinimized())
718     ClickOnCancel();
719 }
720
721 //=======================================================================
722 // function : onSelectMesh()
723 // purpose  :
724 //=======================================================================
725 void SMESHGUI_SmoothingDlg::onSelectMesh (bool toSelectMesh)
726 {
727   if (toSelectMesh)
728     TextLabelElements->setText(tr("SMESH_NAME"));
729   else
730     TextLabelElements->setText(tr("SMESH_ID_ELEMENTS"));
731   myElemFilterBtn->setEnabled(!toSelectMesh);
732
733   if (myEditCurrentArgument != LineEditElements &&
734       myEditCurrentArgument != LineEditNodes) {
735     LineEditElements->clear();
736     LineEditNodes->clear();
737     return;
738   }
739
740   mySelectionMgr->clearFilters();
741   SMESH::SetPointRepresentation(false);
742
743   if (toSelectMesh) {
744     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
745       aViewWindow->SetSelectionMode(ActorSelection);
746     //    mySelectionMgr->setSelectionModes(ActorSelection);
747     mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
748     myEditCurrentArgument->setReadOnly(true);
749     myEditCurrentArgument->setValidator(0);
750   } else {
751     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
752       aViewWindow->SetSelectionMode(myEditCurrentArgument == LineEditElements ? FaceSelection 
753                                                                               : NodeSelection );
754     myEditCurrentArgument->setReadOnly(false);
755     LineEditElements->setValidator(myIdValidator);
756     onTextChange(myEditCurrentArgument->text());
757   }
758
759   SelectionIntoArgument();
760 }
761
762 //=================================================================================
763 // function : keyPressEvent()
764 // purpose  :
765 //=================================================================================
766 void SMESHGUI_SmoothingDlg::keyPressEvent( QKeyEvent* e )
767 {
768   QDialog::keyPressEvent( e );
769   if ( e->isAccepted() )
770     return;
771
772   if ( e->key() == Qt::Key_F1 ) {
773     e->accept();
774     ClickOnHelp();
775   }
776 }
777
778 //=================================================================================
779 // function : setFilters()
780 // purpose  : activate filter dialog
781 //=================================================================================
782 void SMESHGUI_SmoothingDlg::setFilters( const bool theIsElem )
783 {
784   if(myMesh->_is_nil()) {
785     SUIT_MessageBox::critical(this,
786                               tr("SMESH_ERROR"),
787                               tr("NO_MESH_SELECTED"));
788    return;
789   }
790   if ( !myFilterDlg )
791   {
792     QList<int> types;  
793     types.append( SMESH::NODE );
794     types.append( SMESH::ALL );
795     myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, types );
796   }
797   myFilterDlg->Init( theIsElem ? SMESH::ALL : SMESH::NODE );
798
799   myFilterDlg->SetSelection();
800   myFilterDlg->SetMesh( myMesh );
801   myFilterDlg->SetSourceWg( theIsElem ? LineEditElements : LineEditNodes );
802
803   myFilterDlg->show();
804 }
805
806 //=================================================================================
807 // function : setElemFilters()
808 // purpose  : SLOT. Called when element "Filter" button pressed.
809 //=================================================================================
810 void SMESHGUI_SmoothingDlg::setElemFilters()
811 {
812   setFilters( true );
813 }
814
815 //=================================================================================
816 // function : setNodeFilters()
817 // purpose  : SLOT. Called when node "Filter" button pressed.
818 //=================================================================================
819 void SMESHGUI_SmoothingDlg::setNodeFilters()
820 {
821   setFilters( false );
822 }
823
824 //=================================================================================
825 // function : isValid
826 // purpose  :
827 //=================================================================================
828 bool SMESHGUI_SmoothingDlg::isValid()
829 {
830   return checkParameters( true, 2, SpinBox_IterationLimit, SpinBox_AspectRatio );
831 }