From 5cbd98a5be543f46a215b4e7bede5e04a1ccee2f Mon Sep 17 00:00:00 2001 From: akaftasev Date: Fri, 14 Oct 2022 11:00:50 +0300 Subject: [PATCH] 0029093: BOP PaveFiller hungs and constantly consumes memory 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 | 50 ++++++++++++++++++++++++++++++++ tests/perf/modalg/bug29093 | 30 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 tests/perf/modalg/bug29093 diff --git a/src/IntWalk/IntWalk_PWalking.cxx b/src/IntWalk/IntWalk_PWalking.cxx index 464e42f876..bc32b6a9ed 100644 --- a/src/IntWalk/IntWalk_PWalking.cxx +++ b/src/IntWalk/IntWalk_PWalking.cxx @@ -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 index 0000000000..43f155e093 --- /dev/null +++ b/tests/perf/modalg/bug29093 @@ -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