Salome HOME
Mantis issue 0020998: EDF 1572 GEOM: Some limitations to the PipeTShape.
[modules/geom.git] / src / GEOMImpl / GEOMImpl_FillingDriver.cxx
index cf893cd465531afbf63903fce464645e09aa9a1e..c70a3b04f4483c3a9f20f24d25f9217c06965aef 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -18,6 +18,7 @@
 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
 
 #include <Standard_Stream.hxx>
 
@@ -30,6 +31,7 @@
 #include <BRepAlgo.hxx>
 #include <BRepBuilderAPI_MakeFace.hxx>
 #include <BRep_Builder.hxx>
+#include <BRepBuilderAPI_Copy.hxx>
 
 #include <TopAbs.hxx>
 #include <TopoDS.hxx>
@@ -101,7 +103,12 @@ Standard_Integer GEOMImpl_FillingDriver::Execute(TFunction_Logbook& log) const
   GEOMImpl_IFilling IF (aFunction);
   Handle(GEOM_Function) aShapeFunction = IF.GetShape();
   if (aShapeFunction.IsNull()) return 0;
-  TopoDS_Shape aShape = aShapeFunction->GetValue();
+  TopoDS_Shape aShape;
+
+  BRepBuilderAPI_Copy Copy(aShapeFunction->GetValue());
+  if( Copy.IsDone() )
+    aShape = Copy.Shape();
+
   if (aShape.IsNull() || aShape.ShapeType() != TopAbs_COMPOUND) return 0;
 
   Standard_Integer mindeg = IF.GetMinDeg();
@@ -110,7 +117,7 @@ Standard_Integer GEOMImpl_FillingDriver::Execute(TFunction_Logbook& log) const
   Standard_Real tol2d = IF.GetTol3D();
   Standard_Integer nbiter = IF.GetNbIter();
   Standard_Boolean isApprox = IF.GetApprox();
-  Standard_Boolean isUseOri = IF.GetUseOri();
+  Standard_Integer aMethod = IF.GetMethod();
 
   if (mindeg > maxdeg) {
     Standard_RangeError::Raise("Minimal degree can not be more than maximal degree");
@@ -224,6 +231,8 @@ Standard_Integer GEOMImpl_FillingDriver::Execute(TFunction_Logbook& log) const
     // make filling as in old version of SALOME (before 4.1.1)
     GeomFill_SectionGenerator Section;
     Standard_Integer i = 0;
+    Handle(Geom_Curve) aLastC;
+    gp_Pnt PL1,PL2;
     for (Ex.Init(aShape, TopAbs_EDGE); Ex.More(); Ex.Next()) {
       Scurrent = Ex.Current();
       if (Scurrent.IsNull() || Scurrent.ShapeType() != TopAbs_EDGE) return 0;
@@ -235,9 +244,33 @@ Standard_Integer GEOMImpl_FillingDriver::Execute(TFunction_Logbook& log) const
       //else
       //  C = new Geom_TrimmedCurve(C, First, Last);
       C = new Geom_TrimmedCurve(C, First, Last);
-      if( isUseOri && Scurrent.Orientation() == TopAbs_REVERSED ) {
+      gp_Pnt P1,P2;
+      C->D0(First,P1);
+      C->D0(Last,P2);
+
+      if( aMethod==1 && Scurrent.Orientation() == TopAbs_REVERSED ) {
         C->Reverse();
       }
+      else if( aMethod==2 ) {
+        if( i==0 ) {
+          PL1 = P1;
+          PL2 = P2;
+        }
+        else {
+          double d1 = PL1.Distance(P1) + PL2.Distance(P2);
+          double d2 = PL1.Distance(P2) + PL2.Distance(P1);
+          if(d2<d1) {
+            C->Reverse();
+            PL1 = P2;
+            PL2 = P1;
+          }
+          else {
+            PL1 = P1;
+            PL2 = P2;
+          }
+        }
+      }
+
       Section.AddCurve(C);
       i++;
     }