]> SALOME platform Git repositories - modules/geom.git/blob - src/PrimitiveGUI/PrimitiveGUI_BoxDlg.cxx
Salome HOME
Remove some methods of GEOMBase_Helper (IObjectCount(), firstIObject(), lastIObject...
[modules/geom.git] / src / PrimitiveGUI / PrimitiveGUI_BoxDlg.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   : PrimitiveGUI_BoxDlg.cxx
23 // Author : Lucien PIGNOLONI, Open CASCADE S.A.S.
24 //
25
26 #include "PrimitiveGUI_BoxDlg.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 #include <TopoDS_Shape.hxx>
38 #include <TopoDS.hxx>
39 #include <TopExp.hxx>
40 #include <TColStd_IndexedMapOfInteger.hxx>
41 #include <TopTools_IndexedMapOfShape.hxx>
42
43 #include <GEOMImpl_Types.hxx>
44 #include <ostream>
45
46 //=================================================================================
47 // class    : PrimitiveGUI_BoxDlg()
48 // purpose  : Constructs a PrimitiveGUI_BoxDlg 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 PrimitiveGUI_BoxDlg::PrimitiveGUI_BoxDlg( GeometryGUI* theGeometryGUI, QWidget* parent,
54                                           bool modal, Qt::WindowFlags fl )
55   : GEOMBase_Skeleton( theGeometryGUI, parent, modal, fl )
56 {
57   QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_BOX_2P" ) ) );
58   QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_BOX_DXYZ" ) ));
59   QPixmap image2( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) );
60
61   setWindowTitle( tr( "GEOM_BOX_TITLE" ) );
62
63   /***************************************************************/
64   mainFrame()->GroupConstructors->setTitle( tr( "GEOM_BOX" ) );
65   mainFrame()->RadioButton1->setIcon( image0 );
66   mainFrame()->RadioButton2->setIcon( image1 );
67   mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose );
68   mainFrame()->RadioButton3->close();
69
70   GroupPoints = new DlgRef_2Sel( centralWidget() );
71   GroupPoints->GroupBox1->setTitle( tr( "GEOM_DIAGONAL_POINTS" ) );
72   GroupPoints->TextLabel1->setText( tr( "GEOM_POINT_I" ).arg( 1 ) );
73   GroupPoints->TextLabel2->setText( tr( "GEOM_POINT_I" ).arg( 2 ) );
74   GroupPoints->PushButton1->setIcon( image2 );
75   GroupPoints->PushButton2->setIcon( image2 );
76
77   GroupDimensions = new DlgRef_3Spin( centralWidget() );
78   GroupDimensions->GroupBox1->setTitle( tr( "GEOM_BOX_OBJ" ) );
79   GroupDimensions->TextLabel1->setText( tr( "GEOM_DX" ) );
80   GroupDimensions->TextLabel2->setText( tr( "GEOM_DY" ) );
81   GroupDimensions->TextLabel3->setText( tr( "GEOM_DZ" ) );
82
83   QVBoxLayout* layout = new QVBoxLayout( centralWidget() );
84   layout->setMargin( 0 ); layout->setSpacing( 6 );
85   layout->addWidget( GroupPoints );
86   layout->addWidget( GroupDimensions );
87   /***************************************************************/
88
89   setHelpFileName( "create_box_page.html" );
90   
91   Init();
92 }
93
94
95 //=================================================================================
96 // function : ~DialogBox_Box()
97 // purpose  : Destroys the object and frees any allocated resources
98 //=================================================================================
99 PrimitiveGUI_BoxDlg::~PrimitiveGUI_BoxDlg()
100 {
101   // no need to delete child widgets, Qt does it all for us
102 }
103
104
105 //=================================================================================
106 // function : Init()
107 // purpose  :
108 //=================================================================================
109 void PrimitiveGUI_BoxDlg::Init()
110 {
111   /* init variables */
112   myEditCurrentArgument = GroupPoints->LineEdit1;
113   GroupPoints->LineEdit1->setReadOnly( true );
114   GroupPoints->LineEdit2->setReadOnly( true );
115   
116   myPoint1 = myPoint2 = GEOM::GEOM_Object::_nil();
117     
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 );
121   
122   /* min, max, step and decimals for spin boxes */
123   initSpinBox( GroupDimensions->SpinBox_DX, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
124   initSpinBox( GroupDimensions->SpinBox_DY, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
125   initSpinBox( GroupDimensions->SpinBox_DZ, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
126
127   double initValue = 200.0;
128   GroupDimensions->SpinBox_DX->setValue( initValue );
129   GroupDimensions->SpinBox_DY->setValue( initValue );
130   GroupDimensions->SpinBox_DZ->setValue( initValue );
131
132   /* signals and slots connections */
133   connect( buttonOk(),    SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) );
134   connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
135
136   connect( this,          SIGNAL( constructorsClicked( int ) ), this, SLOT( ConstructorsClicked( int ) ) );
137
138   connect( GroupPoints->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
139   connect( GroupPoints->PushButton2, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
140
141   connect( GroupPoints->LineEdit1, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
142   connect( GroupPoints->LineEdit2, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
143
144   connect( GroupDimensions->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox() ) );
145   connect( GroupDimensions->SpinBox_DY, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox() ) );
146   connect( GroupDimensions->SpinBox_DZ, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox() ) );
147   
148   connect( myGeomGUI, SIGNAL( SignalDefaultStepValueChanged( double ) ), this, SLOT( SetDoubleSpinBoxStep( double ) ) );
149
150   connect( myGeomGUI->getApp()->selectionMgr(), 
151            SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
152
153   initName( tr( "GEOM_BOX" ) );
154
155   setConstructorId( 1 ); // simplest constructor
156   ConstructorsClicked( 1 );
157 }
158
159 //=================================================================================
160 // function : SetDoubleSpinBoxStep()
161 // purpose  : Double spin box management
162 //=================================================================================
163 void PrimitiveGUI_BoxDlg::SetDoubleSpinBoxStep( double step )
164 {
165   GroupDimensions->SpinBox_DX->setSingleStep(step);
166   GroupDimensions->SpinBox_DY->setSingleStep(step);
167   GroupDimensions->SpinBox_DZ->setSingleStep(step);
168 }
169
170
171 //=================================================================================
172 // function : ConstructorsClicked()
173 // purpose  : Radio button management
174 //=================================================================================
175 void PrimitiveGUI_BoxDlg::ConstructorsClicked( int constructorId )
176 {
177   disconnect( myGeomGUI->getApp()->selectionMgr(), 0, this, 0 );
178   
179   switch (  constructorId ) {
180   case 0:
181     {
182       //globalSelection( GEOM_POINT );
183       globalSelection(); // close local contexts, if any
184       localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX );
185       
186       GroupDimensions->hide();
187       GroupPoints->show();
188       
189       myEditCurrentArgument = GroupPoints->LineEdit1;
190       GroupPoints->LineEdit1->setText( "" );
191       GroupPoints->LineEdit2->setText( "" );
192       myPoint1 = myPoint2 = GEOM::GEOM_Object::_nil();
193       
194       connect( myGeomGUI->getApp()->selectionMgr(),
195                SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
196       break;
197     }
198   case 1:
199     {
200       GroupPoints->hide();
201       GroupDimensions->show();
202       globalSelection(); // close local contexts, if any
203       break;
204     }
205   }
206  
207   qApp->processEvents();
208   updateGeometry();
209   resize( minimumSize() );
210
211   displayPreview();
212 }
213
214
215 //=================================================================================
216 // function : ClickOnOk()
217 // purpose  :
218 //=================================================================================
219 void PrimitiveGUI_BoxDlg::ClickOnOk()
220 {
221   if ( ClickOnApply() )
222     ClickOnCancel();
223 }
224
225
226 //=================================================================================
227 // function : ClickOnApply()
228 // purpose  :
229 //=================================================================================
230 bool PrimitiveGUI_BoxDlg::ClickOnApply()
231 {
232   if ( !onAccept() )
233     return false;
234   
235   initName();
236   ConstructorsClicked( getConstructorId() );
237   return true;
238 }
239
240
241 //=================================================================================
242 // function : SelectionIntoArgument()
243 // purpose  : Called when selection as changed
244 //=================================================================================
245 void PrimitiveGUI_BoxDlg::SelectionIntoArgument()
246 {
247   if ( getConstructorId() != 0 )
248     return;
249   
250   myEditCurrentArgument->setText( "" );
251   
252   LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
253   SALOME_ListIO aSelList;
254   aSelMgr->selectedObjects(aSelList);
255
256   if ( aSelList.Extent() != 1 ) {
257     if ( myEditCurrentArgument == GroupPoints->LineEdit1 )
258       myPoint1 = GEOM::GEOM_Object::_nil();
259     else if ( myEditCurrentArgument == GroupPoints->LineEdit2 )
260       myPoint2 = GEOM::GEOM_Object::_nil();
261     return;
262   }
263
264   // nbSel == 1
265   Standard_Boolean testResult = Standard_False;
266   GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( aSelList.First(), testResult );
267   
268   if ( !testResult || CORBA::is_nil( aSelectedObject ) )
269     return;
270   
271   TopoDS_Shape aShape;
272   QString aName = GEOMBase::GetName( aSelectedObject );
273   if (GEOMBase::GetShape( aSelectedObject, aShape, TopAbs_SHAPE ) && !aShape.IsNull() ) {
274     TColStd_IndexedMapOfInteger aMap;
275     aSelMgr->GetIndexes( aSelList.First(), aMap );
276     if ( aMap.Extent() == 1) { // Local Selection
277       int anIndex = aMap( 1 );
278       aName.append( ":vertex_" + QString::number( anIndex ) );    
279
280       //Find SubShape Object in Father
281       GEOM::GEOM_Object_var aFindedObject = GEOMBase_Helper::findObjectInFather( aSelectedObject, aName );
282       
283       if ( aFindedObject == GEOM::GEOM_Object::_nil() ) { // Object not found in study
284         GEOM::GEOM_IShapesOperations_var aShapesOp =
285           getGeomEngine()->GetIShapesOperations( getStudyId() );
286         aSelectedObject = aShapesOp->GetSubShape( aSelectedObject, anIndex );
287       }
288       else {
289         aSelectedObject = aFindedObject; // get Object from study       
290       }
291     }
292     else { // Global Selection
293       if ( aShape.ShapeType() != TopAbs_VERTEX ) {
294         aSelectedObject = GEOM::GEOM_Object::_nil();
295         aName = "";
296       }
297     }
298   }
299
300   myEditCurrentArgument->setText( aName );
301
302   if ( myEditCurrentArgument == GroupPoints->LineEdit1 )
303     myPoint1 = aSelectedObject;
304   else if ( myEditCurrentArgument == GroupPoints->LineEdit2 )
305     myPoint2 = aSelectedObject;
306   
307   displayPreview();
308 }
309
310
311 //=================================================================================
312 // function : SetEditCurrentArgument()
313 // purpose  :
314 //=================================================================================
315 void PrimitiveGUI_BoxDlg::SetEditCurrentArgument()
316 {
317   QPushButton* send = (QPushButton*)sender();
318   
319   if ( send == GroupPoints->PushButton1 )
320     myEditCurrentArgument = GroupPoints->LineEdit1;
321   else if ( send == GroupPoints->PushButton2 )
322     myEditCurrentArgument = GroupPoints->LineEdit2;
323   
324   //  globalSelection( GEOM_POINT );
325   globalSelection(); // close local contexts, if any
326   localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX );
327   
328   myEditCurrentArgument->setFocus();
329   SelectionIntoArgument();
330 }
331
332
333 //=================================================================================
334 // function : LineEditReturnPressed()
335 // purpose  :
336 //=================================================================================
337 void PrimitiveGUI_BoxDlg::LineEditReturnPressed()
338 {
339   QLineEdit* send = (QLineEdit*)sender();
340   if ( send == GroupPoints->LineEdit1 || send == GroupPoints->LineEdit2 ) {
341     myEditCurrentArgument = send;
342     GEOMBase_Skeleton::LineEditReturnPressed();
343   }
344 }
345
346
347 //=================================================================================
348 // function : ActivateThisDialog()
349 // purpose  :
350 //=================================================================================
351 void PrimitiveGUI_BoxDlg::ActivateThisDialog()
352 {
353   GEOMBase_Skeleton::ActivateThisDialog();
354   connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
355            this, SLOT( SelectionIntoArgument() ) );
356   
357   ConstructorsClicked( getConstructorId() );
358 }
359
360
361 //=================================================================================
362 // function : enterEvent [REDEFINED]
363 // purpose  :
364 //=================================================================================
365 void PrimitiveGUI_BoxDlg::enterEvent( QEvent* )
366 {
367   if ( !mainFrame()->GroupConstructors->isEnabled() )
368     ActivateThisDialog();
369 }
370
371
372 //=================================================================================
373 // function : ValueChangedInSpinBox()
374 // purpose  :
375 //=================================================================================
376 void PrimitiveGUI_BoxDlg::ValueChangedInSpinBox()
377 {
378   displayPreview();
379 }
380
381
382 //=================================================================================
383 // function : createOperation
384 // purpose  :
385 //=================================================================================
386 GEOM::GEOM_IOperations_ptr PrimitiveGUI_BoxDlg::createOperation()
387 {
388   return getGeomEngine()->GetI3DPrimOperations( getStudyId() );
389 }
390
391
392 //=================================================================================
393 // function : isValid
394 // purpose  :
395 //=================================================================================
396 bool PrimitiveGUI_BoxDlg::isValid( QString& msg )
397 {
398   return getConstructorId() == 0 ? !( myPoint1->_is_nil() || myPoint2->_is_nil() ) : true;
399 }
400
401
402 //=================================================================================
403 // function : execute
404 // purpose  :
405 //=================================================================================
406 bool PrimitiveGUI_BoxDlg::execute( ObjectList& objects )
407 {
408   bool res = false;
409   
410   GEOM::GEOM_Object_var anObj;
411   
412   switch ( getConstructorId() ) {
413   case 0 :
414     { 
415       if ( !CORBA::is_nil( myPoint1 ) &&  !CORBA::is_nil( myPoint2 ) ) {
416         anObj = GEOM::GEOM_I3DPrimOperations::_narrow( getOperation() )->MakeBoxTwoPnt( myPoint1, myPoint2 );
417         res = true;
418       }
419       
420       break;
421     }
422   case 1 :
423     {
424       double x = GroupDimensions->SpinBox_DX->value();
425       double y = GroupDimensions->SpinBox_DY->value();
426       double z = GroupDimensions->SpinBox_DZ->value();
427       
428       anObj = GEOM::GEOM_I3DPrimOperations::_narrow( getOperation() )->MakeBoxDXDYDZ( x, y, z );
429       res = true;
430       break;
431     }
432   }
433   
434   if ( !anObj->_is_nil() )
435   objects.push_back( anObj._retn() );
436   
437   return res;
438 }
439
440 //=================================================================================
441 // function : addSubshapeToStudy
442 // purpose  : virtual method to add new SubObjects if local selection
443 //=================================================================================
444 void PrimitiveGUI_BoxDlg::addSubshapesToStudy()
445 {
446   QMap<QString, GEOM::GEOM_Object_var> objMap;
447   if ( getConstructorId() == 0 ) {
448     objMap[GroupPoints->LineEdit1->text()] = myPoint1;
449     objMap[GroupPoints->LineEdit2->text()] = myPoint2;
450     addSubshapesToFather( objMap );
451   }
452 }