0024126: Crash on fixing the attached shape
[occt.git] / src / ShapeFix / ShapeFix_Face.cxx
index f6f3d75..9043a1d 100755 (executable)
@@ -443,7 +443,7 @@ Standard_Boolean ShapeFix_Face::Perform()
       }
       if ( theAdvFixWire->Perform() ) {
        //fixed = Standard_True; 
-        isfixReorder =  ((theAdvFixWire->StatusReorder(ShapeExtend_DONE) && !theAdvFixWire->StatusReorder(ShapeExtend_DONE5)) || isfixReorder);
+        isfixReorder =  (theAdvFixWire->StatusReorder(ShapeExtend_DONE) || isfixReorder);
         fixed = (theAdvFixWire->StatusSmall(ShapeExtend_DONE) || 
                theAdvFixWire->StatusConnected(ShapeExtend_DONE) ||
                theAdvFixWire->StatusEdgeCurves(ShapeExtend_DONE) ||
@@ -480,7 +480,9 @@ Standard_Boolean ShapeFix_Face::Perform()
     }
     if(fixed || isfixReorder) {
       myFace = tmpFace;
-      myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE1 );
+      if (!theAdvFixWire->StatusReorder(ShapeExtend_DONE5)) {
+        myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE1 );
+      }
     }
   }
   
@@ -1965,29 +1967,6 @@ Standard_Boolean ShapeFix_Face::FixLoopWire(TopTools_SequenceOfShape& aResWires)
   return isDone; 
 }
 
-
-//=======================================================================
-//function : GetPointOnEdge
-//purpose  : auxiliary
-//:h0 abv 29 May 98: PRO10105 1949: like in BRepCheck, point is to be taken 
-// from 3d curve (but only if edge is SameParameter)
-//=======================================================================
-static gp_Pnt GetPointOnEdge ( const TopoDS_Edge &edge, 
-                              const Handle(ShapeAnalysis_Surface) &surf,
-                              const Handle(Geom2d_Curve) &Crv2d, 
-                              const Standard_Real param )
-{
-  if ( BRep_Tool::SameParameter ( edge ) ) {
-    Standard_Real f,l;
-    TopLoc_Location L;
-    const Handle(Geom_Curve) ConS = BRep_Tool::Curve ( edge, L, f, l );
-    if ( ! ConS.IsNull() )
-      return ConS->Value ( param ).Transformed ( L.Transformation() );
-  }
-  return surf->Value ( Crv2d->Value ( param ) );
-}
-
-
 //=======================================================================
 //function : SplitEdge
 //purpose  : 
@@ -2232,18 +2211,24 @@ Standard_Boolean ShapeFix_Face::FixSplitFace(const TopTools_DataMapOfShapeListOf
   TopoDS_Shape S = myFace;
   if ( ! Context().IsNull() ) 
     S = Context()->Apply ( myFace );
-  Standard_Integer NbWires=0, NbWiresNew=0;
+  Standard_Integer NbWires=0, NbWiresNew=0, NbEdges;
   for(TopoDS_Iterator iter(S,Standard_False); iter.More(); iter.Next()) {
-    if(iter.Value().ShapeType() != TopAbs_WIRE || 
-       (iter.Value().Orientation() != TopAbs_FORWARD && iter.Value().Orientation() != TopAbs_REVERSED))
+    const TopoDS_Shape& aShape = iter.Value();
+    if(aShape.ShapeType() != TopAbs_WIRE || 
+       (aShape.Orientation() != TopAbs_FORWARD && aShape.Orientation() != TopAbs_REVERSED))
         continue;
-    TopoDS_Wire wire = TopoDS::Wire ( iter.Value() );
+    TopoDS_Wire wire = TopoDS::Wire ( aShape );
     NbWires++;
     if(MapWires.IsBound(wire)) {
       // if wire not closed --> stop split and return false
       Handle(ShapeExtend_WireData) sewd = new ShapeExtend_WireData(wire);
+      NbEdges = sewd->NbEdges();
+      if (NbEdges == 0) {
+        continue;
+      }
+      //
       TopoDS_Edge E1 = sewd->Edge(1);
-      TopoDS_Edge E2 = sewd->Edge(sewd->NbEdges());
+      TopoDS_Edge E2 = sewd->Edge(NbEdges);
       TopoDS_Vertex V1,V2;
       ShapeAnalysis_Edge sae;
       V1=sae.FirstVertex(E1);