]> OCCT Git - occt-copy.git/commitdiff
0026441: BRepOffset_MakeOffset affects on original shape CR26441
authoraml <aml@opencascade.com>
Thu, 13 Aug 2015 13:27:19 +0000 (16:27 +0300)
committeraml <aml@opencascade.com>
Mon, 17 Aug 2015 11:03:04 +0000 (14:03 +0300)
Copies of necessary objects were created.
Test cases updated to the new behavior.

src/BRepOffset/BRepOffset_MakeOffset.cxx
src/BRepOffset/BRepOffset_MakeOffset.hxx
src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.cxx
tests/bugs/modalg_2/bug5805_1
tests/bugs/modalg_2/bug5805_10
tests/bugs/modalg_2/bug5805_11
tests/bugs/modalg_2/bug5805_12
tests/bugs/modalg_2/bug5805_2
tests/bugs/modalg_2/bug5805_22
tests/bugs/modalg_2/bug5805_23
tests/bugs/modalg_2/bug5805_24

index 54fcac91281a5e7f637ac14515e6e752c2061cbf..5b50c6b04d79fe8b9a6bb3babbce56a322ae16d1 100644 (file)
@@ -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
index 036c989a07897872ea8099d1986d0393b2eb2cbc..5eab23df7357b9a4e95f8fef82742d614717bb9e 100644 (file)
@@ -35,6 +35,7 @@
 #include <BRepOffset_MakeLoops.hxx>
 #include <TopTools_MapOfShape.hxx>
 #include <BRepOffset_DataMapOfShapeOffset.hxx>
+#include <BRepBuilderAPI_Copy.hxx>
 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;
index 6f3844c8ceaab66daf55e0bf205cdb161122a2a1..a6a41730d0939d933ce6489bbff5da38b75d4752 100644 (file)
@@ -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()))
index adcd00d63ddfe368989532e86afeab83d3fb5b7c..f7ebdb1d8d1946cad5f2f5eb2fd9069b914c9bf5 100755 (executable)
@@ -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
index 45b8520436f54f74164d0e0cd9b89e2c59ae023f..a5ba7bf04e0240cd240cc0b400f9c296698cd309 100755 (executable)
@@ -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]
index 9bc05c78a689f6ca8cdc1356532c6ba6b876949d..fd2d4e121c3db49b912ce2269b2808d336e97aec 100755 (executable)
@@ -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]
index 417a4b2c6896a89b9270adfbc788375b83ca36ed..45ad310cdb1f3d93353096363731a0b591f32703 100755 (executable)
@@ -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]
index b9739e93278dd39c7af456a142e48c3d3812d9e1..cdf4f23ba3253272b7f16d7f7b2c64d3e0661638 100755 (executable)
@@ -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
index bc6ae303a0e704a5bf9e498235b0a836893355cc..1c309903e132340cdb75de26905cfdd379c2061b 100755 (executable)
@@ -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]
index e670f809f2e6d201658a34f45acb996acbf6915d..e979f0f38906757e3e3f975098d322bbf0cd1d18 100755 (executable)
@@ -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]
index 4ad85530c83552dc0c9b7f4ea7c6e0ff9d0d90cf..0bb22d8663726870bdfd6d5621a0b734aff66217 100755 (executable)
@@ -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]