1 // Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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, or (at your option) any later version.
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.
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
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // File : TransformationGUI_MultiRotationDlg.cxx
23 // Author : Damien COQUERET, Open CASCADE S.A.S.
25 #include "TransformationGUI_MultiRotationDlg.h"
28 #include <GeometryGUI.h>
31 #include <SUIT_Session.h>
32 #include <SUIT_ResourceMgr.h>
33 #include <SalomeApp_Application.h>
34 #include <LightApp_SelectionMgr.h>
37 #include <TopoDS_Shape.hxx>
38 #include <TopoDS_Edge.hxx>
41 #include <TColStd_IndexedMapOfInteger.hxx>
42 #include <TopTools_IndexedMapOfShape.hxx>
44 #include <GEOMImpl_Types.hxx>
46 //=================================================================================
47 // class : TransformationGUI_MultiRotationDlg()
48 // purpose : Constructs a TransformationGUI_MultiRotationDlg which is a child of 'parent', with the
49 // name 'name' and widget flags set to 'f'.
50 // The dialog will by default be modeless, unless you set 'modal' to
51 // TRUE to construct a modal dialog.
52 //=================================================================================
53 TransformationGUI_MultiRotationDlg::TransformationGUI_MultiRotationDlg
54 (GeometryGUI* theGeometryGUI, QWidget* parent, bool modal, Qt::WindowFlags fl)
55 : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl),
58 SUIT_ResourceMgr* aResMgr = myGeomGUI->getApp()->resourceMgr();
59 QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_MULTIROTATION_SIMPLE")));
60 QPixmap image1 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_MULTIROTATION_DOUBLE")));
61 QPixmap image2 (aResMgr->loadPixmap("GEOM", tr("ICON_SELECT")));
63 setWindowTitle(tr("GEOM_MULTIROTATION_TITLE"));
65 /***************************************************************/
66 mainFrame()->GroupConstructors->setTitle(tr("GEOM_MULTIROTATION"));
67 mainFrame()->RadioButton1->setIcon(image0);
68 mainFrame()->RadioButton2->setIcon(image1);
69 mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
70 mainFrame()->RadioButton3->close();
72 bool isAngleStep = false;
74 GroupArgs = new TransformationGUI_2Sel4Spin1Check (centralWidget());
75 GroupArgs->GroupBox1->setTitle(tr("GEOM_MULTIROTATION_DOUBLE"));
76 GroupArgs->TextLabel1->setText(tr("GEOM_MAIN_OBJECT"));
77 GroupArgs->TextLabel2->setText(tr("GEOM_VECTOR"));
78 //GroupArgs->TextLabel3->setText(tr("GEOM_ANGLE_STEP"));
79 GroupArgs->CheckAngleStep->setText(tr("GEOM_ANGLE_STEP"));
80 GroupArgs->CheckAngleStep->setChecked(isAngleStep);
81 GroupArgs->TextLabel4->setText(tr("GEOM_NB_TIMES"));
82 GroupArgs->TextLabel5->setText(tr("GEOM_STEP_R"));
83 GroupArgs->TextLabel6->setText(tr("GEOM_NB_TIMES"));
84 GroupArgs->CheckButton1->setText(tr("GEOM_REVERSE"));
85 GroupArgs->PushButton1->setIcon(image2);
86 GroupArgs->PushButton2->setIcon(image2);
87 GroupArgs->LineEdit1->setReadOnly(true);
88 GroupArgs->LineEdit2->setReadOnly(true);
89 GroupArgs->SpinBox_DX1->setEnabled(isAngleStep);
90 GroupArgs->CheckButton1->setEnabled(isAngleStep);
91 /***************************************************************/
93 setHelpFileName("multi_rotation_operation_page.html");
98 //=================================================================================
99 // function : ~TransformationGUI_MultiRotationDlg()
100 // purpose : Destroys the object and frees any allocated resources
101 //=================================================================================
102 TransformationGUI_MultiRotationDlg::~TransformationGUI_MultiRotationDlg()
104 // no need to delete child widgets, Qt does it all for us
107 //=================================================================================
110 //=================================================================================
111 void TransformationGUI_MultiRotationDlg::Init()
116 myNbTimes1 = myNbTimes2 = 3;
118 // Get setting of step value from file configuration
119 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
120 double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100);
122 int SpecificStep1 = 5;
123 int SpecificStep2 = 1;
125 // min, max, step and decimals for spin boxes & initial values
126 initSpinBox(GroupArgs->SpinBox_DX1, COORD_MIN, COORD_MAX, SpecificStep1, "angle_precision");
127 initSpinBox(GroupArgs->SpinBox_DY1, 1, 999, SpecificStep2);
128 initSpinBox(GroupArgs->SpinBox_DX2, COORD_MIN, COORD_MAX, step, "length_precision");
129 initSpinBox(GroupArgs->SpinBox_DY2, 1, 999, SpecificStep2);
131 mainFrame()->GroupBoxPublish->show();
133 // signals and slots connections
134 connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk()));
135 connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
137 connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int)));
139 connect(GroupArgs->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
140 connect(GroupArgs->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
142 connect(GroupArgs->SpinBox_DX1, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
143 connect(GroupArgs->SpinBox_DY1, SIGNAL(valueChanged(int)), this, SLOT(ValueChangedInSpinBox(int)));
144 connect(GroupArgs->SpinBox_DX2, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
145 connect(GroupArgs->SpinBox_DY2, SIGNAL(valueChanged(int)), this, SLOT(ValueChangedInSpinBox(int)));
147 connect(GroupArgs->SpinBox_DX1, SIGNAL(textChanged(const QString&)),
148 this, SLOT(TextValueChangedInSpinBox(const QString&)));
150 connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double)));
152 connect(GroupArgs->CheckAngleStep, SIGNAL(toggled(bool)), this, SLOT(CheckAngleStep(bool)));
153 connect(GroupArgs->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(ReverseAngle()));
155 initName(tr("GEOM_MULTIROTATION"));
157 ConstructorsClicked(0);
160 //=================================================================================
161 // function : SetDoubleSpinBoxStep()
162 // purpose : Double spin box management
163 //=================================================================================
164 void TransformationGUI_MultiRotationDlg::SetDoubleSpinBoxStep (double step)
166 GroupArgs->SpinBox_DX2->setSingleStep(step);
169 //=================================================================================
170 // function : ConstructorsClicked()
171 // purpose : Radio button management
172 //=================================================================================
173 void TransformationGUI_MultiRotationDlg::ConstructorsClicked (int constructorId)
175 disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
178 //myVector.nullify();
180 //GroupArgs->LineEdit1->setText("");
181 //GroupArgs->LineEdit2->setText("");
183 GroupArgs->SpinBox_DX1->setValue(myAng);
184 GroupArgs->SpinBox_DY1->setValue(myNbTimes1);
185 GroupArgs->SpinBox_DX2->setValue(myStep);
186 GroupArgs->SpinBox_DY2->setValue(myNbTimes2);
188 switch (constructorId) {
189 case 0: // Rotate simple
191 GroupArgs->GroupBox1->setTitle(tr("GEOM_MULTIROTATION_SIMPLE"));
192 GroupArgs->TextLabel5->hide();
193 GroupArgs->TextLabel6->hide();
194 GroupArgs->SpinBox_DX2->hide();
195 GroupArgs->SpinBox_DY2->hide();
196 GroupArgs->CheckButton1->hide();
199 case 1: // Rotate double
201 GroupArgs->GroupBox1->setTitle(tr("GEOM_MULTIROTATION_DOUBLE"));
202 GroupArgs->TextLabel5->show();
203 GroupArgs->TextLabel6->show();
204 GroupArgs->SpinBox_DX2->show();
205 GroupArgs->SpinBox_DY2->show();
206 GroupArgs->CheckButton1->show();
211 GroupArgs->PushButton1->click();
213 qApp->processEvents();
215 resize(minimumSizeHint());
219 SelectionIntoArgument();
226 //=================================================================================
227 // function : ClickOnOk()
229 //=================================================================================
230 void TransformationGUI_MultiRotationDlg::ClickOnOk()
232 setIsApplyAndClose( true );
237 //=================================================================================
238 // function : ClickOnApply()
240 //=================================================================================
241 bool TransformationGUI_MultiRotationDlg::ClickOnApply()
247 // activate selection and connect selection manager
248 ConstructorsClicked(getConstructorId());
252 //=================================================================================
253 // function : SelectionIntoArgument()
254 // purpose : Called when selection is changed or on dialog initialization or activation
255 //=================================================================================
256 void TransformationGUI_MultiRotationDlg::SelectionIntoArgument()
260 TopAbs_ShapeEnum aNeedType = ( myEditCurrentArgument == GroupArgs->LineEdit2 ) ?
261 TopAbs_EDGE : TopAbs_SHAPE;
262 GEOM::GeomObjPtr aSelectedObject = getSelected( aNeedType );
264 if ( aSelectedObject && GEOMBase::GetShape( aSelectedObject.get(), aShape ) && !aShape.IsNull() ) {
265 QString aName = GEOMBase::GetName( aSelectedObject.get() );
266 myEditCurrentArgument->setText( aName );
267 if ( myEditCurrentArgument == GroupArgs->LineEdit1 ) {
268 myBase = aSelectedObject;
270 // recompute myAng and myStep (Mantis issue 0021718)
271 GEOM::GEOM_IMeasureOperations_var anOper = getGeomEngine()->GetIMeasureOperations(getStudyId());
272 double Xmin, Xmax, Ymin, Ymax, Zmin, Zmax;
273 anOper->GetBoundingBox(myBase.get(), true, Xmin, Xmax, Ymin, Ymax, Zmin, Zmax);
274 if (anOper->IsDone()) {
276 double diag = sqrt((Xmax-Xmin)*(Xmax-Xmin) + (Ymax-Ymin)*(Ymax-Ymin));
277 double d = sqrt((0.5*(Xmax+Xmin))*(0.5*(Xmax+Xmin)) + (0.5*(Ymax+Ymin))*(0.5*(Ymax+Ymin)));
278 if ( fabs(d) > 1.e-16 )
279 myAng = floor(2.0 * atan(diag/d) * 180.0 / M_PI);
280 GroupArgs->SpinBox_DX1->setValue(myAng);
283 myStep = Max(floor(1.5*(Xmax-Xmin)), floor(1.5*(Ymax-Ymin)));
284 GroupArgs->SpinBox_DX2->setValue(myStep);
288 GroupArgs->PushButton2->click();
290 else if ( myEditCurrentArgument == GroupArgs->LineEdit2 ) {
291 myVector = aSelectedObject;
293 GroupArgs->PushButton1->click();
297 // disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
298 // myGeomGUI->getApp()->selectionMgr()->clearSelected();
299 // connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
300 // this, SLOT(SelectionIntoArgument()));
303 if ( myEditCurrentArgument == GroupArgs->LineEdit1 )
305 else if ( myEditCurrentArgument == GroupArgs->LineEdit2 )
307 myEditCurrentArgument->setText("");
313 //=================================================================================
314 // function : SetEditCurrentArgument()
316 //=================================================================================
317 void TransformationGUI_MultiRotationDlg::SetEditCurrentArgument()
319 QPushButton* send = (QPushButton*)sender();
321 disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
322 globalSelection(GEOM_ALLSHAPES);
324 if (send == GroupArgs->PushButton1) {
325 myEditCurrentArgument = GroupArgs->LineEdit1;
327 GroupArgs->PushButton2->setDown(false);
328 GroupArgs->LineEdit2->setEnabled(false);
330 else if (send == GroupArgs->PushButton2) {
331 myEditCurrentArgument = GroupArgs->LineEdit2;
333 localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
335 GroupArgs->PushButton1->setDown(false);
336 GroupArgs->LineEdit1->setEnabled(false);
338 connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
339 this, SLOT(SelectionIntoArgument()));
342 myEditCurrentArgument->setEnabled(true);
343 myEditCurrentArgument->setFocus();
344 // after setFocus(), because it will be setDown(false) when loses focus
347 // seems we need it only to avoid preview disappearing, caused by selection mode change
351 //=================================================================================
352 // function : ActivateThisDialog()
354 //=================================================================================
355 void TransformationGUI_MultiRotationDlg::ActivateThisDialog()
357 GEOMBase_Skeleton::ActivateThisDialog();
358 connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
359 this, SLOT( SelectionIntoArgument() ) );
361 ConstructorsClicked( getConstructorId() );
364 //=================================================================================
365 // function : enterEvent()
367 //=================================================================================
368 void TransformationGUI_MultiRotationDlg::enterEvent (QEvent*)
370 if (!mainFrame()->GroupConstructors->isEnabled())
371 ActivateThisDialog();
374 //=================================================================================
375 // function : TextValueChangedInSpinBox()
377 //=================================================================================
378 void TransformationGUI_MultiRotationDlg::TextValueChangedInSpinBox (const QString& s)
381 s.toDouble(&isDigit);
383 GroupArgs->CheckButton1->setChecked(false);
384 GroupArgs->CheckButton1->setEnabled(isDigit);
387 //=================================================================================
388 // function : ValueChangedInSpinBox()
390 //=================================================================================
391 void TransformationGUI_MultiRotationDlg::ValueChangedInSpinBox (double newValue)
393 QObject* send = (QObject*)sender();
395 if (send == GroupArgs->SpinBox_DX1)
397 else if (send == GroupArgs->SpinBox_DX2)
403 //=================================================================================
404 // function : ValueChangedInSpinBox()
406 //=================================================================================
407 void TransformationGUI_MultiRotationDlg::ValueChangedInSpinBox (int newValue)
409 QObject* send = (QObject*)sender();
411 if (send == GroupArgs->SpinBox_DY1)
412 myNbTimes1 = newValue;
413 else if (send == GroupArgs->SpinBox_DY2)
414 myNbTimes2 = newValue;
419 //=================================================================================
420 // function : ReverseAngle()
422 //=================================================================================
423 void TransformationGUI_MultiRotationDlg::ReverseAngle()
427 int aConstructorId = getConstructorId();
429 if (aConstructorId == 1)
430 GroupArgs->SpinBox_DX1->setValue(myAng);
435 //=================================================================================
436 // function : CheckAngleStep()
438 //=================================================================================
439 void TransformationGUI_MultiRotationDlg::CheckAngleStep (bool isOn)
441 GroupArgs->SpinBox_DX1->setEnabled(isOn);
442 GroupArgs->CheckButton1->setEnabled(isOn);
446 //=================================================================================
447 // function : createOperation
449 //=================================================================================
450 GEOM::GEOM_IOperations_ptr TransformationGUI_MultiRotationDlg::createOperation()
452 return getGeomEngine()->GetITransformOperations(getStudyId());
455 //=================================================================================
456 // function : isValid
458 //=================================================================================
459 bool TransformationGUI_MultiRotationDlg::isValid (QString& msg)
462 switch (getConstructorId()) {
464 ok = (GroupArgs->SpinBox_DX1->isValid( msg, !IsPreview() ) &&
465 GroupArgs->SpinBox_DY1->isValid( msg, !IsPreview() ) &&
466 //myBase && myVector); // myVector = DZ by default
470 ok = (GroupArgs->SpinBox_DX1->isValid( msg, !IsPreview() ) &&
471 GroupArgs->SpinBox_DY1->isValid( msg, !IsPreview() ) &&
472 GroupArgs->SpinBox_DX2->isValid( msg, !IsPreview() ) &&
473 GroupArgs->SpinBox_DY2->isValid( msg, !IsPreview() ) &&
474 //myBase && myVector); // myVector = DZ by default
483 //=================================================================================
484 // function : execute
486 //=================================================================================
487 bool TransformationGUI_MultiRotationDlg::execute (ObjectList& objects)
491 GEOM::GEOM_Object_var anObj;
492 QStringList aParameters;
494 GEOM::GEOM_ITransformOperations_var anOper = GEOM::GEOM_ITransformOperations::_narrow(getOperation());
496 switch (getConstructorId()) {
498 if (GroupArgs->CheckAngleStep->isChecked())
499 anObj = anOper->MultiRotate1DByStep(myBase.get(), myVector.get(), myAng * M_PI / 180., myNbTimes1);
501 anObj = anOper->MultiRotate1D(myBase.get(), myVector.get(), myNbTimes1);
504 if (GroupArgs->CheckAngleStep->isChecked())
505 aParameters << GroupArgs->SpinBox_DX1->text();
506 aParameters << GroupArgs->SpinBox_DY1->text();
511 if (GroupArgs->CheckAngleStep->isChecked())
512 anObj = anOper->MultiRotate2DByStep(myBase.get(), myVector.get(), myAng * M_PI / 180., myNbTimes1,
515 anObj = anOper->MultiRotate2DNbTimes(myBase.get(), myVector.get(), myNbTimes1, myStep, myNbTimes2);
518 if (GroupArgs->CheckAngleStep->isChecked())
519 aParameters << GroupArgs->SpinBox_DX1->text();
520 aParameters << GroupArgs->SpinBox_DY1->text();
521 aParameters << GroupArgs->SpinBox_DX2->text();
522 aParameters << GroupArgs->SpinBox_DY2->text();
528 if (!anObj->_is_nil()) {
530 anObj->SetParameters(aParameters.join(":").toLatin1().constData());
531 objects.push_back(anObj._retn());
537 //=================================================================================
538 // function : addSubshapeToStudy
539 // purpose : virtual method to add new SubObjects if local selection
540 //=================================================================================
541 void TransformationGUI_MultiRotationDlg::addSubshapesToStudy()
543 switch (getConstructorId()) {
546 GEOMBase::PublishSubObject( myVector.get() );
553 //=================================================================================
554 // function : restoreSubShapes
556 //=================================================================================
557 void TransformationGUI_MultiRotationDlg::restoreSubShapes (SALOMEDS::Study_ptr theStudy,
558 SALOMEDS::SObject_ptr theSObject)
560 if (mainFrame()->CheckBoxRestoreSS->isChecked()) {
561 // we pass here the first operation argument (object) through the list of arguments
562 // because the rotation operation place its arguments in the data structure in another order,
563 // and we need to point the first argument directly
564 GEOM::ListOfGO_var anArgs = new GEOM::ListOfGO;
566 anArgs[0] = myBase.copy();
567 getGeomEngine()->RestoreSubShapesSO(theStudy, theSObject, anArgs,
568 /*theFindMethod=*/GEOM::FSM_MultiTransformed,
569 /*theInheritFirstArg=*/true,
570 mainFrame()->CheckBoxAddPrefix->isChecked());
574 //=================================================================================
575 // function : TransformationGUI_2Sel4Spin1Check
577 //=================================================================================
578 TransformationGUI_2Sel4Spin1Check::TransformationGUI_2Sel4Spin1Check (QWidget *parent)
580 gridLayout = new QGridLayout (parent);
581 gridLayout->setSpacing(6);
582 gridLayout->setContentsMargins(11, 11, 11, 11);
583 gridLayout->setHorizontalSpacing(0);
584 gridLayout->setVerticalSpacing(0);
585 gridLayout->setContentsMargins(0, 0, 0, 0);
587 GroupBox1 = new QGroupBox (parent);
589 gridLayout1 = new QGridLayout (GroupBox1);
590 gridLayout1->setSpacing(6);
591 gridLayout1->setContentsMargins(11, 11, 11, 11);
592 gridLayout1->setHorizontalSpacing(6);
593 gridLayout1->setVerticalSpacing(6);
594 gridLayout1->setContentsMargins(9, 9, 9, 9);
597 TextLabel1 = new QLabel(GroupBox1);
598 TextLabel2 = new QLabel(GroupBox1);
600 PushButton1 = new QPushButton (GroupBox1);
601 PushButton2 = new QPushButton (GroupBox1);
603 LineEdit2 = new QLineEdit(GroupBox1);
604 LineEdit1 = new QLineEdit(GroupBox1);
606 gridLayout1->addWidget(TextLabel1, 0, 0, 1, 1);
607 gridLayout1->addWidget(TextLabel2, 1, 0, 1, 1);
608 gridLayout1->addWidget(PushButton1, 0, 1, 1, 1);
609 gridLayout1->addWidget(PushButton2, 1, 1, 1, 1);
610 gridLayout1->addWidget(LineEdit1, 0, 2, 1, 1);
611 gridLayout1->addWidget(LineEdit2, 1, 2, 1, 1);
613 // 4Spin (double-int-double-int)
614 //TextLabel3 = new QLabel (GroupBox1);
615 CheckAngleStep = new QCheckBox (GroupBox1);
616 TextLabel4 = new QLabel (GroupBox1);
617 TextLabel5 = new QLabel (GroupBox1);
618 TextLabel6 = new QLabel (GroupBox1);
620 SpinBox_DX1 = new SalomeApp_DoubleSpinBox (GroupBox1);
621 SpinBox_DY1 = new SalomeApp_IntSpinBox (GroupBox1);
622 SpinBox_DX2 = new SalomeApp_DoubleSpinBox (GroupBox1);
623 SpinBox_DY2 = new SalomeApp_IntSpinBox (GroupBox1);
625 //gridLayout1->addWidget(TextLabel3, 2, 0, 1, 1);
626 gridLayout1->addWidget(CheckAngleStep, 2, 0, 1, 1);
627 gridLayout1->addWidget(TextLabel4, 3, 0, 1, 1);
628 gridLayout1->addWidget(TextLabel5, 5, 0, 1, 1);
629 gridLayout1->addWidget(TextLabel6, 6, 0, 1, 1);
631 gridLayout1->addWidget(SpinBox_DX1, 2, 1, 1, 2);
632 gridLayout1->addWidget(SpinBox_DY1, 3, 1, 1, 2);
633 gridLayout1->addWidget(SpinBox_DX2, 5, 1, 1, 2);
634 gridLayout1->addWidget(SpinBox_DY2, 6, 1, 1, 2);
637 CheckButton1 = new QCheckBox (GroupBox1);
639 gridLayout1->addWidget(CheckButton1, 4, 0, 1, 3);
641 gridLayout->addWidget(GroupBox1, 0, 0, 1, 1);
644 //=================================================================================
645 // function : ~TransformationGUI_2Sel4Spin1Check()
646 // purpose : Destroys the object and frees any allocated resources
647 //=================================================================================
648 TransformationGUI_2Sel4Spin1Check::~TransformationGUI_2Sel4Spin1Check()
650 // no need to delete child widgets, Qt does it all for us