0025704: BRepOffsetAPI_MakeOffset: some customer's cases are processed incorrect
authorjgv <jgv@opencascade.com>
Thu, 29 Jan 2015 10:45:47 +0000 (13:45 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 29 Jan 2015 10:46:54 +0000 (13:46 +0300)
Added test cases bugs/modalg_5/bug25704_1 - bug25704_6

src/BRepFill/BRepFill_OffsetWire.cxx
tests/bugs/modalg_5/bug25704_1 [new file with mode: 0644]
tests/bugs/modalg_5/bug25704_2 [new file with mode: 0644]
tests/bugs/modalg_5/bug25704_3 [new file with mode: 0644]
tests/bugs/modalg_5/bug25704_4 [new file with mode: 0644]
tests/bugs/modalg_5/bug25704_5 [new file with mode: 0644]
tests/bugs/modalg_5/bug25704_6 [new file with mode: 0644]

index ee34109..3b34558 100644 (file)
@@ -215,6 +215,7 @@ static void MakeOffset
  BRepFill_IndexedDataMapOfOrientedShapeListOfShape& Map,
  const Handle(Geom_Plane)&                   RefPlane,
  const Standard_Boolean                      IsOpenResult,
+ const GeomAbs_JoinType                      theJoinType,
  const TopoDS_Vertex *                       Ends);
 
 //=======================================================================
@@ -255,24 +256,31 @@ static Standard_Boolean KPartCircle
       IsOpenResult)
   {
     Standard_Real anOffset = myOffset;
-    if (E.Orientation() == TopAbs_REVERSED) anOffset *= -1;
     
     Handle(Geom2d_Curve) aPCurve = BRep_Tool::CurveOnSurface(E, mySpine, f, l);
     Handle(Geom2dAdaptor_HCurve) AHC = new Geom2dAdaptor_HCurve(aPCurve, f, l);
     Handle(Geom2d_Curve) OC;
     if (AHC->GetType() == GeomAbs_Line)
     {
+      if (E.Orientation() == TopAbs_REVERSED) anOffset *= -1;
       Adaptor3d_OffsetCurve Off(AHC,anOffset);
       OC = new Geom2d_Line(Off.Line());
     }
     else if (AHC->GetType() == GeomAbs_Circle)
     {
+      if (E.Orientation() == TopAbs_FORWARD) anOffset *= -1;
       gp_Circ2d theCirc = AHC->Circle();
-      if (anOffset < 0. || Abs(anOffset) < theCirc.Radius())
-        OC = new Geom2d_Circle (theCirc.Position(), theCirc.Radius() - anOffset);
+      if (anOffset > 0. || Abs(anOffset) < theCirc.Radius())
+        OC = new Geom2d_Circle (theCirc.Position(), theCirc.Radius() + anOffset);
+      else
+      {
+        myIsDone = Standard_False;
+        return Standard_False;
+      }
     }
     else
     {
+      if (E.Orientation() == TopAbs_REVERSED) anOffset *= -1;
       Handle(Geom2d_TrimmedCurve) G2dT = new Geom2d_TrimmedCurve(aPCurve, f, l);
       OC = new Geom2d_OffsetCurve( G2dT, anOffset);
     }
@@ -790,7 +798,7 @@ void BRepFill_OffsetWire::PerformWithBiLo
       }
       else {
        MakeOffset (TopoDS::Edge(SE),myWorkSpine,myOffset,myMap,RefPlane,
-                    myIsOpenResult, Ends);
+                    myIsOpenResult, myJoinType, Ends);
        PE = SE;
       }
     }
@@ -1941,6 +1949,7 @@ void MakeOffset (const TopoDS_Edge&        E,
                       BRepFill_IndexedDataMapOfOrientedShapeListOfShape& Map,
                 const Handle(Geom_Plane)& RefPlane,
                  const Standard_Boolean    IsOpenResult,
+                 const GeomAbs_JoinType    theJoinType,
                  const TopoDS_Vertex *     Ends)
 {
   Standard_Real f,l;
@@ -1984,11 +1993,31 @@ void MakeOffset (const TopoDS_Edge&        E,
       Handle(Geom2d_Circle) CC = new Geom2d_Circle(Off.Circle());      
 
       Standard_Real Delta = 2*M_PI - l + f;
-      if (ToExtendFirstPar)
-        f -= 0.2*Delta;
-      if (ToExtendLastPar)
-        l += 0.2*Delta;
-
+      if (theJoinType == GeomAbs_Arc)
+      {
+        if (ToExtendFirstPar)
+          f -= 0.2*Delta;
+        if (ToExtendLastPar)
+          l += 0.2*Delta;
+      }
+      else //GeomAbs_Intersection
+      {
+        if (ToExtendFirstPar && ToExtendLastPar)
+        {
+          Standard_Real old_l = l;
+          f = old_l + Delta/2.;
+          l = f + 2*M_PI;
+        }
+        else if (ToExtendFirstPar)
+        {
+          f = l;
+          l = f + 2*M_PI;
+        }
+        else if (ToExtendLastPar)
+        {
+          l = f + 2*M_PI;
+        }
+      }
       G2dOC = new Geom2d_TrimmedCurve(CC,f,l);
     }
   }
@@ -1999,9 +2028,19 @@ void MakeOffset (const TopoDS_Edge&        E,
     Handle(Geom2d_Line)       CC = new Geom2d_Line(Off.Line());
     Standard_Real Delta = (l - f);
     if (ToExtendFirstPar)
-      f -= Delta;
+    {
+      if (theJoinType == GeomAbs_Arc)
+        f -= Delta;
+      else //GeomAbs_Intersection
+        f = -Precision::Infinite();
+    }
     if (ToExtendLastPar)
-      l += Delta;
+    {
+      if (theJoinType == GeomAbs_Arc)
+        l += Delta;
+      else //GeomAbs_Intersection
+        l = Precision::Infinite();
+    }
     G2dOC = new Geom2d_TrimmedCurve(CC,f,l);
   }
   else {
diff --git a/tests/bugs/modalg_5/bug25704_1 b/tests/bugs/modalg_5/bug25704_1
new file mode 100644 (file)
index 0000000..d880ff0
--- /dev/null
@@ -0,0 +1,34 @@
+puts "============"
+puts "OCC25704"
+puts "============"
+puts ""
+#######################################################################
+# BRepOffsetAPI_MakeOffset: some customer's cases are processed incorrect
+#######################################################################
+
+circle a 0 0 0 10
+mkedge a a
+wire a a
+
+if [catch { mkoffset resoffset a 1 2. } ] {
+  puts "Error : mkoffset is wrong"
+} else {
+  renamevar resoffset_1 result
+
+  set length 50.2655
+
+  set nb_v_good 1
+  set nb_e_good 1
+  set nb_w_good 1
+  set nb_f_good 0
+  set nb_sh_good 0
+  set nb_sol_good 0
+  set nb_compsol_good 0
+  set nb_compound_good 0
+  set nb_shape_good 3
+}
+
+smallview
+display a
+fit
+set only_screen_axo 1
diff --git a/tests/bugs/modalg_5/bug25704_2 b/tests/bugs/modalg_5/bug25704_2
new file mode 100644 (file)
index 0000000..ccd4dae
--- /dev/null
@@ -0,0 +1,34 @@
+puts "============"
+puts "OCC25704"
+puts "============"
+puts ""
+#######################################################################
+# BRepOffsetAPI_MakeOffset: some customer's cases are processed incorrect
+#######################################################################
+
+circle a 0 0 0 10
+mkedge a a
+wire a a
+
+if [catch { mkoffset resoffset a 1 -3. } ] {
+  puts "Error : mkoffset is wrong"
+} else {
+  renamevar resoffset_1 result
+
+  set length 81.6814
+
+  set nb_v_good 1
+  set nb_e_good 1
+  set nb_w_good 1
+  set nb_f_good 0
+  set nb_sh_good 0
+  set nb_sol_good 0
+  set nb_compsol_good 0
+  set nb_compound_good 0
+  set nb_shape_good 3
+}
+
+smallview
+display a
+fit
+set only_screen_axo 1
diff --git a/tests/bugs/modalg_5/bug25704_3 b/tests/bugs/modalg_5/bug25704_3
new file mode 100644 (file)
index 0000000..aa59ff3
--- /dev/null
@@ -0,0 +1,32 @@
+puts "============"
+puts "OCC25704"
+puts "============"
+puts ""
+#######################################################################
+# BRepOffsetAPI_MakeOffset: some customer's cases are processed incorrect
+#######################################################################
+
+restore [locate_data_file bug25491_offset_lines_2.brep] a
+
+if [catch { mkoffset resoffset a 1 35. i } ] {
+  puts "Error : mkoffset is wrong"
+} else {
+  renamevar resoffset_1 result
+
+  set length 730
+
+  set nb_v_good 8
+  set nb_e_good 8
+  set nb_w_good 1
+  set nb_f_good 0
+  set nb_sh_good 0
+  set nb_sol_good 0
+  set nb_compsol_good 0
+  set nb_compound_good 0
+  set nb_shape_good 17
+}
+
+smallview
+display a
+fit
+set only_screen_axo 1
diff --git a/tests/bugs/modalg_5/bug25704_4 b/tests/bugs/modalg_5/bug25704_4
new file mode 100644 (file)
index 0000000..6441b0d
--- /dev/null
@@ -0,0 +1,32 @@
+puts "============"
+puts "OCC25704"
+puts "============"
+puts ""
+#######################################################################
+# BRepOffsetAPI_MakeOffset: some customer's cases are processed incorrect
+#######################################################################
+
+restore [locate_data_file bug25491_offset_lines_2.brep] a
+
+if [catch { mkoffset resoffset a 1 40. i } ] {
+  puts "Error : mkoffset is wrong"
+} else {
+  renamevar resoffset_1 result
+
+  set length 770
+
+  set nb_v_good 8
+  set nb_e_good 8
+  set nb_w_good 1
+  set nb_f_good 0
+  set nb_sh_good 0
+  set nb_sol_good 0
+  set nb_compsol_good 0
+  set nb_compound_good 0
+  set nb_shape_good 17
+}
+
+smallview
+display a
+fit
+set only_screen_axo 1
diff --git a/tests/bugs/modalg_5/bug25704_5 b/tests/bugs/modalg_5/bug25704_5
new file mode 100644 (file)
index 0000000..ff471e1
--- /dev/null
@@ -0,0 +1,32 @@
+puts "============"
+puts "OCC25704"
+puts "============"
+puts ""
+#######################################################################
+# BRepOffsetAPI_MakeOffset: some customer's cases are processed incorrect
+#######################################################################
+
+restore [locate_data_file bug25704_offset_lines_case3.brep] a
+
+if [catch { mkoffset resoffset a 1 1. i } ] {
+  puts "Error : mkoffset is wrong"
+} else {
+  renamevar resoffset_1 result
+
+  set length 38.9737
+
+  set nb_v_good 5
+  set nb_e_good 5
+  set nb_w_good 1
+  set nb_f_good 0
+  set nb_sh_good 0
+  set nb_sol_good 0
+  set nb_compsol_good 0
+  set nb_compound_good 0
+  set nb_shape_good 11
+}
+
+smallview
+display a
+fit
+set only_screen_axo 1
diff --git a/tests/bugs/modalg_5/bug25704_6 b/tests/bugs/modalg_5/bug25704_6
new file mode 100644 (file)
index 0000000..97d552a
--- /dev/null
@@ -0,0 +1,32 @@
+puts "============"
+puts "OCC25704"
+puts "============"
+puts ""
+#######################################################################
+# BRepOffsetAPI_MakeOffset: some customer's cases are processed incorrect
+#######################################################################
+
+restore [locate_data_file bug25704_twolines.brep] a
+
+if [catch { openoffset resoffset a 5 5 i } ] {
+  puts "Error : mkoffset is wrong"
+} else {
+  renamevar resoffset_1 result
+
+  set length 169.12
+
+  set nb_v_good 4
+  set nb_e_good 3
+  set nb_w_good 1
+  set nb_f_good 0
+  set nb_sh_good 0
+  set nb_sol_good 0
+  set nb_compsol_good 0
+  set nb_compound_good 0
+  set nb_shape_good 8
+}
+
+smallview
+display a
+fit
+set only_screen_axo 1