]> OCCT Git - occt.git/commitdiff
0032569: Modeling Algorithm - Section not found
authorifv <ifv@opencascade.com>
Tue, 14 Sep 2021 14:11:17 +0000 (17:11 +0300)
committersmoskvin <smoskvin@opencascade.com>
Tue, 28 Sep 2021 17:06:09 +0000 (20:06 +0300)
IntPatch/IntPatch_WLineTool.cxx - adding control of maximal ratio of distances between 3 sequential points.
tests/bugs/modalg_7/bug32569 - new test case added
tests/lowalgos/intss/bug29972_1 test case is modified according new behavior of intersection algorithm

src/IntPatch/IntPatch_WLineTool.cxx
tests/bugs/modalg_7/bug32569 [new file with mode: 0644]
tests/lowalgos/intss/bug29972_1

index 4ebe1e41365d3f928fb8b4b5e4cfe39b16461aa7..5e9e0103cc4a50c3afdc6586b87fd94ae733de9c 100644 (file)
@@ -385,11 +385,34 @@ static Standard_Boolean IsInsideIn3d(const gp_Pnt& aBasePnt,
 static const Standard_Integer aMinNbBadDistr = 15;
 static const Standard_Integer aNbSingleBezier = 30;
 
+//=========================================================================
+// function : IsSurfPlaneLike
+// purpose  : Define is surface plane like or not.
+//            Static subfunction in DeleteByTube.
+//=========================================================================
+static Standard_Boolean IsSurfPlaneLike(const Handle(Adaptor3d_Surface)   &theS)
+{
+  if (theS->GetType() == GeomAbs_Plane)
+  {
+    return Standard_True;
+  }
+
+  if (theS->GetType() == GeomAbs_BSplineSurface)
+  {
+    if (theS->UDegree() == 1 && theS->VDegree() == 1)
+    {
+      return Standard_True;
+    }
+  }
+
+  return Standard_False;
+}
 //=========================================================================
 // function : DeleteByTube
 // purpose  : Check and delete points using tube criteria.
 //            Static subfunction in ComputePurgedWLine.
 //=========================================================================
+
 static Handle(IntPatch_WLine)
   DeleteByTube(const Handle(IntPatch_WLine)       &theWLine,
                const Handle(Adaptor3d_Surface)   &theS1,
@@ -419,6 +442,7 @@ static Handle(IntPatch_WLine)
   gp_Vec2d aBase2dVec2(UonS2[1] - UonS2[0], VonS2[1] - VonS2[0]);
   gp_Pnt   aBase3dPnt = theWLine->Point(1).Value();
   gp_Vec   aBase3dVec(theWLine->Point(1).Value(), theWLine->Point(2).Value());
+  Standard_Real aPrevStep = aBase3dVec.SquareMagnitude();
 
   // Choose base tolerance and scale it to pipe algorithm.
   const Standard_Real aBaseTolerance = Precision::Approximation();
@@ -431,6 +455,8 @@ static Handle(IntPatch_WLine)
   Standard_Real aTol3d = aBaseTolerance * aBaseTolerance;
 
   const Standard_Real aLimitCoeff = 0.99 * 0.99;
+  const Standard_Real aMaxSqrRatio = 15. * 15.;
+  Standard_Boolean isPlanePlane = IsSurfPlaneLike(theS1) && IsSurfPlaneLike(theS2);
   for(i = 3; i <= theWLine->NbPnts(); i++)
   {
     Standard_Boolean isDeleteState = Standard_False;
@@ -466,14 +492,27 @@ static Handle(IntPatch_WLine)
       if (Min(aStepOnS1, aStepOnS2) >= aLimitCoeff * Max(aStepOnS1, aStepOnS2))
       {
         // Set hash flag to "Delete" state.
-        isDeleteState = Standard_True;
-        aNewPointsHash.SetValue(i - 1, 1);
-
-        // Change middle point.
-        UonS1[1] = UonS1[2];
-        UonS2[1] = UonS2[2];
-        VonS1[1] = VonS1[2];
-        VonS2[1] = VonS2[2];
+        Standard_Real aCurrStep = aBase3dPnt.SquareDistance(aPnt3d);
+        Standard_Real aSqrRatio = 0.;
+        if (!isPlanePlane)
+        {
+          aSqrRatio = aPrevStep / aCurrStep;
+          if (aSqrRatio < 1.)
+          {
+            aSqrRatio = 1. / aSqrRatio;
+          }        
+        }
+        if (aSqrRatio < aMaxSqrRatio)
+        {
+          isDeleteState = Standard_True;
+          aNewPointsHash.SetValue(i - 1, 1);
+
+          // Change middle point.
+          UonS1[1] = UonS1[2];
+          UonS2[1] = UonS2[2];
+          VonS1[1] = VonS1[2];
+          VonS2[1] = VonS2[2];
+        }
       }
     }
 
@@ -497,6 +536,8 @@ static Handle(IntPatch_WLine)
       aBase3dPnt = theWLine->Point(i - 1).Value();
       aBase3dVec = gp_Vec(theWLine->Point(i - 1).Value(), theWLine->Point(i).Value());
 
+      aPrevStep = aBase3dVec.SquareMagnitude();
+
       aNbPnt++;
     }
   }
diff --git a/tests/bugs/modalg_7/bug32569 b/tests/bugs/modalg_7/bug32569
new file mode 100644 (file)
index 0000000..4f3bfc6
--- /dev/null
@@ -0,0 +1,16 @@
+puts "================================================="
+puts "0032569: Modeling Algorithm - Section not found"
+puts "================================================="
+puts ""
+
+restore [locate_data_file bug32569.brep] s
+explode s
+
+bop s_1 s_2
+bopsection result
+
+checknbshapes result -vertex 2 -edge 1
+
+checkmaxtol result -min_tol 4.5e-4
+
+checkprops result -l 5.5227
index 3e14357e2b1fe00eeeef7445d29a15fe5824410b..ffc09878983e48a2dfdf397c0114b26e6ce94d25 100644 (file)
@@ -37,8 +37,8 @@ while { $AllowRepeat != 0 } {
       puts "Error: Wrong curve's range!"
     }
     
-    xdistcs res_$ic s1 U1 U2 100 2.0e-6
-    xdistcs res_$ic s2 U1 U2 100 2.0e-6
+    xdistcs res_$ic s1 U1 U2 100 3.0e-6
+    xdistcs res_$ic s2 U1 U2 100 3.0e-6
     
     mkedge ee res_$ic
     baddobjects ee