0026498: BRepOffsetAPI_MakeOffset causes segmentation fault
authorisn <isn@opencascade.com>
Thu, 27 Aug 2015 10:52:14 +0000 (13:52 +0300)
committerski <ski@opencascade.com>
Thu, 27 Aug 2015 12:30:15 +0000 (15:30 +0300)
Test case for issue CR26498

src/BRepFill/BRepFill_OffsetWire.cxx
tests/bugs/modalg_6/bug26498 [new file with mode: 0755]

index e644d9d..7aaf944 100644 (file)
@@ -222,6 +222,8 @@ static void MakeOffset
  const GeomAbs_JoinType                      theJoinType,
   const TopoDS_Vertex *                       Ends);
 
+Standard_Boolean CheckSmallParamOnEdge(const TopoDS_Edge& anEdge);
+
 //=======================================================================
 //function : KPartCircle
 //purpose  : 
@@ -1379,6 +1381,8 @@ void BRepFill_OffsetWire::MakeWires()
       TopExp::Vertices (E,V1,V2);
       if (V1.IsSame(V2) && IsSmallClosedEdge(E, V1))
         continue; //remove small closed edges
+      if (!CheckSmallParamOnEdge(E))
+        continue;
       if (!MVE.Contains(V1)) {
         TopTools_ListOfShape empty;
         MVE.Add(V1,empty);
@@ -2756,3 +2760,18 @@ static void QuasiFleche(const Adaptor3d_Curve& C,
   }
 }
 
+Standard_Boolean CheckSmallParamOnEdge(const TopoDS_Edge& anEdge)
+{  
+  const BRep_ListOfCurveRepresentation& aList = ((Handle(BRep_TEdge)::DownCast(anEdge.TShape()))->Curves());
+  if (!aList.IsEmpty())
+  {
+    Handle( BRep_CurveRepresentation ) CRep = ((Handle(BRep_TEdge)::DownCast(anEdge.TShape()))->Curves()).First();
+    Standard_Real f = (Handle(BRep_GCurve)::DownCast(CRep))->First();
+    Standard_Real l = (Handle(BRep_GCurve)::DownCast(CRep))->Last();
+    if (Abs (l - f) < Precision::PConfusion())
+      return Standard_False;
+  }
+  return Standard_True;
+}
+
+
diff --git a/tests/bugs/modalg_6/bug26498 b/tests/bugs/modalg_6/bug26498
new file mode 100755 (executable)
index 0000000..864859f
--- /dev/null
@@ -0,0 +1,42 @@
+puts "============"
+puts "OCC26498"
+puts "============"
+puts ""
+#######################################################################
+# BRepOffsetAPI_MakeOffset causes segmentation fault
+#######################################################################
+
+polyline w 0 0 0 0.2 0 0 0.2 0.2 0 0.4 0.2 0 0.4 0.4 0 -0.06 0.57 0
+
+smallview
+display w
+fit
+
+if [catch { openoffset r w 1 -0.2 i } ] {
+  puts "Error : openoffset is wrong"
+} else {
+  renamevar r_1 result
+
+  set length 0.272485
+
+  set nbshapes_expected "
+Number of shapes in shape
+ VERTEX    : 3
+ EDGE      : 2
+ WIRE      : 1
+ FACE      : 0
+ SHELL     : 0
+ SOLID     : 0
+ COMPSOLID : 0
+ COMPOUND  : 0
+ SHAPE     : 6
+"
+  checknbshapes result -ref ${nbshapes_expected} -t -m "Offset"
+
+  checkshape result
+
+  display result
+  fit
+}
+
+set only_screen_axo 1