From 44053715db9a6ce8c9383e48f2354fb80d36086f Mon Sep 17 00:00:00 2001 From: emv Date: Thu, 22 Aug 2019 13:54:53 +0300 Subject: [PATCH] 0030880: Bug in BRepExtrema_ExtCF Correct tolerance management during intersection of the classification ray with edges of the face. --- src/BRepClass/BRepClass_Intersector.cxx | 15 ++--- src/QABugs/QABugs_20.cxx | 74 +++++++++++++++++++++++++ tests/bugs/modalg_7/bug30880_1 | 11 ++++ tests/bugs/modalg_7/bug30880_2 | 10 ++++ 4 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 tests/bugs/modalg_7/bug30880_1 create mode 100644 tests/bugs/modalg_7/bug30880_2 diff --git a/src/BRepClass/BRepClass_Intersector.cxx b/src/BRepClass/BRepClass_Intersector.cxx index a141f56d05..5c606e9f4c 100644 --- a/src/BRepClass/BRepClass_Intersector.cxx +++ b/src/BRepClass/BRepClass_Intersector.cxx @@ -130,18 +130,15 @@ void BRepClass_Intersector::Perform(const gp_Lin2d& L, gp_Pnt2d pdeb,pfin; C.D0(deb,pdeb); C.D0(fin,pfin); - Standard_Real toldeb = 1.e-5, tolfin = 1.e-5; IntRes2d_Domain DL; - // - if(P!=RealLast()) { - DL.SetValues(L.Location(),0.,Precision::PConfusion(),ElCLib::Value(P,L),P,Precision::PConfusion()); - } - else { - DL.SetValues(L.Location(),0.,Precision::PConfusion(),Standard_True); - } + if (P != RealLast()) + DL.SetValues (L.Location(), 0., Precision::PConfusion(), + ElCLib::Value (P, L), P, Precision::PConfusion()); + else + DL.SetValues (L.Location(), 0., Precision::PConfusion(), Standard_True); - IntRes2d_Domain DE(pdeb,deb,toldeb,pfin,fin,tolfin); + IntRes2d_Domain DE (pdeb, deb, Tol, pfin, fin, Tol); // temporary periodic domain if (C.Curve()->IsPeriodic()) { DE.SetEquivalentParameters(C.FirstParameter(), diff --git a/src/QABugs/QABugs_20.cxx b/src/QABugs/QABugs_20.cxx index 996c7b8e1a..6539581ab3 100644 --- a/src/QABugs/QABugs_20.cxx +++ b/src/QABugs/QABugs_20.cxx @@ -3239,6 +3239,76 @@ static Standard_Integer OCC30869 (Draw_Interpretor& theDI, Standard_Integer theA return 0; } +#include +//======================================================================= +//function : OCC30880 +//purpose : +//======================================================================= +static Standard_Integer OCC30880 (Draw_Interpretor& theDI, Standard_Integer theArgc, const char** theArgv) +{ + if (theArgc != 3) + { + theDI.PrintHelp (theArgv[0]); + return 1; + } + + TopoDS_Shape anEdge = DBRep::Get (theArgv[1]); + if (anEdge.IsNull() || anEdge.ShapeType() != TopAbs_EDGE) + { + theDI << theArgv[1] << " is not an edge.\n"; + return 1; + } + + TopoDS_Shape aFace = DBRep::Get (theArgv[2]); + if (aFace.IsNull() || aFace.ShapeType() != TopAbs_FACE) + { + theDI << theArgv[2] << " is not a face.\n"; + return 1; + } + + BRepExtrema_ExtCF anExtCF (TopoDS::Edge (anEdge), + TopoDS::Face (aFace)); + if (!anExtCF.IsDone()) + { + theDI << "Not done\n"; + return 0; + } + + if (!anExtCF.NbExt()) + { + theDI << "No solutions\n"; + return 0; + } + + if (anExtCF.IsParallel()) + { + theDI << "Infinite number of solutions, distance - " << Sqrt (anExtCF.SquareDistance (1)) << "\n"; + return 0; + } + + Standard_Real aDistMin = RealLast(); + Standard_Integer aSolMin = -1; + // Look for the minimal solution + for (int i = 1; i <= anExtCF.NbExt(); ++i) + { + Standard_Real aDist = anExtCF.SquareDistance (i); + if (aDist < aDistMin) + { + aDistMin = aDist; + aSolMin = i; + } + } + + if (aSolMin < 0) + { + theDI << "Failed\n"; + return 0; + } + + theDI << "Minimal distance - " << Sqrt (aDistMin) << "\n"; + return 0; +} + void QABugs::Commands_20(Draw_Interpretor& theCommands) { const char *group = "QABugs"; @@ -3296,5 +3366,9 @@ void QABugs::Commands_20(Draw_Interpretor& theCommands) { "Usage: OCC30869 wire", __FILE__, OCC30869, group); + theCommands.Add ("OCC30880", "Looks for extrema between edge and face.\n" + "Usage: OCC30880 edge face", + __FILE__, OCC30880, group); + return; } diff --git a/tests/bugs/modalg_7/bug30880_1 b/tests/bugs/modalg_7/bug30880_1 new file mode 100644 index 0000000000..f0f8dbf8bf --- /dev/null +++ b/tests/bugs/modalg_7/bug30880_1 @@ -0,0 +1,11 @@ +puts "========" +puts "0030880: Bug in BRepExtrema_ExtCF" +puts "========" +puts "" + +restore [locate_data_file bug30880_edge.brep] e +restore [locate_data_file bug30880_face.brep] f + +if {![regexp "No solutions" [OCC30880 e f]]} { + puts "Error: Incorrect extrema solutions" +} diff --git a/tests/bugs/modalg_7/bug30880_2 b/tests/bugs/modalg_7/bug30880_2 new file mode 100644 index 0000000000..49a67cb501 --- /dev/null +++ b/tests/bugs/modalg_7/bug30880_2 @@ -0,0 +1,10 @@ +puts "========" +puts "0030880: Bug in BRepExtrema_ExtCF" +puts "========" +puts "" + +restore [locate_data_file bug30880_face.brep] f +point p2d -0.0034857302428251678 0.016350559703980902 +if {![regexp "OUT" [b2dclassify f p2d -tol 1.e-7]]} { + puts "Error: Incorrect classification of the point" +} -- 2.39.5