0024475: Regression on OCCT6.6.0 relative to OCCT6.5.3: wrong result of ThruSections...
[occt.git] / src / BRepFill / BRepFill_CompatibleWires.cxx
old mode 100755 (executable)
new mode 100644 (file)
index 24f4678..0b8e372
@@ -1,8 +1,18 @@
-// File:       BRepFill_CompatibleWires.cxx
-// Created:    Thu Jul  2 16:47:25 1998
-// Author:     Joelle CHAUVET
-//             <jct@sgi64>
-
+// Created on: 1998-07-02
+// Created by: Joelle CHAUVET
+// Copyright (c) 1998-1999 Matra Datavision
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and / or modify it
+// under the terms of the GNU Lesser General Public version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
 
 #include <BRepFill_CompatibleWires.ixx>
 
@@ -53,7 +63,7 @@
 #include <TColStd_Array1OfReal.hxx>
 #include <TColStd_SequenceOfReal.hxx>
 
-
+#ifdef DEB_EFV
 static void EdgesFromVertex (const TopoDS_Wire&   W,
                             const TopoDS_Vertex& V, 
                             TopoDS_Edge& E1, 
@@ -104,7 +114,7 @@ static void EdgesFromVertex (const TopoDS_Wire&   W,
   }
 }
                                      
-
+#endif
 static void SeqOfVertices (const TopoDS_Wire&   W,
                           TopTools_SequenceOfShape& S)
 {
@@ -913,11 +923,6 @@ void BRepFill_CompatibleWires::
     
     // extremity of the first wire
     V1 = TopoDS::Vertex(SeqV.Value(1));        
-    // previous wire 
-#ifdef DEB
-    const TopoDS_Wire& wire2 = 
-#endif
-      TopoDS::Wire(myWork(i-1));
     // loop on vertices of wire1
     for (ii=1;ii<=SeqV.Length();ii++) {
       
@@ -1362,7 +1367,7 @@ void BRepFill_CompatibleWires::SameNumberByACR(const  Standard_Boolean  report)
 //purpose  : 
 //=======================================================================
 
-void BRepFill_CompatibleWires::ComputeOrigin(const  Standard_Boolean polar )
+void BRepFill_CompatibleWires::ComputeOrigin(const  Standard_Boolean /*polar*/ )
 {
   // reorganize the wires respecting orientation and origin
   
@@ -1450,9 +1455,24 @@ void BRepFill_CompatibleWires::ComputeOrigin(const  Standard_Boolean polar )
   Standard_Integer nbs, NbSamples = 0;
   if (theLength <= 2)
     NbSamples = 4;
+  gp_Pln FirstPlane;
+  PlaneOfWire(TopoDS::Wire(myWork(ideb)), FirstPlane);
+  gp_Pnt FirstBary = FirstPlane.Location();
+  gp_Vec NormalOfFirstPlane = FirstPlane.Axis().Direction();
   for (i = ideb+1; i <= ifin; i++)
     {
       const TopoDS_Wire& wire = TopoDS::Wire(myWork(i));
+
+      //Compute offset vector as current bary center projected on first plane
+      //to first bary center
+      gp_Pln CurPlane;
+      PlaneOfWire(wire, CurPlane);
+      gp_Pnt CurBary = CurPlane.Location();
+      gp_Vec aVec(FirstBary, CurBary);
+      gp_Vec anOffsetProj = (aVec * NormalOfFirstPlane) * NormalOfFirstPlane;
+      CurBary.Translate(-anOffsetProj); //projected current bary center
+      gp_Vec Offset(CurBary, FirstBary);
+      
       TopoDS_Wire newwire;
       BRep_Builder BB;
       BB.MakeWire(newwire);
@@ -1465,8 +1485,8 @@ void BRepFill_CompatibleWires::ComputeOrigin(const  Standard_Boolean polar )
        }
       
       Standard_Real MinSumDist = Precision::Infinite();
-      Standard_Integer jmin, j, k, n;
-      Standard_Boolean forward;
+      Standard_Integer jmin = 1, j, k, n;
+      Standard_Boolean forward = Standard_False;
       if (i == myWork.Length() && myDegen2)
        {
          // last point section
@@ -1483,7 +1503,7 @@ void BRepFill_CompatibleWires::ComputeOrigin(const  Standard_Boolean polar )
                const TopoDS_Vertex& Vprev = TopoDS::Vertex( PrevSeq(n) );
                gp_Pnt Pprev = BRep_Tool::Pnt(Vprev);
                const TopoDS_Vertex& V = TopoDS::Vertex( SeqVertices(k) );
-               gp_Pnt P = BRep_Tool::Pnt(V);
+               gp_Pnt P = BRep_Tool::Pnt(V).XYZ() + Offset.XYZ();
                SumDist += Pprev.Distance(P);
                 if (NbSamples > 0)
                 {
@@ -1502,7 +1522,7 @@ void BRepFill_CompatibleWires::ComputeOrigin(const  Standard_Boolean polar )
                       (Ecurve.FirstParameter() + nbs*SampleOnCur) :
                       (Ecurve.FirstParameter() + (NbSamples-nbs)*SampleOnCur);
                     gp_Pnt PonPrev = PrevEcurve.Value(ParOnPrev);
-                    gp_Pnt PonCur = Ecurve.Value(ParOnCur);
+                    gp_Pnt PonCur = Ecurve.Value(ParOnCur).XYZ() + Offset.XYZ();
                     SumDist += PonPrev.Distance(PonCur);
                   }
                 }
@@ -1512,7 +1532,7 @@ void BRepFill_CompatibleWires::ComputeOrigin(const  Standard_Boolean polar )
                const TopoDS_Vertex& Vprev = TopoDS::Vertex( PrevSeq(n) );
                gp_Pnt Pprev = BRep_Tool::Pnt(Vprev);
                const TopoDS_Vertex& V = TopoDS::Vertex( SeqVertices(k) );
-               gp_Pnt P = BRep_Tool::Pnt(V);
+               gp_Pnt P = BRep_Tool::Pnt(V).XYZ() + Offset.XYZ();
                SumDist += Pprev.Distance(P);
                 if (NbSamples > 0)
                 {
@@ -1531,7 +1551,7 @@ void BRepFill_CompatibleWires::ComputeOrigin(const  Standard_Boolean polar )
                       (Ecurve.FirstParameter() + nbs*SampleOnCur) :
                       (Ecurve.FirstParameter() + (NbSamples-nbs)*SampleOnCur);
                     gp_Pnt PonPrev = PrevEcurve.Value(ParOnPrev);
-                    gp_Pnt PonCur = Ecurve.Value(ParOnCur);
+                    gp_Pnt PonCur = Ecurve.Value(ParOnCur).XYZ() + Offset.XYZ();
                     SumDist += PonPrev.Distance(PonCur);
                   }
                 }
@@ -1550,7 +1570,7 @@ void BRepFill_CompatibleWires::ComputeOrigin(const  Standard_Boolean polar )
                const TopoDS_Vertex& Vprev = TopoDS::Vertex( PrevSeq(n) );
                gp_Pnt Pprev = BRep_Tool::Pnt(Vprev);
                const TopoDS_Vertex& V = TopoDS::Vertex( SeqVertices(k) );
-               gp_Pnt P = BRep_Tool::Pnt(V);
+               gp_Pnt P = BRep_Tool::Pnt(V).XYZ() + Offset.XYZ();
                SumDist += Pprev.Distance(P);
                 if (NbSamples > 0)
                 {
@@ -1572,7 +1592,7 @@ void BRepFill_CompatibleWires::ComputeOrigin(const  Standard_Boolean polar )
                       (Ecurve.FirstParameter() + (NbSamples-nbs)*SampleOnCur) :
                       (Ecurve.FirstParameter() + nbs*SampleOnCur);
                     gp_Pnt PonPrev = PrevEcurve.Value(ParOnPrev);
-                    gp_Pnt PonCur = Ecurve.Value(ParOnCur);
+                    gp_Pnt PonCur = Ecurve.Value(ParOnCur).XYZ() + Offset.XYZ();
                     SumDist += PonPrev.Distance(PonCur);
                   }
                 }
@@ -1582,7 +1602,7 @@ void BRepFill_CompatibleWires::ComputeOrigin(const  Standard_Boolean polar )
                const TopoDS_Vertex& Vprev = TopoDS::Vertex( PrevSeq(n) );
                gp_Pnt Pprev = BRep_Tool::Pnt(Vprev);
                const TopoDS_Vertex& V = TopoDS::Vertex( SeqVertices(k) );
-               gp_Pnt P = BRep_Tool::Pnt(V);
+               gp_Pnt P = BRep_Tool::Pnt(V).XYZ() + Offset.XYZ();
                SumDist += Pprev.Distance(P);
                 if (NbSamples > 0)
                 {
@@ -1601,7 +1621,7 @@ void BRepFill_CompatibleWires::ComputeOrigin(const  Standard_Boolean polar )
                       (Ecurve.FirstParameter() + (NbSamples-nbs)*SampleOnCur) :
                       (Ecurve.FirstParameter() + nbs*SampleOnCur);
                     gp_Pnt PonPrev = PrevEcurve.Value(ParOnPrev);
-                    gp_Pnt PonCur = Ecurve.Value(ParOnCur);
+                    gp_Pnt PonCur = Ecurve.Value(ParOnCur).XYZ() + Offset.XYZ();
                     SumDist += PonPrev.Distance(PonCur);
                   }
                 }
@@ -1657,8 +1677,8 @@ void BRepFill_CompatibleWires::ComputeOrigin(const  Standard_Boolean polar )
       newwire.Orientation( TopAbs_FORWARD );
       myWork(i) = newwire;
     }
+#ifdef DEB_EFV
 
-/*  
   for ( i=ideb; i<=myWork.Length(); i++) {
     
     const TopoDS_Wire& wire = TopoDS::Wire(myWork(i));
@@ -1908,7 +1928,7 @@ void BRepFill_CompatibleWires::ComputeOrigin(const  Standard_Boolean polar )
       if (!Vsuiv.IsNull()) Psuiv=BRep_Tool::Pnt(Vsuiv);
     }
   }
-*/
+#endif
   
   // blocking sections ?
   if (vClosed) myWork(myWork.Length()) = myWork(1);