Salome HOME
Moving to GUI module
[modules/geom.git] / src / TransformationGUI / TransformationGUI_OffsetDlg.cxx
1 //  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 // GEOM GEOMGUI : GUI for Geometry component
23 // File   : TransformationGUI_OffsetDlg.cxx
24 // Author : Lucien PIGNOLONI, Open CASCADE S.A.S.
25 //
26 #include "TransformationGUI_OffsetDlg.h"
27
28 #include <DlgRef.h>
29 #include <GeometryGUI.h>
30 #include <GEOMBase.h>
31
32 #include <SUIT_ResourceMgr.h>
33 #include <SUIT_Session.h>
34 #include <SalomeApp_Application.h>
35 #include <LightApp_SelectionMgr.h>
36
37 //=================================================================================
38 // class    : TransformationGUI_OffsetDlg()
39 // purpose  : Constructs a TransformationGUI_OffsetDlg which is a child of 'parent', with the 
40 //            name 'name' and widget flags set to 'f'.
41 //            The dialog will by default be modeless, unless you set 'modal' to
42 //            TRUE to construct a modal dialog.
43 //=================================================================================
44 TransformationGUI_OffsetDlg::TransformationGUI_OffsetDlg( GeometryGUI* theGeometryGUI, QWidget* parent,
45                                                           bool modal, Qt::WindowFlags fl )
46   : GEOMBase_Skeleton( theGeometryGUI, parent, modal, fl )
47 {
48   QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_OFFSET" ) ) );
49   QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) );
50
51   setWindowTitle( tr( "GEOM_OFFSET_TITLE" ) );
52
53   /***************************************************************/
54   mainFrame()->GroupConstructors->setTitle( tr( "GEOM_OFFSET" ) );
55   mainFrame()->RadioButton1->setIcon( image0 );
56   mainFrame()->RadioButton2->setAttribute( Qt::WA_DeleteOnClose );
57   mainFrame()->RadioButton2->close();
58   mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose );
59   mainFrame()->RadioButton3->close();
60  
61   GroupPoints = new DlgRef_1Sel1Spin1Check( centralWidget() );
62   GroupPoints->GroupBox1->setTitle( tr( "GEOM_ARGUMENTS" ) );
63   GroupPoints->TextLabel1->setText( tr( "GEOM_OBJECTS" ) );
64   GroupPoints->TextLabel2->setText( tr( "GEOM_OFFSET" ) );
65   GroupPoints->CheckButton1->setText( tr( "GEOM_CREATE_COPY" ) );
66
67   // san -- modification of an exisitng object by offset is not allowed
68   GroupPoints->CheckButton1->hide();
69
70   GroupPoints->PushButton1->setIcon( image1 );
71   
72   QVBoxLayout* layout = new QVBoxLayout( centralWidget() );
73   layout->setMargin( 0 ); layout->setSpacing( 6 );
74   layout->addWidget( GroupPoints );
75   
76   /***************************************************************/
77
78   setHelpFileName( "offset_operation_page.html" );
79   
80   Init();
81 }
82
83
84 //=================================================================================
85 // function : ~TransformationGUI_OffsetDlg()
86 // purpose  : Destroys the object and frees any allocated resources
87 //=================================================================================
88 TransformationGUI_OffsetDlg::~TransformationGUI_OffsetDlg()
89 {  
90   /* no need to delete child widgets, Qt does it all for us */
91 }
92
93
94 //=================================================================================
95 // function : Init()
96 // purpose  :
97 //=================================================================================
98 void TransformationGUI_OffsetDlg::Init()
99 {  
100   /* init variables */
101   myEditCurrentArgument = GroupPoints->LineEdit1;
102   GroupPoints->LineEdit1->setReadOnly( true );
103   
104   /* Get setting of step value from file configuration */
105   double step = 1;
106    
107   /* min, max, step and decimals for spin boxes & initial values */
108   initSpinBox( GroupPoints->SpinBox_DX, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
109   GroupPoints->SpinBox_DX->setValue( 1e-05 );
110   
111   // Activate Create a Copy mode
112   GroupPoints->CheckButton1->setChecked( true );
113   CreateCopyModeChanged( true );
114
115   mainFrame()->GroupBoxPublish->show();
116
117   /* signals and slots connections */
118   connect( buttonOk(),    SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) );
119   connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
120   
121   connect( GroupPoints->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
122   connect( myGeomGUI->getApp()->selectionMgr(), 
123            SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
124
125   connect( GroupPoints->SpinBox_DX,   SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox() ) );
126   connect( GroupPoints->CheckButton1, SIGNAL( toggled( bool ) ),        this, SLOT( CreateCopyModeChanged( bool ) ) );
127   
128   initName( tr( "GEOM_OFFSET" ) );
129
130   globalSelection( GEOM_ALLSHAPES );
131 }
132
133
134 //=================================================================================
135 // function : ClickOnOk()
136 // purpose  :
137 //=================================================================================
138 void TransformationGUI_OffsetDlg::ClickOnOk()
139 {
140   if ( ClickOnApply() )
141     ClickOnCancel();
142 }
143
144
145 //=================================================================================
146 // function : ClickOnApply()
147 // purpose  :
148 //=================================================================================
149 bool TransformationGUI_OffsetDlg::ClickOnApply()
150 {
151   if ( !onAccept( GroupPoints->CheckButton1->isChecked() ) )
152     return false;
153   
154   initName();
155   return true;
156 }
157
158
159 //=================================================================================
160 // function : SelectionIntoArgument()
161 // purpose  : Called when selection has changed
162 //=================================================================================
163 void TransformationGUI_OffsetDlg::SelectionIntoArgument()
164 {
165   myEditCurrentArgument->setText( "" );
166   QString aName;
167
168   LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
169   SALOME_ListIO aSelList;
170   aSelMgr->selectedObjects(aSelList);
171
172   int aNbSel = GEOMBase::GetNameOfSelectedIObjects(aSelList, aName);
173   if ( aNbSel < 1 ) {
174     myObjects.length( 0 );
175     return;
176   }
177
178   // nbSel > 0
179   GEOMBase::ConvertListOfIOInListOfGO (aSelList, myObjects);
180   if (!myObjects.length())
181     return;
182
183   myEditCurrentArgument->setText(aName);
184
185   displayPreview();
186 }
187
188
189 //=================================================================================
190 // function : LineEditReturnPressed()
191 // purpose  :
192 //=================================================================================
193 void TransformationGUI_OffsetDlg::LineEditReturnPressed()
194 {
195   QLineEdit* send = (QLineEdit*)sender();
196   if ( send == GroupPoints->LineEdit1 ) {
197     myEditCurrentArgument = GroupPoints->LineEdit1;
198     GEOMBase_Skeleton::LineEditReturnPressed();
199   }
200 }
201
202
203 //=================================================================================
204 // function : SetEditCurrentArgument()
205 // purpose  :
206 //=================================================================================
207 void TransformationGUI_OffsetDlg::SetEditCurrentArgument()
208 {
209   QPushButton* send = (QPushButton*)sender();
210   
211   if ( send == GroupPoints->PushButton1 ) {
212     GroupPoints->PushButton1->setDown(true);
213     myEditCurrentArgument = GroupPoints->LineEdit1;
214     myEditCurrentArgument->setFocus();
215     SelectionIntoArgument();
216   }
217 }
218
219
220 //=================================================================================
221 // function : enterEvent()
222 // purpose  : when mouse enter onto the QWidget
223 //=================================================================================
224 void TransformationGUI_OffsetDlg::enterEvent( QEvent* )
225 {
226   if ( !mainFrame()->GroupConstructors->isEnabled() )
227     ActivateThisDialog();
228 }
229
230
231 //=================================================================================
232 // function : ActivateThisDialog()
233 // purpose  :
234 //=================================================================================
235 void TransformationGUI_OffsetDlg::ActivateThisDialog()
236 {
237   GEOMBase_Skeleton::ActivateThisDialog();
238   connect( myGeomGUI->getApp()->selectionMgr(), 
239            SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
240   globalSelection( GEOM_ALLSHAPES );
241   myEditCurrentArgument = GroupPoints->LineEdit1;
242   myEditCurrentArgument->setFocus();
243 }
244
245
246 //=================================================================================
247 // function : ValueChangedInSpinBox()
248 // purpose  :
249 //=================================================================================
250 void TransformationGUI_OffsetDlg::ValueChangedInSpinBox()
251 {
252   displayPreview();
253 }
254
255
256 //=================================================================================
257 // function : createOperation
258 // purpose  :
259 //=================================================================================
260 GEOM::GEOM_IOperations_ptr TransformationGUI_OffsetDlg::createOperation()
261 {
262   return getGeomEngine()->GetITransformOperations( getStudyId() );
263 }
264
265 //=================================================================================
266 // function : isValid
267 // purpose  :
268 //=================================================================================
269 bool TransformationGUI_OffsetDlg::isValid( QString& msg )
270 {
271   //return !(myObjects.length() == 0);
272   if ( myObjects.length() == 0 ) return false;
273
274   for ( int i = 0; i < myObjects.length(); i++ ) {
275     GEOM::shape_type aType = myObjects[i]->GetShapeType();
276     if ( aType != GEOM::FACE && aType != GEOM::SHELL && aType != GEOM::SOLID ) {
277       msg = tr( "ERROR_SHAPE_TYPE" );
278       return false;
279     }
280   }
281   return GroupPoints->SpinBox_DX->isValid( msg, !IsPreview() );
282 }
283
284 //=================================================================================
285 // function : execute
286 // purpose  :
287 //=================================================================================
288 bool TransformationGUI_OffsetDlg::execute( ObjectList& objects )
289 {
290   bool res = false;
291   
292   GEOM::GEOM_Object_var anObj;
293   
294   if ( GroupPoints->CheckButton1->isChecked() || IsPreview() ) {
295     for ( int i = 0; i < myObjects.length(); i++ ) {
296       
297       anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->OffsetShapeCopy( myObjects[i], GetOffset() );
298       if ( !anObj->_is_nil() ) {
299         if(!IsPreview()) {
300           anObj->SetParameters(GroupPoints->SpinBox_DX->text().toLatin1().constData());
301         }
302         objects.push_back( anObj._retn() );
303       }
304     }
305   }
306   else {
307     for ( int i = 0; i < myObjects.length(); i++ ) {
308       anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->OffsetShape( myObjects[i], GetOffset() );
309       if ( !anObj->_is_nil() )
310         objects.push_back( anObj._retn() );
311     }
312   }
313   res = true;
314     
315   return res;
316 }
317
318 //=================================================================================
319 // function : restoreSubShapes
320 // purpose  :
321 //=================================================================================
322 void TransformationGUI_OffsetDlg::restoreSubShapes( SALOMEDS::Study_ptr   theStudy,
323                                                     SALOMEDS::SObject_ptr theSObject )
324 {
325   if ( mainFrame()->CheckBoxRestoreSS->isChecked() ) {
326     // empty list of arguments means that all arguments should be restored
327     getGeomEngine()->RestoreSubShapesSO( theStudy, theSObject, GEOM::ListOfGO(),
328                                          /*theFindMethod=*/GEOM::FSM_Transformed,
329                                          /*theInheritFirstArg=*/true );
330   }
331 }
332
333 //=================================================================================
334 // function : GetOffset()
335 // purpose  :
336 //=================================================================================
337 double TransformationGUI_OffsetDlg::GetOffset() const
338 {
339   return GroupPoints->SpinBox_DX->value();
340 }
341
342 //=================================================================================
343 // function :  CreateCopyModeChanged()
344 // purpose  :
345 //=================================================================================
346 void TransformationGUI_OffsetDlg::CreateCopyModeChanged( bool isCreateCopy )
347 {
348   mainFrame()->GroupBoxName->setEnabled( isCreateCopy );
349 }