]> OCCT Git - occt-copy.git/commitdiff
0030497: [REGRESSION] Mesh - wrong Poly_Polygon3D within local selection of located... CR0_DMUReviewer_2_30497_1
authornds <nds@opencascade.com>
Wed, 20 Feb 2019 13:14:03 +0000 (16:14 +0300)
committernds <nds@opencascade.com>
Wed, 20 Feb 2019 13:17:58 +0000 (16:17 +0300)
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
tests/bugs/moddata_3/bug30497 [new file with mode: 0644]

index 4df32b0b8ceccd42cd93515fcc1cf6f38116ffb1..ba7636f08c02b6268d7a0f5eda80dc16003e0e02 100644 (file)
@@ -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 (file)
index 0000000..239b481
--- /dev/null
@@ -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