]> OCCT Git - occt.git/commitdiff
0029093: BOP PaveFiller hungs and constantly consumes memory
authorakaftasev <akaftasev@opencascade.com>
Fri, 14 Oct 2022 08:00:50 +0000 (11:00 +0300)
committersmoskvin <smoskvin@opencascade.com>
Mon, 31 Oct 2022 16:18:07 +0000 (19:18 +0300)
Method IntWalk_PWalking::ExtendLineInCommonZone(...) now is not called if the already found intersection point is on surface boundary.
As result, the intersection line going along any boundary will never be extended. It is appropriate for high-level OCCT-algorithm because they will take the boundary (not computed line) as intersection result.

src/IntWalk/IntWalk_PWalking.cxx
tests/perf/modalg/bug29093 [new file with mode: 0644]

index 464e42f8767811112e86178de9666398ae63027b..bc32b6a9edb8d4c41be79a716800893d74f8ebbc 100644 (file)
@@ -1694,6 +1694,20 @@ void IntWalk_PWalking::Perform(const TColStd_Array1OfReal& ParDep,
 Standard_Boolean IntWalk_PWalking::ExtendLineInCommonZone(const IntImp_ConstIsoparametric theChoixIso,
                                                           const Standard_Boolean          theDirectionFlag) 
 {
+  // Caro1 and Caro2
+  const Handle(Adaptor3d_Surface)& Caro1 = myIntersectionOn2S.Function().AuxillarSurface1();
+  const Handle(Adaptor3d_Surface)& Caro2 = myIntersectionOn2S.Function().AuxillarSurface2();
+  //
+  const Standard_Real UFirst1 = Adaptor3d_HSurfaceTool::FirstUParameter(Caro1);
+  const Standard_Real VFirst1 = Adaptor3d_HSurfaceTool::FirstVParameter(Caro1);
+  const Standard_Real ULast1 = Adaptor3d_HSurfaceTool::LastUParameter(Caro1);
+  const Standard_Real VLast1 = Adaptor3d_HSurfaceTool::LastVParameter(Caro1);
+
+  const Standard_Real UFirst2 = Adaptor3d_HSurfaceTool::FirstUParameter(Caro2);
+  const Standard_Real VFirst2 = Adaptor3d_HSurfaceTool::FirstVParameter(Caro2);
+  const Standard_Real ULast2 = Adaptor3d_HSurfaceTool::LastUParameter(Caro2);
+  const Standard_Real VLast2 = Adaptor3d_HSurfaceTool::LastVParameter(Caro2);
+
   Standard_Boolean bOutOfTangentZone = Standard_False;
   Standard_Boolean bStop = !myIntersectionOn2S.IsTangent();
   Standard_Integer dIncKey = 1;
@@ -1705,6 +1719,42 @@ Standard_Boolean IntWalk_PWalking::ExtendLineInCommonZone(const IntImp_ConstIsop
   Standard_Integer uvit = 0;
   IntSurf_SequenceOfPntOn2S aSeqOfNewPoint;
 
+  previousPoint.Parameters(Param(1), Param(2), Param(3), Param(4));
+
+  if (Param(1) - UFirst1 < ResoU1)
+  {
+    return bOutOfTangentZone;
+  }
+  else if (Param(2) - VFirst1 < ResoV1)
+  {
+    return bOutOfTangentZone;
+  }
+  else if (Param(3) - UFirst2 < ResoU2)
+  {
+    return bOutOfTangentZone;
+  }
+  else if (Param(4) - VFirst2 < ResoV2)
+  {
+    return bOutOfTangentZone;
+  }
+
+  if (Param(1) - ULast1 > -ResoU1)
+  {
+    return bOutOfTangentZone;
+  }
+  else if (Param(2) - VLast1 > -ResoV1)
+  {
+    return bOutOfTangentZone;
+  }
+  else if (Param(3) - ULast2 > -ResoU2)
+  {
+    return bOutOfTangentZone;
+  }
+  else if (Param(4) - VLast2 > -ResoV2)
+  {
+    return bOutOfTangentZone;
+  }
+
   while (!bStop) {
     nbIterWithoutAppend++;
 
diff --git a/tests/perf/modalg/bug29093 b/tests/perf/modalg/bug29093
new file mode 100644 (file)
index 0000000..43f155e
--- /dev/null
@@ -0,0 +1,30 @@
+puts "========"
+puts "0029093: BOP PaveFiller hungs and constantly consumes memory"
+puts "========"
+puts ""
+
+bclearobjects;
+bcleartools;
+
+restore [locate_data_file bug29093.brep] a
+
+explode a So
+baddobjects a_7
+baddtools a_9
+
+dchrono cr restart
+
+bfillds
+bbuild result
+
+dchrono cr stop counter bbuild
+
+checkshape result
+checkprops result -s 1329680 -v 34507100
+checknbshapes result -vertex 5 -edge 13 -wire 9 -face 9 -shell 3 -solid 3 
+
+smallview
+donly result
+fit
+
+checkview -display result -2d -path ${imagedir}/${test_image}.png