0024171: Eliminate CLang compiler warning -Wreorder
[occt.git] / src / ShapeFix / ShapeFix_Face.cxx
index 313300c..6349c01 100755 (executable)
@@ -41,6 +41,7 @@
 
 #include <Geom2d_Curve.hxx>
 #include <Geom2d_Line.hxx>
+#include <Geom2dAdaptor_Curve.hxx>
 #include <Geom_Curve.hxx>
 #include <Geom_BSplineSurface.hxx>
 #include <GeomAdaptor_HSurface.hxx>
@@ -270,7 +271,7 @@ void ShapeFix_Face::Add (const TopoDS_Wire& wire)
 //purpose  : auxilary - try to split wire (it is needed if some segments
 //           were removed in ShapeFix_Wire::FixSelfIntersection()
 //=======================================================================
-static Standard_Boolean SplitWire(const TopoDS_Wire& wire,
+static Standard_Boolean SplitWire(const TopoDS_Face &face, const TopoDS_Wire& wire,
                                   TopTools_SequenceOfShape& aResWires)
 {
   TColStd_MapOfInteger UsedEdges;
@@ -288,9 +289,10 @@ static Standard_Boolean SplitWire(const TopoDS_Wire& wire,
     sewd1->Add(E1);
     Standard_Boolean IsConnectedEdge = Standard_True;
     for(j=2; j<=sewd->NbEdges() && IsConnectedEdge; j++) {
+      TopoDS_Edge E2;
       for(k=2; k<=sewd->NbEdges(); k++) {
         if(UsedEdges.Contains(k)) continue;
-        TopoDS_Edge E2 = sewd->Edge(k);
+        E2 = sewd->Edge(k);
         TopoDS_Vertex V21 = sae.FirstVertex(E2);
         TopoDS_Vertex V22 = sae.LastVertex(E2);
         if( sae.FirstVertex(E2).IsSame(V1) ) {
@@ -300,15 +302,31 @@ static Standard_Boolean SplitWire(const TopoDS_Wire& wire,
           break;
         }
       }
-      if(V1.IsSame(V0)) {
-        // new wire is closed, put it into sequence
-        aResWires.Append(sewd1->Wire());
-        break;
-      }
       if(k>sewd->NbEdges()) {
         IsConnectedEdge = Standard_False;
         break;
       }
+      if(V1.IsSame(V0)) {
+        //check that V0 and V1 are same in 2d too
+        Standard_Real a1,b1,a2,b2;
+        Handle (Geom2d_Curve) curve1 = BRep_Tool::CurveOnSurface(E1,face,a1,b1);
+        Handle (Geom2d_Curve) curve2 = BRep_Tool::CurveOnSurface(E2,face,a2,b2);
+        gp_Pnt2d v0,v1;
+        if (E1.Orientation() == TopAbs_REVERSED)
+          a1 = b1;
+        if (E2.Orientation() == TopAbs_REVERSED)
+          b2 = a2;
+        curve1->D0(a1,v0);
+        curve2->D0(b2,v1);
+        GeomAdaptor_Surface anAdaptor(BRep_Tool::Surface(face));
+        Standard_Real tol = Max(BRep_Tool::Tolerance(V0),BRep_Tool::Tolerance(V1));
+        Standard_Real maxResolution = 2 * Max ( anAdaptor.UResolution(tol), anAdaptor.VResolution(tol) );
+        if (v0.SquareDistance(v1) < maxResolution) {
+          // new wire is closed, put it into sequence
+          aResWires.Append(sewd1->Wire());
+          break;
+        }
+      }
     }
     if(!IsConnectedEdge) {
       // create new notclosed wire
@@ -459,11 +477,13 @@ Standard_Boolean ShapeFix_Face::Perform()
       if ( ! Context().IsNull() ) Context()->Replace ( S, tmpFace );
       //myFace = tmpFace;
       isReplaced = Standard_True;
-      myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE1 );
-      
     }
-    if(fixed || isfixReorder)
+    if(fixed || isfixReorder) {
       myFace = tmpFace;
+      if (!theAdvFixWire->StatusReorder(ShapeExtend_DONE5)) {
+        myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE1 );
+      }
+    }
   }
   
   myResult = myFace;
@@ -588,14 +608,14 @@ Standard_Boolean ShapeFix_Face::Perform()
           B.Add (tmpFace,iter.Value());
           continue;
         }
-        if(iter.Value().Orientation() != TopAbs_FORWARD || 
+        if(iter.Value().Orientation() != TopAbs_FORWARD && 
            iter.Value().Orientation() != TopAbs_REVERSED) {
           B.Add (tmpFace,TopoDS::Wire(iter.Value()));
           continue;
         }
         nbw++;
         TopoDS_Wire wire = TopoDS::Wire ( iter.Value() );
-        SplitWire(wire,aWires);
+        SplitWire(tmpFace,wire,aWires);
       }
       if(nbw<aWires.Length()) {
         for(Standard_Integer iw=1; iw<=aWires.Length(); iw++)
@@ -1379,16 +1399,18 @@ Standard_Boolean ShapeFix_Face::FixMissingSeam()
   if ( ::Precision::IsInfinite ( SUF ) || ::Precision::IsInfinite ( SUL ) ) {
     if ( ::Precision::IsInfinite ( SUF ) ) SUF = fU1;
     if ( ::Precision::IsInfinite ( SUL ) ) SUL = fU2;
-    if(Abs(SUL-SUF) < ::Precision::PConfusion())
+    if(Abs(SUL-SUF) < ::Precision::PConfusion()) {
       if ( ::Precision::IsInfinite ( SUF ) ) SUF-=1000.;
       else SUL+=1000.;
+    }
   }
   if ( ::Precision::IsInfinite ( SVF ) || ::Precision::IsInfinite ( SVL ) ) {
     if ( ::Precision::IsInfinite ( SVF ) ) SVF = fV1;
     if ( ::Precision::IsInfinite ( SVL ) ) SVL = fV2;
-    if(Abs(SVL-SVF) < ::Precision::PConfusion())
+    if(Abs(SVL-SVF) < ::Precision::PConfusion()) {
       if ( ::Precision::IsInfinite ( SVF ) ) SVF-=1000.;
       else SVL+=1000.;
+    }
   }
     
   URange = Abs ( SUL - SUF );
@@ -1609,9 +1631,10 @@ Standard_Boolean ShapeFix_Face::FixMissingSeam()
        vf = pos1.Y();
       }
     }
-    if ( skipU && skipV ) 
+    if ( skipU && skipV ) {
       if ( i1 <= nb1 ) continue;
       else break;
+    }
     // or yet better - if it is end of some edges on both wires
     for ( Standard_Integer i2 = 1; i1 <= nb1 && i2 <= nb2; i2++ ) {
       TopoDS_Edge edge2 = wd2->Edge ( i2 );
@@ -1701,7 +1724,7 @@ Standard_Boolean ShapeFix_Face::FixSmallAreaWire()
   Standard_Real prec = ::Precision::PConfusion()*100;
   for (TopoDS_Iterator wi (myFace, Standard_False); wi.More(); wi.Next()) {
     if(wi.Value().ShapeType() != TopAbs_WIRE && 
-       (wi.Value().Orientation() != TopAbs_FORWARD || wi.Value().Orientation() != TopAbs_REVERSED))
+       (wi.Value().Orientation() != TopAbs_FORWARD && wi.Value().Orientation() != TopAbs_REVERSED))
         continue;
     TopoDS_Wire wire = TopoDS::Wire ( wi.Value() );
     Handle(ShapeAnalysis_Wire) saw = new ShapeAnalysis_Wire(wire,myFace,prec);
@@ -1947,29 +1970,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  : 
@@ -2214,18 +2214,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);