From: aml Date: Thu, 30 Oct 2014 09:04:27 +0000 (+0300) Subject: 0025380: Intersection curve cannot reach boundary of surface X-Git-Tag: V6_8_0~45 X-Git-Url: http://git.dev.opencascade.org/gitweb/?p=occt.git;a=commitdiff_plain;h=1eaf1cc1dc3c52ef79436eae1b5f977d05afea98 0025380: Intersection curve cannot reach boundary of surface Changed next point computation in IntWalk_PWalker.cxx. Now trying to walk over another isoline if new point is too close to previous. Test case for issue CR25380 --- diff --git a/src/IntWalk/IntWalk_PWalking.cxx b/src/IntWalk/IntWalk_PWalking.cxx index 17d1c13c0a..9834a6a822 100644 --- a/src/IntWalk/IntWalk_PWalking.cxx +++ b/src/IntWalk/IntWalk_PWalking.cxx @@ -783,7 +783,43 @@ void IntWalk_PWalking::Perform(const TColStd_Array1OfReal& ParDep, SvParam[2]=Param(3); SvParam[3]=Param(4); // - ChoixIso= myIntersectionOn2S.Perform(Param, Rsnld, ChoixIso); + Standard_Integer aTryNumber = 0; + Standard_Real isBadPoint = Standard_False; + IntImp_ConstIsoparametric aBestIso = ChoixIso; + do + { + isBadPoint = Standard_False; + + ChoixIso= myIntersectionOn2S.Perform(Param, Rsnld, aBestIso); + + if (myIntersectionOn2S.IsDone() && !myIntersectionOn2S.IsEmpty()) + { + Standard_Real aNewPnt[4], anAbsParamDist[4]; + myIntersectionOn2S.Point().Parameters(aNewPnt[0], aNewPnt[1], aNewPnt[2], aNewPnt[3]); + + if (aNewPnt[0] < u1min || aNewPnt[0] > u1max || + aNewPnt[1] < v1min || aNewPnt[1] > v1max || + aNewPnt[2] < u2min || aNewPnt[2] > u2max || + aNewPnt[3] < v2min || aNewPnt[3] > v2max) + { + break; // Out of borders, handle this later. + } + + anAbsParamDist[0] = Abs(Param(1) - dP1 - aNewPnt[0]); + anAbsParamDist[1] = Abs(Param(2) - dP2 - aNewPnt[1]); + anAbsParamDist[2] = Abs(Param(3) - dP3 - aNewPnt[2]); + anAbsParamDist[3] = Abs(Param(4) - dP4 - aNewPnt[3]); + if (anAbsParamDist[0] < ResoU1 && + anAbsParamDist[1] < ResoV1 && + anAbsParamDist[2] < ResoU2 && + anAbsParamDist[3] < ResoV2 && + Status != IntWalk_PasTropGrand) + { + isBadPoint = Standard_True; + aBestIso = IntImp_ConstIsoparametric((aBestIso + 1) % 4); + } + } + } while (isBadPoint && ++aTryNumber <= 4); // if (!myIntersectionOn2S.IsDone()) { diff --git a/tests/bugs/modalg_5/bug25380 b/tests/bugs/modalg_5/bug25380 new file mode 100755 index 0000000000..f472350ea3 --- /dev/null +++ b/tests/bugs/modalg_5/bug25380 @@ -0,0 +1,32 @@ +puts "================" +puts "OCC25380" +puts "================" +puts "" +####################################################################### +# Intersection curve cannot reach boundary of surface +####################################################################### + +restore [locate_data_file bug25380_b1.brep] b1 +restore [locate_data_file bug25380_b2.brep] b2 + +set log [bopcurves b1 b2] + +regexp {Tolerance Reached=+([-0-9.+eE]+)\n+([-0-9.+eE]+)} ${log} full Toler NbCurv +set MaxTol 1.e-11 +if {${Toler} > ${MaxTol}} { + puts "Error: Tolerance is too big!" +} + +regexp {The length c_1 is ([-0-9.+eE]+)} [length c_1] full Curve_Length + +set expected_length 1.614 +set tol_abs_length 1.e-3 +set tol_rel_length 0.01 +checkreal "Curve length" ${Curve_Length} ${expected_length} ${tol_abs_length} ${tol_rel_length} + +smallview +donly c_1 b1 +fit +display b2 + +set only_screen_axo 1