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