0031202: Shape Healing - FixMissingSeam creates degenerated edge
authoranv <anv@opencascade.com>
Thu, 28 Nov 2019 09:25:20 +0000 (12:25 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 6 Dec 2019 16:32:34 +0000 (19:32 +0300)
Adding tolerance to prevent degenerated cuts in cases where all vertex tolerance is covered by distance of the edge curve from vertex point.

src/ShapeFix/ShapeFix_ComposeShell.cxx
tests/bugs/heal/bug31202 [new file with mode: 0644]
tests/de/step_1/E3

index c57e0ba..7072e94 100644 (file)
@@ -985,8 +985,11 @@ ShapeFix_WireSegment ShapeFix_ComposeShell::SplitWire (ShapeFix_WireSegment &wir
         currPnt = myGrid->Value ( currPnt2d );
         if ( currPnt.Distance ( lastVPnt ) <= lastVTol && 
             lastPnt.Distance ( currPnt ) <= tol && 
+            // Tolerance is increased to prevent degenerated cuts in cases where all vertex
+            // tolerance is covered by distance of the edge curve from vertex point.
+            // Doubled to prevent edge being fully covered by its vertices tolerance (invalid edge).
             CheckByCurve3d ( lastVPnt, c3d, f3d+(currPar-firstPar)*(l3d-f3d)/span2d, 
-                            T, lastVTol ) &&
+                            T, lastVTol + 2 * Precision::Confusion() ) && 
             lastPnt.Distance ( myGrid->Value ( C2d->Value(0.5*(currPar+lastPar)) ) ) <= tol ) {
           V = lastV;
           Standard_Real uRes = myUResolution;
@@ -1005,8 +1008,11 @@ ShapeFix_WireSegment ShapeFix_ComposeShell::SplitWire (ShapeFix_WireSegment &wir
         }
         else if ( currPnt.Distance ( prevVPnt ) <= prevVTol && 
                  prevPnt.Distance ( currPnt ) <= tol && 
+                 // Tolerance is increased to prevent degenerated cuts in cases where all vertex
+                 // tolerance is covered by distance of the edge curve from vertex point.
+                 // Doubled to prevent edge being fully covered by its vertices tolerance (invalid edge).
                  CheckByCurve3d ( prevVPnt, c3d, f3d+(currPar-firstPar)*(l3d-f3d)/span2d, 
-                                 T, prevVTol ) &&
+                                 T, prevVTol + 2 * Precision::Confusion()) &&
                  prevPnt.Distance ( myGrid->Value ( C2d->Value(0.5*(currPar+prevPar)) ) ) <= tol ) {
           V = prevV;
           Standard_Real uRes = myUResolution;
diff --git a/tests/bugs/heal/bug31202 b/tests/bugs/heal/bug31202
new file mode 100644 (file)
index 0000000..3af7e65
--- /dev/null
@@ -0,0 +1,4 @@
+restore [locate_data_file bug31202.brep] shape
+fixshape result shape 0.000001137 0.0001137
+checkshape result
+checknbshapes result -edge 4
\ No newline at end of file
index 33ac6dc..7bc41cb 100644 (file)
@@ -1,6 +1,5 @@
 # !!!! This file is generated automatically, do not edit manually! See end script
 puts "TODO CR23096 ALL: TPSTAT : Faulty" 
-puts "TODO CR23096 ALL: CHECKSHAPE : Faulty" 
 
 
 set filename bm1_sy_exhaust.stp