0026098: The result of General Fuse operation is self-interfered shape
authoremv <emv@opencascade.com>
Thu, 23 Apr 2015 13:59:22 +0000 (16:59 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 23 Apr 2015 14:00:57 +0000 (17:00 +0300)
class BOPTools_AlgoTools
method static Standard_Real IntersectCurves2d(const gp_Pnt& aPV,
                                const TopoDS_Face& aF,
                                const Handle(Geom_Surface)& aS,
                                const TopoDS_Edge& aE1,
                                const TopoDS_Edge& aE2)
Check the validity of the 2d intersection before applying the result.

Test case for issue CR26098

src/BOPTools/BOPTools_AlgoTools_1.cxx
tests/bugs/modalg_6/bug26098 [new file with mode: 0755]

index ea06e2d..1bfcdfc 100644 (file)
@@ -610,7 +610,7 @@ Standard_Real IntersectCurves2d(const gp_Pnt& aPV,
                                 const TopoDS_Edge& aE1,
                                 const TopoDS_Edge& aE2)
 {
-  Standard_Real aDist, aD, aT11, aT12, aT21, aT22, aTol2d;
+  Standard_Real aDist, aD, aT11, aT12, aT21, aT22, aTol2d, aT1, aT2;
   Standard_Integer j, aNbPnt;
   Geom2dInt_GInter aInter;
   gp_Pnt aP;
@@ -639,7 +639,17 @@ Standard_Real IntersectCurves2d(const gp_Pnt& aPV,
     if (aNbPnt) {
       aDist = -Precision::Infinite();
       for (j = 1; j <= aNbPnt; ++j) {
-        aP2D = aInter.Point(j).Value();
+        const IntRes2d_IntersectionPoint& aPoint = aInter.Point(j);
+        //
+        aT1 = aPoint.ParamOnFirst();
+        aT2 = aPoint.ParamOnSecond();
+        //
+        if ((aT1 < aT11 || aT1 > aT12) ||
+            (aT2 < aT21 || aT2 > aT22)) {
+          continue;
+        }          
+        //
+        aP2D = aPoint.Value();
         aS->D0(aP2D.X(), aP2D.Y(), aP);
         aD=aPV.SquareDistance(aP);
         if (aD > aDist) {
diff --git a/tests/bugs/modalg_6/bug26098 b/tests/bugs/modalg_6/bug26098
new file mode 100755 (executable)
index 0000000..aefa812
--- /dev/null
@@ -0,0 +1,44 @@
+puts "============"
+puts "OCC26098"
+puts "============"
+puts ""
+###############################
+## The result of General Fuse operation is self-interfered shape
+###############################
+
+restore [locate_data_file bug26098_c.brep ] c
+
+explode c
+
+bclearobjects
+bcleartools
+baddobjects c_1
+baddtools c_2 c_3 c_4 c_5
+
+bfillds
+bbuild result
+
+set info [bopcheck result]
+
+if { [regexp "This shape seems to be OK" ${info}] != 1 } {
+    puts "Error : The result of General Fuse operation is self-interfered shape"
+}
+
+set square 173.444
+
+set nbshapes_expected "
+Number of shapes in shape
+ VERTEX    : 230
+ EDGE      : 400
+ WIRE      : 196
+ FACE      : 185
+ SHELL     : 20
+ SOLID     : 20
+ COMPSOLID : 0
+ COMPOUND  : 1
+ SHAPE     : 1052
+"
+
+checknbshapes result -ref ${nbshapes_expected} -t -m "Result obtained by General Fuse operator"
+
+set 3dviewer 1