From: aml Date: Thu, 13 Aug 2015 13:27:19 +0000 (+0300) Subject: 0026441: BRepOffset_MakeOffset affects on original shape X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=5797815b5a6988568f381a0a781ba04c62396771;p=occt-copy.git 0026441: BRepOffset_MakeOffset affects on original shape Copies of necessary objects were created. Test cases updated to the new behavior. --- diff --git a/src/BRepOffset/BRepOffset_MakeOffset.cxx b/src/BRepOffset/BRepOffset_MakeOffset.cxx index 54fcac9128..5b50c6b04d 100644 --- a/src/BRepOffset/BRepOffset_MakeOffset.cxx +++ b/src/BRepOffset/BRepOffset_MakeOffset.cxx @@ -516,7 +516,12 @@ void BRepOffset_MakeOffset::Initialize(const TopoDS_Shape& S, const Standard_Boolean Thickening) { myOffset = Offset; - myShape = S; + + // Copy object and store bijection. + myInitShape = S; + myCopy.Perform(myInitShape); + myShape = myCopy.Shape(); + myTol = Tol; myMode = Mode; myInter = Inter; @@ -550,14 +555,16 @@ void BRepOffset_MakeOffset::Clear() //purpose : //======================================================================= -void BRepOffset_MakeOffset::AddFace(const TopoDS_Face& F) { - myFaces.Add(F); +void BRepOffset_MakeOffset::AddFace(const TopoDS_Face& F) +{ + TopoDS_Shape aF = GetInitImage(F); + myFaces.Add(aF); //------------- // MAJ SD. //------------- - myInitOffsetFace.SetRoot (F) ; - myInitOffsetFace.Bind (F,F); - myImageOffset.SetRoot (F) ; + myInitOffsetFace.SetRoot (aF) ; + myInitOffsetFace.Bind (aF,aF); + myImageOffset.SetRoot (aF) ; } //======================================================================= @@ -568,8 +575,9 @@ void BRepOffset_MakeOffset::AddFace(const TopoDS_Face& F) { void BRepOffset_MakeOffset::SetOffsetOnFace(const TopoDS_Face& F, const Standard_Real Off) { - if ( myFaceOffset.IsBound(F)) myFaceOffset.UnBind(F); - myFaceOffset.Bind(F,Off); + TopoDS_Shape aF = GetInitImage(F); + if ( myFaceOffset.IsBound(aF)) myFaceOffset.UnBind(aF); + myFaceOffset.Bind(aF,Off); } //======================================================================= @@ -577,8 +585,8 @@ void BRepOffset_MakeOffset::SetOffsetOnFace(const TopoDS_Face& F, //purpose : //======================================================================= -static void RemoveCorks (TopoDS_Shape& S, - TopTools_IndexedMapOfShape& Faces) +static void RemoveCorks(TopoDS_Shape& S, + TopTools_IndexedMapOfShape& Faces) { TopoDS_Compound SS; BRep_Builder B; @@ -670,6 +678,7 @@ void BRepOffset_MakeOffset::MakeOffsetShape() //------------------------------------------ // Construction of myShape without caps. //------------------------------------------ + if(!myFaces.IsEmpty()) { RemoveCorks (myShape,myFaces); @@ -3393,3 +3402,11 @@ void CorrectSolid(TopoDS_Solid& theSol, TopTools_ListOfShape& theSolList) } theSol = aNewSol; } +//======================================================================= +//function : GetInitImage +//purpose : +//======================================================================= +TopoDS_Shape BRepOffset_MakeOffset::GetInitImage(const TopoDS_Shape& theShape) +{ + return myCopy.Modified(theShape).First(); +} \ No newline at end of file diff --git a/src/BRepOffset/BRepOffset_MakeOffset.hxx b/src/BRepOffset/BRepOffset_MakeOffset.hxx index 036c989a07..5eab23df73 100644 --- a/src/BRepOffset/BRepOffset_MakeOffset.hxx +++ b/src/BRepOffset/BRepOffset_MakeOffset.hxx @@ -35,6 +35,7 @@ #include #include #include +#include class BRepAlgo_AsDes; class TopoDS_Shape; class TopoDS_Face; @@ -93,6 +94,8 @@ public: //! Returns the list of closing faces stores by AddFace Standard_EXPORT const TopTools_IndexedMapOfShape& ClosingFaces() const; + //! Returns image of input shape for history support. + Standard_EXPORT TopoDS_Shape GetInitImage(const TopoDS_Shape& theShape); @@ -143,7 +146,9 @@ private: Standard_Real myOffset; Standard_Real myTol; - TopoDS_Shape myShape; + TopoDS_Shape myShape; // shape for modifications. + TopoDS_Shape myInitShape; // Init shape. + BRepBuilderAPI_Copy myCopy; // Stored to get bijection between items in myInitShape and myShape. BRepOffset_Mode myMode; Standard_Boolean myInter; Standard_Boolean mySelfInter; diff --git a/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.cxx b/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.cxx index 6f3844c8ce..a6a41730d0 100644 --- a/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.cxx +++ b/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.cxx @@ -85,15 +85,18 @@ const TopTools_ListOfShape& BRepOffsetAPI_MakeOffsetShape::Generated (const Topo { myGenerated.Clear(); - if (!myOffsetShape.ClosingFaces().Contains(S)) { - myOffsetShape.OffsetFacesFromShapes ().LastImage (S, myGenerated); + if (!myOffsetShape.ClosingFaces().Contains(S)) + { + TopoDS_Shape aImShape = myOffsetShape.GetInitImage(S); + myOffsetShape.OffsetFacesFromShapes().LastImage (aImShape, myGenerated); - if (!myOffsetShape.ClosingFaces().IsEmpty()) { + if (!myOffsetShape.ClosingFaces().IsEmpty()) + { // Reverse generated shapes in case of small solids. // Useful only for faces without influence on others. TopTools_ListIteratorOfListOfShape it(myGenerated); for (; it.More(); it.Next()) - it.Value().Reverse(); + it.Value().Reverse(); } } return myGenerated; @@ -111,7 +114,8 @@ const TopTools_ListOfShape& BRepOffsetAPI_MakeOffsetShape::GeneratedEdge (const { myGenerated.Clear(); - myOffsetShape.OffsetEdgesFromShapes ().LastImage (S, myGenerated); + TopoDS_Shape aImShape = myOffsetShape.GetInitImage(S); + myOffsetShape.OffsetEdgesFromShapes ().LastImage (aImShape, myGenerated); if (!myGenerated.IsEmpty()) { if (S.IsSame(myGenerated.First())) diff --git a/tests/bugs/modalg_2/bug5805_1 b/tests/bugs/modalg_2/bug5805_1 index adcd00d63d..f7ebdb1d8d 100755 --- a/tests/bugs/modalg_2/bug5805_1 +++ b/tests/bugs/modalg_2/bug5805_1 @@ -46,14 +46,14 @@ if { $maxtolerance > 1. } { set square 981.941 -set nb_v_good 6 -set nb_e_good 10 +set nb_v_good 8 +set nb_e_good 12 set nb_w_good 8 set nb_f_good 6 set nb_sh_good 1 set nb_sol_good 1 set nb_compsol_good 0 set nb_compound_good 0 -set nb_shape_good 32 +set nb_shape_good 36 set 2dviewer 0 diff --git a/tests/bugs/modalg_2/bug5805_10 b/tests/bugs/modalg_2/bug5805_10 index 45b8520436..a5ba7bf04e 100755 --- a/tests/bugs/modalg_2/bug5805_10 +++ b/tests/bugs/modalg_2/bug5805_10 @@ -31,15 +31,15 @@ catch { OFFSETSHAPE $distance {s_2} $calcul $type } set square 1041.35 -set nb_v_good 3 -set nb_e_good 5 +set nb_v_good 4 +set nb_e_good 6 set nb_w_good 6 set nb_f_good 5 set nb_sh_good 1 set nb_sol_good 1 set nb_compsol_good 0 set nb_compound_good 0 -set nb_shape_good 21 +set nb_shape_good 23 set index [lsearch [whatis s] Closed] diff --git a/tests/bugs/modalg_2/bug5805_11 b/tests/bugs/modalg_2/bug5805_11 index 9bc05c78a6..fd2d4e121c 100755 --- a/tests/bugs/modalg_2/bug5805_11 +++ b/tests/bugs/modalg_2/bug5805_11 @@ -30,15 +30,15 @@ catch { OFFSETSHAPE $distance {s_3} $calcul $type } set square 1041.35 -set nb_v_good 3 -set nb_e_good 5 +set nb_v_good 4 +set nb_e_good 6 set nb_w_good 6 set nb_f_good 5 set nb_sh_good 1 set nb_sol_good 1 set nb_compsol_good 0 set nb_compound_good 0 -set nb_shape_good 21 +set nb_shape_good 23 set index [lsearch [whatis s] Closed] diff --git a/tests/bugs/modalg_2/bug5805_12 b/tests/bugs/modalg_2/bug5805_12 index 417a4b2c68..45ad310cdb 100755 --- a/tests/bugs/modalg_2/bug5805_12 +++ b/tests/bugs/modalg_2/bug5805_12 @@ -31,15 +31,15 @@ catch { OFFSETSHAPE $distance {s_2 s_3} $calcul $type } set square 982.254 -set nb_v_good 3 -set nb_e_good 5 +set nb_v_good 4 +set nb_e_good 6 set nb_w_good 6 set nb_f_good 4 set nb_sh_good 1 set nb_sol_good 1 set nb_compsol_good 0 set nb_compound_good 0 -set nb_shape_good 20 +set nb_shape_good 22 set index [lsearch [whatis s] Closed] diff --git a/tests/bugs/modalg_2/bug5805_2 b/tests/bugs/modalg_2/bug5805_2 index b9739e9327..cdf4f23ba3 100755 --- a/tests/bugs/modalg_2/bug5805_2 +++ b/tests/bugs/modalg_2/bug5805_2 @@ -41,14 +41,14 @@ if { $maxtolerance > 1. } { set square 982.254 -set nb_v_good 3 -set nb_e_good 5 +set nb_v_good 4 +set nb_e_good 6 set nb_w_good 6 set nb_f_good 4 set nb_sh_good 1 set nb_sol_good 1 set nb_compsol_good 0 set nb_compound_good 0 -set nb_shape_good 20 +set nb_shape_good 22 set 2dviewer 0 diff --git a/tests/bugs/modalg_2/bug5805_22 b/tests/bugs/modalg_2/bug5805_22 index bc6ae303a0..1c309903e1 100755 --- a/tests/bugs/modalg_2/bug5805_22 +++ b/tests/bugs/modalg_2/bug5805_22 @@ -32,15 +32,15 @@ catch { OFFSETSHAPE $distance {s_3} $calcul $type } set square 502.366 -set nb_v_good 3 -set nb_e_good 5 +set nb_v_good 4 +set nb_e_good 6 set nb_w_good 6 set nb_f_good 5 set nb_sh_good 1 set nb_sol_good 1 set nb_compsol_good 0 set nb_compound_good 0 -set nb_shape_good 21 +set nb_shape_good 23 set index [lsearch [whatis s] Closed] diff --git a/tests/bugs/modalg_2/bug5805_23 b/tests/bugs/modalg_2/bug5805_23 index e670f809f2..e979f0f389 100755 --- a/tests/bugs/modalg_2/bug5805_23 +++ b/tests/bugs/modalg_2/bug5805_23 @@ -32,15 +32,15 @@ catch { OFFSETSHAPE $distance {s_2} $calcul $type } set square 502.366 -set nb_v_good 3 -set nb_e_good 5 +set nb_v_good 4 +set nb_e_good 6 set nb_w_good 6 set nb_f_good 5 set nb_sh_good 1 set nb_sol_good 1 set nb_compsol_good 0 set nb_compound_good 0 -set nb_shape_good 21 +set nb_shape_good 23 set index [lsearch [whatis s] Closed] diff --git a/tests/bugs/modalg_2/bug5805_24 b/tests/bugs/modalg_2/bug5805_24 index 4ad85530c8..0bb22d8663 100755 --- a/tests/bugs/modalg_2/bug5805_24 +++ b/tests/bugs/modalg_2/bug5805_24 @@ -32,15 +32,15 @@ catch { OFFSETSHAPE $distance {s_3 s_2} $calcul $type } set square 489.372 -set nb_v_good 3 -set nb_e_good 5 +set nb_v_good 4 +set nb_e_good 6 set nb_w_good 6 set nb_f_good 4 set nb_sh_good 1 set nb_sol_good 1 set nb_compsol_good 0 set nb_compound_good 0 -set nb_shape_good 20 +set nb_shape_good 22 set index [lsearch [whatis s] Closed]