From e39ee4040b8fcca425f5ede16069932338c7afa6 Mon Sep 17 00:00:00 2001 From: jfa Date: Fri, 21 Dec 2012 08:29:02 +0000 Subject: [PATCH] Mantis issue 0021716: EDF 1679 : Create the bounding box in the GUI --- doc/salome/gui/GEOM/images/measures5.png | Bin 14644 -> 20073 bytes doc/salome/gui/GEOM/input/bounding_box.doc | 14 +- .../gui/GEOM/input/tui_bounding_box.doc | 6 + idl/GEOM_Gen.idl | 7 + src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx | 53 ++++++ src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx | 2 + src/GEOMImpl/GEOMImpl_MeasureDriver.cxx | 43 ++++- src/GEOMImpl/GEOMImpl_Types.hxx | 1 + src/GEOM_I/GEOM_IMeasureOperations_i.cc | 26 ++- src/GEOM_I/GEOM_IMeasureOperations_i.hh | 3 +- src/GEOM_SWIG/GEOM_TestMeasures.py | 3 +- src/GEOM_SWIG/geompyDC.py | 22 ++- src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx | 160 ++++++++++++++++-- src/MeasureGUI/MeasureGUI_BndBoxDlg.h | 34 ++-- 14 files changed, 332 insertions(+), 42 deletions(-) diff --git a/doc/salome/gui/GEOM/images/measures5.png b/doc/salome/gui/GEOM/images/measures5.png index 13af1afdfa7f0112c80a0725a3e3fa828c3b75d9..d2180be634371ff73d46022d56591c28793eaf7a 100755 GIT binary patch literal 20073 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: Displays the bounding box dimensions of a -geometrical object in form of a Python Tuple (Xmin, Xmax, Ymin, -Ymax, Zmin, Zmax). -\n TUI Command: geompy.BoundingBox(Shape), where \em Shape +\n TUI Commands: [Xmin,Xmax, Ymin,Ymax, Zmin,Zmax] = geompy.BoundingBox(Shape), +BBox = geompy.MakeBoundingBox(Shape), where \em Shape is the shape for which a bounding box is computed. See also a \ref tui_bounding_box_page "TUI example". -\image html measures5.png - */ diff --git a/doc/salome/gui/GEOM/input/tui_bounding_box.doc b/doc/salome/gui/GEOM/input/tui_bounding_box.doc index 232ab13b4..022795cbb 100644 --- a/doc/salome/gui/GEOM/input/tui_bounding_box.doc +++ b/doc/salome/gui/GEOM/input/tui_bounding_box.doc @@ -7,11 +7,17 @@ import geompy # create a box box = geompy.MakeBoxDXDYDZ(100,30,100) + bb = geompy.BoundingBox(box) print "\nBounding Box of box 100x30x100:" print " Xmin = ", bb[0], ", Xmax = ", bb[1] print " Ymin = ", bb[2], ", Ymax = ", bb[3] print " Zmin = ", bb[4], ", Zmax = ", bb[5] + +aBB = geompy.MakeBoundingBox(box) + +geompy.addToStudy(box, "box 100x30x100") +geompy.addToStudy(aBB, "Bounding box of box 100x30x100") \endcode */ diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index de18e7ee1..24a7f1946 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -3558,6 +3558,13 @@ module GEOM out double Ymin, out double Ymax, out double Zmin, out double Zmax); + /*! + * \brief Get bounding box of the given shape + * \param theShape Shape to obtain bounding box of. + * \return New GEOM_Object, containing the created bounding box. + */ + GEOM_Object MakeBoundingBox (in GEOM_Object theShape); + /*! * \brief Get min and max tolerances of sub-shapes of theShape * \param theShape Shape, to get tolerances of. diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx index 0d08e6dcd..6f4194500 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx @@ -1166,6 +1166,59 @@ void GEOMImpl_IMeasureOperations::GetBoundingBox SetErrorCode(OK); } +//============================================================================= +/*! + * GetBoundingBox + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IMeasureOperations::GetBoundingBox + (Handle(GEOM_Object) theShape) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return NULL; + + //Add a new BoundingBox object + Handle(GEOM_Object) aBnd = GetEngine()->AddObject(GetDocID(), GEOM_BOX); + + //Add a new BoundingBox function + Handle(GEOM_Function) aFunction = + aBnd->AddFunction(GEOMImpl_MeasureDriver::GetID(), BND_BOX_MEASURE); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_MeasureDriver::GetID()) return NULL; + + GEOMImpl_IMeasure aCI (aFunction); + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return NULL; + + aCI.SetBase(aRefShape); + + //Compute the BoundingBox value + try { +#if OCC_VERSION_LARGE > 0x06010000 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Measure driver failed to compute a bounding box"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aBnd << " = geompy.MakeBoundingBox(" << theShape << ")"; + + SetErrorCode(OK); + return aBnd; +} + //============================================================================= /*! * GetTolerance diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx index fbcdcfa9e..eff6fdaca 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx @@ -117,6 +117,8 @@ class GEOMImpl_IMeasureOperations : public GEOM_IOperations { Standard_Real& Ymin, Standard_Real& Ymax, Standard_Real& Zmin, Standard_Real& Zmax); + Standard_EXPORT Handle(GEOM_Object) GetBoundingBox (Handle(GEOM_Object) theShape); + Standard_EXPORT void GetTolerance (Handle(GEOM_Object) theShape, Standard_Real& FaceMin, Standard_Real& FaceMax, Standard_Real& EdgeMin, Standard_Real& EdgeMax, diff --git a/src/GEOMImpl/GEOMImpl_MeasureDriver.cxx b/src/GEOMImpl/GEOMImpl_MeasureDriver.cxx index 7aa6fb5f8..33ead5986 100644 --- a/src/GEOMImpl/GEOMImpl_MeasureDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_MeasureDriver.cxx @@ -30,9 +30,12 @@ #include #include +#include #include -#include +#include #include +#include +#include #include #include @@ -55,6 +58,7 @@ #include #include #include +#include //======================================================================= //function : GetID @@ -93,14 +97,47 @@ Standard_Integer GEOMImpl_MeasureDriver::Execute(TFunction_Logbook& log) const { Handle(GEOM_Function) aRefBase = aCI.GetBase(); TopoDS_Shape aShapeBase = aRefBase->GetValue(); - if (aShapeBase.IsNull()) { + if (aShapeBase.IsNull()) Standard_NullObject::Raise("Shape for centre of mass calculation is null"); - } gp_Ax3 aPos = GEOMUtils::GetPosition(aShapeBase); gp_Pnt aCenterMass = aPos.Location(); aShape = BRepBuilderAPI_MakeVertex(aCenterMass).Shape(); } + else if (aType == BND_BOX_MEASURE) + { + Handle(GEOM_Function) aRefBase = aCI.GetBase(); + TopoDS_Shape aShapeBase = aRefBase->GetValue(); + if (aShapeBase.IsNull()) + Standard_NullObject::Raise("Shape for bounding box calculation is null"); + + BRepBuilderAPI_Copy aCopyTool (aShapeBase); + if (!aCopyTool.IsDone()) + Standard_NullObject::Raise("Shape for bounding box calculation is bad"); + + aShapeBase = aCopyTool.Shape(); + + // remove triangulation to obtain more exact boundaries + BRepTools::Clean(aShapeBase); + + Bnd_Box B; + BRepBndLib::Add(aShapeBase, B); + + Standard_Real Xmin, Ymin, Zmin, Xmax, Ymax, Zmax; + B.Get(Xmin, Ymin, Zmin, Xmax, Ymax, Zmax); + + if (Xmax - Xmin < Precision::Confusion()) Xmax += Precision::Confusion(); + if (Ymax - Ymin < Precision::Confusion()) Ymax += Precision::Confusion(); + if (Zmax - Zmin < Precision::Confusion()) Zmax += Precision::Confusion(); + + gp_Pnt P1 (Xmin, Ymin, Zmin); + gp_Pnt P2 (Xmax, Ymax, Zmax); + + BRepPrimAPI_MakeBox MB (P1, P2); + MB.Build(); + if (!MB.IsDone()) StdFail_NotDone::Raise("Bounding box cannot be computed from the given shape"); + aShape = MB.Shape(); + } else if (aType == VERTEX_BY_INDEX) { Handle(GEOM_Function) aRefBase = aCI.GetBase(); diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 659158e28..687eb7f15 100755 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -309,6 +309,7 @@ // Measures #define CDG_MEASURE 1 +#define BND_BOX_MEASURE 2 #define VECTOR_FACE_NORMALE 4 #define VERTEX_BY_INDEX 5 diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.cc b/src/GEOM_I/GEOM_IMeasureOperations_i.cc index ffbdcd5d4..66bcb5288 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.cc +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.cc @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -273,6 +272,31 @@ void GEOM_IMeasureOperations_i::GetBoundingBox (GEOM::GEOM_Object_ptr theShape, GetOperations()->GetBoundingBox(aShape, Xmin, Xmax, Ymin, Ymax, Zmin, Zmax); } +//============================================================================= +/*! + * MakeBoundingBox + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IMeasureOperations_i::MakeBoundingBox + (GEOM::GEOM_Object_ptr theShape) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference shape + Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + if (aShape.IsNull()) return aGEOMObject._retn(); + + // Make Box - bounding box of theShape + Handle(GEOM_Object) anObject = GetOperations()->GetBoundingBox(aShape); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * GetTolerance diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.hh b/src/GEOM_I/GEOM_IMeasureOperations_i.hh index 4534dc45e..0f68c3510 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.hh +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.hh @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOM_IMeasureOperations_i_HeaderFile #define _GEOM_IMeasureOperations_i_HeaderFile @@ -75,6 +74,8 @@ class GEOM_I_EXPORT GEOM_IMeasureOperations_i : CORBA::Double& Ymin, CORBA::Double& Ymax, CORBA::Double& Zmin, CORBA::Double& Zmax); + GEOM::GEOM_Object_ptr MakeBoundingBox (GEOM::GEOM_Object_ptr theShape); + void GetTolerance (GEOM::GEOM_Object_ptr theShape, CORBA::Double& FaceMin, CORBA::Double& FaceMax, CORBA::Double& EdgeMin, CORBA::Double& EdgeMax, diff --git a/src/GEOM_SWIG/GEOM_TestMeasures.py b/src/GEOM_SWIG/GEOM_TestMeasures.py index 1621f2bf4..ea9e31c86 100644 --- a/src/GEOM_SWIG/GEOM_TestMeasures.py +++ b/src/GEOM_SWIG/GEOM_TestMeasures.py @@ -19,7 +19,6 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -# def TestMeasureOperations (geompy, math): @@ -98,6 +97,8 @@ def TestMeasureOperations (geompy, math): print " Xmin = ", BB[0], ", Xmax = ", BB[1] print " Ymin = ", BB[2], ", Ymax = ", BB[3] print " Zmin = ", BB[4], ", Zmax = ", BB[5] + BB = geompy.MakeBoundingBox(box) + geompy.addToStudy(BB, "BoundingBox") ####### Inertia ####### diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index ef8415920..e72c6538e 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -6644,7 +6644,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): # Zmin,Zmax: Limits of shape along OZ axis. # # @ref tui_measurement_tools_page "Example" - def BoundingBox(self,theShape): + def BoundingBox (self, theShape): """ Get parameters of bounding box of the given shape @@ -6662,6 +6662,26 @@ class geompyDC(GEOM._objref_GEOM_Gen): RaiseIfFailed("GetBoundingBox", self.MeasuOp) return aTuple + ## Get bounding box of the given shape + # @param theShape Shape to obtain bounding box of. + # @return New GEOM.GEOM_Object, containing the created box. + # + # @ref tui_measurement_tools_page "Example" + def MakeBoundingBox (self, theShape): + """ + Get bounding box of the given shape + + Parameters: + theShape Shape to obtain bounding box of. + + Returns: + New GEOM.GEOM_Object, containing the created box. + """ + # Example: see GEOM_TestMeasures.py + anObj = self.MeasuOp.MakeBoundingBox(theShape) + RaiseIfFailed("MakeBoundingBox", self.MeasuOp) + return anObj + ## Get inertia matrix and moments of inertia of theShape. # @param theShape Shape to calculate inertia of. # @return [I11,I12,I13, I21,I22,I23, I31,I32,I33, Ix,Iy,Iz] diff --git a/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx b/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx index d3eb0603a..5460c7e4f 100644 --- a/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx @@ -35,6 +35,10 @@ #include #include +#include +#include +#include +#include //================================================================================= // class : MeasureGUI_BndBoxDlg() @@ -44,21 +48,23 @@ // true to construct a modal dialog. //================================================================================= MeasureGUI_BndBoxDlg::MeasureGUI_BndBoxDlg (GeometryGUI* GUI, QWidget* parent) - : MeasureGUI_Skeleton(GUI, parent) + : GEOMBase_Skeleton(GUI, parent) { - QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( - "GEOM", tr( "ICON_DLG_BOUNDING_BOX" ) ) ); - QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( - "GEOM", tr( "ICON_SELECT" ) ) ); + QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_BOUNDING_BOX"))); + QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); - setWindowTitle( tr( "GEOM_BNDBOX_TITLE" ) ); + setWindowTitle(tr("GEOM_BNDBOX_TITLE")); /***************************************************************/ - mainFrame()->GroupConstructors->setTitle( tr( "GEOM_BNDBOX" ) ); - mainFrame()->RadioButton1->setIcon( image0 ); + mainFrame()->GroupConstructors->setTitle(tr("GEOM_BNDBOX")); + mainFrame()->RadioButton1->setIcon(image0); + mainFrame()->RadioButton2->setAttribute( Qt::WA_DeleteOnClose ); + mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); + mainFrame()->RadioButton3->close(); - myGrp = new MeasureGUI_1Sel6LineEdit( centralWidget() ); + myGrp = new MeasureGUI_1Sel6LineEdit (centralWidget()); myGrp->GroupBox1->setTitle( tr( "GEOM_BNDBOX_OBJDIM" ) ); myGrp->TextLabel1->setText( tr( "GEOM_OBJECT" ) ); myGrp->TextLabel2->setText( tr( "GEOM_MIN" ) ); @@ -87,7 +93,7 @@ MeasureGUI_BndBoxDlg::MeasureGUI_BndBoxDlg (GeometryGUI* GUI, QWidget* parent) /***************************************************************/ - myHelpFileName = "using_measurement_tools_page.html#bounding_box_anchor"; + myHelpFileName = "bounding_box_page.html"; /* Initialisation */ Init(); @@ -107,9 +113,41 @@ MeasureGUI_BndBoxDlg::~MeasureGUI_BndBoxDlg() //================================================================================= void MeasureGUI_BndBoxDlg::Init() { - mySelBtn = myGrp->PushButton1; - mySelEdit = myGrp->LineEdit1; - MeasureGUI_Skeleton::Init(); + myEditCurrentArgument = myGrp->LineEdit1; + + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(myGrp->PushButton1, SIGNAL(clicked()), this, SLOT(SelectionIntoArgument())); + + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + + initName(tr("GEOM_BNDBOX")); + globalSelection(); + SelectionIntoArgument(); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void MeasureGUI_BndBoxDlg::ClickOnOk() +{ + if (ClickOnApply()) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool MeasureGUI_BndBoxDlg::ClickOnApply() +{ + if (!onAccept()) + return false; + + initName(); + return true; } //================================================================================= @@ -121,7 +159,7 @@ void MeasureGUI_BndBoxDlg::processObject() double aXMin, aXMax, aYMin, aYMax, aZMin, aZMax; if (!getParameters(aXMin, aXMax, aYMin, aYMax, aZMin, aZMax)) { - mySelEdit->setText(""); + myEditCurrentArgument->setText(""); myGrp->LineEdit11->setText(""); myGrp->LineEdit12->setText(""); myGrp->LineEdit21->setText(""); @@ -177,3 +215,97 @@ SALOME_Prs* MeasureGUI_BndBoxDlg::buildPrs() return !aShape.IsNull() ? getDisplayer()->BuildPrs(aShape) : 0; } + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void MeasureGUI_BndBoxDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + myObj = GEOM::GEOM_Object::_nil(); + + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + if (aSelList.Extent() != 1) { + processObject(); + erasePreview(); + return; + } + + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First()); + + if (aSelectedObject->_is_nil()) { + processObject(); + erasePreview(); + return; + } + + myObj = aSelectedObject; + myEditCurrentArgument->setText(GEOMBase::GetName(myObj)); + processObject(); + redisplayPreview(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr MeasureGUI_BndBoxDlg::createOperation() +{ + return getGeomEngine()->GetIMeasureOperations(getStudyId()); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool MeasureGUI_BndBoxDlg::isValid (QString&) +{ + return !myObj->_is_nil(); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool MeasureGUI_BndBoxDlg::execute (ObjectList& objects) +{ + GEOM::GEOM_IMeasureOperations_var anOper = GEOM::GEOM_IMeasureOperations::_narrow(getOperation()); + GEOM::GEOM_Object_var anObj = anOper->MakeBoundingBox(myObj); + + if (!anObj->_is_nil()) + objects.push_back(anObj._retn()); + + return true; +} + +//================================================================================= +// function : redisplayPreview() +// purpose : +//================================================================================= +void MeasureGUI_BndBoxDlg::redisplayPreview() +{ + QString aMess; + if (!isValid(aMess)) { + erasePreview(true); + return; + } + + erasePreview(false); + + try { + SUIT_OverrideCursor(); + + getDisplayer()->SetColor(Quantity_NOC_VIOLET); + getDisplayer()->SetToActivate(false); + + if (SALOME_Prs* aPrs = buildPrs()) + displayPreview(aPrs); + } + catch (const SALOME::SALOME_Exception& e) { + SalomeApp_Tools::QtCatchCorbaException(e); + } +} diff --git a/src/MeasureGUI/MeasureGUI_BndBoxDlg.h b/src/MeasureGUI/MeasureGUI_BndBoxDlg.h index 8fd3af034..bb1e8971e 100644 --- a/src/MeasureGUI/MeasureGUI_BndBoxDlg.h +++ b/src/MeasureGUI/MeasureGUI_BndBoxDlg.h @@ -18,16 +18,15 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // GEOM GEOMGUI : GUI for Geometry component // File : MeasureGUI_BndBoxDlg.h // Author : Nicolas REJNERI, Open CASCADE S.A.S. -// + #ifndef MEASUREGUI_BNDBOXDLG_H #define MEASUREGUI_BNDBOXDLG_H -#include "MeasureGUI_Skeleton.h" +#include "GEOMBase_Skeleton.h" class MeasureGUI_1Sel6LineEdit; @@ -35,27 +34,36 @@ class MeasureGUI_1Sel6LineEdit; // class : DialogBox_PROPERTIES // purpose : //================================================================================= -class MeasureGUI_BndBoxDlg : public MeasureGUI_Skeleton +class MeasureGUI_BndBoxDlg : public GEOMBase_Skeleton { Q_OBJECT public: - MeasureGUI_BndBoxDlg( GeometryGUI*, QWidget* ); + MeasureGUI_BndBoxDlg (GeometryGUI*, QWidget*); ~MeasureGUI_BndBoxDlg(); protected: - // redefined from GEOMBase_Helper and MeasureGUI_Skeleton - virtual void processObject(); - virtual SALOME_Prs* buildPrs(); + // redefined from GEOMBase_Helper + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid (QString&); + virtual bool execute (ObjectList&); + + void redisplayPreview(); + virtual void processObject(); + virtual SALOME_Prs* buildPrs(); private: - void Init(); - bool getParameters( double&, double&, - double&, double&, - double&, double& ); + void Init(); + bool getParameters (double&, double&, double&, double&, double&, double&); private: - MeasureGUI_1Sel6LineEdit* myGrp; + GEOM::GEOM_Object_var myObj; + MeasureGUI_1Sel6LineEdit* myGrp; + +private slots: + void ClickOnOk(); + bool ClickOnApply(); + void SelectionIntoArgument(); }; #endif // MEASUREGUI_BNDBOXDLG_H -- 2.39.2