From: jgv Date: Mon, 30 Mar 2020 18:18:47 +0000 (+0300) Subject: 0031470: Modeling Algorithms - Regression: BOP common produces empty result (box... X-Git-Tag: V7_5_0_beta~228 X-Git-Url: http://git.dev.opencascade.org/gitweb/?p=occt.git;a=commitdiff_plain;h=13dd311c9b73c9cf5234370206266fb746c8f309 0031470: Modeling Algorithms - Regression: BOP common produces empty result (box and holed sphere) Approx_ComputeCLine.gxx : new class field is added to manage hang checking. ProjLib/ProjLib_ComputeApprox.cxx : unset hang checking for analytical surfaces and curves --- diff --git a/src/Approx/Approx_ComputeCLine.gxx b/src/Approx/Approx_ComputeCLine.gxx index 51eab1d9f5..e5f49064a1 100644 --- a/src/Approx/Approx_ComputeCLine.gxx +++ b/src/Approx/Approx_ComputeCLine.gxx @@ -54,6 +54,7 @@ const AppParCurves_Constraint LastC) mylastC = LastC; myMaxSegments = MAXSEGM; myInvOrder = Standard_True; + myHangChecking = Standard_True; alldone = Standard_False; Perform(Line); } @@ -82,6 +83,7 @@ const AppParCurves_Constraint LastC) mylastC = LastC; myMaxSegments = MAXSEGM; myInvOrder = Standard_True; + myHangChecking = Standard_True; } //======================================================================= @@ -97,7 +99,15 @@ void Approx_ComputeCLine::Perform(const MultiLine& Line) Standard_Real thetol3d = Precision::Confusion(), thetol2d = Precision::Confusion(); UFirst = Line.FirstParameter(); ULast = Line.LastParameter(); - Standard_Real TolU = Max((ULast - UFirst)*1.e-03, Precision::Confusion()); + Standard_Real TolU = 0.; + if (myHangChecking) + { + TolU = Max((ULast - UFirst)*1.e-03, Precision::Confusion()); + } + else + { + TolU = Max((ULast - UFirst)*1.e-05, Precision::PApproximation()); + } Standard_Real myfirstU = UFirst; Standard_Real mylastU = ULast; Standard_Integer aMaxSegments = 0; @@ -176,7 +186,7 @@ void Approx_ComputeCLine::Perform(const MultiLine& Line) //cout << myfirstU << " - " << mylastU << " tol : " << thetol3d << " " << thetol2d << endl; Standard_Boolean aStopCutting = Standard_False; - if (aNbCut >= aNbComp) + if (myHangChecking && aNbCut >= aNbComp) { if (aNbCut > aNbImp + 1) { @@ -434,6 +444,15 @@ void Approx_ComputeCLine::SetInvOrder(const Standard_Boolean theInvOrder) myInvOrder = theInvOrder; } +//======================================================================= +//function : SetHangChecking +//purpose : +//======================================================================= +void Approx_ComputeCLine::SetHangChecking(const Standard_Boolean theHangChecking) +{ + myHangChecking = theHangChecking; +} + //======================================================================= //function : IsAllApproximated //purpose : returns False if at a moment of the approximation, diff --git a/src/Approx/Approx_FitAndDivide.hxx b/src/Approx/Approx_FitAndDivide.hxx index 552af14087..70443fdeaa 100644 --- a/src/Approx/Approx_FitAndDivide.hxx +++ b/src/Approx/Approx_FitAndDivide.hxx @@ -70,6 +70,12 @@ public: //! By default inverse order is used. Standard_EXPORT void SetInvOrder(const Standard_Boolean theInvOrder); + //! Set value of hang checking flag + //! if this flag = true, possible hang of algorithm is checked + //! and algorithm is forced to stop. + //! By default hang checking is used. + Standard_EXPORT void SetHangChecking(const Standard_Boolean theHangChecking); + //! returns False if at a moment of the approximation, //! the status NoApproximation has been sent by the user //! when more points were needed. @@ -125,6 +131,7 @@ private: AppParCurves_Constraint mylastC; Standard_Integer myMaxSegments; Standard_Boolean myInvOrder; + Standard_Boolean myHangChecking; }; diff --git a/src/Approx/Approx_FitAndDivide2d.hxx b/src/Approx/Approx_FitAndDivide2d.hxx index c1d4283b3e..2a334ce597 100644 --- a/src/Approx/Approx_FitAndDivide2d.hxx +++ b/src/Approx/Approx_FitAndDivide2d.hxx @@ -70,6 +70,12 @@ public: //! By default inverse order is used. Standard_EXPORT void SetInvOrder(const Standard_Boolean theInvOrder); + //! Set value of hang checking flag + //! if this flag = true, possible hang of algorithm is checked + //! and algorithm is forced to stop. + //! By default hang checking is used. + Standard_EXPORT void SetHangChecking(const Standard_Boolean theHangChecking); + //! returns False if at a moment of the approximation, //! the status NoApproximation has been sent by the user //! when more points were needed. @@ -125,6 +131,7 @@ private: AppParCurves_Constraint mylastC; Standard_Integer myMaxSegments; Standard_Boolean myInvOrder; + Standard_Boolean myHangChecking; }; diff --git a/src/BRepFill/BRepFill_ComputeCLine.hxx b/src/BRepFill/BRepFill_ComputeCLine.hxx index 273515069a..e736d53bd5 100644 --- a/src/BRepFill/BRepFill_ComputeCLine.hxx +++ b/src/BRepFill/BRepFill_ComputeCLine.hxx @@ -70,6 +70,12 @@ public: //! By default inverse order is used. Standard_EXPORT void SetInvOrder(const Standard_Boolean theInvOrder); + //! Set value of hang checking flag + //! if this flag = true, possible hang of algorithm is checked + //! and algorithm is forced to stop. + //! By default hang checking is used. + Standard_EXPORT void SetHangChecking(const Standard_Boolean theHangChecking); + //! returns False if at a moment of the approximation, //! the status NoApproximation has been sent by the user //! when more points were needed. @@ -125,6 +131,7 @@ private: AppParCurves_Constraint mylastC; Standard_Integer myMaxSegments; Standard_Boolean myInvOrder; + Standard_Boolean myHangChecking; }; diff --git a/src/ProjLib/ProjLib_ComputeApprox.cxx b/src/ProjLib/ProjLib_ComputeApprox.cxx index cdf6442b4e..63ee160ebb 100644 --- a/src/ProjLib/ProjLib_ComputeApprox.cxx +++ b/src/ProjLib/ProjLib_ComputeApprox.cxx @@ -1156,6 +1156,10 @@ void ProjLib_ComputeApprox::Perform Approx_FitAndDivide2d Fit(Deg1, Deg2, myTolerance, aTol2d, Standard_True, aFistC, aLastC); Fit.SetMaxSegments(aMaxSegments); + if (simplecase) + { + Fit.SetHangChecking(Standard_False); + } Fit.Perform(F); Standard_Real aNewTol2d = 0; diff --git a/tests/bugs/modalg_7/bug31470 b/tests/bugs/modalg_7/bug31470 new file mode 100644 index 0000000000..f109c73f02 --- /dev/null +++ b/tests/bugs/modalg_7/bug31470 @@ -0,0 +1,36 @@ +puts "=================================================================" +puts "OCC31470: BOP common produces empty result (box and holed sphere)" +puts "=================================================================" +puts "" + +plane pln1 51.899912462 99.996691888 62.33204004 +psphere s1 pln1 15 +psphere s2 pln1 10 +bcut ss s1 s2 +box bb 100 100 100 + +bcommon result bb ss +savehistory hh + +explode ss f +modified ff hh ss_1 +generated ee hh ss_1 + +checkshape result + +checknbshapes result -solid 1 -shell 1 -face 3 -wire 6 -edge 8 -vertex 6 + +set tolres [checkmaxtol result] + +if { ${tolres} > 2.e-7} { + puts "Error: bad tolerance of result" +} + +checkprops result -v 4975.49 + +v2d +pcurve pc ee ff +trim pc pc +2dfit + +checkview -screenshot -2d -path ${imagedir}/${test_image}.png