From c11106d1ef32c6bd65c919fa10edee4ad3bce207 Mon Sep 17 00:00:00 2001 From: mkr Date: Tue, 5 Aug 2008 14:19:36 +0000 Subject: [PATCH] Additional fix for bug 0019898 : Bouding box gives strange values on a sphere. --- src/MeasureGUI/Makefile.am | 1 + src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx | 65 +++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/src/MeasureGUI/Makefile.am b/src/MeasureGUI/Makefile.am index e2462292f..d0d175121 100644 --- a/src/MeasureGUI/Makefile.am +++ b/src/MeasureGUI/Makefile.am @@ -105,6 +105,7 @@ libMeasureGUI_la_CPPFLAGS = \ -I$(srcdir)/../OBJECT \ -I$(srcdir)/../GEOMClient \ -I$(srcdir)/../GEOMImpl \ + -I$(srcdir)/../GEOM \ -I$(top_builddir)/idl \ -I$(top_builddir)/salome_adm/unix diff --git a/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx b/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx index 7023827cd..39d443310 100644 --- a/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx @@ -32,7 +32,16 @@ #include "GEOMBase.h" #include "GEOM_Displayer.h" +#include +#include + #include +#include +#include +#include +#include +#include +#include #include "utilities.h" #include "SUIT_Session.h" @@ -161,8 +170,64 @@ bool MeasureGUI_BndBoxDlg::getParameters( double& theXmin, double& theXmax, { try { + Handle(Poly_Triangulation) Trtn = 0; + + Handle(GEOM_Object) anObject = GEOM_Engine::GetEngine()->GetObject(myObj->GetStudyID(), myObj->GetEntry()); + if (!anObject.IsNull()) + { + Handle(GEOM_Function) aRefShape = anObject->GetLastFunction(); + if (!aRefShape.IsNull()) + { + TopoDS_Shape aShape = aRefShape->GetValue(); + if (!aShape.IsNull()) + { + TopLoc_Location l; + Handle(Poly_Triangulation) T; + TopExp_Explorer ex; + for (ex.Init(aShape,TopAbs_FACE); ex.More(); ex.Next()) { + const TopoDS_Face& F = TopoDS::Face(ex.Current()); + + BRepAdaptor_Surface surf(F); + if (surf.GetType() == GeomAbs_Sphere) + { + T = BRep_Tool::Triangulation(F, l); + if (!T.IsNull()) { + Handle(Poly_Triangulation) NullTrtn = 0; + (*((Handle(BRep_TFace)*)&F.TShape()))->Triangulation(NullTrtn); + Trtn = T; + break; + } + } + else + break; + } + } + } + } + GEOM::GEOM_IMeasureOperations::_narrow( getOperation() )->GetBoundingBox( myObj, theXmin, theXmax, theYmin, theYmax, theZmin, theZmax ); + + if (!Trtn.IsNull()) + { + Handle(GEOM_Function) aRefShape = anObject->GetLastFunction(); + if (!aRefShape.IsNull()) + { + TopoDS_Shape aShape = aRefShape->GetValue(); + if (!aShape.IsNull()) + { + TopLoc_Location l; + Handle(Poly_Triangulation) T; + TopExp_Explorer ex; + for (ex.Init(aShape,TopAbs_FACE); ex.More(); ex.Next()) { + const TopoDS_Face& F = TopoDS::Face(ex.Current()); + (*((Handle(BRep_TFace)*)&F.TShape()))->Triangulation(Trtn); + break; + } + } + } + } + } catch( const SALOME::SALOME_Exception& e ) {