0029682: Boolean intersection with fuzzy-option hangs
authornbv <nbv@opencascade.com>
Mon, 9 Apr 2018 13:05:30 +0000 (16:05 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 12 Apr 2018 11:14:06 +0000 (14:14 +0300)
Algorithm of step re-computation has been improved.

src/IntWalk/IntWalk_PWalking.cxx
src/IntWalk/IntWalk_PWalking.hxx
tests/perf/modalg/bug29682 [new file with mode: 0644]

index a1a3feb..1387158 100644 (file)
@@ -963,10 +963,21 @@ void IntWalk_PWalking::Perform(const TColStd_Array1OfReal& ParDep,
             }                  
             else
             {
-              pasuv[0]*=0.5; 
-              pasuv[1]*=0.5; 
-              pasuv[2]*=0.5; 
-              pasuv[3]*=0.5;
+              if (aStatus != IntWalk_StepTooSmall)
+              {
+                // Bug #0029682 (Boolean intersection with
+                // fuzzy-option hangs). 
+                // If aStatus == IntWalk_StepTooSmall then
+                // the counter "LevelOfIterWithoutAppend" will
+                // be nulified in the future if the step is smaller
+                // (see "case IntWalk_StepTooSmall:" below).
+                // Here, we forbid this nulification and thereby provide out from
+                // the algorithm.
+                pasuv[0] *= 0.5;
+                pasuv[1] *= 0.5;
+                pasuv[2] *= 0.5;
+                pasuv[3] *= 0.5;
+              }
             }
           }
         }
index 9fe04b7..e3ac4bb 100644 (file)
@@ -149,6 +149,9 @@ public:
     if (anIdx <= myTangentIdx)
     {
       myTangentIdx--;
+
+      if (myTangentIdx < 1)
+        myTangentIdx = 1;
     }
 
     line->RemovePoint(anIdx);
@@ -228,8 +231,14 @@ private:
   Standard_Boolean close;
   Standard_Boolean tgfirst;
   Standard_Boolean tglast;
+
+  //! Index of point on the surface boundary.
+  //! It is used for transition computation
   Standard_Integer myTangentIdx;
+
+  //! Tangent to WLine in the point with index myTangentIdx
   gp_Dir tgdir;
+
   Standard_Real fleche;
   Standard_Real pasMax;
   Standard_Real tolconf;
diff --git a/tests/perf/modalg/bug29682 b/tests/perf/modalg/bug29682
new file mode 100644 (file)
index 0000000..066e4bd
--- /dev/null
@@ -0,0 +1,38 @@
+puts "========"
+puts "OCC29682"
+puts "========"
+puts ""
+#################################################
+# Boolean intersection with fuzzy-option hangs
+#################################################
+
+restore [locate_data_file bug29682_f1.brep] s1
+restore [locate_data_file bug29682_f2.brep] s2
+
+copy s1 f1
+copy s2 f2
+
+bfuzzyvalue 0.0
+dchrono h1 restart
+bsection r1 f1 f2
+dchrono h1 stop counter BSectionNoFV
+
+checknbshapes r1 -vertex 2 -edge 1
+checkprops r1 -l 2995.33
+
+copy s1 f1
+copy s2 f2
+
+bfuzzyvalue 0.2
+dchrono h2 restart
+bsection r2 f1 f2
+dchrono h2 stop counter BSectionFV
+
+checknbshapes r2 -vertex 2 -edge 1
+checkprops r2 -l 2995.33
+
+smallview
+don s1 s2 r2
+fit
+
+checkview -screenshot -2d -path ${imagedir}/${test_image}.png
\ No newline at end of file