]> OCCT Git - occt.git/commitdiff
0032607: Modeling Algorithms - BOPAlgo_BOP returns incomplete result CR0-WEEK-40 IR-2021-10-08
authorifv <ifv@opencascade.com>
Mon, 4 Oct 2021 14:25:56 +0000 (17:25 +0300)
committersmoskvin <smoskvin@opencascade.com>
Fri, 8 Oct 2021 17:51:50 +0000 (20:51 +0300)
IntPatch/IntPatch_ImpPrmIntersection.cxx - decreasing step for some conditions
tests/lowalgos/intss/bug32607 - test case added

src/IntPatch/IntPatch_ImpPrmIntersection.cxx
tests/lowalgos/intss/bug32607 [new file with mode: 0644]

index 320af323b38d0d86bf261205c32d8d78af2fa2b6..483d1c2f341104798e49413ded0c6d2bc115e1e7 100644 (file)
@@ -81,6 +81,11 @@ static
                               const Standard_Real theToler2D,
                               const Standard_Real thePeriod);
 
+static
+  Standard_Real GetLocalStep(const Handle(Adaptor3d_Surface)& theSurf,
+                             const Standard_Real theStep);
+
+
 //=======================================================================
 //function : IsSeamOrPole
 //purpose  : 
@@ -481,6 +486,81 @@ void Recadre(const Standard_Boolean ,
   pt.SetParameters(U1,V1,U2,V2);
 }
 
+//=======================================================================
+//function : GetLocalStep
+//purpose  : 
+//=======================================================================
+Standard_Real GetLocalStep(const Handle(Adaptor3d_Surface)& theSurf,
+                                  const Standard_Real theStep)
+{
+  Standard_Real aLocalStep = theStep;
+  if (theSurf->UContinuity() > GeomAbs_C0 && theSurf->VContinuity() > GeomAbs_C0)
+  {
+    GeomAbs_SurfaceType aSType = theSurf->GetType();
+
+    if (aSType == GeomAbs_BezierSurface || aSType == GeomAbs_BSplineSurface)
+    {
+      Standard_Real aMinRes = Precision::Infinite();
+      Standard_Integer aMaxDeg = 0;
+      const Standard_Real aLimRes = 1.e-10;
+
+      aMinRes = Min(theSurf->UResolution(Precision::Confusion()),
+                    theSurf->VResolution(Precision::Confusion()));
+      aMaxDeg = Max(theSurf->UDegree(), theSurf->VDegree());
+      if (aMinRes < aLimRes && aMaxDeg > 3)
+      {
+        aLocalStep = 0.0001;
+      }
+    }
+  }
+  if (theSurf->UContinuity() == GeomAbs_C0)
+  {
+    Standard_Integer aNbInt = theSurf->NbUIntervals(GeomAbs_C1);
+    if (aNbInt > 1)
+    {
+      TColStd_Array1OfReal anInts(1, aNbInt + 1);
+      theSurf->UIntervals(anInts, GeomAbs_C1);
+      Standard_Integer i;
+      Standard_Real aMinInt = Precision::Infinite();
+      for (i = 1; i <= aNbInt; ++i)
+      {
+        aMinInt = Min(aMinInt, anInts(i + 1) - anInts(i));
+      }
+
+      aMinInt /= theSurf->LastUParameter() - theSurf->FirstUParameter();
+      if (aMinInt < 0.002)
+      {
+        aLocalStep = 0.0001;
+      }
+    }
+
+  }
+
+  if (theSurf->VContinuity() == GeomAbs_C0)
+  {
+    Standard_Integer aNbInt = theSurf->NbVIntervals(GeomAbs_C1);
+    if (aNbInt > 1)
+    {
+      TColStd_Array1OfReal anInts(1, aNbInt + 1);
+      theSurf->VIntervals(anInts, GeomAbs_C1);
+      Standard_Integer i;
+      Standard_Real aMinInt = Precision::Infinite();
+      for (i = 1; i <= aNbInt; ++i)
+      {
+        aMinInt = Min(aMinInt, anInts(i + 1) - anInts(i));
+      }
+
+      aMinInt /= theSurf->LastVParameter() - theSurf->FirstVParameter();
+      if (aMinInt < 0.002)
+      {
+        aLocalStep = 0.0001;
+      }
+    }
+  }
+
+  aLocalStep = Min(theStep, aLocalStep);
+  return aLocalStep;
+}
 //=======================================================================
 //function : Perform
 //purpose  : 
@@ -587,35 +667,10 @@ void IntPatch_ImpPrmIntersection::Perform (const Handle(Adaptor3d_Surface)& Surf
   }
   //
   Standard_Real aLocalPas = Pas;
-   GeomAbs_SurfaceType aSType = reversed ? Surf1->GetType() : Surf2->GetType();
-
-  if (aSType == GeomAbs_BezierSurface || aSType == GeomAbs_BSplineSurface)
-  {
-    Standard_Real aMinRes = Precision::Infinite();
-    GeomAbs_Shape aCont = GeomAbs_C0;
-    Standard_Integer aMaxDeg = 0;
-    const Standard_Real aLimRes = 1.e-10;
-
-    if (reversed)
-    {
-      aMinRes = Min(Surf1->UResolution(Precision::Confusion()),
-        Surf1->VResolution(Precision::Confusion()));
-      aCont = (GeomAbs_Shape)Min(Surf1->UContinuity(), Surf1->VContinuity());
-      aMaxDeg = Max(Surf1->UDegree(), Surf1->VDegree());
-    }
-    else
-    {
-      aMinRes = Min(Surf2->UResolution(Precision::Confusion()),
-        Surf2->VResolution(Precision::Confusion()));
-      aCont = (GeomAbs_Shape)Min(Surf2->UContinuity(), Surf2->VContinuity());
-      aMaxDeg = Max(Surf2->UDegree(), Surf2->VDegree());
-    }
-
-    if (aMinRes < aLimRes && aCont > GeomAbs_C0 && aMaxDeg > 3)
-    {
-      aLocalPas = Min(Pas, 0.0001);
-    }
-  }
+  if (reversed)
+    aLocalPas = GetLocalStep(Surf1, Pas);
+  else
+    aLocalPas = GetLocalStep(Surf2, Pas);
 
   Func.SetImplicitSurface(Quad);
   Func.Set(IntSurf_QuadricTool::Tolerance(Quad));
diff --git a/tests/lowalgos/intss/bug32607 b/tests/lowalgos/intss/bug32607
new file mode 100644 (file)
index 0000000..746f547
--- /dev/null
@@ -0,0 +1,24 @@
+puts "========"
+puts "0032607: Modeling Algorithms - BOPAlgo_BOP returns incomplete result"
+puts "========"
+puts ""
+
+restore [locate_data_file bug32607.brep] s
+explode s 
+
+regexp {Tolerance Reached=+([-0-9.+eE]+)\n+([-0-9.+eE]+)} [bopcurves s_1 s_2 -2d] full Toler NbCurv
+
+checkreal Tolerance $Toler 0.0011727990276470168 1.0e-7 0.0
+if {$NbCurv != 1} {
+  puts "Error: Please check NbCurves for intersector"
+} else {
+  checklength c_1 -l 14.469397997508448
+  CheckLoops c_1
+}
+
+smallview 
+don c_*
+fit
+disp s_1 s_2
+
+checkview -screenshot -2d -path ${imagedir}/${test_image}.png