0030497: [REGRESSION] Mesh - wrong Poly_Polygon3D within local selection of located...
authornds <nds@opencascade.com>
Thu, 28 Feb 2019 06:55:53 +0000 (09:55 +0300)
committerapn <apn@opencascade.com>
Thu, 28 Feb 2019 17:24:43 +0000 (20:24 +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 implementation, 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.

Limit addition of edges to data model by ones with unique TShape and location using edges map already available in BRepMesh_ShapeVisitor.

src/BRepMesh/BRepMesh_ShapeVisitor.cxx
src/IMeshTools/IMeshTools_ShapeExplorer.cxx
tests/bugs/mesh/bug25364
tests/bugs/moddata_3/bug30497 [new file with mode: 0644]

index 791810b..0705c13 100644 (file)
@@ -57,8 +57,11 @@ BRepMesh_ShapeVisitor::~BRepMesh_ShapeVisitor ()
 //=======================================================================
 void BRepMesh_ShapeVisitor::Visit(const TopoDS_Edge& theEdge)
 {
-  myModel->AddEdge(theEdge);
-  myDEdgeMap.Bind(theEdge, myModel->EdgesNb() - 1);
+  if (!myDEdgeMap.IsBound (theEdge))
+  {
+    myModel->AddEdge (theEdge);
+    myDEdgeMap.Bind  (theEdge, myModel->EdgesNb () - 1);
+  }
 }
 
 //=======================================================================
index 4df32b0..2dc244a 100644 (file)
 #include <TopTools_MapOfShape.hxx>
 #include <Geom_Surface.hxx>
 
+namespace
+{
+  //=======================================================================
+  // Function: visitEdges
+  // Purpose : Explodes the given shape on edges according to the specified
+  //           criteria and visits each one in order to add it to data model.
+  //=======================================================================
+  void visitEdges (const Handle (IMeshTools_ShapeVisitor)& theVisitor,
+                   const TopoDS_Shape&                     theShape,
+                   const TopAbs_ShapeEnum                  theToFind,
+                   const TopAbs_ShapeEnum                  theToAvoid = TopAbs_SHAPE)
+  {
+    TopExp_Explorer aEdgesIt (theShape, theToFind, theToAvoid);
+    for (; aEdgesIt.More (); aEdgesIt.Next ())
+    {
+      const TopoDS_Edge& aEdge = TopoDS::Edge (aEdgesIt.Current ());
+      if (!BRep_Tool::IsGeometric (aEdge))
+      {
+        continue;
+      }
+
+      theVisitor->Visit (aEdge);
+    }
+  }
+}
+
 //=======================================================================
 // Function: Constructor
 // Purpose : 
@@ -50,28 +76,15 @@ 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 ())
-  {
-    const TopoDS_Edge& aEdge = TopoDS::Edge (aEdgeIt.Value ());
-    if (!BRep_Tool::IsGeometric(aEdge))
-    {
-      continue;
-    }
+  // Explore all free edges in shape.
+  visitEdges (theVisitor, GetShape (), TopAbs_EDGE, TopAbs_FACE);
 
-    theVisitor->Visit (aEdge);
-  }
-
-  // Explore faces
+  // Explore all related to some face edges in shape.
+  // make array of faces suitable for processing (excluding faces without surface)
   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);
@@ -84,13 +97,16 @@ void IMeshTools_ShapeExplorer::Accept (
       continue; // already processed
     }
 
-    TopoDS_Face aFace = TopoDS::Face (aFaceIter.Value ());
+    const TopoDS_Face& aFace = TopoDS::Face (aFaceIter.Value ());
     const Handle (Geom_Surface)& aSurf = BRep_Tool::Surface (aFace, aDummyLoc);
     if (aSurf.IsNull())
     {
       continue;
     }
 
+    // Explore all edges in face.
+    visitEdges (theVisitor, aFace, TopAbs_EDGE);
+
     // Store only forward faces in order to prevent inverse issue.
     theVisitor->Visit (TopoDS::Face (aFace.Oriented (TopAbs_FORWARD)));
   }
index 0ef6bc4..a4544ad 100755 (executable)
@@ -68,7 +68,7 @@ set mem_delta_private 200
 set mem_delta_swap 120
 set mem_delta_swappeak 250
 set mem_delta_wset 200
-set mem_delta_wsetpeak 220
+set mem_delta_wsetpeak 300
 set mem_delta_virt 220
 set mem_delta_heap 80
 
diff --git a/tests/bugs/moddata_3/bug30497 b/tests/bugs/moddata_3/bug30497
new file mode 100644 (file)
index 0000000..0fb0e7f
--- /dev/null
@@ -0,0 +1,17 @@
+puts "======="
+puts "0030497 \[REGRESSION\] Mesh - wrong Poly_Polygon3D within local selection of located shape"
+puts "======="
+puts ""
+
+pload XDE
+testreadstep [locate_data_file as1-oc-214-mat.stp] s
+
+vclear
+vinit View1
+vaxo
+vdisplay s -dispmode 1
+vfit
+vselmode 2 1
+vmoveto 150 201
+
+vdump ${imagedir}/${casename}.png