]> SALOME platform Git repositories - modules/geom.git/blob - src/TransformationGUI/TransformationGUI_OffsetDlg.cxx
Salome HOME
test integration for 0019050: EDF 521 GEOM SMESH : Improve selection process in the...
[modules/geom.git] / src / TransformationGUI / TransformationGUI_OffsetDlg.cxx
1 // GEOM GEOMGUI : GUI for Geometry component
2 //
3 // Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
5 // 
6 // This library is free software; you can redistribute it and/or 
7 // modify it under the terms of the GNU Lesser General Public 
8 // License as published by the Free Software Foundation; either 
9 // version 2.1 of the License. 
10 // 
11 // This library is distributed in the hope that it will be useful, 
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
14 // Lesser General Public License for more details. 
15 // 
16 // You should have received a copy of the GNU Lesser General Public 
17 // License along with this library; if not, write to the Free Software 
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
19 // 
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 // File   : TransformationGUI_OffsetDlg.cxx
23 // Author : Lucien PIGNOLONI, Open CASCADE S.A.S.
24 //
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   int aNbSel = GEOMBase::GetNameOfSelectedIObjects( selectedIO(), aName );
169   if ( aNbSel < 1 ) {
170     myObjects.length( 0 );
171     return;
172   }
173
174   // nbSel > 0
175   GEOMBase::ConvertListOfIOInListOfGO( selectedIO(), myObjects );
176   if ( !myObjects.length() )
177     return;
178   
179   myEditCurrentArgument->setText( aName );
180   
181   displayPreview();
182 }
183
184
185 //=================================================================================
186 // function : LineEditReturnPressed()
187 // purpose  :
188 //=================================================================================
189 void TransformationGUI_OffsetDlg::LineEditReturnPressed()
190 {
191   QLineEdit* send = (QLineEdit*)sender();
192   if ( send == GroupPoints->LineEdit1 ) {
193     myEditCurrentArgument = GroupPoints->LineEdit1;
194     GEOMBase_Skeleton::LineEditReturnPressed();
195   }
196 }
197
198
199 //=================================================================================
200 // function : SetEditCurrentArgument()
201 // purpose  :
202 //=================================================================================
203 void TransformationGUI_OffsetDlg::SetEditCurrentArgument()
204 {
205   QPushButton* send = (QPushButton*)sender();
206   
207   if ( send == GroupPoints->PushButton1 ) {
208     myEditCurrentArgument = GroupPoints->LineEdit1;
209     myEditCurrentArgument->setFocus();
210     SelectionIntoArgument();
211   }
212 }
213
214
215 //=================================================================================
216 // function : enterEvent()
217 // purpose  : when mouse enter onto the QWidget
218 //=================================================================================
219 void TransformationGUI_OffsetDlg::enterEvent( QEvent* )
220 {
221   if ( !mainFrame()->GroupConstructors->isEnabled() )
222     ActivateThisDialog();
223 }
224
225
226 //=================================================================================
227 // function : ActivateThisDialog()
228 // purpose  :
229 //=================================================================================
230 void TransformationGUI_OffsetDlg::ActivateThisDialog()
231 {
232   GEOMBase_Skeleton::ActivateThisDialog();
233   connect( myGeomGUI->getApp()->selectionMgr(), 
234            SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
235   globalSelection( GEOM_ALLSHAPES );
236   myEditCurrentArgument = GroupPoints->LineEdit1;
237   myEditCurrentArgument->setFocus();
238 }
239
240
241 //=================================================================================
242 // function : ValueChangedInSpinBox()
243 // purpose  :
244 //=================================================================================
245 void TransformationGUI_OffsetDlg::ValueChangedInSpinBox()
246 {
247   displayPreview();
248 }
249
250
251 //=================================================================================
252 // function : createOperation
253 // purpose  :
254 //=================================================================================
255 GEOM::GEOM_IOperations_ptr TransformationGUI_OffsetDlg::createOperation()
256 {
257   return getGeomEngine()->GetITransformOperations( getStudyId() );
258 }
259
260 //=================================================================================
261 // function : isValid
262 // purpose  :
263 //=================================================================================
264 bool TransformationGUI_OffsetDlg::isValid( QString& msg )
265 {
266   //return !(myObjects.length() == 0);
267   if ( myObjects.length() == 0 ) return false;
268
269   for ( int i = 0; i < myObjects.length(); i++ ) {
270     GEOM::shape_type aType = myObjects[i]->GetShapeType();
271     if ( aType != GEOM::FACE && aType != GEOM::SHELL && aType != GEOM::SOLID ) {
272       msg = tr( "ERROR_SHAPE_TYPE" );
273       return false;
274     }
275   }
276   return true;
277 }
278
279 //=================================================================================
280 // function : execute
281 // purpose  :
282 //=================================================================================
283 bool TransformationGUI_OffsetDlg::execute( ObjectList& objects )
284 {
285   bool res = false;
286   
287   GEOM::GEOM_Object_var anObj;
288   
289   if ( GroupPoints->CheckButton1->isChecked() || IsPreview() ) {
290     for ( int i = 0; i < myObjects.length(); i++ ) {
291       
292       anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->OffsetShapeCopy( myObjects[i], GetOffset() );
293       if ( !anObj->_is_nil() )
294         objects.push_back( anObj._retn() );
295     }
296   }
297   else {
298     for ( int i = 0; i < myObjects.length(); i++ ) {
299       anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->OffsetShape( myObjects[i], GetOffset() );
300       if ( !anObj->_is_nil() )
301         objects.push_back( anObj._retn() );
302     }
303   }
304   res = true;
305     
306   return res;
307 }
308
309 //=================================================================================
310 // function : restoreSubShapes
311 // purpose  :
312 //=================================================================================
313 void TransformationGUI_OffsetDlg::restoreSubShapes( SALOMEDS::Study_ptr   theStudy,
314                                                     SALOMEDS::SObject_ptr theSObject )
315 {
316   if ( mainFrame()->CheckBoxRestoreSS->isChecked() ) {
317     // empty list of arguments means that all arguments should be restored
318     getGeomEngine()->RestoreSubShapesSO( theStudy, theSObject, GEOM::ListOfGO(),
319                                          /*theFindMethod=*/GEOM::FSM_Transformed,
320                                          /*theInheritFirstArg=*/true );
321   }
322 }
323
324 //=================================================================================
325 // function : GetOffset()
326 // purpose  :
327 //=================================================================================
328 double TransformationGUI_OffsetDlg::GetOffset() const
329 {
330   return GroupPoints->SpinBox_DX->value();
331 }
332
333 //=================================================================================
334 // function :  CreateCopyModeChanged()
335 // purpose  :
336 //=================================================================================
337 void TransformationGUI_OffsetDlg::CreateCopyModeChanged( bool isCreateCopy )
338 {
339   mainFrame()->GroupBoxName->setEnabled( isCreateCopy );
340 }