Salome HOME
Join modifications from branch OCC_development_for_3_2_0a2
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_SmoothingDlg.cxx
1 //  SMESH SMESHGUI : GUI for SMESH component
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
21 //
22 //
23 //
24 //  File   : SMESHGUI_SmoothingDlg.cxx
25 //  Author : Michael ZORIN
26 //  Module : SMESH
27 //  $Header:
28
29 #include "SMESHGUI_SmoothingDlg.h"
30
31 #include "SMESHGUI.h"
32 #include "SMESHGUI_Utils.h"
33 #include "SMESHGUI_VTKUtils.h"
34 #include "SMESHGUI_MeshUtils.h"
35 #include "SMESHGUI_SpinBox.h"
36 #include "SMESHGUI_IdValidator.h"
37
38 #include "SMESH_Actor.h"
39 #include "SMESH_TypeFilter.hxx"
40 #include "SMESH_NumberFilter.hxx"
41 #include "SMESH_LogicalFilter.hxx"
42
43 #include "SMDS_Mesh.hxx"
44
45 #include "SUIT_ResourceMgr.h"
46 #include "SUIT_OverrideCursor.h"
47 #include "SUIT_Desktop.h"
48 #include "SUIT_MessageBox.h"
49
50 #include "SVTK_ViewModel.h"
51 #include "SVTK_Selector.h"
52 #include "SVTK_ViewWindow.h"
53 #include "SVTK_Selection.h"
54 #include "SALOME_ListIO.hxx"
55
56 #include "utilities.h"
57
58 // OCCT Includes
59 #include <TColStd_MapOfInteger.hxx>
60 #include <TColStd_IndexedMapOfInteger.hxx>
61
62 // QT Includes
63 #include <qapplication.h>
64 #include <qbuttongroup.h>
65 #include <qgroupbox.h>
66 #include <qlabel.h>
67 #include <qlineedit.h>
68 #include <qpushbutton.h>
69 #include <qradiobutton.h>
70 #include <qcombobox.h>
71 #include <qcheckbox.h>
72 #include <qspinbox.h>
73 #include <qlayout.h>
74 #include <qvalidator.h>
75 #include <qpixmap.h>
76
77 // IDL Headers
78 #include "SALOMEconfig.h"
79 #include CORBA_SERVER_HEADER(SMESH_Group)
80
81 using namespace std;
82
83 //=================================================================================
84 // function : SMESHGUI_SmoothingDlg()
85 // purpose  : constructor
86 //=================================================================================
87 SMESHGUI_SmoothingDlg::SMESHGUI_SmoothingDlg( SMESHGUI* theModule, const char* name,
88                                               bool modal, WFlags fl)
89      : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder |
90                 WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose),
91      mySMESHGUI( theModule ),
92      mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
93 {
94   QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_SMOOTHING")));
95   QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
96
97   if (!name)
98     setName("SMESHGUI_SmoothingDlg");
99   resize(303, 185);
100   setCaption(tr("SMESH_SMOOTHING"));
101   setSizeGripEnabled(TRUE);
102   SMESHGUI_SmoothingDlgLayout = new QGridLayout(this);
103   SMESHGUI_SmoothingDlgLayout->setSpacing(6);
104   SMESHGUI_SmoothingDlgLayout->setMargin(11);
105
106   /***************************************************************/
107   GroupConstructors = new QButtonGroup(this, "GroupConstructors");
108   GroupConstructors->setTitle(tr("SMESH_SMOOTHING" ));
109   GroupConstructors->setExclusive(TRUE);
110   GroupConstructors->setColumnLayout(0, Qt::Vertical);
111   GroupConstructors->layout()->setSpacing(0);
112   GroupConstructors->layout()->setMargin(0);
113   GroupConstructorsLayout = new QGridLayout(GroupConstructors->layout());
114   GroupConstructorsLayout->setAlignment(Qt::AlignTop);
115   GroupConstructorsLayout->setSpacing(6);
116   GroupConstructorsLayout->setMargin(11);
117   Constructor1 = new QRadioButton(GroupConstructors, "Constructor1");
118   Constructor1->setText(tr("" ));
119   Constructor1->setPixmap(image0);
120   Constructor1->setChecked(TRUE);
121   Constructor1->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)1,
122                                           (QSizePolicy::SizeType)0,
123                                           Constructor1->sizePolicy().hasHeightForWidth()));
124   Constructor1->setMinimumSize(QSize(50, 0));
125   GroupConstructorsLayout->addWidget(Constructor1, 0, 0);
126   QSpacerItem* spacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
127   GroupConstructorsLayout->addItem(spacer, 0, 1);
128   SMESHGUI_SmoothingDlgLayout->addWidget(GroupConstructors, 0, 0);
129
130   /***************************************************************/
131   GroupButtons = new QGroupBox(this, "GroupButtons");
132   GroupButtons->setGeometry(QRect(10, 10, 281, 48));
133   GroupButtons->setTitle(tr(""));
134   GroupButtons->setColumnLayout(0, Qt::Vertical);
135   GroupButtons->layout()->setSpacing(0);
136   GroupButtons->layout()->setMargin(0);
137   GroupButtonsLayout = new QGridLayout(GroupButtons->layout());
138   GroupButtonsLayout->setAlignment(Qt::AlignTop);
139   GroupButtonsLayout->setSpacing(6);
140   GroupButtonsLayout->setMargin(11);
141   buttonCancel = new QPushButton(GroupButtons, "buttonCancel");
142   buttonCancel->setText(tr("SMESH_BUT_CLOSE" ));
143   buttonCancel->setAutoDefault(TRUE);
144   GroupButtonsLayout->addWidget(buttonCancel, 0, 3);
145   buttonApply = new QPushButton(GroupButtons, "buttonApply");
146   buttonApply->setText(tr("SMESH_BUT_APPLY" ));
147   buttonApply->setAutoDefault(TRUE);
148   GroupButtonsLayout->addWidget(buttonApply, 0, 1);
149   QSpacerItem* spacer_9 = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
150   GroupButtonsLayout->addItem(spacer_9, 0, 2);
151   buttonOk = new QPushButton(GroupButtons, "buttonOk");
152   buttonOk->setText(tr("SMESH_BUT_OK" ));
153   buttonOk->setAutoDefault(TRUE);
154   buttonOk->setDefault(TRUE);
155   GroupButtonsLayout->addWidget(buttonOk, 0, 0);
156   SMESHGUI_SmoothingDlgLayout->addWidget(GroupButtons, 2, 0);
157
158   /***************************************************************/
159   GroupArguments = new QGroupBox(this, "GroupArguments");
160   GroupArguments->setTitle(tr("SMESH_ARGUMENTS"));
161   GroupArguments->setColumnLayout(0, Qt::Vertical);
162   GroupArguments->layout()->setSpacing(0);
163   GroupArguments->layout()->setMargin(0);
164   GroupArgumentsLayout = new QGridLayout(GroupArguments->layout());
165   GroupArgumentsLayout->setAlignment(Qt::AlignTop);
166   GroupArgumentsLayout->setSpacing(6);
167   GroupArgumentsLayout->setMargin(11);
168
169   // Controls for elements selection
170   TextLabelElements  = new QLabel(GroupArguments, "TextLabelElements");
171   TextLabelElements->setText(tr("SMESH_ID_ELEMENTS" ));
172   GroupArgumentsLayout->addWidget(TextLabelElements, 0, 0);
173
174   SelectElementsButton  = new QPushButton(GroupArguments, "SelectElementsButton");
175   SelectElementsButton->setText(tr("" ));
176   SelectElementsButton->setPixmap(image1);
177   SelectElementsButton->setToggleButton(FALSE);
178   GroupArgumentsLayout->addWidget(SelectElementsButton, 0, 1);
179
180   LineEditElements  = new QLineEdit(GroupArguments, "LineEditElements");
181   LineEditElements->setValidator(new SMESHGUI_IdValidator(this, "validator"));
182   GroupArgumentsLayout->addWidget(LineEditElements, 0, 2);
183
184   // Control for the whole mesh selection
185   CheckBoxMesh = new QCheckBox(GroupArguments, "CheckBoxMesh");
186   CheckBoxMesh->setText(tr("SMESH_SELECT_WHOLE_MESH"));
187   GroupArgumentsLayout->addMultiCellWidget(CheckBoxMesh, 1, 1, 0, 2);
188
189   // Controls for nodes selection
190   TextLabelNodes = new QLabel(GroupArguments, "TextLabelNodes");
191   TextLabelNodes->setText(tr("FIXED_NODES_IDS"));
192   GroupArgumentsLayout->addWidget(TextLabelNodes, 2, 0);
193
194   SelectNodesButton  = new QPushButton(GroupArguments, "SelectNodesButton");
195   SelectNodesButton->setText(tr("" ));
196   SelectNodesButton->setPixmap(image1);
197   SelectNodesButton->setToggleButton(FALSE);
198   GroupArgumentsLayout->addWidget(SelectNodesButton, 2, 1);
199
200   LineEditNodes  = new QLineEdit(GroupArguments, "LineEditNodes");
201   LineEditNodes->setValidator(new SMESHGUI_IdValidator(this, "validator"));
202   GroupArgumentsLayout->addWidget(LineEditNodes, 2, 2);
203
204   // Controls for method selection
205   TextLabelMethod = new QLabel(GroupArguments, "TextLabelMethod");
206   TextLabelMethod->setText(tr("METHOD" ));
207   GroupArgumentsLayout->addMultiCellWidget(TextLabelMethod, 3, 3, 0, 1);
208
209   ComboBoxMethod = new QComboBox(GroupArguments, "ComboBoxMethod");
210   GroupArgumentsLayout->addWidget(ComboBoxMethod, 3, 2);
211
212   // Controls for iteration limit defining
213   TextLabelLimit = new QLabel(GroupArguments, "TextLabelLimit");
214   TextLabelLimit->setText(tr("ITERATION_LIMIT" ));
215   GroupArgumentsLayout->addMultiCellWidget(TextLabelLimit, 4, 4, 0, 1);
216
217   SpinBox_IterationLimit = new QSpinBox(GroupArguments, "SpinBox_IterationLimit");
218   GroupArgumentsLayout->addWidget(SpinBox_IterationLimit, 4, 2);
219
220   // Controls for max. aspect ratio defining
221   TextLabelAspectRatio = new QLabel(GroupArguments, "TextLabelAspectRatio");
222   TextLabelAspectRatio->setText(tr("MAX_ASPECT_RATIO"));
223   GroupArgumentsLayout->addMultiCellWidget(TextLabelAspectRatio, 5, 5, 0, 1);
224
225   SpinBox_AspectRatio = new SMESHGUI_SpinBox(GroupArguments, "SpinBox_AspectRatio");
226   GroupArgumentsLayout->addWidget(SpinBox_AspectRatio, 5, 2);
227
228   // Check box "Is Parametric"
229   CheckBoxParametric = new QCheckBox( GroupArguments, "CheckBoxParametric" );
230   CheckBoxParametric->setText( tr( "IS_PARAMETRIC" ) );
231   GroupArgumentsLayout->addMultiCellWidget( CheckBoxParametric, 6, 6, 0, 2 );
232
233
234   SMESHGUI_SmoothingDlgLayout->addWidget(GroupArguments, 1, 0);
235
236   /* Initialisations */
237   ComboBoxMethod->insertItem(tr("LAPLACIAN"));
238   ComboBoxMethod->insertItem(tr("CENTROIDAL"));
239
240   ComboBoxMethod->setCurrentItem(0);
241
242   CheckBoxParametric->setChecked( TRUE );
243   
244   QIntValidator* anIntValidator = new QIntValidator(SpinBox_IterationLimit);
245   SpinBox_IterationLimit->setValidator(anIntValidator);
246   SpinBox_IterationLimit->setRange(1, 999999);
247   SpinBox_IterationLimit->setValue(20);
248   SpinBox_AspectRatio->RangeStepAndValidator(0.0, +999999.999, 0.1, 3);
249   SpinBox_AspectRatio->SetValue(1.1);
250
251   GroupArguments->show();
252   myConstructorId = 0;
253   Constructor1->setChecked(TRUE);
254   
255   mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
256
257   mySMESHGUI->SetActiveDialogBox(this);
258
259   // Costruction of the logical filter for the elements: mesh/sub-mesh/group
260   SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
261   SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter (GROUP);
262
263   QPtrList<SUIT_SelectionFilter> aListOfFilters;
264   if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
265   if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
266
267   myMeshOrSubMeshOrGroupFilter =
268     new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
269
270   Init();
271
272   /***************************************************************/
273   // signals and slots connections
274   connect(buttonOk, SIGNAL(clicked()),     this, SLOT(ClickOnOk()));
275   connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
276   connect(buttonApply, SIGNAL(clicked()),  this, SLOT(ClickOnApply()));
277   connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int)));
278
279   connect(SelectElementsButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
280   connect(SelectNodesButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
281   connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
282   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
283   /* to close dialog if study change */
284   connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
285   connect(LineEditElements, SIGNAL(textChanged(const QString&)),
286            SLOT(onTextChange(const QString&)));
287   connect(LineEditNodes, SIGNAL(textChanged(const QString&)),
288            SLOT(onTextChange(const QString&)));
289   connect(CheckBoxMesh, SIGNAL(toggled(bool)),
290            SLOT(onSelectMesh(bool)));
291
292   /***************************************************************/
293   
294   this->show(); // displays Dialog
295 }
296
297 //=================================================================================
298 // function : ~SMESHGUI_SmoothingDlg()
299 // purpose  : destructor
300 //=================================================================================
301 SMESHGUI_SmoothingDlg::~SMESHGUI_SmoothingDlg()
302 {
303   // no need to delete child widgets, Qt does it all for us
304 }
305
306 //=================================================================================
307 // function : Init()
308 // purpose  : initialization
309 //=================================================================================
310 void SMESHGUI_SmoothingDlg::Init()
311 {
312   myBusy = false;
313
314 //   ComboBoxMethod->setCurrentItem(0);
315
316 //   SpinBox_IterationLimit->setValue(20);
317 //   SpinBox_AspectRatio->SetValue(1.1);
318
319   myEditCurrentArgument = LineEditElements;
320   LineEditElements->setFocus();
321   LineEditElements->clear();
322   LineEditNodes->clear();
323   myElementsId = "";
324   myNbOkElements = 0;
325   myNbOkNodes = 0;
326   myActor     = 0;
327   myMesh = SMESH::SMESH_Mesh::_nil();
328
329   CheckBoxMesh->setChecked(false);
330   onSelectMesh(false);
331 }
332
333 //=================================================================================
334 // function : ConstructorsClicked()
335 // purpose  : Radio button management
336 //=================================================================================
337 void SMESHGUI_SmoothingDlg::ConstructorsClicked (int constructorId)
338 {
339 }
340
341 //=================================================================================
342 // function : ClickOnApply()
343 // purpose  : Called when user presses <Apply> button
344 //=================================================================================
345 void SMESHGUI_SmoothingDlg::ClickOnApply()
346 {
347   if (mySMESHGUI->isActiveStudyLocked())
348     return;
349
350   if (myNbOkElements &&
351       (myNbOkNodes || LineEditNodes->text().stripWhiteSpace().isEmpty())) {
352     QStringList aListElementsId = QStringList::split(" ", myElementsId, false);
353     QStringList aListNodesId    = QStringList::split(" ", LineEditNodes->text(), false);
354
355     SMESH::long_array_var anElementsId = new SMESH::long_array;
356     SMESH::long_array_var aNodesId = new SMESH::long_array;
357
358     anElementsId->length(aListElementsId.count());
359     for (int i = 0; i < aListElementsId.count(); i++)
360       anElementsId[i] = aListElementsId[i].toInt();
361
362     if (myNbOkNodes) {
363       aNodesId->length(aListNodesId.count());
364       for (int i = 0; i < aListNodesId.count(); i++)
365         aNodesId[i] = aListNodesId[i].toInt();
366     } else {
367       aNodesId->length(0);
368     }
369
370     long anIterationLimit = (long)SpinBox_IterationLimit->value();
371     double aMaxAspectRatio = SpinBox_AspectRatio->GetValue();
372
373     SMESH::SMESH_MeshEditor::Smooth_Method aMethod = SMESH::SMESH_MeshEditor::LAPLACIAN_SMOOTH;
374     if (ComboBoxMethod->currentItem() > 0)
375       aMethod =  SMESH::SMESH_MeshEditor::CENTROIDAL_SMOOTH;
376
377     bool aResult = false;
378     try {
379       SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
380       QApplication::setOverrideCursor(Qt::waitCursor);
381       if ( CheckBoxParametric->isChecked() )
382         aResult = aMeshEditor->SmoothParametric(anElementsId.inout(), aNodesId.inout(),
383                                                 anIterationLimit, aMaxAspectRatio, aMethod);
384       else
385         aResult = aMeshEditor->Smooth(anElementsId.inout(), aNodesId.inout(),
386                                       anIterationLimit, aMaxAspectRatio, aMethod);
387       QApplication::restoreOverrideCursor();
388     } catch (...) {
389     }
390
391     if (aResult) {
392       Handle(SALOME_InteractiveObject) anIO = myActor->getIO();
393
394       SALOME_ListIO aList;
395       aList.Append(anIO);
396       mySelectionMgr->setSelectedObjects(aList, false);
397       SMESH::UpdateView();
398       Init();
399     }
400   }
401 }
402
403 //=================================================================================
404 // function : ClickOnOk()
405 // purpose  : Called when user presses <OK> button
406 //=================================================================================
407 void SMESHGUI_SmoothingDlg::ClickOnOk()
408 {
409   ClickOnApply();
410   ClickOnCancel();
411 }
412
413 //=================================================================================
414 // function : ClickOnCancel()
415 // purpose  : Called when dialog box is closed
416 //=================================================================================
417 void SMESHGUI_SmoothingDlg::ClickOnCancel()
418 {
419   disconnect(mySelectionMgr, 0, this, 0);
420   mySelectionMgr->clearFilters();
421   //mySelectionMgr->clearSelected();
422   SMESH::SetPickable(); // ???
423   SMESH::SetPointRepresentation(false);
424   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
425     aViewWindow->SetSelectionMode(ActorSelection);
426   mySMESHGUI->ResetState();
427   reject();
428 }
429
430 //=======================================================================
431 // function : onTextChange()
432 // purpose  :
433 //=======================================================================
434 void SMESHGUI_SmoothingDlg::onTextChange (const QString& theNewText)
435 {
436   QLineEdit* send = (QLineEdit*)sender();
437
438   // return if busy
439   if (myBusy) return;
440
441   // set busy flag
442   myBusy = true;
443
444   if (send == LineEditElements)
445     myNbOkElements = 0;
446   else if (send == LineEditNodes)
447     myNbOkNodes = 0;
448
449   buttonOk->setEnabled(false);
450   buttonApply->setEnabled(false);
451
452   // hilight entered elements/nodes
453   SMDS_Mesh* aMesh = 0;
454   if (myActor)
455     aMesh = myActor->GetObject()->GetMesh();
456
457   if (aMesh) {
458     
459     QStringList aListId = QStringList::split(" ", theNewText, false);
460
461     if (send == LineEditElements) {
462       const Handle(SALOME_InteractiveObject)& anIO = myActor->getIO();
463       TColStd_MapOfInteger newIndices;
464       for (int i = 0; i < aListId.count(); i++) {
465         const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt());
466         if (e)
467           newIndices.Add(e->GetID());
468         myNbOkElements++;
469       }
470       mySelector->AddOrRemoveIndex(anIO, newIndices, false);
471       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
472         aViewWindow->highlight( anIO, true, true );
473       myElementsId = theNewText;
474
475     } else if (send == LineEditNodes) {
476       TColStd_MapOfInteger newIndices;
477       
478       for (int i = 0; i < aListId.count(); i++) {
479         const SMDS_MeshNode * n = aMesh->FindNode(aListId[ i ].toInt());
480         if (n)
481           newIndices.Add(n->GetID());
482         myNbOkNodes++;
483       }
484       mySelector->AddOrRemoveIndex(myActor->getIO(), newIndices, false);
485       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
486         aViewWindow->highlight( myActor->getIO(), true, true );
487     }
488   }
489
490   if (myNbOkElements && (myNbOkNodes || LineEditNodes->text().stripWhiteSpace().isEmpty())) {
491     buttonOk->setEnabled(true);
492     buttonApply->setEnabled(true);
493   }
494
495   myBusy = false;
496 }
497
498 //=================================================================================
499 // function : SelectionIntoArgument()
500 // purpose  : Called when selection as changed or other case
501 //=================================================================================
502 void SMESHGUI_SmoothingDlg::SelectionIntoArgument()
503 {
504   if (myBusy) return;
505
506   // clear
507   myActor = 0;
508   QString aString = "";
509
510   myBusy = true;
511   if (myEditCurrentArgument == (QWidget*)LineEditElements) {
512     LineEditElements->setText(aString);
513     myNbOkElements = 0;
514     buttonOk->setEnabled(false);
515     buttonApply->setEnabled(false);
516   }
517   myBusy = false;
518
519   if (!GroupButtons->isEnabled()) // inactive
520     return;
521
522   // get selected mesh
523   SALOME_ListIO aList;
524   mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type());
525   int nbSel = aList.Extent();
526   if (nbSel != 1)
527     return;
528
529   Handle(SALOME_InteractiveObject) IO = aList.First();
530   myMesh = SMESH::GetMeshByIO(IO);
531   if (myMesh->_is_nil())
532     return;
533
534   myActor = SMESH::FindActorByObject(myMesh);
535   if (!myActor)
536     return;
537
538   int aNbUnits = 0;
539
540   if (myEditCurrentArgument == LineEditElements) {
541     myElementsId = "";
542
543     if (CheckBoxMesh->isChecked()) {
544       SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
545
546       if (!SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO)->_is_nil()) { //MESH
547         // get IDs from mesh
548         SMDS_Mesh* aSMDSMesh = myActor->GetObject()->GetMesh();
549         if (!aSMDSMesh)
550           return;
551
552         for (int i = aSMDSMesh->MinElementID(); i <= aSMDSMesh->MaxElementID(); i++ ) {
553           const SMDS_MeshElement * e = aSMDSMesh->FindElement(i);
554           if (e) {
555             myElementsId += QString(" %1").arg(i);
556             aNbUnits++;
557           }
558         }
559       } else if (!SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(IO)->_is_nil()) { //SUBMESH
560         // get submesh
561         SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(IO);
562
563         // get IDs from submesh
564         SMESH::long_array_var anElementsIds = new SMESH::long_array;
565         anElementsIds = aSubMesh->GetElementsId();
566         for (int i = 0; i < anElementsIds->length(); i++) {
567           myElementsId += QString(" %1").arg(anElementsIds[i]);
568         }
569         aNbUnits = anElementsIds->length();
570       } else { // GROUP
571         // get smesh group
572         SMESH::SMESH_GroupBase_var aGroup =
573           SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IO);
574         if (aGroup->_is_nil())
575           return;
576
577         // get IDs from smesh group
578         SMESH::long_array_var anElementsIds = new SMESH::long_array;
579         anElementsIds = aGroup->GetListOfID();
580         for (int i = 0; i < anElementsIds->length(); i++) {
581           myElementsId += QString(" %1").arg(anElementsIds[i]);
582         }
583         aNbUnits = anElementsIds->length();
584       }
585     } else {
586       aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aString);
587       myElementsId = aString;
588     }
589   } else if (myEditCurrentArgument == LineEditNodes && !myMesh->_is_nil() && myActor) {
590     myNbOkNodes = 0;
591     aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aString);
592   } else {
593   }
594
595   if (aNbUnits < 1)
596     return;
597
598   myBusy = true;
599   myEditCurrentArgument->setText(aString);
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) {
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           mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
635         } else {
636           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
637             aViewWindow->SetSelectionMode(CellSelection);
638         }
639       } else if (send == SelectNodesButton) {
640         myEditCurrentArgument = LineEditNodes;
641         SMESH::SetPointRepresentation(true);
642         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
643           aViewWindow->SetSelectionMode(NodeSelection);
644       }
645
646       myEditCurrentArgument->setFocus();
647       connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
648       SelectionIntoArgument();
649       break;
650     }
651   }
652 }
653
654 //=================================================================================
655 // function : DeactivateActiveDialog()
656 // purpose  : Deactivates this dialog
657 //=================================================================================
658 void SMESHGUI_SmoothingDlg::DeactivateActiveDialog()
659 {
660   if (GroupConstructors->isEnabled()) {
661     GroupConstructors->setEnabled(false);
662     GroupArguments->setEnabled(false);
663     GroupButtons->setEnabled(false);
664     mySMESHGUI->ResetState();
665     mySMESHGUI->SetActiveDialogBox(0);
666   }
667 }
668
669 //=================================================================================
670 // function : ActivateThisDialog()
671 // purpose  : Activates this dialog
672 //=================================================================================
673 void SMESHGUI_SmoothingDlg::ActivateThisDialog()
674 {
675   // Emit a signal to deactivate the active dialog
676   mySMESHGUI->EmitSignalDeactivateDialog();
677   GroupConstructors->setEnabled(true);
678   GroupArguments->setEnabled(true);
679   GroupButtons->setEnabled(true);
680
681   mySMESHGUI->SetActiveDialogBox(this);
682   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
683     aViewWindow->SetSelectionMode(CellSelection);
684   SelectionIntoArgument();
685 }
686
687 //=================================================================================
688 // function : enterEvent()
689 // purpose  : Mouse enter event
690 //=================================================================================
691 void SMESHGUI_SmoothingDlg::enterEvent (QEvent*)
692 {
693   if (!GroupConstructors->isEnabled())
694     ActivateThisDialog();
695 }
696
697 //=================================================================================
698 // function : closeEvent()
699 // purpose  :
700 //=================================================================================
701 void SMESHGUI_SmoothingDlg::closeEvent (QCloseEvent*)
702 {
703   /* same than click on cancel button */
704   this->ClickOnCancel();
705 }
706
707 //=======================================================================
708 // function : hideEvent()
709 // purpose  : caused by ESC key
710 //=======================================================================
711 void SMESHGUI_SmoothingDlg::hideEvent (QHideEvent*)
712 {
713   if (!isMinimized())
714     ClickOnCancel();
715 }
716
717 //=======================================================================
718 // function : onSelectMesh()
719 // purpose  :
720 //=======================================================================
721 void SMESHGUI_SmoothingDlg::onSelectMesh (bool toSelectMesh)
722 {
723   if (toSelectMesh)
724     TextLabelElements->setText(tr("SMESH_NAME"));
725   else
726     TextLabelElements->setText(tr("SMESH_ID_ELEMENTS"));
727
728   if (myEditCurrentArgument != LineEditElements) {
729     LineEditElements->clear();
730     return;
731   }
732
733   mySelectionMgr->clearFilters();
734   SMESH::SetPointRepresentation(false);
735
736   if (toSelectMesh) {
737     mySelectionMgr->setSelectionModes(ActorSelection);
738     mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
739     LineEditElements->setReadOnly(true);
740   } else {
741     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
742       aViewWindow->SetSelectionMode(CellSelection);
743     LineEditElements->setReadOnly(false);
744     onTextChange(LineEditElements->text());
745   }
746
747   SelectionIntoArgument();
748 }