From a7d89710080a7b41105bd796477014cb05c4d9b2 Mon Sep 17 00:00:00 2001 From: msv Date: Fri, 29 Sep 2017 10:43:52 +0300 Subject: [PATCH] 0029159: Sewing fail when using a maximum tolerance Force setting truly computed tolerance of the edge if BRepLib::SameParameter has put too large tolerance. --- src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx | 14 +++++++++- tests/bugs/modalg_7/bug29159 | 29 ++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 tests/bugs/modalg_7/bug29159 diff --git a/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx b/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx index ffe71aad90..ce5039ff8c 100644 --- a/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx +++ b/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx @@ -118,6 +118,7 @@ #include #include #include +#include #include #include #include @@ -951,11 +952,22 @@ TopoDS_Edge BRepBuilderAPI_Sewing::SameParameterEdge(const TopoDS_Edge& edgeFirs if (dist > dist2) dist2 = dist; } - maxTol = Max(sqrt(dist2), Precision::Confusion()); + maxTol = Max(sqrt(dist2) * (1. + 1e-7), Precision::Confusion()); } } if(maxTol >= 0. && maxTol < tolReached) + { + if (tolReached > MaxTolerance()) + { + // Set tolerance directly to overwrite too large tolerance + static_cast(edge.TShape().operator->())->Tolerance(maxTol); + } + else + { + // just update tolerance with computed distance aBuilder.UpdateEdge(edge, maxTol); + } + } aBuilder.SameParameter(edge,Standard_True); } } diff --git a/tests/bugs/modalg_7/bug29159 b/tests/bugs/modalg_7/bug29159 new file mode 100644 index 0000000000..21397f9cd6 --- /dev/null +++ b/tests/bugs/modalg_7/bug29159 @@ -0,0 +1,29 @@ +puts "========" +puts "OCC29159" +puts "========" +puts "" +################################################# +# Sewing fail when using a maximum tolerance +################################################# + +set MaxTol 5e-4 +set ExpLength 97.234 + +restore [locate_data_file bug29159_F.brep] f +sewing result 5e-4 f +mint 1e-8 +maxt $MaxTol + +regexp {EDGE *: MAX=([-0-9.+eE]+)} [tolerance result] full toler + +if {$toler > $MaxTol} { + puts "Error: Tolerance after sewing is greater than max allowed tolerance" +} + +if {![regexp "seems to be OK" [bopcheck result 2]]} { + puts "Error: result of sewing is self-interfering" +} + +checknbshapes result -m "Sewing result" -edge 8 -face 2 + +smallview +X+Y +don result +fit -- 2.39.5