From c7806cb6e6a7565fadc3c30d3fea4d7ad3e91234 Mon Sep 17 00:00:00 2001 From: jgv Date: Thu, 29 Jan 2015 13:45:47 +0300 Subject: [PATCH] 0025704: BRepOffsetAPI_MakeOffset: some customer's cases are processed incorrect Added test cases bugs/modalg_5/bug25704_1 - bug25704_6 --- src/BRepFill/BRepFill_OffsetWire.cxx | 61 +++++++++++++++++++++++----- tests/bugs/modalg_5/bug25704_1 | 34 ++++++++++++++++ tests/bugs/modalg_5/bug25704_2 | 34 ++++++++++++++++ tests/bugs/modalg_5/bug25704_3 | 32 +++++++++++++++ tests/bugs/modalg_5/bug25704_4 | 32 +++++++++++++++ tests/bugs/modalg_5/bug25704_5 | 32 +++++++++++++++ tests/bugs/modalg_5/bug25704_6 | 32 +++++++++++++++ 7 files changed, 246 insertions(+), 11 deletions(-) create mode 100644 tests/bugs/modalg_5/bug25704_1 create mode 100644 tests/bugs/modalg_5/bug25704_2 create mode 100644 tests/bugs/modalg_5/bug25704_3 create mode 100644 tests/bugs/modalg_5/bug25704_4 create mode 100644 tests/bugs/modalg_5/bug25704_5 create mode 100644 tests/bugs/modalg_5/bug25704_6 diff --git a/src/BRepFill/BRepFill_OffsetWire.cxx b/src/BRepFill/BRepFill_OffsetWire.cxx index ee341093f5..3b34558b02 100644 --- a/src/BRepFill/BRepFill_OffsetWire.cxx +++ b/src/BRepFill/BRepFill_OffsetWire.cxx @@ -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 index 0000000000..d880ff0ce6 --- /dev/null +++ b/tests/bugs/modalg_5/bug25704_1 @@ -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 index 0000000000..ccd4dae343 --- /dev/null +++ b/tests/bugs/modalg_5/bug25704_2 @@ -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 index 0000000000..aa59ff3133 --- /dev/null +++ b/tests/bugs/modalg_5/bug25704_3 @@ -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 index 0000000000..6441b0d1c2 --- /dev/null +++ b/tests/bugs/modalg_5/bug25704_4 @@ -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 index 0000000000..ff471e18e4 --- /dev/null +++ b/tests/bugs/modalg_5/bug25704_5 @@ -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 index 0000000000..97d552ad4c --- /dev/null +++ b/tests/bugs/modalg_5/bug25704_6 @@ -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 -- 2.39.5