]> OCCT Git - occt-copy.git/commitdiff
0029351: Boolean Operations create invalid pcurves
authoremv <emv@opencascade.com>
Tue, 5 Dec 2017 11:22:22 +0000 (14:22 +0300)
committernbv <nbv@opencascade.com>
Sat, 28 Apr 2018 06:31:13 +0000 (09:31 +0300)
When making pcurve for edge on face make sure that the produced 2D curve will have the same range as 3D curve of the edge.

(cherry picked from commit 0a807dd9a320d93306dfea222ae5976a7a355549)

src/BOPTools/BOPTools_AlgoTools2D.cxx

index 9697b92f561c0d37a9d62568ee3731cef13d58ad..2696de0e4e682c534d3590a51d70f62a9b48e487 100644 (file)
@@ -46,6 +46,7 @@
 #include <GeomAdaptor_HSurface.hxx>
 #include <GeomAdaptor_Surface.hxx>
 #include <GeomInt.hxx>
+#include <GeomLib.hxx>
 #include <GeomProjLib.hxx>
 #include <gp.hxx>
 #include <gp_Cylinder.hxx>
@@ -667,12 +668,25 @@ void BOPTools_AlgoTools2D::MakePCurveOnFace
   }
   //
   TolReached2d=aTolR;
-  //
+
+  // Adjust curve for periodic surface
   Handle(Geom2d_Curve) aC2DA;
   BOPTools_AlgoTools2D::AdjustPCurveOnSurf (*pBAS, aT1, aT2, aC2D, aC2DA);
-  //
-  aC2D=aC2DA;
-  //
+  aC2D = aC2DA;
+
+  // Make sure that the range of the 2D curve is sufficient for representation of the 3D curve.
+  Standard_Real aTCFirst = aC2D->FirstParameter();
+  Standard_Real aTCLast  = aC2D->LastParameter();
+  if ((aTCFirst - aT1) > Precision::PConfusion() ||
+      (aT2 - aTCLast ) > Precision::PConfusion())
+  {
+    if (aTCFirst < aT1) aTCFirst = aT1;
+    if (aTCLast  > aT2) aTCLast  = aT2;
+
+    GeomLib::SameRange(Precision::PConfusion(), aC2D,
+                       aTCFirst, aTCLast, aT1, aT2, aC2D);
+  }
+
   // compute the appropriate tolerance for the edge
   Handle(Geom_Surface) aS = pBAS->Surface().Surface();
   aS = Handle(Geom_Surface)::DownCast(aS->Transformed(pBAS->Trsf()));