0024798: Boolean operation CUT produces incorrect result
authoremv <emv@opencascade.com>
Mon, 14 Apr 2014 11:52:02 +0000 (15:52 +0400)
committerabv <abv@opencascade.com>
Thu, 24 Apr 2014 11:43:30 +0000 (15:43 +0400)
Face classifier has been used to check adjustment of 2d curve for the face.

Test case for issue CR24798

src/BOPTools/BOPTools_AlgoTools2D.cxx
tests/bugs/modalg_5/bug24798 [new file with mode: 0644]

index ecbdcd5..b6b1087 100644 (file)
@@ -53,6 +53,7 @@
 #include <Geom_Surface.hxx>
 #include <BOPCol_IndexedMapOfShape.hxx>
 #include <BOPTools.hxx>
+#include <BRepClass_FaceClassifier.hxx>
 
 
 static 
@@ -348,6 +349,42 @@ static
     //xt
   }
   //
+  {
+    //check the point with classifier
+    Standard_Real u,v;
+    u = u2 + du;
+    v = v2 + dv;
+    if (aBAS.IsUPeriodic()) {
+      aUPeriod = aBAS.UPeriod(); 
+      if ((UMax - UMin - 2*aDelta) > aUPeriod) {
+        if ((u > (UMin + aDelta + aUPeriod)) ||
+            (u < (UMax - aDelta - aUPeriod))) {
+          BRepClass_FaceClassifier aClassifier;
+          aClassifier.Perform(aF, gp_Pnt2d(u, v), aDelta);
+          TopAbs_State Status = aClassifier.State();
+          if (Status == TopAbs_OUT) {
+            du += (u > (UMin + aDelta + aUPeriod)) ? -aUPeriod : aUPeriod;
+          }
+        }
+      }
+    }
+    //
+    u = u2 + du;
+    if (aBAS.IsVPeriodic()) {
+      Standard_Real aVPeriod = aBAS.VPeriod(); 
+      if ((VMax - VMin - 2*aDelta) > aVPeriod) {
+        if ((v > (VMin + aDelta + aVPeriod)) ||
+            (v < (VMax - aDelta - aVPeriod))) {
+          BRepClass_FaceClassifier aClassifier;
+          aClassifier.Perform(aF, gp_Pnt2d(u, v), aDelta);
+          TopAbs_State Status = aClassifier.State();
+          if (Status == TopAbs_OUT) {
+            dv += (v > (VMin + aDelta + aVPeriod)) ? -aVPeriod : aVPeriod;
+          }
+        }
+      }
+    }
+  }
   // Translation if necessary
   Handle(Geom2d_Curve) aC2Dx=aC2D;
 
diff --git a/tests/bugs/modalg_5/bug24798 b/tests/bugs/modalg_5/bug24798
new file mode 100644 (file)
index 0000000..235bdeb
--- /dev/null
@@ -0,0 +1,28 @@
+puts "============"
+puts "OCC24798"
+puts "============"
+puts ""
+######################################################
+# Boolean operation CUT produces incorrect result
+######################################################
+
+restore [locate_data_file bug24798_r1_cut.brep] b1
+restore [locate_data_file bug24798_rectBranch.brep] b2
+
+bop b1 b2
+bopcut result
+
+set square 1826.15
+
+# Analysis of "nbshapes res"
+set nb_v_good 44
+set nb_e_good 67
+set nb_w_good 29
+set nb_f_good 22
+set nb_sh_good 1
+set nb_sol_good 1
+set nb_compsol_good 0
+set nb_compound_good 1
+set nb_shape_good 165
+
+set 2dviewer 1