0028601: ShapeFix_Shape increases tolerance of sub-shapes of a valid shape
authorimn <imn@opencascade.com>
Fri, 14 Apr 2017 12:15:18 +0000 (15:15 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 28 Apr 2017 09:44:51 +0000 (12:44 +0300)
- Avoid increase of edge/vertex tolerance if the distance between 3D curve and p-curve is within old tolerance.

src/ShapeFix/ShapeFix.cxx
tests/bugs/heal/bug329
tests/bugs/modalg_6/bug28601 [new file with mode: 0644]

index 11bb03d..75679bd 100644 (file)
@@ -210,6 +210,7 @@ Standard_Boolean ShapeFix::SameParameter(const TopoDS_Shape& shape,
         Standard_Real tol0 = BRep_Tool::Tolerance(edge);
         tol = tol0;
         Standard_Real tol2 = tol*tol;
+        Standard_Boolean isChanged = Standard_False;
         const Standard_Integer NCONTROL = 23;
         for ( Standard_Integer i = 0; i < NCONTROL; i++ )
         {
@@ -217,17 +218,23 @@ Standard_Boolean ShapeFix::SameParameter(const TopoDS_Shape& shape,
           gp_Pnt pnt = crv->Value ( par );
           gp_Pnt prj = ACS.Value( par );
           Standard_Real dist = pnt.SquareDistance(prj);
-          if ( tol2 < dist )
+          if ( tol2 < dist ) 
+          {
             tol2 = dist;
+            isChanged = Standard_True;
+          }
         }
-        tol = 1.00005 * sqrt(tol2); // coeff: see trj3_pm1-ct-203.stp #19681, edge 10
-        if ( tol >= tol0 )
+        if ( isChanged )
         {
-          B.UpdateEdge ( edge, tol );
-          for ( TopoDS_Iterator itV(edge); itV.More(); itV.Next() )
+          tol = 1.00005 * sqrt(tol2); // coeff: see trj3_pm1-ct-203.stp #19681, edge 10
+          if ( tol >= tol0 )
           {
-            TopoDS_Shape S = itV.Value();
-            B.UpdateVertex ( TopoDS::Vertex ( S ), tol );
+            B.UpdateEdge ( edge, tol );
+            for ( TopoDS_Iterator itV(edge); itV.More(); itV.Next() )
+            {
+              TopoDS_Shape S = itV.Value();
+              B.UpdateVertex ( TopoDS::Vertex ( S ), tol );
+            }
           }
         }
       }
index 3828403..3d6b51a 100755 (executable)
@@ -1,5 +1,3 @@
-puts "TODO OCC12345 ALL: Error : Tolerance invalid. Function FixShape works WRONGLY"
-
 puts "========================"
 puts " OCC329 "
 puts "========================"
diff --git a/tests/bugs/modalg_6/bug28601 b/tests/bugs/modalg_6/bug28601
new file mode 100644 (file)
index 0000000..f95c43b
--- /dev/null
@@ -0,0 +1,21 @@
+puts "========"
+puts "OCC28601"
+puts "========"
+puts ""
+###################################################################
+# ShapeFix_Shape increases tolerance of sub-shapes of a valid shape
+###################################################################
+
+box b 10 10 10
+set tol_before [checkmaxtol b]
+fixshape b1 b
+set tol_after [checkmaxtol b1]
+
+puts "MAX tolerance shape before fixshape : $tol_before"
+puts "MAX tolerance shape after fixshape : $tol_after"
+
+if { ${tol_after} > ${tol_before} } {
+  puts "Error: Export /Import cause increasing tolerances of shape"
+} else {
+  puts "Export /Import does not cause increasing tolerances of shape"
+}
\ No newline at end of file