0022717: Exception during sewing
authorAMA <>
Thu, 29 Dec 2011 11:41:55 +0000 (11:41 +0000)
committerbugmaster <bugmaster@opencascade.com>
Mon, 5 Mar 2012 15:31:53 +0000 (19:31 +0400)
src/BRepLib/BRepLib.cdl
src/BRepLib/BRepLib.cxx
src/ShapeBuild/ShapeBuild_Edge.cxx
src/ShapeFix/ShapeFix_Wire.cxx

index 808ff54..f2a5f8f 100755 (executable)
@@ -191,7 +191,7 @@ is
        ---Purpose: Computes the 3d curve for the edge  <E> if it does
        --          not exist. Returns True  if the curve was computed
        --          or  existed. Returns False  if there is no  planar
-       --          pcurve. 
+       --          pcurve or the computation failed. 
        --          <MaxSegment> >= 30 in approximation
 
     BuildCurves3d(S : Shape from TopoDS ;
index 314f903..13f03e4 100755 (executable)
@@ -347,7 +347,8 @@ Standard_Boolean  BRepLib::BuildCurve3d(const TopoDS_Edge& AnEdge,
     // compute the 3d curve
     gp_Ax2 axes = P->Position().Ax2();
     Handle(Geom_Curve) C3d = GeomLib::To3d(axes,PC);
-
+    if (C3d.IsNull())
+      return Standard_False;
     // update the edge
     Standard_Real First, Last;
 
@@ -419,7 +420,8 @@ Standard_Boolean  BRepLib::BuildCurve3d(const TopoDS_Edge& AnEdge,
       //Patch
       //max_deviation = Max(tolerance, max_deviation) ;
       max_deviation = Max( tolerance, Tolerance );
-
+      if (NewCurvePtr.IsNull())
+        return Standard_False;
       Standard_Boolean is_closed ;
       is_closed = AnEdge.Closed() ;
       B.UpdateEdge(TopoDS::Edge(AnEdge),
index e2eb2ae..0c2f8e2 100755 (executable)
@@ -589,6 +589,8 @@ Standard_Boolean ShapeBuild_Edge::BuildCurve3d (const TopoDS_Edge& edge) const
       Handle(Geom_Curve) c3d;
       Standard_Real f,l;
       c3d = BRep_Tool::Curve(edge,f,l);
+      if (c3d.IsNull())
+        return Standard_False;
       // 15.11.2002 PTV OCC966
       if(!IsPeriodic(c3d)) {
        Standard_Boolean isLess = Standard_False;
index 428ef6f..5ed8357 100755 (executable)
@@ -668,14 +668,15 @@ Standard_Boolean ShapeFix_Wire::FixEdgeCurves()
         Handle(Geom2d_Curve) C;
         Handle(Geom_Surface) S;
         TopLoc_Location L;
-        Standard_Real first, last;
+        Standard_Real first = 0., last = 0.;
         BRep_Tool::CurveOnSurface ( sbwd->Edge(i), C, S, L, first, last );
-        if ( C.IsNull() )
+        if ( C.IsNull() || Abs (last - first) < Precision::PConfusion())
         {
           SendWarning ( sbwd->Edge ( i ), Message_Msg ( "FixWire.FixCurve3d.Removed" ) );// Incomplete edge (with no pcurves or 3d curve) removed
           sbwd->Remove ( i-- );
           nb--;
           myStatusEdgeCurves |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE5 );
+          FixConnected (i + 1, Precision());
         }
        myStatusEdgeCurves |= ShapeExtend::EncodeStatus ( ShapeExtend_FAIL5 );
       }