Salome HOME
Revert "Synchronize adm files"
[modules/geom.git] / src / MeasureGUI / MeasureGUI_BndBoxDlg.cxx
1 // Copyright (C) 2007-2014  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, or (at your option) any later version.
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
23 // GEOM GEOMGUI : GUI for Geometry component
24 // File   : MeasureGUI_BndBoxDlg.cxx
25 // Author : Nicolas REJNERI, Open CASCADE S.A.S.
26
27 #include "MeasureGUI_BndBoxDlg.h"
28 #include "MeasureGUI_Widgets.h"
29
30 #include "GeometryGUI.h"
31
32 #include <GEOMBase.h>
33 #include <DlgRef.h>
34
35 #include <BRepPrimAPI_MakeBox.hxx>
36
37 #include <SUIT_Session.h>
38 #include <SUIT_ResourceMgr.h>
39 #include <SUIT_OverrideCursor.h>
40 #include <SalomeApp_Application.h>
41 #include <SalomeApp_Tools.h>
42 #include <LightApp_SelectionMgr.h>
43
44 //=================================================================================
45 // class    : MeasureGUI_BndBoxDlg()
46 // purpose  : Constructs a MeasureGUI_BndBoxDlg which is a child of 'parent', with the
47 //            name 'name' and widget flags set to 'f'.
48 //            The dialog will by default be modeless, unless you set 'modal' to
49 //            true to construct a modal dialog.
50 //=================================================================================
51 MeasureGUI_BndBoxDlg::MeasureGUI_BndBoxDlg (GeometryGUI* GUI, QWidget* parent)
52   : GEOMBase_Skeleton(GUI, parent)
53 {
54   QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_BOUNDING_BOX")));
55   QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT")));
56
57   setWindowTitle(tr("GEOM_BNDBOX_TITLE"));
58
59   /***************************************************************/
60
61   mainFrame()->GroupConstructors->setTitle(tr("GEOM_BNDBOX"));
62   mainFrame()->RadioButton1->setIcon(image0);
63   mainFrame()->RadioButton2->setAttribute( Qt::WA_DeleteOnClose );
64   mainFrame()->RadioButton2->close();
65   mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose );
66   mainFrame()->RadioButton3->close();
67
68   myGrp = new MeasureGUI_1Sel6LineEdit (centralWidget());
69   myGrp->GroupBox1->setTitle( tr( "GEOM_BNDBOX_OBJDIM" ) );
70   myGrp->TextLabel1->setText( tr( "GEOM_OBJECT" ) );
71   myGrp->TextLabel2->setText( tr( "GEOM_MIN" ) );
72   myGrp->TextLabel3->setText( tr( "GEOM_MAX" ) );
73   myGrp->TextLabel4->setText( tr( "GEOM_X" ) );
74   myGrp->TextLabel5->setText( tr( "GEOM_Y" ) );
75   myGrp->TextLabel6->setText( tr( "GEOM_Z" ) );
76   myGrp->LineEdit11->setReadOnly( true );
77   myGrp->LineEdit12->setReadOnly( true );
78   myGrp->LineEdit21->setReadOnly( true );
79   myGrp->LineEdit22->setReadOnly( true );
80   myGrp->LineEdit31->setReadOnly( true );
81   myGrp->LineEdit32->setReadOnly( true );
82   myGrp->LineEdit11->setMinimumWidth(120);
83   myGrp->LineEdit12->setMinimumWidth(120);
84   myGrp->LineEdit21->setMinimumWidth(120);
85   myGrp->LineEdit22->setMinimumWidth(120);
86   myGrp->LineEdit31->setMinimumWidth(120);
87   myGrp->LineEdit32->setMinimumWidth(120);
88   myGrp->PushButton1->setIcon( image1 );
89   myGrp->LineEdit1->setReadOnly( true );
90
91   QVBoxLayout* layout = new QVBoxLayout( centralWidget() );
92   layout->setMargin( 0 ); layout->setSpacing( 6 );
93   layout->addWidget( myGrp );
94
95   /***************************************************************/
96
97   myHelpFileName = "bounding_box_page.html";
98
99   /* Initialisation */
100   Init();
101 }
102
103 //=================================================================================
104 // function : ~MeasureGUI_BndBoxDlg()
105 // purpose  : Destroys the object and frees any allocated resources
106 //=================================================================================
107 MeasureGUI_BndBoxDlg::~MeasureGUI_BndBoxDlg()
108 {
109 }
110
111 //=================================================================================
112 // function : Init()
113 // purpose  :
114 //=================================================================================
115 void MeasureGUI_BndBoxDlg::Init()
116 {
117   myEditCurrentArgument = myGrp->LineEdit1;
118
119   connect(buttonOk(),         SIGNAL(clicked()), this, SLOT(ClickOnOk()));
120   connect(buttonApply(),      SIGNAL(clicked()), this, SLOT(ClickOnApply()));
121   connect(myGrp->PushButton1, SIGNAL(clicked()), this, SLOT(SelectionIntoArgument()));
122
123   connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
124           this, SLOT(SelectionIntoArgument()));
125
126   initName(tr("GEOM_BNDBOX"));
127   globalSelection();
128   SelectionIntoArgument();
129 }
130
131 //=================================================================================
132 // function : ClickOnOk()
133 // purpose  :
134 //=================================================================================
135 void MeasureGUI_BndBoxDlg::ClickOnOk()
136 {
137   if (ClickOnApply())
138     ClickOnCancel();
139 }
140
141 //=================================================================================
142 // function : ClickOnApply()
143 // purpose  :
144 //=================================================================================
145 bool MeasureGUI_BndBoxDlg::ClickOnApply()
146 {
147   if (!onAccept())
148     return false;
149
150   initName();
151   return true;
152 }
153
154 //=================================================================================
155 // function : ActivateThisDialog()
156 // purpose  :
157 //=================================================================================
158 void MeasureGUI_BndBoxDlg::ActivateThisDialog()
159 {
160   GEOMBase_Skeleton::ActivateThisDialog();
161
162   connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
163           this, SLOT(SelectionIntoArgument()));
164
165   globalSelection();
166   redisplayPreview();
167 }
168
169 //=================================================================================
170 // function : enterEvent()
171 // purpose  :
172 //=================================================================================
173 void MeasureGUI_BndBoxDlg::enterEvent(QEvent*)
174 {
175   if (!mainFrame()->GroupConstructors->isEnabled())
176     ActivateThisDialog();
177 }
178
179 //=================================================================================
180 // function : processObject
181 // purpose  :
182 //=================================================================================
183 void MeasureGUI_BndBoxDlg::processObject()
184 {
185   double aXMin, aXMax, aYMin, aYMax, aZMin, aZMax;
186
187   if (!getParameters(aXMin, aXMax, aYMin, aYMax, aZMin, aZMax)) {
188     myEditCurrentArgument->setText("");
189     myGrp->LineEdit11->setText("");
190     myGrp->LineEdit12->setText("");
191     myGrp->LineEdit21->setText("");
192     myGrp->LineEdit22->setText("");
193     myGrp->LineEdit31->setText("");
194     myGrp->LineEdit32->setText("");
195   }
196   else {
197     SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
198     int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 );
199
200     myGrp->LineEdit11->setText( DlgRef::PrintDoubleValue( aXMin, aPrecision ) );
201     myGrp->LineEdit12->setText( DlgRef::PrintDoubleValue( aXMax, aPrecision ) );
202
203     myGrp->LineEdit21->setText( DlgRef::PrintDoubleValue( aYMin, aPrecision ) );
204     myGrp->LineEdit22->setText( DlgRef::PrintDoubleValue( aYMax, aPrecision ) );
205
206     myGrp->LineEdit31->setText( DlgRef::PrintDoubleValue( aZMin, aPrecision ) );
207     myGrp->LineEdit32->setText( DlgRef::PrintDoubleValue( aZMax, aPrecision ) );
208   }
209 }
210
211 //=================================================================================
212 // function : getParameters
213 // purpose  :
214 //=================================================================================
215 bool MeasureGUI_BndBoxDlg::getParameters (double& theXmin, double& theXmax,
216                                           double& theYmin, double& theYmax,
217                                           double& theZmin, double& theZmax)
218 {
219   if (myObj->_is_nil())
220     return false;
221
222   GEOM::GEOM_IMeasureOperations_var anOper = GEOM::GEOM_IMeasureOperations::_narrow(getOperation());
223   anOper->GetBoundingBox(myObj, true, theXmin, theXmax, theYmin, theYmax, theZmin, theZmax);
224
225   return anOper->IsDone();
226 }
227
228 //=================================================================================
229 // function : buildPrs
230 // purpose  :
231 //=================================================================================
232 SALOME_Prs* MeasureGUI_BndBoxDlg::buildPrs()
233 {
234   double aXMin, aYMin, aZMin, aXMax, aYMax, aZMax;
235
236   if (!getParameters(aXMin, aXMax, aYMin, aYMax, aZMin, aZMax))
237     return 0;
238
239   TopoDS_Shape aShape = BRepPrimAPI_MakeBox(gp_Pnt(aXMin, aYMin, aZMin),
240                                             gp_Pnt(aXMax, aYMax, aZMax)).Shape();
241
242   return !aShape.IsNull() ? getDisplayer()->BuildPrs(aShape) : 0;
243 }
244
245 //=================================================================================
246 // function : SelectionIntoArgument()
247 // purpose  : Called when selection as changed or other case
248 //=================================================================================
249 void MeasureGUI_BndBoxDlg::SelectionIntoArgument()
250 {
251   myEditCurrentArgument->setText("");
252   myObj = GEOM::GEOM_Object::_nil();
253
254   LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
255   SALOME_ListIO aSelList;
256   aSelMgr->selectedObjects(aSelList);
257
258   if (aSelList.Extent() != 1) {
259     processObject();
260     erasePreview();
261     return;
262   }
263
264   GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First());
265
266   if (aSelectedObject->_is_nil()) {
267     processObject();
268     erasePreview();
269     return;
270   }
271
272   myObj = aSelectedObject;
273   myEditCurrentArgument->setText(GEOMBase::GetName(myObj));
274   processObject();
275   redisplayPreview();
276 }
277
278 //=================================================================================
279 // function : createOperation
280 // purpose  :
281 //=================================================================================
282 GEOM::GEOM_IOperations_ptr MeasureGUI_BndBoxDlg::createOperation()
283 {
284   return getGeomEngine()->GetIMeasureOperations(getStudyId());
285 }
286
287 //=================================================================================
288 // function : isValid
289 // purpose  :
290 //=================================================================================
291 bool MeasureGUI_BndBoxDlg::isValid (QString&)
292 {
293   return !myObj->_is_nil();
294 }
295
296 //=================================================================================
297 // function : execute
298 // purpose  :
299 //=================================================================================
300 bool MeasureGUI_BndBoxDlg::execute (ObjectList& objects)
301 {
302   GEOM::GEOM_IMeasureOperations_var anOper = GEOM::GEOM_IMeasureOperations::_narrow(getOperation());
303   GEOM::GEOM_Object_var anObj = anOper->MakeBoundingBox(myObj, true);
304
305   if (!anObj->_is_nil())
306     objects.push_back(anObj._retn());
307
308   return true;
309 }
310
311 //=================================================================================
312 // function : redisplayPreview()
313 // purpose  :
314 //=================================================================================
315 void MeasureGUI_BndBoxDlg::redisplayPreview()
316 {
317   QString aMess;
318   if (!isValid(aMess)) {
319     erasePreview(true);
320     return;
321   }
322
323   erasePreview(false);
324
325   try {
326     SUIT_OverrideCursor();
327
328     getDisplayer()->SetColor(Quantity_NOC_VIOLET);
329     getDisplayer()->SetToActivate(false);
330     
331     if (SALOME_Prs* aPrs = buildPrs())
332       displayPreview(aPrs);
333   }
334   catch (const SALOME::SALOME_Exception& e) {
335     SalomeApp_Tools::QtCatchCorbaException(e);
336   }
337   catch (...) {
338   }
339 }