From 51607a487c98fde114260b552fb01de7bea1fdb7 Mon Sep 17 00:00:00 2001 From: nbv Date: Fri, 22 Sep 2017 11:24:35 +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 | 47 ++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 tests/perf/modalg/bug29093 diff --git a/src/IntWalk/IntWalk_PWalking.cxx b/src/IntWalk/IntWalk_PWalking.cxx index eed1c6334a..fa5bc45ede 100644 --- a/src/IntWalk/IntWalk_PWalking.cxx +++ b/src/IntWalk/IntWalk_PWalking.cxx @@ -1653,6 +1653,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_HSurface)& Caro1 = myIntersectionOn2S.Function().AuxillarSurface1(); + const Handle(Adaptor3d_HSurface)& 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; @@ -1664,6 +1678,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 (Abs(Param(1) - UFirst1) < ResoU1) + { + return bOutOfTangentZone; + } + else if (Abs(Param(2) - VFirst1) < ResoV1) + { + return bOutOfTangentZone; + } + else if (Abs(Param(3) - UFirst2) < ResoU2) + { + return bOutOfTangentZone; + } + else if (Abs(Param(4) - VFirst2) < ResoV2) + { + return bOutOfTangentZone; + } + + if (Abs(Param(1) - ULast1) < ResoU1) + { + return bOutOfTangentZone; + } + else if (Abs(Param(2) - VLast1) < ResoV1) + { + return bOutOfTangentZone; + } + else if (Abs(Param(3) - ULast2) < ResoU2) + { + return bOutOfTangentZone; + } + else if (Abs(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..10face3f4b --- /dev/null +++ b/tests/perf/modalg/bug29093 @@ -0,0 +1,47 @@ +puts "========" +puts "OCC29093" +puts "========" +puts "" +################################# +# BOP PaveFiller hungs and constantly consumes memory +################################# + +puts "TODO OCC28989 ALL : Error! Big tolerance value!" + +set mem_max_wsetpeak 100000000 + +bclearobjects; +bcleartools; + +restore [locate_data_file bug29093_hung.brep] a +explode a So +baddobjects a_1 +baddtools a_2 a_3 a_4 a_5 a_6 a_7 a_8 a_9 a_10 a_11 a_12 a_13 a_14 + +dchrono cr restart + +bfillds +bbop result 4 + +dchrono cr stop counter bbuild + +set mem_wsetpeak [meminfo wsetpeak] + +if { ${mem_wsetpeak} > ${mem_max_wsetpeak}} { + puts "Error : there is memory problem (${mem_wsetpeak} MBytes has been allocated)" +} + +regexp {Tolerance +MAX=([-0-9.+eE]+)} [tolerance result] full MaxTol + +# Maximal tolerance value must be updated after the fix. +# Current tolerance value is 803.89403359886296. + +if {${MaxTol} > 1.0e-4} { + puts "Error! Big tolerance value!" +} + +smallview +donly result +fit + +checkview -screenshot -2d -path ${imagedir}/${test_image}.png \ No newline at end of file -- 2.39.5