From ad52e520d5b7f1defaadf0ed1d3c115dfc042325 Mon Sep 17 00:00:00 2001 From: mpv Date: Tue, 8 Feb 2011 14:17:24 +0000 Subject: [PATCH] Added flag for computation internal shapes (manifold topology). In the SALOME/TRIPOLI module this piece of the functionality is not needed. It produces incorrect shapes and/or crashes. --- src/GEOMAlgo/GEOMAlgo_Algo.cdl | 7 ++- src/GEOMAlgo/GEOMAlgo_Algo.cxx | 12 ++++- src/GEOMAlgo/GEOMAlgo_Algo.hxx | 2 + src/GEOMAlgo/GEOMAlgo_BuilderSolid.cxx | 68 ++++++++++++++------------ src/GEOMAlgo/GEOMAlgo_Builder_3.cxx | 1 + 5 files changed, 56 insertions(+), 34 deletions(-) diff --git a/src/GEOMAlgo/GEOMAlgo_Algo.cdl b/src/GEOMAlgo/GEOMAlgo_Algo.cdl index 7bb6dd4bc..02f7a57a3 100755 --- a/src/GEOMAlgo/GEOMAlgo_Algo.cdl +++ b/src/GEOMAlgo/GEOMAlgo_Algo.cdl @@ -51,9 +51,14 @@ is WarningStatus (me) returns Integer from Standard; - + + ComputeInternalShapes(me : in out; theFlag : Boolean from Standard) + ---Purpose: Allows to omit of creation of internal shapes (manifold topology). + -- Needed for the SALOME/TRIPOLI module. + fields myErrorStatus : Integer from Standard is protected; myWarningStatus : Integer from Standard is protected; + myComputeInternalShapes : Boolean from Standard is protected; end Algo; diff --git a/src/GEOMAlgo/GEOMAlgo_Algo.cxx b/src/GEOMAlgo/GEOMAlgo_Algo.cxx index 6435bcd3a..37a15abe6 100755 --- a/src/GEOMAlgo/GEOMAlgo_Algo.cxx +++ b/src/GEOMAlgo/GEOMAlgo_Algo.cxx @@ -34,7 +34,8 @@ GEOMAlgo_Algo::GEOMAlgo_Algo() : myErrorStatus(1), - myWarningStatus(0) + myWarningStatus(0), + myComputeInternalShapes(Standard_True) {} //======================================================================= // function: ~ @@ -78,3 +79,12 @@ // myErrorStatus // // 1 - object is just initialized + +//======================================================================= +//function : ComputeInternalShapes +//purpose : +//======================================================================= + void GEOMAlgo_Algo::ComputeInternalShapes(const Standard_Boolean theFlag) +{ + myComputeInternalShapes = theFlag; +} diff --git a/src/GEOMAlgo/GEOMAlgo_Algo.hxx b/src/GEOMAlgo/GEOMAlgo_Algo.hxx index 71b728c27..add926a46 100644 --- a/src/GEOMAlgo/GEOMAlgo_Algo.hxx +++ b/src/GEOMAlgo/GEOMAlgo_Algo.hxx @@ -64,6 +64,7 @@ Standard_EXPORT Standard_Integer ErrorStatus() const; Standard_EXPORT Standard_Integer WarningStatus() const; +Standard_EXPORT void ComputeInternalShapes(const Standard_Boolean theFlag); @@ -88,6 +89,7 @@ Standard_EXPORT virtual void CheckResult() ; // Standard_Integer myErrorStatus; Standard_Integer myWarningStatus; +Standard_Boolean myComputeInternalShapes; private: diff --git a/src/GEOMAlgo/GEOMAlgo_BuilderSolid.cxx b/src/GEOMAlgo/GEOMAlgo_BuilderSolid.cxx index 07be8c7fb..3e76200d5 100755 --- a/src/GEOMAlgo/GEOMAlgo_BuilderSolid.cxx +++ b/src/GEOMAlgo/GEOMAlgo_BuilderSolid.cxx @@ -159,9 +159,11 @@ static if (myErrorStatus) { return; } - PerformInternalShapes(); - if (myErrorStatus) { - return; + if (myComputeInternalShapes) { + PerformInternalShapes(); + if (myErrorStatus) { + return; + } } } //======================================================================= @@ -445,42 +447,44 @@ static aEFMap.Clear(); AddedFacesMap.Clear(); // - aItM.Initialize(myShapesToAvoid); - for (; aItM.More(); aItM.Next()) { - const TopoDS_Shape& aFF=aItM.Key(); - TopExp::MapShapesAndAncestors(aFF, TopAbs_EDGE, TopAbs_FACE, aEFMap); - } - // - aItM.Initialize(myShapesToAvoid); - for (; aItM.More(); aItM.Next()) { - const TopoDS_Shape& aFF=aItM.Key(); - if (!AddedFacesMap.Add(aFF)) { - continue; + if (myComputeInternalShapes) { + aItM.Initialize(myShapesToAvoid); + for (; aItM.More(); aItM.Next()) { + const TopoDS_Shape& aFF=aItM.Key(); + TopExp::MapShapesAndAncestors(aFF, TopAbs_EDGE, TopAbs_FACE, aEFMap); } // - // make a new shell - TopoDS_Shell aShell; - aBB.MakeShell(aShell); - aBB.Add(aShell, aFF); - // - TopoDS_Iterator aItAddedF (aShell); - for (; aItAddedF.More(); aItAddedF.Next()) { - const TopoDS_Face& aF = *((TopoDS_Face*)(&aItAddedF.Value())); + aItM.Initialize(myShapesToAvoid); + for (; aItM.More(); aItM.Next()) { + const TopoDS_Shape& aFF=aItM.Key(); + if (!AddedFacesMap.Add(aFF)) { + continue; + } // - TopExp_Explorer aEdgeExp(aF, TopAbs_EDGE); - for (; aEdgeExp.More(); aEdgeExp.Next()) { - const TopoDS_Edge& aE = *((TopoDS_Edge*)(&aEdgeExp.Current())); - const TopTools_ListOfShape& aLF=aEFMap.FindFromKey(aE); - aItF.Initialize(aLF); - for (; aItF.More(); aItF.Next()) { - const TopoDS_Face& aFL=*((TopoDS_Face*)(&aItF.Value())); - if (AddedFacesMap.Add(aFL)){ - aBB.Add(aShell, aFL); + // make a new shell + TopoDS_Shell aShell; + aBB.MakeShell(aShell); + aBB.Add(aShell, aFF); + // + TopoDS_Iterator aItAddedF (aShell); + for (; aItAddedF.More(); aItAddedF.Next()) { + const TopoDS_Face& aF = *((TopoDS_Face*)(&aItAddedF.Value())); + // + TopExp_Explorer aEdgeExp(aF, TopAbs_EDGE); + for (; aEdgeExp.More(); aEdgeExp.Next()) { + const TopoDS_Edge& aE = *((TopoDS_Edge*)(&aEdgeExp.Current())); + const TopTools_ListOfShape& aLF=aEFMap.FindFromKey(aE); + aItF.Initialize(aLF); + for (; aItF.More(); aItF.Next()) { + const TopoDS_Face& aFL=*((TopoDS_Face*)(&aItF.Value())); + if (AddedFacesMap.Add(aFL)){ + aBB.Add(aShell, aFL); + } } } } + myLoopsInternal.Append(aShell); } - myLoopsInternal.Append(aShell); } } //======================================================================= diff --git a/src/GEOMAlgo/GEOMAlgo_Builder_3.cxx b/src/GEOMAlgo/GEOMAlgo_Builder_3.cxx index 68393f472..ef3a0b747 100755 --- a/src/GEOMAlgo/GEOMAlgo_Builder_3.cxx +++ b/src/GEOMAlgo/GEOMAlgo_Builder_3.cxx @@ -456,6 +456,7 @@ void GEOMAlgo_Builder::BuildDraftSolid (const TopoDS_Shape& theSolid, // // 1. Build solids for interferred source solids aSB.SetContext(aCtx); + aSB.ComputeInternalShapes(myComputeInternalShapes); aNbS=myDraftSolids.Extent(); for (i=1; i<=aNbS; ++i) { const TopoDS_Shape& aS =myDraftSolids.FindKey(i);