Salome HOME
52941: Remove selected group does't work in sewing operation
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_ScaleDlg.cxx
1 // Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 //  File   : SMESHGUI_ScaleDlg.cxx
20 //  Author : Michael ZORIN, Open CASCADE S.A.S.
21 //  SMESH includes
22
23 #include "SMESHGUI_ScaleDlg.h"
24
25 #include "SMESHGUI.h"
26 #include "SMESHGUI_SpinBox.h"
27 #include "SMESHGUI_Utils.h"
28 #include "SMESHGUI_VTKUtils.h"
29 #include "SMESHGUI_MeshUtils.h"
30 #include "SMESHGUI_IdValidator.h"
31 #include "SMESHGUI_FilterDlg.h"
32 #include "SMESHGUI_MeshEditPreview.h"
33
34 #include <SMESH_Actor.h>
35 #include <SMESH_TypeFilter.hxx>
36 #include <SMESH_LogicalFilter.hxx>
37 #include <SMDS_Mesh.hxx>
38
39 // SALOME GUI includes
40 #include <SUIT_Desktop.h>
41 #include <SUIT_ResourceMgr.h>
42 #include <SUIT_Session.h>
43 #include <SUIT_MessageBox.h>
44 #include <SUIT_OverrideCursor.h>
45
46 #include <LightApp_Application.h>
47 #include <LightApp_SelectionMgr.h>
48
49 #include <SVTK_ViewModel.h>
50 #include <SVTK_ViewWindow.h>
51 #include <SALOME_ListIO.hxx>
52
53 // SALOME KERNEL includes
54 #include <SALOMEDSClient.hxx>
55 #include <SALOMEDSClient_SObject.hxx>
56
57 // OCCT includes
58 #include <TColStd_MapOfInteger.hxx>
59
60 // Qt includes
61 #include <QApplication>
62 #include <QButtonGroup>
63 #include <QGroupBox>
64 #include <QLabel>
65 #include <QLineEdit>
66 #include <QPushButton>
67 #include <QRadioButton>
68 #include <QCheckBox>
69 #include <QHBoxLayout>
70 #include <QVBoxLayout>
71 #include <QGridLayout>
72 #include <QSpinBox>
73 #include <QKeyEvent>
74
75 // IDL includes
76 #include <SALOMEconfig.h>
77 #include CORBA_SERVER_HEADER(SMESH_Group)
78 #include CORBA_SERVER_HEADER(SMESH_MeshEditor)
79
80 enum { MOVE_ELEMS_BUTTON = 0, COPY_ELEMS_BUTTON, MAKE_MESH_BUTTON }; //!< action type
81
82 /*!
83   \class BusyLocker
84   \brief Simple 'busy state' flag locker.
85   \internal
86 */
87
88 class BusyLocker
89 {
90 public:
91   //! Constructor. Sets passed boolean flag to \c true.
92   BusyLocker( bool& busy ) : myBusy( busy ) { myBusy = true; }
93   //! Destructor. Clear external boolean flag passed as parameter to the constructor to \c false.
94   ~BusyLocker() { myBusy = false; }
95 private:
96   bool& myBusy; //! External 'busy state' boolean flag
97 };
98
99 #define SPACING 6
100 #define MARGIN  11
101
102 //=================================================================================
103 // class    : SMESHGUI_ScaleDlg()
104 // purpose  :
105 //=================================================================================
106 SMESHGUI_ScaleDlg::SMESHGUI_ScaleDlg( SMESHGUI* theModule ) : 
107     SMESHGUI_MultiPreviewDlg( theModule ),
108     mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
109     myFilterDlg(0)
110 {
111   QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_MESH_SCALE")));
112   QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_SCALE_ALONG_AXES")));
113   QPixmap image2 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
114
115   setModal(false);
116   setAttribute(Qt::WA_DeleteOnClose, true);
117   setWindowTitle(tr("SMESH_SCALE_TITLE"));
118   setSizeGripEnabled(true);
119
120   QVBoxLayout* SMESHGUI_ScaleDlgLayout = new QVBoxLayout(this);
121   SMESHGUI_ScaleDlgLayout->setSpacing(SPACING);
122   SMESHGUI_ScaleDlgLayout->setMargin(MARGIN);
123
124   /***************************************************************/
125   ConstructorsBox = new QGroupBox(tr("SMESH_SCALE"), this);
126   GroupConstructors = new QButtonGroup(this);
127   QHBoxLayout* ConstructorsBoxLayout = new QHBoxLayout(ConstructorsBox);
128   ConstructorsBoxLayout->setSpacing(SPACING);
129   ConstructorsBoxLayout->setMargin(MARGIN);
130
131   RadioButton1= new QRadioButton(ConstructorsBox);
132   RadioButton1->setIcon(image0);
133   RadioButton2= new QRadioButton(ConstructorsBox);
134   RadioButton2->setIcon(image1);
135
136   ConstructorsBoxLayout->addWidget(RadioButton1);
137   ConstructorsBoxLayout->addWidget(RadioButton2);
138   GroupConstructors->addButton(RadioButton1, 0);
139   GroupConstructors->addButton(RadioButton2, 1);
140
141   /***************************************************************/
142   GroupArguments = new QGroupBox(tr("SMESH_ARGUMENTS"), this);
143   QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments);
144   GroupArgumentsLayout->setSpacing(SPACING);
145   GroupArgumentsLayout->setMargin(MARGIN);
146
147   myIdValidator = new SMESHGUI_IdValidator(this);
148
149   // Controls for elements selection
150   TextLabelElements = new QLabel(tr("SMESH_ID_ELEMENTS"), GroupArguments);
151   SelectElementsButton = new QPushButton(GroupArguments);
152   SelectElementsButton->setIcon(image2);
153   LineEditElements = new QLineEdit(GroupArguments);
154   LineEditElements->setValidator(myIdValidator);
155   LineEditElements->setMaxLength(-1);
156   myFilterBtn = new QPushButton( tr( "SMESH_BUT_FILTER" ), GroupArguments );
157   connect(myFilterBtn,   SIGNAL(clicked()), this, SLOT(setFilters()));
158
159   // Control for the whole mesh selection
160   CheckBoxMesh = new QCheckBox(tr("SMESH_SELECT_WHOLE_MESH"), GroupArguments);
161
162   // Controls for vector and points selection
163   TextLabel1 = new QLabel(tr("SMESH_BASE_POINT"), GroupArguments);
164   SelectButton1 = new QPushButton(GroupArguments);
165   SelectButton1->setIcon(image2);
166
167   TextLabel1_1 = new QLabel(tr("SMESH_X"), GroupArguments);
168   SpinBox1_1 = new SMESHGUI_SpinBox(GroupArguments);
169   TextLabel1_2 = new QLabel(tr("SMESH_Y"), GroupArguments);
170   SpinBox1_2 = new SMESHGUI_SpinBox(GroupArguments);
171   TextLabel1_3 = new QLabel(tr("SMESH_Z"), GroupArguments);
172   SpinBox1_3 = new SMESHGUI_SpinBox(GroupArguments);
173
174   TextLabel2 = new QLabel(tr("SMESH_SCALE_FACTOR"), GroupArguments);
175   SpinBox_FX = new SMESHGUI_SpinBox(GroupArguments);
176
177   TextLabel3 = new QLabel(tr("SMESH_SCALE_FACTOR_Y"), GroupArguments);
178   SpinBox_FY = new SMESHGUI_SpinBox(GroupArguments);
179
180   TextLabel4 = new QLabel(tr("SMESH_SCALE_FACTOR_Z"), GroupArguments);
181   SpinBox_FZ = new SMESHGUI_SpinBox(GroupArguments);
182
183
184   // switch of action type
185   ActionBox = new QGroupBox(GroupArguments);
186   ActionGroup = new QButtonGroup(GroupArguments);
187   QVBoxLayout* ActionBoxLayout = new QVBoxLayout(ActionBox);
188   ActionBoxLayout->addSpacing(SPACING);
189   ActionBoxLayout->setMargin(MARGIN);
190
191   QRadioButton* aMoveElements = new QRadioButton(tr("SMESH_MOVE_ELEMENTS"), ActionBox);
192   QRadioButton* aCopyElements = new QRadioButton(tr("SMESH_COPY_ELEMENTS"), ActionBox);
193   QRadioButton* aCreateMesh   = new QRadioButton(tr("SMESH_CREATE_MESH"),   ActionBox);
194
195   ActionBoxLayout->addWidget(aMoveElements);
196   ActionBoxLayout->addWidget(aCopyElements);
197   ActionBoxLayout->addWidget(aCreateMesh);
198   ActionGroup->addButton(aMoveElements, MOVE_ELEMS_BUTTON);
199   ActionGroup->addButton(aCopyElements, COPY_ELEMS_BUTTON);
200   ActionGroup->addButton(aCreateMesh,   MAKE_MESH_BUTTON);
201
202   // CheckBox for groups generation
203   MakeGroupsCheck = new QCheckBox(tr("SMESH_MAKE_GROUPS"), GroupArguments);
204   MakeGroupsCheck->setChecked(false);
205
206   // Name of a mesh to create
207   LineEditNewMesh = new QLineEdit(GroupArguments);
208
209   //Preview check box
210   myPreviewCheckBox = new QCheckBox(tr("PREVIEW"), GroupArguments);
211
212   // layout
213   GroupArgumentsLayout->addWidget(TextLabelElements,    0, 0);
214   GroupArgumentsLayout->addWidget(SelectElementsButton, 0, 1);
215   GroupArgumentsLayout->addWidget(LineEditElements,     0, 2, 1, 5);
216   GroupArgumentsLayout->addWidget(myFilterBtn,          0, 7);
217   GroupArgumentsLayout->addWidget(CheckBoxMesh,         1, 0, 1, 8);
218   GroupArgumentsLayout->addWidget(TextLabel1,           2, 0);
219   GroupArgumentsLayout->addWidget(SelectButton1,        2, 1);
220   GroupArgumentsLayout->addWidget(TextLabel1_1,         2, 2);
221   GroupArgumentsLayout->addWidget(SpinBox1_1,           2, 3);
222   GroupArgumentsLayout->addWidget(TextLabel1_2,         2, 4);
223   GroupArgumentsLayout->addWidget(SpinBox1_2,           2, 5);
224   GroupArgumentsLayout->addWidget(TextLabel1_3,         2, 6);
225   GroupArgumentsLayout->addWidget(SpinBox1_3,           2, 7);
226   GroupArgumentsLayout->addWidget(TextLabel2,           3, 0);
227   GroupArgumentsLayout->addWidget(SpinBox_FX,           3, 3);
228   GroupArgumentsLayout->addWidget(TextLabel3,           4, 0);
229   GroupArgumentsLayout->addWidget(SpinBox_FY,           4, 3);
230   GroupArgumentsLayout->addWidget(TextLabel4,           5, 0);
231   GroupArgumentsLayout->addWidget(SpinBox_FZ,           5, 3);
232   GroupArgumentsLayout->addWidget(ActionBox,            7, 0, 3, 4);
233   GroupArgumentsLayout->addWidget(MakeGroupsCheck,      8, 5, 1, 4);
234   GroupArgumentsLayout->addWidget(LineEditNewMesh,      9, 5, 1, 4);
235   GroupArgumentsLayout->addWidget(myPreviewCheckBox,    10, 0);
236
237   /***************************************************************/
238   GroupButtons = new QGroupBox(this);
239   QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons);
240   GroupButtonsLayout->setSpacing(SPACING);
241   GroupButtonsLayout->setMargin(MARGIN);
242
243   buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons);
244   buttonOk->setAutoDefault(true);
245   buttonOk->setDefault(true);
246   buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
247   buttonApply->setAutoDefault(true);
248   buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
249   buttonCancel->setAutoDefault(true);
250   buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons);
251   buttonHelp->setAutoDefault(true);
252
253   GroupButtonsLayout->addWidget(buttonOk);
254   GroupButtonsLayout->addSpacing(10);
255   GroupButtonsLayout->addWidget(buttonApply);
256   GroupButtonsLayout->addSpacing(10);
257   GroupButtonsLayout->addStretch();
258   GroupButtonsLayout->addWidget(buttonCancel);
259   GroupButtonsLayout->addWidget(buttonHelp);
260
261   /***************************************************************/
262   SMESHGUI_ScaleDlgLayout->addWidget(ConstructorsBox);
263   SMESHGUI_ScaleDlgLayout->addWidget(GroupArguments);
264   SMESHGUI_ScaleDlgLayout->addWidget(GroupButtons);
265
266   /* Initialisations */
267   SpinBox1_1->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
268   SpinBox1_2->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
269   SpinBox1_3->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
270   SpinBox_FX->RangeStepAndValidator(1.e-6, 1.e+6, 1.0, "parametric_precision");
271   SpinBox_FX->SetStep(0.1);
272   SpinBox_FY->RangeStepAndValidator(1.e-6, 1.e+6, 1.0, "parametric_precision");
273   SpinBox_FY->SetStep(0.1);
274   SpinBox_FZ->RangeStepAndValidator(1.e-6, 1.e+6, 1.0, "parametric_precision");
275   SpinBox_FZ->SetStep(0.1);
276
277   RadioButton1->setChecked(true);
278
279   mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
280
281   mySMESHGUI->SetActiveDialogBox((QDialog*)this);
282
283   // Costruction of the logical filter
284   SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (SMESH::MESHorSUBMESH);
285   SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter (SMESH::GROUP);
286
287   QList<SUIT_SelectionFilter*> aListOfFilters;
288   if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
289   if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
290
291   myMeshOrSubMeshOrGroupFilter =
292     new SMESH_LogicalFilter(aListOfFilters, SMESH_LogicalFilter::LO_OR);
293
294   myHelpFileName = "scale_page.html";
295
296   Init();
297
298   /* signals and slots connections */
299   connect(buttonOk,     SIGNAL(clicked()), this, SLOT(ClickOnOk()));
300   connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject()));
301   connect(buttonApply,  SIGNAL(clicked()), this, SLOT(ClickOnApply()));
302   connect(buttonHelp,   SIGNAL(clicked()), this, SLOT(ClickOnHelp()));
303   connect(GroupConstructors, SIGNAL(buttonClicked(int)), SLOT(ConstructorsClicked(int)));
304
305   connect(SelectElementsButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
306   connect(SelectButton1,        SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
307
308   connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
309   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()),   this, SLOT(SelectionIntoArgument()));
310   /* to close dialog if study change */
311   connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()),      this, SLOT(reject()));
312   connect(mySMESHGUI, SIGNAL(SignalActivatedViewManager()), this, SLOT(onOpenView()));
313   connect(mySMESHGUI, SIGNAL(SignalCloseView()),            this, SLOT(onCloseView()));
314
315   connect(LineEditElements, SIGNAL(textChanged(const QString&)),    SLOT(onTextChange(const QString&)));
316   connect(CheckBoxMesh,     SIGNAL(toggled(bool)),                  SLOT(onSelectMesh(bool)));
317   connect(ActionGroup,      SIGNAL(buttonClicked(int)),             SLOT(onActionClicked(int)));
318
319   connect(SpinBox1_1,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
320   connect(SpinBox1_2,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
321   connect(SpinBox1_3,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
322
323   connect(SpinBox_FX,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
324   connect(SpinBox_FY,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
325   connect(SpinBox_FZ,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
326
327   //To Connect preview check box
328   connectPreviewControl();
329
330   ConstructorsClicked(0);
331   SelectionIntoArgument();
332   onActionClicked(MOVE_ELEMS_BUTTON);
333 }
334
335 //=================================================================================
336 // function : ~SMESHGUI_ScaleDlg()
337 // purpose  : Destroys the object and frees any allocated resources
338 //=================================================================================
339 SMESHGUI_ScaleDlg::~SMESHGUI_ScaleDlg()
340 {
341   if ( myFilterDlg ) {
342     myFilterDlg->setParent( 0 );
343     delete myFilterDlg;
344     myFilterDlg = 0;
345   }
346 }
347
348 //=================================================================================
349 // function : Init()
350 // purpose  :
351 //=================================================================================
352 void SMESHGUI_ScaleDlg::Init (bool ResetControls)
353 {
354   myBusy = false;
355   myObjects.clear();
356   myObjectsNames.clear();
357   myMeshes.clear();
358
359   myEditCurrentArgument = 0;
360   LineEditElements->clear();
361   myElementsId = "";
362   myNbOkElements = 0;
363
364   buttonOk->setEnabled(false);
365   buttonApply->setEnabled(false);
366
367   myActor = 0;
368
369   if (ResetControls) {
370     SpinBox1_1->SetValue(0.0);
371     SpinBox1_2->SetValue(0.0);
372     SpinBox1_3->SetValue(0.0);
373     SpinBox_FX->SetValue(1.0);
374     SpinBox_FY->SetValue(1.0);
375     SpinBox_FZ->SetValue(1.0);
376     myPreviewCheckBox->setChecked(false);
377     onDisplaySimulation(false);
378
379     ActionGroup->button( MOVE_ELEMS_BUTTON )->setChecked(true);
380     CheckBoxMesh->setChecked(false);
381     onSelectMesh(false);
382   }
383 }
384
385 //=================================================================================
386 // function : ConstructorsClicked()
387 // purpose  : Radio button management
388 //=================================================================================
389 void SMESHGUI_ScaleDlg::ConstructorsClicked (int constructorId)
390 {
391   disconnect(mySelectionMgr, 0, this, 0);
392
393   switch (constructorId) {
394   case 0:
395     {
396       TextLabel2->setText(tr("SMESH_SCALE_FACTOR"));
397       TextLabel3->hide();
398       TextLabel4->hide();
399       SpinBox_FY->hide();
400       SpinBox_FZ->hide();
401       break;
402     }
403   case 1:
404     {
405       TextLabel2->setText(tr("SMESH_SCALE_FACTOR_X"));
406       TextLabel3->show();
407       TextLabel4->show();
408       SpinBox_FY->show();
409       SpinBox_FZ->show();
410       break;
411     }
412   }
413
414   if (myEditCurrentArgument != (QWidget*)LineEditElements) {
415     SMESH::SetPointRepresentation(false);
416     if (!CheckBoxMesh->isChecked())
417       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
418         aViewWindow->SetSelectionMode( CellSelection );
419   }
420
421   myEditCurrentArgument = (QWidget*)LineEditElements;
422   LineEditElements->setFocus();
423
424   if (CheckBoxMesh->isChecked())
425     onSelectMesh(true);
426
427   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
428
429   QApplication::instance()->processEvents();
430   myEditCurrentArgument->hide();
431   myEditCurrentArgument->show();
432   updateGeometry();
433   resize(100,100);
434 }
435
436 //=================================================================================
437 // function : ClickOnApply()
438 // purpose  :
439 //=================================================================================
440 bool SMESHGUI_ScaleDlg::ClickOnApply()
441 {
442   if (mySMESHGUI->isActiveStudyLocked())
443     return false;
444
445   if( !isValid() )
446     return false;
447
448   if (myNbOkElements) {
449     QStringList aListElementsId = myElementsId.split(" ", QString::SkipEmptyParts);
450
451     SMESH::long_array_var anElementsId = new SMESH::long_array;
452
453     anElementsId->length(aListElementsId.count());
454     for (int i = 0; i < aListElementsId.count(); i++)
455       anElementsId[i] = aListElementsId[i].toInt();
456
457     SMESH::PointStruct aPoint;
458     SMESH::double_array_var aScaleFact = new SMESH::double_array;
459     getScale(aPoint, aScaleFact);
460
461     QStringList aParameters;
462     aParameters << SpinBox1_1->text();
463     aParameters << SpinBox1_2->text();
464     aParameters << SpinBox1_3->text();
465     aParameters << SpinBox_FX->text();
466     if (GetConstructorId() == 1) {
467       aParameters << SpinBox_FX->text();
468       aParameters << SpinBox_FX->text();
469     }
470     else {
471       aParameters << SpinBox_FY->text();
472       aParameters << SpinBox_FZ->text();
473     }
474
475     int actionButton = ActionGroup->checkedId();
476     bool makeGroups = ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() );
477     QStringList anEntryList;
478     try {
479       SUIT_OverrideCursor aWaitCursor;
480      
481       switch ( actionButton ) {
482
483       case MOVE_ELEMS_BUTTON:
484         if ( CheckBoxMesh->isChecked() )
485           for ( int i = 0; i < myObjects.count(); i++ ) {
486             SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor();
487             myMeshes[i]->SetParameters( aParameters.join( ":" ).toLatin1().constData() );
488             aMeshEditor->Scale(myObjects[i], aPoint, aScaleFact, false);
489           }
490         else {
491           SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor();
492           SMESH::IDSource_wrap src = aMeshEditor->MakeIDSource(anElementsId, SMESH::ALL);
493           myMeshes[0]->SetParameters( aParameters.join( ":" ).toLatin1().constData() );
494           aMeshEditor->Scale( src, aPoint, aScaleFact, false);
495         }
496         break;
497
498       case COPY_ELEMS_BUTTON:
499         if ( makeGroups ) {
500           SMESH::ListOfGroups_var groups;
501           if(CheckBoxMesh->isChecked())
502             for ( int i = 0; i < myObjects.count(); i++ ) {
503               SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor();
504               myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
505               groups = aMeshEditor->ScaleMakeGroups(myObjects[i], aPoint, aScaleFact);
506             }
507           else {
508             SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor();
509             SMESH::IDSource_wrap src = aMeshEditor->MakeIDSource(anElementsId, SMESH::ALL);
510             myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
511             groups = aMeshEditor->ScaleMakeGroups( src, aPoint, aScaleFact);
512           }
513         }
514         else {
515           if(CheckBoxMesh->isChecked()) {
516             for ( int i = 0; i < myObjects.count(); i++ ) {
517               SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor();
518               myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
519               aMeshEditor->Scale(myObjects[i], aPoint, aScaleFact, true);
520             }
521           }
522           else {
523             SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor();
524             SMESH::IDSource_wrap src = aMeshEditor->MakeIDSource(anElementsId, SMESH::ALL);
525             myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
526             aMeshEditor->Scale( src, aPoint, aScaleFact, true);
527           }
528         }
529         break;
530
531       case MAKE_MESH_BUTTON: {
532         SMESH::SMESH_Mesh_var mesh;
533         if (CheckBoxMesh->isChecked()) {
534           for ( int i = 0; i < myObjects.count(); i++ ) {
535             QString aName = SMESH::UniqueMeshName( LineEditNewMesh->text().replace( "*", myObjectsNames[i] ) );
536             SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor();
537             myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
538             mesh = aMeshEditor->ScaleMakeMesh(myObjects[i], aPoint, aScaleFact, makeGroups,
539                                               aName.toLatin1().data());
540             if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) )
541               anEntryList.append( aSObject->GetID().c_str() );
542           }
543         }
544         else {
545           SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor();
546           myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
547           SMESH::IDSource_wrap src = aMeshEditor->MakeIDSource(anElementsId, SMESH::ALL);
548           mesh = aMeshEditor->ScaleMakeMesh( src, aPoint, aScaleFact, makeGroups,
549                                              LineEditNewMesh->text().toLatin1().data());
550           if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) )
551             anEntryList.append( aSObject->GetID().c_str() );
552         }
553         break;
554       }
555       }
556     } catch (...) {
557     }
558
559     for ( int i = 0; i < myObjects.count(); i++ ) {
560       SMESH_Actor* actor = SMESH::FindActorByObject( myObjects[i] );
561       if ( actor ) SMESH::Update( actor->getIO(), true );
562     }
563
564     if ( ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) ||
565          actionButton == MAKE_MESH_BUTTON ) {
566       mySMESHGUI->updateObjBrowser(true); // new groups may appear
567       if( LightApp_Application* anApp =
568           dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ) )
569         anApp->browseObjects( anEntryList, isApplyAndClose() );
570     }
571     Init(false);
572     ConstructorsClicked(GetConstructorId());
573     SelectionIntoArgument();
574
575     SMESHGUI::Modified();
576   }
577
578   return true;
579 }
580
581 //=================================================================================
582 // function : ClickOnOk()
583 // purpose  :
584 //=================================================================================
585 void SMESHGUI_ScaleDlg::ClickOnOk()
586 {
587   setIsApplyAndClose( true );
588   if( ClickOnApply() )
589     reject();
590 }
591
592 //=================================================================================
593 // function : reject()
594 // purpose  :
595 //=================================================================================
596 void SMESHGUI_ScaleDlg::reject()
597 {
598   disconnect(mySelectionMgr, 0, this, 0);
599   mySelectionMgr->clearFilters();
600   //mySelectionMgr->clearSelected();
601   if (SMESH::GetCurrentVtkView()) {
602     SMESH::RemoveFilters(); // PAL6938 -- clean all mesh entity filters
603     SMESH::SetPointRepresentation(false);
604   }
605   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
606     aViewWindow->SetSelectionMode( ActorSelection );
607   mySMESHGUI->ResetState();
608   QDialog::reject();
609 }
610
611 //=================================================================================
612 // function : onOpenView()
613 // purpose  :
614 //=================================================================================
615 void SMESHGUI_ScaleDlg::onOpenView()
616 {
617   if ( mySelector ) {
618     SMESH::SetPointRepresentation(false);
619   }
620   else {
621     mySelector = SMESH::GetViewWindow( mySMESHGUI )->GetSelector();
622     ActivateThisDialog();
623   }
624 }
625
626 //=================================================================================
627 // function : onCloseView()
628 // purpose  :
629 //=================================================================================
630 void SMESHGUI_ScaleDlg::onCloseView()
631 {
632   DeactivateActiveDialog();
633   mySelector = 0;
634 }
635
636 //=================================================================================
637 // function : ClickOnHelp()
638 // purpose  :
639 //=================================================================================
640 void SMESHGUI_ScaleDlg::ClickOnHelp()
641 {
642   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
643   if (app)
644     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
645   else {
646     QString platform;
647 #ifdef WIN32
648     platform = "winapplication";
649 #else
650     platform = "application";
651 #endif
652     SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
653                              tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
654                              arg(app->resourceMgr()->stringValue("ExternalBrowser",
655                                                                  platform)).
656                              arg(myHelpFileName));
657   }
658 }
659
660 //=======================================================================
661 // function : onTextChange()
662 // purpose  :
663 //=======================================================================
664 void SMESHGUI_ScaleDlg::onTextChange (const QString& theNewText)
665 {
666   QLineEdit* send = (QLineEdit*)sender();
667
668   if (myBusy) return;
669   BusyLocker lock( myBusy );
670
671   if (send == LineEditElements)
672     myNbOkElements = 0;
673
674   buttonOk->setEnabled(false);
675   buttonApply->setEnabled(false);
676
677   // hilight entered elements
678   SMDS_Mesh* aMesh = 0;
679   if (myActor)
680     aMesh = myActor->GetObject()->GetMesh();
681
682   if (aMesh) {
683     Handle(SALOME_InteractiveObject) anIO = myActor->getIO();
684
685     TColStd_MapOfInteger newIndices;
686
687     QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts);
688
689     if (send == LineEditElements) {
690       for (int i = 0; i < aListId.count(); i++) {
691         const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt());
692         if (e)
693           newIndices.Add(e->GetID());
694         myNbOkElements++;
695       }
696     }
697
698     mySelector->AddOrRemoveIndex( anIO, newIndices, false );
699     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
700       aViewWindow->highlight( anIO, true, true );
701
702     myElementsId = theNewText;
703   }
704
705   if (myNbOkElements) {
706     buttonOk->setEnabled(true);
707     buttonApply->setEnabled(true);
708   }
709 }
710
711 //=================================================================================
712 // function : SelectionIntoArgument()
713 // purpose  : Called when selection as changed or other case
714 //=================================================================================
715 void SMESHGUI_ScaleDlg::SelectionIntoArgument()
716 {
717   if (myBusy) return;
718   BusyLocker lock( myBusy );
719   // clear
720   myActor = 0;
721   QString aString = "";
722   onDisplaySimulation(false);
723
724   if (myEditCurrentArgument == (QWidget*)LineEditElements) {
725     LineEditElements->setText(aString);
726     myNbOkElements = 0;
727     buttonOk->setEnabled(false);
728     buttonApply->setEnabled(false);
729   }
730
731   if (!GroupButtons->isEnabled()) // inactive
732     return;
733
734   // get selected mesh
735   SALOME_ListIO aList;
736   mySelectionMgr->selectedObjects(aList);
737
738   int nbSel = aList.Extent();
739   if (nbSel < 1)
740     return;
741
742   int aNbUnits = 0;
743
744   if (myEditCurrentArgument == (QWidget*)LineEditElements) {
745     myElementsId = "";
746     myObjects.clear();
747     myObjectsNames.clear();
748     myMeshes.clear();
749
750     for ( SALOME_ListIteratorOfListIO it( aList ); it.More(); it.Next() ) {
751       Handle(SALOME_InteractiveObject) IO = it.Value();
752       SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO( IO );
753       if ( aMesh->_is_nil() )
754         return;
755   
756       myActor = SMESH::FindActorByObject( aMesh );
757       if ( !myActor )
758         myActor = SMESH::FindActorByEntry( IO->getEntry() );
759       if ( !myActor && !CheckBoxMesh->isChecked() )
760         return;
761
762       if ( !SMESH::IObjectToInterface<SMESH::SMESH_IDSource>( IO )->_is_nil() ) {
763         if ( _PTR(Study) aStudy = SMESH::GetActiveStudyDocument() ) {
764           _PTR(SObject) obj = aStudy->FindObjectID( qPrintable( QString( IO->getEntry() ) ) );
765           _PTR(GenericAttribute) anAttr;
766           if ( obj && obj->FindAttribute( anAttr, "AttributeName" ) ) {
767             _PTR(AttributeName) aNameAttr( anAttr );
768             myObjects << SMESH::IObjectToInterface<SMESH::SMESH_IDSource>( IO );
769             myObjectsNames << aNameAttr->Value().c_str();
770             myMeshes << aMesh;
771           }
772         }
773       }
774     }
775       
776     // MakeGroups is available if there are groups and "Copy"
777     int aNbGroups = 0;
778     for ( int i = 0; i < myMeshes.count(); i++ )
779       aNbGroups += myMeshes[i]->NbGroups();
780
781     if ( aNbGroups == 0 ) {
782       MakeGroupsCheck->setChecked(false);
783       MakeGroupsCheck->setEnabled(false);
784     }
785     else if ( ActionGroup->checkedId() != MOVE_ELEMS_BUTTON ) {
786       MakeGroupsCheck->setEnabled(true);
787     }
788
789     if (CheckBoxMesh->isChecked()) {
790       SMESH::GetNameOfSelectedIObjects( mySelectionMgr, aString );
791       if (myMeshes.isEmpty())
792         return;
793         // get IDs from mesh
794         /*
795         SMDS_Mesh* aSMDSMesh = myActor->GetObject()->GetMesh();
796         if (!aSMDSMesh)
797           return;
798
799         for (int i = aSMDSMesh->MinElementID(); i <= aSMDSMesh->MaxElementID(); i++) {
800           const SMDS_MeshElement * e = aSMDSMesh->FindElement(i);
801           if (e) {
802             myElementsId += QString(" %1").arg(i);
803             aNbUnits++;
804           }
805         }
806       } else if (!SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(IO)->_is_nil()) { //SUBMESH
807         // get submesh
808         SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(IO);
809
810         // get IDs from submesh
811         SMESH::long_array_var anElementsIds = new SMESH::long_array;
812         anElementsIds = aSubMesh->GetElementsId();
813         for (int i = 0; i < anElementsIds->length(); i++) {
814           myElementsId += QString(" %1").arg(anElementsIds[i]);
815         }
816         aNbUnits = anElementsIds->length();
817       } else { // GROUP
818         // get smesh group
819         SMESH::SMESH_GroupBase_var aGroup =
820           SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IO);
821         if (aGroup->_is_nil())
822           return;
823
824         // get IDs from smesh group
825         SMESH::long_array_var anElementsIds = new SMESH::long_array;
826         anElementsIds = aGroup->GetListOfID();
827         for (int i = 0; i < anElementsIds->length(); i++) {
828           myElementsId += QString(" %1").arg(anElementsIds[i]);
829         }
830         aNbUnits = anElementsIds->length();
831       }
832         */
833     } else {
834       aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, aList.First(), aString);
835       myElementsId = aString;
836       if (aNbUnits < 1)
837         return;
838     }
839
840     myNbOkElements = true;
841   } else {
842     Handle(SALOME_InteractiveObject) IO = aList.First();
843     if ((SMESH::GetMeshByIO(IO))->_is_nil())
844       return;
845
846     SMESH_Actor* anActor = SMESH::FindActorByObject(SMESH::GetMeshByIO(IO));
847     if (!anActor)
848       anActor = SMESH::FindActorByEntry(IO->getEntry());
849     if (!anActor && !CheckBoxMesh->isChecked())
850       return;
851
852     aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, IO, aString);
853     if (aNbUnits != 1)
854       return;
855
856     SMDS_Mesh* aMesh =  anActor->GetObject()->GetMesh();
857     if (!aMesh)
858       return;
859
860     const SMDS_MeshNode * n = aMesh->FindNode(aString.toInt());
861     if (!n)
862       return;
863
864     double x = n->X();
865     double y = n->Y();
866     double z = n->Z();
867
868     if (myEditCurrentArgument == (QWidget*)SpinBox1_1) {
869       SpinBox1_1->SetValue(x);
870       SpinBox1_2->SetValue(y);
871       SpinBox1_3->SetValue(z);
872     }
873     else if (myEditCurrentArgument == (QWidget*)SpinBox_FX) {
874       SpinBox_FX->SetValue(x);
875       SpinBox_FY->SetValue(y);
876       SpinBox_FZ->SetValue(z);
877     }
878   }
879
880   if (myEditCurrentArgument == (QWidget*)LineEditElements) {
881     LineEditElements->setText(aString);
882     LineEditElements->repaint();
883     LineEditElements->setEnabled(false); // to fully update lineedit IPAL 19809
884     LineEditElements->setEnabled(true);
885     setNewMeshName();
886   }
887
888   // OK
889   if (myNbOkElements) {
890     buttonOk->setEnabled(true);
891     buttonApply->setEnabled(true);
892   }
893   
894   onDisplaySimulation(true);
895 }
896
897 //=================================================================================
898 // function : SetEditCurrentArgument()
899 // purpose  :
900 //=================================================================================
901 void SMESHGUI_ScaleDlg::SetEditCurrentArgument()
902 {
903   QPushButton* send = (QPushButton*)sender();
904
905   disconnect(mySelectionMgr, 0, this, 0);
906   mySelectionMgr->clearSelected();
907   mySelectionMgr->clearFilters();
908
909   if (send == SelectElementsButton) {
910     myEditCurrentArgument = (QWidget*)LineEditElements;
911     SMESH::SetPointRepresentation(false);
912     if (CheckBoxMesh->isChecked()) {
913       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
914         aViewWindow->SetSelectionMode( ActorSelection );
915       mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
916     }
917     else {
918       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
919         aViewWindow->SetSelectionMode( CellSelection );
920     }
921   }
922   else if (send == SelectButton1) {
923     myEditCurrentArgument = (QWidget*)SpinBox1_1;
924     SMESH::SetPointRepresentation(true);
925     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
926       aViewWindow->SetSelectionMode( NodeSelection );
927   }
928
929   myEditCurrentArgument->setFocus();
930   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
931   SelectionIntoArgument();
932 }
933
934 //=================================================================================
935 // function : DeactivateActiveDialog()
936 // purpose  :
937 //=================================================================================
938 void SMESHGUI_ScaleDlg::DeactivateActiveDialog()
939 {
940   if (ConstructorsBox->isEnabled()) {
941     ConstructorsBox->setEnabled(false);
942     GroupArguments->setEnabled(false);
943     GroupButtons->setEnabled(false);
944     mySMESHGUI->ResetState();
945     mySMESHGUI->SetActiveDialogBox(0);
946   }
947 }
948
949 //=================================================================================
950 // function : ActivateThisDialog()
951 // purpose  :
952 //=================================================================================
953 void SMESHGUI_ScaleDlg::ActivateThisDialog()
954 {
955   /* Emit a signal to deactivate the active dialog */
956   mySMESHGUI->EmitSignalDeactivateDialog();
957   ConstructorsBox->setEnabled(true);
958   GroupArguments->setEnabled(true);
959   GroupButtons->setEnabled(true);
960
961   mySMESHGUI->SetActiveDialogBox((QDialog*)this);
962
963   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
964     aViewWindow->SetSelectionMode( CellSelection );
965
966   SelectionIntoArgument();
967 }
968
969 //=================================================================================
970 // function : enterEvent()
971 // purpose  :
972 //=================================================================================
973 void SMESHGUI_ScaleDlg::enterEvent (QEvent*)
974 {
975   if (!ConstructorsBox->isEnabled()) {
976     SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI );
977     if ( aViewWindow && !mySelector) {
978       mySelector = aViewWindow->GetSelector();
979     }
980     ActivateThisDialog();
981   }
982 }
983
984 //=======================================================================
985 //function : onSelectMesh
986 //purpose  :
987 //=======================================================================
988 void SMESHGUI_ScaleDlg::onSelectMesh (bool toSelectMesh)
989 {
990   if (toSelectMesh)
991     TextLabelElements->setText(tr("SMESH_NAME"));
992   else
993     TextLabelElements->setText(tr("SMESH_ID_ELEMENTS"));
994   myFilterBtn->setEnabled(!toSelectMesh);
995
996   if (myEditCurrentArgument != LineEditElements) {
997     LineEditElements->clear();
998     return;
999   }
1000
1001   mySelectionMgr->clearFilters();
1002   SMESH::SetPointRepresentation(false);
1003
1004   if (toSelectMesh) {
1005     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1006       aViewWindow->SetSelectionMode( ActorSelection );
1007     mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
1008     LineEditElements->setReadOnly(true);
1009     LineEditElements->setValidator(0);
1010   } else {
1011     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1012       aViewWindow->SetSelectionMode( CellSelection );
1013     LineEditElements->setReadOnly(false);
1014     LineEditElements->setValidator(myIdValidator);
1015     onTextChange(LineEditElements->text());
1016     hidePreview();
1017   }
1018
1019   SelectionIntoArgument();
1020 }
1021
1022 //=======================================================================
1023 //function : onActionClicked
1024 //purpose  : slot called when an action type changed
1025 //=======================================================================
1026
1027 void SMESHGUI_ScaleDlg::onActionClicked(int button)
1028 {
1029   int aNbGroups = 0;
1030   for ( int i = 0; i < myMeshes.count(); i++ )
1031     aNbGroups += myMeshes[i]->NbGroups();
1032
1033   switch ( button ) {
1034   case MOVE_ELEMS_BUTTON:
1035     MakeGroupsCheck->setEnabled(false);
1036     LineEditNewMesh->setEnabled(false);
1037     break;
1038   case COPY_ELEMS_BUTTON:
1039     LineEditNewMesh->setEnabled(false);
1040     MakeGroupsCheck->setText( tr("SMESH_MAKE_GROUPS"));
1041     MakeGroupsCheck->setEnabled( myMeshes.isEmpty() || aNbGroups > 0 );
1042     break;
1043   case MAKE_MESH_BUTTON:
1044     LineEditNewMesh->setEnabled(true);
1045     MakeGroupsCheck->setText( tr("SMESH_COPY_GROUPS"));
1046     MakeGroupsCheck->setEnabled( myMeshes.isEmpty() || aNbGroups > 0 );
1047     break;
1048   }
1049   setNewMeshName();
1050   toDisplaySimulation();
1051 }
1052
1053 //=======================================================================
1054 //function : setNewMeshName
1055 //purpose  : update contents of LineEditNewMesh
1056 //=======================================================================
1057
1058 void SMESHGUI_ScaleDlg::setNewMeshName()
1059 {
1060   LineEditNewMesh->setText("");
1061   if ( LineEditNewMesh->isEnabled() && !myMeshes.isEmpty() ) {
1062     QString name;
1063     if ( CheckBoxMesh->isChecked() ) {
1064       name = myObjects.count() > 1 ? "*" : LineEditElements->text();
1065     }
1066     else {
1067       _PTR(SObject) meshSO = SMESH::FindSObject( myMeshes[0] );
1068       name = meshSO->GetName().c_str();
1069     }
1070     if ( !name.isEmpty() )
1071       LineEditNewMesh->setText( SMESH::UniqueMeshName( name, "scaled"));
1072   }
1073 }
1074
1075 //=================================================================================
1076 // function : GetConstructorId()
1077 // purpose  :
1078 //=================================================================================
1079 int SMESHGUI_ScaleDlg::GetConstructorId()
1080 {
1081   return GroupConstructors->checkedId();
1082 }
1083
1084 //=================================================================================
1085 // function : keyPressEvent()
1086 // purpose  :
1087 //=================================================================================
1088 void SMESHGUI_ScaleDlg::keyPressEvent( QKeyEvent* e )
1089 {
1090   QDialog::keyPressEvent( e );
1091   if ( e->isAccepted() )
1092     return;
1093
1094   if ( e->key() == Qt::Key_F1 ) {
1095     e->accept();
1096     ClickOnHelp();
1097   }
1098 }
1099
1100 //=================================================================================
1101 // function : setFilters()
1102 // purpose  : SLOT. Called when "Filter" button pressed.
1103 //=================================================================================
1104 void SMESHGUI_ScaleDlg::setFilters()
1105 {
1106   if(myMeshes.isEmpty()) {
1107     SUIT_MessageBox::critical(this,
1108                               tr("SMESH_ERROR"),
1109                               tr("NO_MESH_SELECTED"));
1110    return;
1111   }
1112   if ( !myFilterDlg )
1113     myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, SMESH::ALL );
1114
1115   myFilterDlg->SetSelection();
1116   myFilterDlg->SetMesh( myMeshes[0] );
1117   myFilterDlg->SetSourceWg( LineEditElements );
1118
1119   myFilterDlg->show();
1120 }
1121
1122 //=================================================================================
1123 // function : isValid
1124 // purpose  :
1125 //=================================================================================
1126 bool SMESHGUI_ScaleDlg::isValid()
1127 {
1128   bool ok = true;
1129   QString msg;
1130
1131   ok = SpinBox1_1->isValid( msg, true ) && ok;
1132   ok = SpinBox1_2->isValid( msg, true ) && ok;
1133   ok = SpinBox1_3->isValid( msg, true ) && ok;
1134   ok = SpinBox_FX->isValid( msg, true ) && ok;
1135   if (GetConstructorId() == 1) {
1136     ok = SpinBox_FY->isValid( msg, true ) && ok;
1137     ok = SpinBox_FZ->isValid( msg, true ) && ok;
1138   }
1139
1140   if( !ok ) {
1141     QString str( tr( "SMESH_INCORRECT_INPUT" ) );
1142     if ( !msg.isEmpty() )
1143       str += "\n" + msg;
1144     SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
1145     return false;
1146   }
1147   return true;
1148 }
1149
1150 //=================================================================================
1151 // function : onDisplaySimulation
1152 // purpose  : Show/Hide preview
1153 //=================================================================================
1154 void SMESHGUI_ScaleDlg::onDisplaySimulation( bool toDisplayPreview ) {
1155   if (myPreviewCheckBox->isChecked() && toDisplayPreview) {    
1156     if ( myNbOkElements && isValid() ) {
1157       QStringList aListElementsId = myElementsId.split(" ", QString::SkipEmptyParts);
1158
1159       SMESH::long_array_var anElementsId = new SMESH::long_array;
1160       
1161       anElementsId->length(aListElementsId.count());
1162       for (int i = 0; i < aListElementsId.count(); i++)
1163         anElementsId[i] = aListElementsId[i].toInt();
1164       
1165       SMESH::PointStruct aPoint;
1166       SMESH::double_array_var aScaleFact = new SMESH::double_array;
1167       getScale(aPoint, aScaleFact);
1168       
1169       try {
1170         bool copy = ( ActionGroup->checkedId() == COPY_ELEMS_BUTTON ||
1171                       ActionGroup->checkedId() == MAKE_MESH_BUTTON );
1172         SUIT_OverrideCursor aWaitCursor;
1173         QList<SMESH::MeshPreviewStruct_var> aMeshPreviewStruct;
1174
1175         if(CheckBoxMesh->isChecked())
1176           for ( int i = 0; i < myObjects.count(); i++ ) {
1177             SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditPreviewer();
1178             aMeshEditor->Scale(myObjects[i], aPoint, aScaleFact, copy);
1179             aMeshPreviewStruct << aMeshEditor->GetPreviewData();
1180           }
1181         else {
1182           SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditPreviewer();
1183           SMESH::IDSource_wrap src = aMeshEditor->MakeIDSource(anElementsId, SMESH::ALL);
1184           aMeshEditor->Scale( src, aPoint, aScaleFact, copy);
1185           aMeshPreviewStruct << aMeshEditor->GetPreviewData();
1186         }
1187         setSimulationPreview(aMeshPreviewStruct);
1188       } catch (...) {
1189         hidePreview();
1190       }
1191     } else {
1192       hidePreview();
1193     } 
1194   } else {
1195     hidePreview();
1196   }
1197 }
1198
1199 //=================================================================================
1200 // function : getScale
1201 // purpose  : get scale parameters
1202 //=================================================================================
1203 void SMESHGUI_ScaleDlg::getScale( SMESH::PointStruct& thePoint ,  SMESH::double_array_var& theScaleFact) {
1204   thePoint.x = SpinBox1_1->GetValue();
1205   thePoint.y = SpinBox1_2->GetValue();
1206   thePoint.z = SpinBox1_3->GetValue();
1207   
1208   theScaleFact->length(3);
1209   theScaleFact[0] = SpinBox_FX->GetValue();
1210   if (GetConstructorId() == 0) {
1211     theScaleFact[1] = SpinBox_FX->GetValue();
1212     theScaleFact[2] = SpinBox_FX->GetValue();
1213   }
1214   else {
1215     theScaleFact[1] = SpinBox_FY->GetValue();
1216     theScaleFact[2] = SpinBox_FZ->GetValue();
1217   } 
1218 }