]> SALOME platform Git repositories - modules/geom.git/blob - src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx
Salome HOME
Issue 0021055: EDF 1602 STUDY: Object browser reactualisation when creating an object
[modules/geom.git] / src / TransformationGUI / TransformationGUI_MultiRotationDlg.cxx
1 //  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //  GEOM GEOMGUI : GUI for Geometry component
23 //  File   : TransformationGUI_MultiRotationDlg.cxx
24 //  Author : Damien COQUERET, Open CASCADE S.A.S.
25
26 #include "TransformationGUI_MultiRotationDlg.h"
27
28 #include <DlgRef.h>
29 #include <GeometryGUI.h>
30 #include <GEOMBase.h>
31
32 #include <SUIT_Session.h>
33 #include <SUIT_ResourceMgr.h>
34 #include <SalomeApp_Application.h>
35 #include <LightApp_SelectionMgr.h>
36
37 // OCCT Includes
38 #include <TopoDS_Shape.hxx>
39 #include <TopoDS_Edge.hxx>
40 #include <TopoDS.hxx>
41 #include <TopExp.hxx>
42 #include <TColStd_IndexedMapOfInteger.hxx>
43 #include <TopTools_IndexedMapOfShape.hxx>
44
45 #include <GEOMImpl_Types.hxx>
46
47 //=================================================================================
48 // class    : TransformationGUI_MultiRotationDlg()
49 // purpose  : Constructs a TransformationGUI_MultiRotationDlg which is a child of 'parent', with the
50 //            name 'name' and widget flags set to 'f'.
51 //            The dialog will by default be modeless, unless you set 'modal' to
52 //            TRUE to construct a modal dialog.
53 //=================================================================================
54 TransformationGUI_MultiRotationDlg::TransformationGUI_MultiRotationDlg
55 (GeometryGUI* theGeometryGUI, QWidget* parent, bool modal, Qt::WindowFlags fl)
56   : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl),
57     myInitial(true)
58 {
59   SUIT_ResourceMgr* aResMgr = myGeomGUI->getApp()->resourceMgr();
60   QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_MULTIROTATION_SIMPLE")));
61   QPixmap image1 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_MULTIROTATION_DOUBLE")));
62   QPixmap image2 (aResMgr->loadPixmap("GEOM", tr("ICON_SELECT")));
63
64   setWindowTitle(tr("GEOM_MULTIROTATION_TITLE"));
65
66   /***************************************************************/
67   mainFrame()->GroupConstructors->setTitle(tr("GEOM_MULTIROTATION"));
68   mainFrame()->RadioButton1->setIcon(image0);
69   mainFrame()->RadioButton2->setIcon(image1);
70   mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
71   mainFrame()->RadioButton3->close();
72
73   GroupPoints = new DlgRef_2Sel1SpinInt(centralWidget());
74   GroupPoints->GroupBox1->setTitle(tr("GEOM_MULTIROTATION_SIMPLE"));
75   GroupPoints->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
76   GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR"));
77   GroupPoints->TextLabel3->setText(tr("GEOM_NB_TIMES"));
78   GroupPoints->PushButton1->setIcon(image2);
79   GroupPoints->PushButton2->setIcon(image2);
80   GroupPoints->LineEdit1->setReadOnly(true);
81   GroupPoints->LineEdit2->setReadOnly(true);
82
83   GroupDimensions = new DlgRef_2Sel4Spin1Check(centralWidget());
84   GroupDimensions->GroupBox1->setTitle(tr("GEOM_MULTIROTATION_DOUBLE"));
85   GroupDimensions->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
86   GroupDimensions->TextLabel2->setText(tr("GEOM_VECTOR"));
87   GroupDimensions->TextLabel3->setText(tr("GEOM_ANGLE"));
88   GroupDimensions->TextLabel4->setText(tr("GEOM_NB_TIMES"));
89   GroupDimensions->TextLabel5->setText(tr("GEOM_STEP"));
90   GroupDimensions->TextLabel6->setText(tr("GEOM_NB_TIMES"));
91   GroupDimensions->CheckButton1->setText(tr("GEOM_REVERSE"));
92   GroupDimensions->PushButton1->setIcon(image2);
93   GroupDimensions->PushButton2->setIcon(image2);
94   GroupDimensions->LineEdit1->setReadOnly(true);
95   GroupDimensions->LineEdit2->setReadOnly(true);
96
97   QVBoxLayout* layout = new QVBoxLayout(centralWidget());
98   layout->setMargin(0); layout->setSpacing(6);
99   layout->addWidget(GroupPoints);
100   layout->addWidget(GroupDimensions);
101   /***************************************************************/
102
103   setHelpFileName("multi_rotation_operation_page.html");
104
105   Init();
106 }
107
108 //=================================================================================
109 // function : ~TransformationGUI_MultiRotationDlg()
110 // purpose  : Destroys the object and frees any allocated resources
111 //=================================================================================
112 TransformationGUI_MultiRotationDlg::~TransformationGUI_MultiRotationDlg()
113 {
114   // no need to delete child widgets, Qt does it all for us
115 }
116
117 //=================================================================================
118 // function : Init()
119 // purpose  :
120 //=================================================================================
121 void TransformationGUI_MultiRotationDlg::Init()
122 {
123   // Get setting of step value from file configuration
124   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
125   double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100);
126
127   int SpecificStep1 = 5;
128   int SpecificStep2 = 1;
129   // init variables
130   myAng = 45.0;
131   myStep = 50.0;
132   myNbTimes1 = myNbTimes2 = 2;
133
134   // min, max, step and decimals for spin boxes & initial values
135   initSpinBox(GroupPoints->SpinBox_DX, 1, 999, SpecificStep2);
136   GroupPoints->SpinBox_DX->setValue(myNbTimes1);
137
138   initSpinBox(GroupDimensions->SpinBox_DX1, COORD_MIN, COORD_MAX, SpecificStep1, "angle_precision" );
139   initSpinBox(GroupDimensions->SpinBox_DY1, 1, 999, SpecificStep2);
140   initSpinBox(GroupDimensions->SpinBox_DX2, COORD_MIN, COORD_MAX, step,"length_precision" );
141   initSpinBox(GroupDimensions->SpinBox_DY2, 1, 999, SpecificStep2);
142   GroupDimensions->SpinBox_DX1->setValue(myAng);
143   GroupDimensions->SpinBox_DY1->setValue(myNbTimes1);
144   GroupDimensions->SpinBox_DX2->setValue(myStep);
145   GroupDimensions->SpinBox_DY2->setValue(myNbTimes2);
146
147   GroupPoints->LineEdit1->setText("");
148   GroupPoints->LineEdit2->setText("");
149
150   GroupDimensions->LineEdit1->setText("");
151   GroupDimensions->LineEdit2->setText("");
152
153   myBase.nullify();
154   myVector.nullify();
155
156   mainFrame()->GroupBoxPublish->show();
157
158   // signals and slots connections
159   connect(buttonOk(),    SIGNAL(clicked()), this, SLOT(ClickOnOk()));
160   connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
161
162   connect(this,          SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int)));
163
164   connect(GroupPoints->PushButton1,     SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
165   connect(GroupPoints->PushButton2,     SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
166   connect(GroupDimensions->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
167   connect(GroupDimensions->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
168
169   connect(GroupPoints->SpinBox_DX,      SIGNAL(valueChanged(int)),    this, SLOT(ValueChangedInSpinBox(int)));
170   connect(GroupDimensions->SpinBox_DX1, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
171   connect(GroupDimensions->SpinBox_DY1, SIGNAL(valueChanged(int)),    this, SLOT(ValueChangedInSpinBox(int)));
172   connect(GroupDimensions->SpinBox_DX2, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
173   connect(GroupDimensions->SpinBox_DY2, SIGNAL(valueChanged(int)),    this, SLOT(ValueChangedInSpinBox(int)));
174
175   connect(GroupDimensions->SpinBox_DX1,SIGNAL(textChanged( const QString& )),
176           this, SLOT(TextValueChangedInSpinBox( const QString& )));
177
178   connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double)));
179
180   connect(GroupDimensions->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(ReverseAngle()));
181
182   initName(tr("GEOM_MULTIROTATION"));
183
184   ConstructorsClicked(0);
185 }
186
187 //=================================================================================
188 // function : SetDoubleSpinBoxStep()
189 // purpose  : Double spin box management
190 //=================================================================================
191 void TransformationGUI_MultiRotationDlg::SetDoubleSpinBoxStep (double step)
192 {
193   GroupDimensions->SpinBox_DX2->setSingleStep(step);
194
195   // san: Commented so as not to override specific step settings
196   //GroupPoints->SpinBox_DX->setSingleStep((int)step);
197   //GroupDimensions->SpinBox_DX1->setSingleStep(step);
198   //GroupDimensions->SpinBox_DY1->setSingleStep((int)step);
199   //GroupDimensions->SpinBox_DY2->setSingleStep((int)step);
200 }
201
202 //=================================================================================
203 // function : ConstructorsClicked()
204 // purpose  : Radio button management
205 //=================================================================================
206 void TransformationGUI_MultiRotationDlg::ConstructorsClicked (int constructorId)
207 {
208   disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
209
210   switch (constructorId) {
211   case 0: // Rotate simple
212     {
213       GroupDimensions->hide();
214       GroupPoints->show();
215
216       GroupPoints->LineEdit1->setText("");
217       GroupPoints->LineEdit2->setText("");
218       myBase.nullify();
219       myVector.nullify();
220
221       GroupPoints->SpinBox_DX->setValue(myNbTimes1);
222
223       GroupPoints->PushButton1->click();
224     }
225     break;
226   case 1: // Rotate double
227     {
228       GroupPoints->hide();
229       GroupDimensions->show();
230
231       GroupDimensions->LineEdit1->setText("");
232       GroupDimensions->LineEdit2->setText("");
233       myBase.nullify();
234       myVector.nullify();
235
236       GroupDimensions->SpinBox_DX1->setValue(myAng);
237       GroupDimensions->SpinBox_DY1->setValue(myNbTimes1);
238       GroupDimensions->SpinBox_DX2->setValue(myStep);
239       GroupDimensions->SpinBox_DY2->setValue(myNbTimes2);
240
241       GroupDimensions->PushButton1->click();
242     }
243     break;
244   }
245
246   qApp->processEvents();
247   updateGeometry();
248   resize(minimumSizeHint());
249
250   if (myInitial) {
251     myInitial = false;
252     SelectionIntoArgument();
253   }
254   else {
255     processPreview();
256   }
257 }
258
259 //=================================================================================
260 // function : ClickOnOk()
261 // purpose  :
262 //=================================================================================
263 void TransformationGUI_MultiRotationDlg::ClickOnOk()
264 {
265   setIsApplyAndClose( true );
266   if (ClickOnApply())
267     ClickOnCancel();
268 }
269
270 //=================================================================================
271 // function : ClickOnApply()
272 // purpose  :
273 //=================================================================================
274 bool TransformationGUI_MultiRotationDlg::ClickOnApply()
275 {
276   if (!onAccept())
277     return false;
278
279   initName();
280   // activate selection and connect selection manager
281   ConstructorsClicked(getConstructorId());
282   return true;
283 }
284
285 //=================================================================================
286 // function : SelectionIntoArgument()
287 // purpose  : Called when selection is changed or on dialog initialization or activation
288 //=================================================================================
289 void TransformationGUI_MultiRotationDlg::SelectionIntoArgument()
290 {
291   erasePreview();
292
293   TopAbs_ShapeEnum aNeedType = ( myEditCurrentArgument == GroupPoints->LineEdit2 ||
294                                  myEditCurrentArgument == GroupDimensions->LineEdit2 ) ?
295     TopAbs_EDGE : TopAbs_SHAPE;
296   GEOM::GeomObjPtr aSelectedObject = getSelected( aNeedType );
297   TopoDS_Shape aShape;
298   if ( aSelectedObject && GEOMBase::GetShape( aSelectedObject.get(), aShape ) && !aShape.IsNull() ) {
299     QString aName = GEOMBase::GetName( aSelectedObject.get() );
300     myEditCurrentArgument->setText( aName );
301     if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) {
302       myBase = aSelectedObject;
303       if ( !myVector )
304         GroupPoints->PushButton2->click();
305     }
306     else if ( myEditCurrentArgument == GroupPoints->LineEdit2)  {
307       myVector = aSelectedObject;
308       if ( !myBase )
309         GroupPoints->PushButton1->click();
310     }
311     else if ( myEditCurrentArgument == GroupDimensions->LineEdit1 ) {
312       myBase = aSelectedObject;
313       if ( !myVector )
314         GroupDimensions->PushButton2->click();
315     }
316     else if ( myEditCurrentArgument == GroupDimensions->LineEdit2 ) {
317       myVector = aSelectedObject;
318       if ( !myBase )
319         GroupDimensions->PushButton1->click();
320     }
321     
322     // clear selection
323     disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
324     myGeomGUI->getApp()->selectionMgr()->clearSelected();
325     connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
326             this, SLOT(SelectionIntoArgument()));
327   }
328   else {
329     if ( myEditCurrentArgument == GroupPoints->LineEdit1 ||
330          myEditCurrentArgument == GroupDimensions->LineEdit1 )
331       myBase.nullify();
332     else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ||
333               myEditCurrentArgument == GroupDimensions->LineEdit2 )
334       myVector.nullify();
335     myEditCurrentArgument->setText("");
336   }
337
338   processPreview();
339 }
340
341 //=================================================================================
342 // function : SetEditCurrentArgument()
343 // purpose  :
344 //=================================================================================
345 void TransformationGUI_MultiRotationDlg::SetEditCurrentArgument()
346 {
347   QPushButton* send = (QPushButton*)sender();
348
349   disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
350   globalSelection(GEOM_ALLSHAPES);
351
352   if (send == GroupPoints->PushButton1) {
353     myEditCurrentArgument = GroupPoints->LineEdit1;
354
355     GroupPoints->PushButton2->setDown(false);
356     GroupPoints->LineEdit2->setEnabled(false);
357   }
358   else if (send == GroupPoints->PushButton2) {
359     myEditCurrentArgument = GroupPoints->LineEdit2;
360
361     localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
362
363     GroupPoints->PushButton1->setDown(false);
364     GroupPoints->LineEdit1->setEnabled(false);
365   }
366   else if (send == GroupDimensions->PushButton1) {
367     myEditCurrentArgument = GroupDimensions->LineEdit1;
368
369     GroupDimensions->PushButton2->setDown(false);
370     GroupDimensions->LineEdit2->setEnabled(false);
371   }
372   else if (send == GroupDimensions->PushButton2) {
373     myEditCurrentArgument = GroupDimensions->LineEdit2;
374
375     localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
376
377     GroupDimensions->PushButton1->setDown(false);
378     GroupDimensions->LineEdit1->setEnabled(false);
379   }
380   connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
381           this, SLOT(SelectionIntoArgument()));
382
383   // enable line edit
384   myEditCurrentArgument->setEnabled(true);
385   myEditCurrentArgument->setFocus();
386   // after setFocus(), because it will be setDown(false) when loses focus
387   send->setDown(true);
388
389   // seems we need it only to avoid preview disappearing, caused by selection mode change
390   processPreview();
391 }
392
393 //=================================================================================
394 // function : ActivateThisDialog()
395 // purpose  :
396 //=================================================================================
397 void TransformationGUI_MultiRotationDlg::ActivateThisDialog()
398 {
399   GEOMBase_Skeleton::ActivateThisDialog();
400   connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
401            this, SLOT( SelectionIntoArgument() ) );
402
403   ConstructorsClicked( getConstructorId() );
404 }
405
406 //=================================================================================
407 // function : enterEvent()
408 // purpose  :
409 //=================================================================================
410 void TransformationGUI_MultiRotationDlg::enterEvent (QEvent*)
411 {
412   if (!mainFrame()->GroupConstructors->isEnabled())
413     ActivateThisDialog();
414 }
415
416 //=================================================================================
417 // function : TextValueChangedInSpinBox()
418 // purpose  :
419 //=================================================================================
420 void TransformationGUI_MultiRotationDlg::TextValueChangedInSpinBox(const QString& s){
421   bool isDigit;
422   s.toDouble(&isDigit);
423   if(!isDigit)
424     GroupDimensions->CheckButton1->setChecked(false);
425   GroupDimensions->CheckButton1->setEnabled(isDigit);
426 }
427
428 //=================================================================================
429 // function : ValueChangedInSpinBox()
430 // purpose  :
431 //=================================================================================
432 void TransformationGUI_MultiRotationDlg::ValueChangedInSpinBox (double newValue)
433 {
434   QObject* send = (QObject*)sender();
435
436   if (send == GroupDimensions->SpinBox_DX1)
437     myAng = newValue;
438   else if (send == GroupDimensions->SpinBox_DX2)
439     myStep = newValue;
440
441   processPreview();
442 }
443
444 //=================================================================================
445 // function : ValueChangedInSpinBox()
446 // purpose  :
447 //=================================================================================
448 void TransformationGUI_MultiRotationDlg::ValueChangedInSpinBox (int newValue)
449 {
450   QObject* send = (QObject*)sender();
451
452   if (send == GroupPoints->SpinBox_DX || send == GroupDimensions->SpinBox_DY1)
453     myNbTimes1 = newValue;
454   else if (send == GroupDimensions->SpinBox_DY2)
455     myNbTimes2 = newValue;
456
457   processPreview();
458 }
459
460 //=================================================================================
461 // function : ReverseAngle()
462 // purpose  : 'state' not used here
463 //=================================================================================
464 void TransformationGUI_MultiRotationDlg::ReverseAngle()
465 {
466   myAng = -myAng;
467
468   int aConstructorId = getConstructorId();
469
470   if (aConstructorId == 1)
471     GroupDimensions->SpinBox_DX1->setValue(myAng);
472
473   processPreview();
474 }
475
476 //=================================================================================
477 // function : createOperation
478 // purpose  :
479 //=================================================================================
480 GEOM::GEOM_IOperations_ptr TransformationGUI_MultiRotationDlg::createOperation()
481 {
482   return getGeomEngine()->GetITransformOperations(getStudyId());
483 }
484
485 //=================================================================================
486 // function : isValid
487 // purpose  :
488 //=================================================================================
489 bool TransformationGUI_MultiRotationDlg::isValid (QString& msg)
490 {
491   bool ok = false;
492   switch(getConstructorId()){
493   case 0:
494     ok = GroupPoints->SpinBox_DX->isValid( msg, !IsPreview() ) &&  myBase && myVector;
495     break;
496   case 1:
497     ok = GroupDimensions->SpinBox_DX1->isValid( msg, !IsPreview() ) &&
498          GroupDimensions->SpinBox_DY1->isValid( msg, !IsPreview() ) &&
499          GroupDimensions->SpinBox_DX2->isValid( msg, !IsPreview() ) &&
500          GroupDimensions->SpinBox_DY2->isValid( msg, !IsPreview() ) &&
501          myBase && myVector;
502     break;
503   default:
504     break;
505   }
506   return ok;
507 }
508
509 //=================================================================================
510 // function : execute
511 // purpose  :
512 //=================================================================================
513 bool TransformationGUI_MultiRotationDlg::execute (ObjectList& objects)
514 {
515   bool res = false;
516
517   GEOM::GEOM_Object_var anObj;
518   QStringList aParameters;
519
520   GEOM::GEOM_ITransformOperations_var anOper = GEOM::GEOM_ITransformOperations::_narrow(getOperation());
521
522   switch (getConstructorId()) {
523   case 0:
524     if ( myBase && myVector ) {
525       anObj = anOper->MultiRotate1D(myBase.get(), myVector.get(), myNbTimes1);
526       if(!IsPreview())
527         aParameters<<GroupPoints->SpinBox_DX->text();
528       res = true;
529     }
530     break;
531   case 1:
532     if ( myBase && myVector ) {
533       anObj = anOper->MultiRotate2D(myBase.get(), myVector.get(), myAng, myNbTimes1, myStep, myNbTimes2);
534       if(!IsPreview()) {
535         aParameters<<GroupDimensions->SpinBox_DX1->text();
536         aParameters<<GroupDimensions->SpinBox_DY1->text();
537         aParameters<<GroupDimensions->SpinBox_DX2->text();
538         aParameters<<GroupDimensions->SpinBox_DY2->text();
539       }
540       res = true;
541     }
542     break;
543   }
544
545   if (!anObj->_is_nil()) {
546     if(!IsPreview())
547       anObj->SetParameters(aParameters.join(":").toLatin1().constData());
548     objects.push_back(anObj._retn());
549   }
550
551   return res;
552 }
553
554 //=================================================================================
555 // function : addSubshapeToStudy
556 // purpose  : virtual method to add new SubObjects if local selection
557 //=================================================================================
558 void TransformationGUI_MultiRotationDlg::addSubshapesToStudy()
559 {
560   switch (getConstructorId()) {
561   case 0:
562   case 1:
563     GEOMBase::PublishSubObject( myVector.get() );
564     break;
565   default:
566     break;
567   }
568 }
569
570 //=================================================================================
571 // function : restoreSubShapes
572 // purpose  :
573 //=================================================================================
574 void TransformationGUI_MultiRotationDlg::restoreSubShapes (SALOMEDS::Study_ptr   theStudy,
575                                                            SALOMEDS::SObject_ptr theSObject)
576 {
577   if (mainFrame()->CheckBoxRestoreSS->isChecked()) {
578     // we pass here the first operation argument (object) through the list of arguments
579     // because the rotation operation place its arguments in the data structure in another order,
580     // and we need to point the first argument directly
581     GEOM::ListOfGO_var anArgs = new GEOM::ListOfGO;
582     anArgs->length(1);
583     anArgs[0] = myBase.copy();
584     getGeomEngine()->RestoreSubShapesSO(theStudy, theSObject, anArgs,
585                                         /*theFindMethod=*/GEOM::FSM_MultiTransformed,
586                                         /*theInheritFirstArg=*/true,
587                                         mainFrame()->CheckBoxAddPrefix->isChecked());
588   }
589 }