0029159: Sewing fail when using a maximum tolerance
authormsv <msv@opencascade.com>
Fri, 29 Sep 2017 07:43:52 +0000 (10:43 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 6 Oct 2017 07:28:08 +0000 (10:28 +0300)
Force setting truly computed tolerance of the edge if BRepLib::SameParameter has put too large tolerance.

src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx
tests/bugs/modalg_7/bug29159 [new file with mode: 0644]

index 9c27fb6..7d3db72 100644 (file)
@@ -51,6 +51,7 @@
 #include <BRep_ListOfPointRepresentation.hxx>
 #include <BRep_PointOnCurve.hxx>
 #include <BRep_Tool.hxx>
+#include <BRep_TEdge.hxx>
 #include <BRep_TVertex.hxx>
 #include <BRepBuilderAPI_BndBoxTreeSelector.hxx>
 #include <BRepBuilderAPI_CellFilter.hxx>
@@ -961,11 +962,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<BRep_TEdge*>(edge.TShape().get())->Tolerance(maxTol);
+        }
+        else
+        {
+          // just update tolerance with computed distance
+          aBuilder.UpdateEdge(edge, maxTol);
         }
       }
-      if(maxTol >= 0. && maxTol < tolReached)
-        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 (file)
index 0000000..097a7f8
--- /dev/null
@@ -0,0 +1,31 @@
+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 "self-interfering" [bopcheck result 2]]} {
+  puts "Error: result of sewing is self-interfering"
+}
+
+checknbshapes result -m "Sewing result" -edge 8 -face 2
+checkprops result -l $ExpLength -skip
+
+smallview +X+Y
+don result
+fit
+checkview -screenshot -2d -path ${imagedir}/${test_image}_1.png