From a05a929211971c935e3dd46923624b47166cdc4e Mon Sep 17 00:00:00 2001 From: nds Date: Wed, 20 Feb 2019 16:14:03 +0300 Subject: [PATCH] 0030497: [REGRESSION] Mesh - wrong Poly_Polygon3D within local selection of located shape The previous code has a condition to avoid processing the same faces if the face has a location. The similar condition should be applied during the edges processing. If not doing this, in the previous imlementation, IMeshData_Edge instances are created for all edges(even located), but edges of faces located are not filled with curves. As a result we had wrong local selection of edges. (cherry picked from commit 9e00d610b88e4f1778a5a55fe9c50d2665169d28) --- src/IMeshTools/IMeshTools_ShapeExplorer.cxx | 48 +++++++++++++++++---- tests/bugs/moddata_3/bug30497 | 18 ++++++++ 2 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 tests/bugs/moddata_3/bug30497 diff --git a/src/IMeshTools/IMeshTools_ShapeExplorer.cxx b/src/IMeshTools/IMeshTools_ShapeExplorer.cxx index 4df32b0b8c..ba7636f08c 100644 --- a/src/IMeshTools/IMeshTools_ShapeExplorer.cxx +++ b/src/IMeshTools/IMeshTools_ShapeExplorer.cxx @@ -50,14 +50,11 @@ IMeshTools_ShapeExplorer::~IMeshTools_ShapeExplorer () void IMeshTools_ShapeExplorer::Accept ( const Handle (IMeshTools_ShapeVisitor)& theVisitor) { - // Explore all edges in shape - either free or related to some face. - TopTools_IndexedMapOfShape aEdges; - TopExp::MapShapes (GetShape (), TopAbs_EDGE, aEdges); - - TopTools_IndexedMapOfShape::Iterator aEdgeIt (aEdges); - for (; aEdgeIt.More (); aEdgeIt.Next ()) + // Explore all free edges in shape. + TopExp_Explorer aFreeEdgesIt (GetShape (), TopAbs_EDGE, TopAbs_FACE); + for (; aFreeEdgesIt.More(); aFreeEdgesIt.Next()) { - const TopoDS_Edge& aEdge = TopoDS::Edge (aEdgeIt.Value ()); + const TopoDS_Edge& aEdge = TopoDS::Edge (aFreeEdgesIt.Current()); if (!BRep_Tool::IsGeometric(aEdge)) { continue; @@ -66,12 +63,11 @@ void IMeshTools_ShapeExplorer::Accept ( theVisitor->Visit (aEdge); } - // Explore faces + // Explore all related to some face edges in shape. TopTools_ListOfShape aFaceList; BRepLib::ReverseSortFaces (GetShape (), aFaceList); TopTools_MapOfShape aFaceMap; - // make array of faces suitable for processing (excluding faces without surface) TopLoc_Location aDummyLoc; const TopLoc_Location aEmptyLoc; TopTools_ListIteratorOfListOfShape aFaceIter (aFaceList); @@ -91,6 +87,40 @@ void IMeshTools_ShapeExplorer::Accept ( continue; } + TopExp_Explorer anEdgesExp (aFace, TopAbs_EDGE); + for (; anEdgesExp.More(); anEdgesExp.Next()) + { + const TopoDS_Edge& aEdge = TopoDS::Edge (anEdgesExp.Current()); + if (!BRep_Tool::IsGeometric(aEdge)) + { + continue; + } + + theVisitor->Visit (aEdge); + } + } + + // Explore faces + aFaceMap.Clear(); + + // make array of faces suitable for processing (excluding faces without surface) + aFaceIter.Init (aFaceList); + for (; aFaceIter.More (); aFaceIter.Next ()) + { + TopoDS_Shape aFaceNoLoc = aFaceIter.Value (); + aFaceNoLoc.Location (aEmptyLoc); + if (!aFaceMap.Add(aFaceNoLoc)) + { + continue; // already processed + } + + TopoDS_Face aFace = TopoDS::Face (aFaceIter.Value ()); + const Handle (Geom_Surface)& aSurf = BRep_Tool::Surface (aFace, aDummyLoc); + if (aSurf.IsNull()) + { + continue; + } + // Store only forward faces in order to prevent inverse issue. theVisitor->Visit (TopoDS::Face (aFace.Oriented (TopAbs_FORWARD))); } diff --git a/tests/bugs/moddata_3/bug30497 b/tests/bugs/moddata_3/bug30497 new file mode 100644 index 0000000000..239b481730 --- /dev/null +++ b/tests/bugs/moddata_3/bug30497 @@ -0,0 +1,18 @@ +puts "=======" +puts "0030497" +puts "=======" +puts "" +################################################## +# [REGRESSION] Mesh - wrong Poly_Polygon3D within local selection of located shape +################################################## + +pload XDE VISUALIZATION +testreadstep as1-oc-214-mat.stp s + +vclear +vinit View1 +vaxo +vdisplay s -dispmode 1 +vfit +vselmode 2 1 +vmoveto 150 201 -- 2.39.5