From: rnv Date: Fri, 4 Mar 2011 07:36:14 +0000 (+0000) Subject: Patch from MIV: Modification of the deflection computing mechanism. X-Git-Tag: Start_BR_19998_21191~41 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=242c40379f62d843ab135e1acd108f06f90c8b04;p=modules%2Fgeom.git Patch from MIV: Modification of the deflection computing mechanism. --- diff --git a/src/OBJECT/GEOM_Actor.cxx b/src/OBJECT/GEOM_Actor.cxx index 675ffd069..7328f77a1 100644 --- a/src/OBJECT/GEOM_Actor.cxx +++ b/src/OBJECT/GEOM_Actor.cxx @@ -39,8 +39,6 @@ #include "GEOM_ShadingFace.h" #include "SVTK_Actor.h" -#include - #include #include #include @@ -49,8 +47,14 @@ #include #include +#include +#include +#include #include #include +#include +#include +#include #include #include @@ -102,7 +106,10 @@ GEOM_Actor::GEOM_Actor(): myHighlightProp(vtkProperty::New()), myPreHighlightProp(vtkProperty::New()), myShadingFaceProp(vtkProperty::New()), - isOnlyVertex(false) + isOnlyVertex(false), + // Making deflection relative similarly to GEOM_AISShape + myDeflection( .001 ), + myIsRelative( true ) { #ifdef MYDEBUG MESSAGE (this<< " GEOM_Actor::GEOM_Actor"); @@ -174,7 +181,6 @@ GEOM_Actor::GEOM_Actor(): // Toggle display mode setDisplayMode(0); // WIRE FRAME - SetVectorMode(0); // } @@ -351,6 +357,39 @@ GEOM_Actor return myVectorMode; } +static +void +MeshShape(const TopoDS_Shape& theShape, + float& theDeflection, + bool theIsRelative) +{ + static Standard_Real RELATIVE_DEFLECTION = 0.0001; + Standard_Real aDeflection = theDeflection <= 0 ? RELATIVE_DEFLECTION : theDeflection; + + // theDeflection <= 0 -> Compute default theDeflection + // Otherwise compute the absolute deflection on the basis of relative + if(theDeflection <= 0 || theIsRelative ){ + Bnd_Box B; + BRepBndLib::Add(theShape, B); + if(!B.IsVoid()){ + Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax; + B.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax); + + // This magic line comes from Prs3d_ShadedShape.gxx in OCCT + aDeflection = std::max( aXmax-aXmin , std::max(aYmax-aYmin , aZmax-aZmin)) + *aDeflection*4; + } + else + // Just to assign some value, because a void bnd box is not a good case + aDeflection = RELATIVE_DEFLECTION; + + if(theDeflection <= 0) + theDeflection = theIsRelative ? RELATIVE_DEFLECTION : aDeflection; + } + + BRepMesh_IncrementalMesh aMesh(theShape,aDeflection); +} + void GEOM_Actor:: SetDeflection(float theDeflection, bool theIsRelative) @@ -358,7 +397,7 @@ SetDeflection(float theDeflection, bool theIsRelative) myDeflection = theDeflection; myIsRelative = theIsRelative; - GEOM::MeshShape2(myShape,myDeflection,myIsRelative); + MeshShape(myShape,myDeflection,myIsRelative); SetModified(); } @@ -389,12 +428,7 @@ void GEOM_Actor::SetShape (const TopoDS_Shape& theShape, TopTools_IndexedDataMapOfShapeListOfShape anEdgeMap; TopExp::MapShapesAndAncestors(theShape,TopAbs_EDGE,TopAbs_FACE,anEdgeMap); - GEOM::SetShape(theShape,anEdgeMap,theIsVector, - myIsolatedEdgeSource.Get(), - myOneFaceEdgeSource.Get(), - mySharedEdgeSource.Get(), - myWireframeFaceSource.Get(), - myShadingFaceSource.Get()); + SetShape(theShape,anEdgeMap,theIsVector); isOnlyVertex = myIsolatedEdgeSource->IsEmpty() && myOneFaceEdgeSource->IsEmpty() && @@ -409,6 +443,65 @@ void GEOM_Actor::SetShape (const TopoDS_Shape& theShape, } } +void GEOM_Actor::SetShape (const TopoDS_Shape& theShape, + const TopTools_IndexedDataMapOfShapeListOfShape& theEdgeMap, + bool theIsVector) +{ + if (theShape.ShapeType() == TopAbs_COMPOUND) { + TopoDS_Iterator anItr(theShape); + for (; anItr.More(); anItr.Next()) { + SetShape(anItr.Value(),theEdgeMap,theIsVector); + } + } + + switch (theShape.ShapeType()) { + case TopAbs_WIRE: { + TopExp_Explorer anEdgeExp(theShape,TopAbs_EDGE); + for (; anEdgeExp.More(); anEdgeExp.Next()){ + const TopoDS_Edge& anEdge = TopoDS::Edge(anEdgeExp.Current()); + if (!BRep_Tool::Degenerated(anEdge)) + myIsolatedEdgeSource->AddEdge(anEdge,theIsVector); + } + break; + } + case TopAbs_EDGE: { + const TopoDS_Edge& anEdge = TopoDS::Edge(theShape); + if (!BRep_Tool::Degenerated(anEdge)) + myIsolatedEdgeSource->AddEdge(anEdge,theIsVector); + break; + } + case TopAbs_VERTEX: { + break; + } + default: { + TopExp_Explorer aFaceExp (theShape,TopAbs_FACE); + for(; aFaceExp.More(); aFaceExp.Next()) { + const TopoDS_Face& aFace = TopoDS::Face(aFaceExp.Current()); + myWireframeFaceSource->AddFace(aFace); + myShadingFaceSource->AddFace(aFace); + TopExp_Explorer anEdgeExp(aFaceExp.Current(), TopAbs_EDGE); + for(; anEdgeExp.More(); anEdgeExp.Next()) { + const TopoDS_Edge& anEdge = TopoDS::Edge(anEdgeExp.Current()); + if(!BRep_Tool::Degenerated(anEdge)){ + // compute the number of faces + int aNbOfFaces = theEdgeMap.FindFromKey(anEdge).Extent(); + switch(aNbOfFaces){ + case 0: // isolated edge + myIsolatedEdgeSource->AddEdge(anEdge,theIsVector); + break; + case 1: // edge in only one face + myOneFaceEdgeSource->AddEdge(anEdge,theIsVector); + break; + default: // edge shared by at least two faces + mySharedEdgeSource->AddEdge(anEdge,theIsVector); + } + } + } + } + } + } +} + // OLD METHODS void GEOM_Actor::setDeflection(double adef) { #ifdef MYDEBUG diff --git a/src/OBJECT/GEOM_Actor.h b/src/OBJECT/GEOM_Actor.h index e31ea1990..4910ea6a8 100644 --- a/src/OBJECT/GEOM_Actor.h +++ b/src/OBJECT/GEOM_Actor.h @@ -56,6 +56,8 @@ class vtkRenderer; class vtkAppendPolyData; typedef GEOM_SmartPtr PAppendFilter; +class TopTools_IndexedDataMapOfShapeListOfShape; + class GEOM_OBJECT_EXPORT GEOM_Actor: public SALOME_Actor { public: @@ -67,6 +69,10 @@ public: bool theIsRelative, bool theIsVector = false); + void SetShape (const TopoDS_Shape& theShape, + const TopTools_IndexedDataMapOfShapeListOfShape& theEdgeMap, + bool theIsVector); + void SetDeflection(float theDeflection, bool theIsRelative); float GetDeflection() const{ return myDeflection;} bool GetIsRelative() const{ return myIsRelative;}