]> OCCT Git - occt-copy.git/commitdiff
0028710: Implement 'BRepTools_History' history for algorithm 'ShapeUpgrade_UnifySameD...
authorabk <abk@opencascade.com>
Tue, 25 Apr 2017 12:27:33 +0000 (15:27 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 29 Jun 2017 11:24:05 +0000 (14:24 +0300)
'BRepTools_History' history was implemented for algorithm
'ShapeUpgrade_UnifySameDomain'.

The history of the changing of the initial shape was corrected to consider all
shapes created by the algorithm as modified shapes instead of generated ones.

The old history interface was replaced by the new one:
- to get the modified shapes use: History()->Modified();
- to check if the shapes has been deleted use: History()->IsRemoved().

dox/dev_guides/upgrade/upgrade.md
src/BOPAlgo/BOPAlgo_CellsBuilder.cxx
src/BOPAlgo/BOPAlgo_CellsBuilder.hxx
src/BRepOffsetAPI/BRepOffsetAPI_MiddlePath.cxx
src/SWDRAW/SWDRAW_ShapeUpgrade.cxx
src/ShapeUpgrade/ShapeUpgrade_UnifySameDomain.cxx
src/ShapeUpgrade/ShapeUpgrade_UnifySameDomain.hxx
tests/bugs/heal/bug26489_4
tests/heal/unify_same_domain/A4

index ed2f82c4012fd06ed42e1fb3d4be347c27490dd7..3ba4a0efd1ba44d98097df6f73673b663428c56e 100644 (file)
@@ -1396,3 +1396,9 @@ if (anError != Storage_VSOk)
 Since 7.2.0 version, method *IsPeriodic()* returns the corresponding status of periodicity of the basis curve regardless of closure status of the adaptor curve (see method *IsClosed()*).
 Method *IsClosed()* for adaptor can return false even on periodic curve, in the case if its parametric range is not full period, e.g. for adaptor on circle in range [0, @f$ \pi @f$].
 In previous versions, *IsPeriodic()* always returned false if *IsClosed()* returned false.
+
+@subsection upgrade_720_persistence Change in algorithm ShapeUpgrade_UnifySameDomain
+
+The history of the changing of the initial shape was corrected:
+* all shapes created by the algorithm are considered as modified shapes instead of generated ones;
+* method Generated was removed and its calls should be replaced by calls of method History()->Modified.
index 0b89357ebf5a437bfc3b050d2997b8fd73a1a577..f725224027a2eb31c58e1fda656f85fd7bd0ce4e 100644 (file)
@@ -48,7 +48,7 @@ BOPAlgo_CellsBuilder::BOPAlgo_CellsBuilder()
   myIndex(100, myAllocator),
   myMaterials(100, myAllocator),
   myShapeMaterial(100, myAllocator),
-  myMapGenerated(100, myAllocator)
+  myMapModified(100, myAllocator)
 {
 }
 
@@ -63,7 +63,7 @@ BOPAlgo_CellsBuilder::BOPAlgo_CellsBuilder
   myIndex(100, myAllocator),
   myMaterials(100, myAllocator),
   myShapeMaterial(100, myAllocator),
-  myMapGenerated(100, myAllocator)
+  myMapModified(100, myAllocator)
 {
 }
 
@@ -86,7 +86,7 @@ void BOPAlgo_CellsBuilder::Clear()
   myIndex.Clear();
   myMaterials.Clear();
   myShapeMaterial.Clear();
-  myMapGenerated.Clear();
+  myMapModified.Clear();
 }
 
 //=======================================================================
@@ -312,7 +312,7 @@ void BOPAlgo_CellsBuilder::AddAllToResult(const Standard_Integer theMaterial,
 {
   myShapeMaterial.Clear();
   myMaterials.Clear();
-  myMapGenerated.Clear();
+  myMapModified.Clear();
   //
   myShape = myAllParts;
   //
@@ -435,7 +435,7 @@ void BOPAlgo_CellsBuilder::RemoveAllFromResult()
   //
   myMaterials.Clear();
   myShapeMaterial.Clear();
-  myMapGenerated.Clear();
+  myMapModified.Clear();
   //
   PrepareHistory();
 }
@@ -760,7 +760,7 @@ Standard_Boolean BOPAlgo_CellsBuilder::RemoveInternals(const BOPCol_ListOfShape&
       return bRemoved;
     }
     //
-    // fill map of generated shapes
+    // fill map of modified shapes
     BOPCol_IndexedMapOfShape aMG;
     Standard_Integer i, aNb;
     //
@@ -771,20 +771,12 @@ Standard_Boolean BOPAlgo_CellsBuilder::RemoveInternals(const BOPCol_ListOfShape&
     aNb = aMG.Extent();
     for (i = 1; i <= aNb; ++i) {
       const TopoDS_Shape& aSS = aMG(i);
-      const TopTools_ListOfShape& aLSGen = anUnify.Generated(aSS);
-      TopTools_ListIteratorOfListOfShape aIt(aLSGen);
+      const TopTools_ListOfShape& aLSMod = anUnify.History()->Modified(aSS);
+      TopTools_ListIteratorOfListOfShape aIt(aLSMod);
       for (; aIt.More(); aIt.Next()) {
         const TopoDS_Shape& aSU = aIt.Value();
         if (!aSU.IsNull() && !aSS.IsSame(aSU)) {
-          myMapGenerated.Bind(aSS, aSU);
-          bRemoved = Standard_True;
-        }
-      }
-      const TopTools_ListOfShape& aLSMod = anUnify.Modified(aSS);
-      for (aIt.Init(aLSMod); aIt.More(); aIt.Next()) {
-        const TopoDS_Shape& aSU = aIt.Value();
-        if (!aSU.IsNull() && !aSS.IsSame(aSU)) {
-          myMapGenerated.Bind(aSS, aSU);
+          myMapModified.Bind(aSS, aSU);
           bRemoved = Standard_True;
         }
       }
@@ -907,17 +899,17 @@ Standard_Boolean BOPAlgo_CellsBuilder::IsDeleted(const TopoDS_Shape& theS)
     return bRet;
   }
   //
-  Standard_Boolean bHasImage, bHasGenerated;
+  Standard_Boolean bHasImage, bHasModified;
   //
   bHasImage = myImages.IsBound(theS);
-  bHasGenerated = myMapGenerated.IsBound(theS);
-  if (!bHasImage && !bHasGenerated) {
+  bHasModified = myMapModified.IsBound(theS);
+  if (!bHasImage && !bHasModified) {
     bRet = !myMapShape.Contains(theS);
     return bRet;
   }
   //
-  if (bHasGenerated) {
-    const TopoDS_Shape& aSG = myMapGenerated.Find(theS);
+  if (bHasModified) {
+    const TopoDS_Shape& aSG = myMapModified.Find(theS);
     if (myMapShape.Contains(aSG)) {
       bRet = Standard_False;
       return bRet;
@@ -932,8 +924,8 @@ Standard_Boolean BOPAlgo_CellsBuilder::IsDeleted(const TopoDS_Shape& theS)
       const TopoDS_Shape& aSpR = myShapesSD.IsBound(aSp) ? 
         myShapesSD.Find(aSp) : aSp;
       //
-      const TopoDS_Shape& aSpRG = myMapGenerated.IsBound(aSpR) ?
-        myMapGenerated.Find(aSpR) : aSpR;
+      const TopoDS_Shape& aSpRG = myMapModified.IsBound(aSpR) ?
+        myMapModified.Find(aSpR) : aSpR;
       if (myMapShape.Contains(aSpRG)) {
         bRet = Standard_False;
         break;
@@ -945,10 +937,10 @@ Standard_Boolean BOPAlgo_CellsBuilder::IsDeleted(const TopoDS_Shape& theS)
 }
 
 //=======================================================================
-//function : Generated
+//function : Modified
 //purpose  : 
 //=======================================================================
-const TopTools_ListOfShape& BOPAlgo_CellsBuilder::Generated(const TopoDS_Shape& theS)
+const TopTools_ListOfShape& BOPAlgo_CellsBuilder::Modified(const TopoDS_Shape& theS)
 {
   myHistShapes.Clear();
   if (theS.IsNull()) {
@@ -960,9 +952,9 @@ const TopTools_ListOfShape& BOPAlgo_CellsBuilder::Generated(const TopoDS_Shape&
     return myHistShapes;
   }
   //
-  Standard_Boolean bHasGenerated = myMapGenerated.IsBound(theS);
-  if (bHasGenerated) {
-    const TopoDS_Shape& aSG = myMapGenerated.Find(theS);
+  Standard_Boolean bHasModified = myMapModified.IsBound(theS);
+  if (bHasModified) {
+    const TopoDS_Shape& aSG = myMapModified.Find(theS);
     if (myMapShape.Contains(aSG)) {
       myHistShapes.Append(aSG);
     }
@@ -982,14 +974,18 @@ const TopTools_ListOfShape& BOPAlgo_CellsBuilder::Generated(const TopoDS_Shape&
     const TopoDS_Shape& aSpR = myShapesSD.IsBound(aSp) ? 
       myShapesSD.Find(aSp) : aSp;
     //
-    if (myMapGenerated.IsBound(aSpR)) {
-      const TopoDS_Shape& aSG = myMapGenerated.Find(aSpR);
+    if (myMapModified.IsBound(aSpR)) {
+      const TopoDS_Shape& aSG = myMapModified.Find(aSpR);
       if (myMapShape.Contains(aSG)) {
         if (aMFence.Add(aSG)) {
           myHistShapes.Append(aSG);
         }
       }
     }
+    else if (aMFence.Add(aSpR))
+    {
+      myHistShapes.Append(aSpR);
+    }
   }
   //
   return myHistShapes;
index ec0bee9614996850acf21c9ae2e451f8bf3f83f8..6339a9970e8d5bb9bf8d3dabfac2988681e3c85e 100644 (file)
@@ -237,7 +237,7 @@ class BOPAlgo_CellsBuilder : public BOPAlgo_Builder
   Standard_EXPORT void MakeContainers();
 
   //! Returns the list of shapes generated from the shape theS.
-  Standard_EXPORT virtual const TopTools_ListOfShape& Generated(const TopoDS_Shape& theS) Standard_OVERRIDE;
+  Standard_EXPORT virtual const TopTools_ListOfShape& Modified(const TopoDS_Shape& theS) Standard_OVERRIDE;
   
   //! Returns true if the shape theS has been deleted.
   Standard_EXPORT virtual Standard_Boolean IsDeleted (const TopoDS_Shape& theS) Standard_OVERRIDE;
@@ -287,7 +287,7 @@ class BOPAlgo_CellsBuilder : public BOPAlgo_Builder
   BOPCol_IndexedDataMapOfShapeListOfShape myIndex;
   BOPCol_DataMapOfIntegerListOfShape myMaterials;
   BOPCol_DataMapOfShapeInteger myShapeMaterial;
-  BOPCol_DataMapOfShapeShape myMapGenerated;
+  BOPCol_DataMapOfShapeShape myMapModified;
 
  private:
 
index 112713abd4f5f782715c1d93f77d06220901ccf0..9bb864cad0adf6af9deaf0c6cb8f0c10f6c8f508 100644 (file)
@@ -270,11 +270,10 @@ static TopoDS_Wire GetUnifiedWire(const TopoDS_Wire& theWire,
   for (; wexp.More(); wexp.Next())
   {
     TopoDS_Shape anEdge = wexp.Current();
-    const TopTools_ListOfShape& aLSG = theUnifier.Generated(anEdge);
-    // take care of processing the result of Generated() before getting Modified()
-    Standard_Boolean isEmpty = aLSG.IsEmpty();
-    if (!isEmpty) {
-      TopTools_ListIteratorOfListOfShape anIt(aLSG);
+    const TopTools_ListOfShape& aLS = theUnifier.History()->Modified(anEdge);
+    if (!aLS.IsEmpty())
+    {
+      TopTools_ListIteratorOfListOfShape anIt(aLS);
       for (; anIt.More(); anIt.Next()) {
         const TopoDS_Shape& aShape = anIt.Value();
         //wire shouldn't contain duplicated generated edges
@@ -282,12 +281,11 @@ static TopoDS_Wire GetUnifiedWire(const TopoDS_Wire& theWire,
           aWMaker.Add(TopoDS::Edge(aShape));
       }
     }
-    const TopTools_ListOfShape& aLSM = theUnifier.Modified(anEdge);
-    if (!aLSM.IsEmpty())
-      aWMaker.Add(aLSM);
-    else if (isEmpty)
+    else
+    {
       // no change, put original edge
       aWMaker.Add(TopoDS::Edge(anEdge));
+    }
   }
   return aWMaker.Wire();
 }
index c39067b2580588c7e9e38791c3bde6c48a5aa2fb..82ad8b20fdf254fbadf97f71143b39878e9f47d9 100644 (file)
@@ -1364,43 +1364,6 @@ static Standard_Integer unifysamedom(Draw_Interpretor& di, Standard_Integer n, c
   return 0;
 }
 
-Standard_Integer unifysamedomgen(Draw_Interpretor& di,
-                                 Standard_Integer n,
-                                 const char** a)
-{
-  if (n != 3) {
-    di << "use unifysamedomgen newshape oldshape\n";
-    return 0;
-  }
-  TopoDS_Shape aShape;
-  aShape = DBRep::Get(a[2]);
-  if (aShape.IsNull()) {
-    di << "Null shape is not allowed here\n";
-    return 1;
-  }
-
-  const TopTools_ListOfShape& aLS = Unifier().Generated(aShape);
-
-  if (aLS.Extent() > 1) {
-    BRep_Builder aBB;
-    TopoDS_Compound aRes;
-    aBB.MakeCompound(aRes);
-    TopTools_ListIteratorOfListOfShape aIt(aLS);
-    for (; aIt.More(); aIt.Next()) {
-      const TopoDS_Shape& aCurrentShape = aIt.Value();
-      aBB.Add(aRes, aCurrentShape);
-    }
-    DBRep::Set(a[1], aRes);
-  }
-  else if (aLS.Extent() == 1) {
-    DBRep::Set(a[1], aLS.First());
-  }
-  else {
-    di << "No shapes were generated from the shape\n";
-  }
-  return 0;
-}
-
 Standard_Integer unifysamedommod(Draw_Interpretor& di,
                                  Standard_Integer n,
                                  const char** a)
@@ -1416,7 +1379,7 @@ Standard_Integer unifysamedommod(Draw_Interpretor& di,
     return 1;
   }
 
-  const TopTools_ListOfShape& aLS = Unifier().Modified(aShape);
+  const TopTools_ListOfShape& aLS = Unifier().History()->Modified(aShape);
 
   if (aLS.Extent() > 1) {
     BRep_Builder aBB;
@@ -1451,7 +1414,7 @@ Standard_Integer unifysamedomisdel(Draw_Interpretor& di,
     di << "Null shape is not allowed here\n";
     return 1;
   }
-  Standard_Boolean IsDeleted = Unifier().IsDeleted(aShape);
+  Standard_Boolean IsDeleted = Unifier().History()->IsRemoved(aShape);
   di << "The shape has" << (IsDeleted ? " " : " not ") << "been deleted" << "\n";
   return 0;
 }
@@ -1665,11 +1628,6 @@ Standard_Integer reshape(Draw_Interpretor& di,
   theCommands.Add ("unifysamedom",
                    "unifysamedom result shape [s1 s2 ...] [-f] [-e] [-nosafe] [+b] [+i] [-t val] [-a val]",
                     __FILE__,unifysamedom,g);
-  
-  theCommands.Add("unifysamedomgen",
-                  "unifysamedomgen newshape oldshape : get new shape generated "
-                  "by unifysamedom command from the old one",
-                  __FILE__, unifysamedomgen, g);
 
   theCommands.Add("unifysamedommod",
                   "unifysamedommod newshape oldshape : get new shape modified "
index f3b740572fecbe46c772085e8f6d4c19ab91f920..0c154fa96bc3ca109d55be81c5fd5b539fa1b53c 100644 (file)
@@ -1142,10 +1142,8 @@ static Standard_Boolean MergeSeq (TopTools_SequenceOfShape& SeqEdges,
                                   const Standard_Boolean ConcatBSplines,
                                   const Standard_Boolean isSafeInputMode,
                                   Handle(ShapeBuild_ReShape)& theContext,
-                                  TopTools_DataMapOfShapeShape& theOldToGeneratedShapes,
                                   const TopTools_MapOfShape& nonMergVert,
-                                  TopTools_MapOfShape& RemovedShapes,
-                                  const TopTools_DataMapOfShapeShape& NewEdges2OldEdges)
+                                  TopTools_MapOfShape& theRemovedVertices)
 { 
   NCollection_Sequence<SubSequenceOfEdges> SeqOfSubsSeqOfEdges;
   if (MergeEdges(SeqEdges, theAngTol, ConcatBSplines, isSafeInputMode,
@@ -1155,28 +1153,25 @@ static Standard_Boolean MergeSeq (TopTools_SequenceOfShape& SeqEdges,
     {
       if (SeqOfSubsSeqOfEdges(i).UnionEdges.IsNull())
         continue;
+
+      theContext->Merge(SeqOfSubsSeqOfEdges(i).SeqsEdges,
+        SeqOfSubsSeqOfEdges(i).UnionEdges);
+
       ShapeAnalysis_Edge sae;
       TopoDS_Vertex VF = sae.FirstVertex(SeqOfSubsSeqOfEdges(i).UnionEdges);
       TopoDS_Vertex VL = sae.LastVertex(SeqOfSubsSeqOfEdges(i).UnionEdges);
       for (Standard_Integer j = 1; j <= SeqOfSubsSeqOfEdges(i).SeqsEdges.Length(); j++)
       {
         const TopoDS_Shape& anOldEdge = SeqOfSubsSeqOfEdges(i).SeqsEdges(j);
-        const TopoDS_Shape* pOrigEdge = NewEdges2OldEdges.Seek(anOldEdge);
-        if (!pOrigEdge)
-          pOrigEdge = &anOldEdge;
-        theOldToGeneratedShapes.Bind(*pOrigEdge, SeqOfSubsSeqOfEdges(i).UnionEdges);
-        if (j == 1)
-          theContext->Replace(anOldEdge, SeqOfSubsSeqOfEdges(i).UnionEdges);
-        else
-          theContext->Remove(anOldEdge);
         TopoDS_Vertex V[2];
         TopExp::Vertices(TopoDS::Edge(anOldEdge), V[0], V[1]);
-        for (int k = 0; k < 2; k++) 
+        for (int k = 0; k < 2; k++)
         {
+          TopoDS_Vertex aV = V[k];
           if (isSafeInputMode)  // vertex might be changed and replaced
-            V[k] = TopoDS::Vertex(theContext->Apply(V[k]));
-          if (!V[k].IsEqual(VF) && !V[k].IsEqual(VL))
-            RemovedShapes.Add(V[k]);
+            aV = TopoDS::Vertex(theContext->Apply(aV));
+          if (!aV.IsEqual(VF) && !aV.IsEqual(VL))
+            theRemovedVertices.Add(V[k]);
         }
       }
     }
@@ -1230,7 +1225,8 @@ ShapeUpgrade_UnifySameDomain::ShapeUpgrade_UnifySameDomain()
     myUnifyEdges (Standard_True),
     myConcatBSplines (Standard_False),
     myAllowInternal (Standard_False),
-    mySafeInputMode(Standard_True)
+    mySafeInputMode(Standard_True),
+    myHistory(new BRepTools_History)
 {
   myContext = new ShapeBuild_ReShape;
 }
@@ -1252,7 +1248,8 @@ ShapeUpgrade_UnifySameDomain::ShapeUpgrade_UnifySameDomain(const TopoDS_Shape& a
     myConcatBSplines (ConcatBSplines),
     myAllowInternal (Standard_False),
     mySafeInputMode (Standard_True),
-    myShape (aShape)
+    myShape (aShape),
+    myHistory(new BRepTools_History)
 {
   myContext = new ShapeBuild_ReShape;
 }
@@ -1274,9 +1271,8 @@ void ShapeUpgrade_UnifySameDomain::Initialize(const TopoDS_Shape& aShape,
   myConcatBSplines = ConcatBSplines;
 
   myContext->Clear();
-  myOldToGeneratedShapes.Clear();
+  myRemoved.Clear();
   myKeepShapes.Clear();
-  myRemovedShapes.Clear();
 }
 
 //=======================================================================
@@ -1627,15 +1623,22 @@ void ShapeUpgrade_UnifySameDomain::IntUnifyFaces(const TopoDS_Shape& theInpShape
       for (int j = 1; j <= edges.Length(); j++) {
         TopExp::MapShapes(edges(j), aMapEdgesAndVertexes);
       }
-      for (int j = 1; j <= anOldEdges.Extent(); j++) {
+
+      for (int j = 1; j <= anOldEdges.Extent(); j++)
+      {
         const TopoDS_Edge& anEdge = TopoDS::Edge(anOldEdges(j));
-        if (!aMapEdgesAndVertexes.Contains(anEdge)) {
-          myRemovedShapes.Add(anEdge);
+        if (!aMapEdgesAndVertexes.Contains(anEdge))
+        {
+          myRemoved.Add(anEdge);
+
           TopoDS_Vertex V[2];
           TopExp::Vertices(anEdge, V[0], V[1]);
-          for (int k = 0; k < 2; k++) {
+          for (int k = 0; k < 2; k++)
+          {
             if (!aMapEdgesAndVertexes.Contains(V[k]))
-              myRemovedShapes.Add(V[k]);
+            {
+              myRemoved.Add(V[k]);
+            }
           }
         }
       }
@@ -1701,7 +1704,7 @@ void ShapeUpgrade_UnifySameDomain::IntUnifyFaces(const TopoDS_Shape& theInpShape
               if(BRep_Tool::Degenerated(E)) {
                 sewd->Remove(j);
                 isDegRemoved = Standard_True;
-                myRemovedShapes.Add(E);
+                myRemoved.Add(E);
                 j--;
               }
             }
@@ -1838,13 +1841,8 @@ void ShapeUpgrade_UnifySameDomain::IntUnifyFaces(const TopoDS_Shape& theInpShape
         myContext->Replace(aCurrent,CompRes);
       }
 
-      // remove the remaining faces
-      for(i = 1; i <= faces.Length(); i++)
-      { 
-        myOldToGeneratedShapes.Bind(faces(i), theResult);
-        if (i > 1)
-          myContext->Remove(faces(i));
-      }
+      const TopoDS_Shape aResult3 = myContext->Apply(theResult);
+      myContext->Merge(faces, aResult3);
     }
   } // end processing each face
 
@@ -1929,9 +1927,8 @@ void ShapeUpgrade_UnifySameDomain::UnifyEdges()
       SeqEdges.Append(expE.Current());
     SharedVert.Clear();
     CheckSharedVertices(SeqEdges, aMapEdgesVertex, myKeepShapes, SharedVert); 
-    MergeSeq(SeqEdges, myAngTol, myConcatBSplines, mySafeInputMode,
-             myContext, myOldToGeneratedShapes, SharedVert, 
-             myRemovedShapes, NewEdges2OldEdges);
+    MergeSeq(SeqEdges, myAngTol, myConcatBSplines, mySafeInputMode, myContext,
+      SharedVert, myRemoved);
   }
 
   // processing each face
@@ -1978,8 +1975,7 @@ void ShapeUpgrade_UnifySameDomain::UnifyEdges()
       SharedVert.Clear();
       CheckSharedVertices(SeqEdges, aMapEdgesVertex, myKeepShapes, SharedVert);
       if (MergeSeq(SeqEdges, myAngTol, myConcatBSplines, mySafeInputMode,
-                    myContext, myOldToGeneratedShapes, SharedVert, 
-                    myRemovedShapes, NewEdges2OldEdges))
+        myContext, SharedVert, myRemoved))
       {
         TopoDS_Face tmpF = TopoDS::Face(exp.Current());
         if ( !ChangedFaces.Contains(tmpF) )
@@ -1995,8 +1991,7 @@ void ShapeUpgrade_UnifySameDomain::UnifyEdges()
       SharedVert.Clear();
       CheckSharedVertices(aNonSharedEdges, aMapEdgesVertex, myKeepShapes, SharedVert);
       if (MergeSeq(aNonSharedEdges, myAngTol, myConcatBSplines, mySafeInputMode,
-                   myContext, myOldToGeneratedShapes, SharedVert, 
-                   myRemovedShapes, NewEdges2OldEdges))
+        myContext, SharedVert, myRemoved))
       {
         TopoDS_Face tmpF = TopoDS::Face(exp.Current());
         if ( !ChangedFaces.Contains(tmpF) )
@@ -2077,60 +2072,15 @@ void ShapeUpgrade_UnifySameDomain::Build()
   else if (myUnifyFaces)
     UnifyFaces();
 
-  //Done();
-}
-
-//=======================================================================
-//function : Shape
-//purpose  : give the resulting shape
-//=======================================================================
-const TopoDS_Shape& ShapeUpgrade_UnifySameDomain::Shape() const
-{
-  return myShape;
-}
-
-//=======================================================================
-//function : Generated
-//purpose  : returns the new shape from the old one
-//=======================================================================
-const TopTools_ListOfShape& ShapeUpgrade_UnifySameDomain::Generated(const TopoDS_Shape& aShape)
-{
-  const TopoDS_Shape* aNewShape;
-  myHistShapes.Clear();
-  aNewShape = myOldToGeneratedShapes.Seek(aShape);
-  if (aNewShape) {
-    if (myContext->IsRecorded(*aNewShape))
-      myHistShapes.Append(myContext->Apply(*aNewShape));
-    else
-      myHistShapes.Append(*aNewShape);
-  }
-  return myHistShapes;
-}
-
-//=======================================================================
-//function : Modified
-//purpose  : returns the new modified shape from the old one shape
-//=======================================================================
-const TopTools_ListOfShape& ShapeUpgrade_UnifySameDomain::Modified(const TopoDS_Shape& aShape)
-{
-  TopoDS_Shape aNewShape;
-  Standard_Integer aModifiedStatus;
-  myHistShapes.Clear();
-  if (!myOldToGeneratedShapes.Seek(aShape) && 
-      !myRemovedShapes.Contains(aShape) &&
-      myContext->IsRecorded(aShape)){
-    aModifiedStatus = myContext->Status(aShape, aNewShape, Standard_True);
-    if (aModifiedStatus > 0)
-      myHistShapes.Append(aNewShape);
+  if (!myHistory.IsNull())
+  {
+    myHistory->Merge(myContext->History());
+    for (TopTools_MapOfShape::Iterator aIt(myRemoved);
+      aIt.More(); aIt.Next())
+    {
+      myHistory->Remove(aIt.Value());
+    }
   }
-  return myHistShapes;
-}
 
-//=======================================================================
-//function : IsDeleted
-//purpose  : returns true if the shape has been deleted.
-//=======================================================================
-Standard_Boolean ShapeUpgrade_UnifySameDomain::IsDeleted(const TopoDS_Shape& aShape)
-{
-  return myRemovedShapes.Contains(aShape);
+  //Done();
 }
index e004b0366ba45843f48f94a513107c670cd4a24c..311784affe71a6dbd2b94bc8635509f545fbc2f5 100644 (file)
@@ -17,6 +17,7 @@
 #ifndef _ShapeUpgrade_UnifySameDomain_HeaderFile
 #define _ShapeUpgrade_UnifySameDomain_HeaderFile
 
+#include <BRepTools_History.hxx>
 #include <Standard.hxx>
 #include <Standard_Type.hxx>
 
@@ -43,13 +44,17 @@ DEFINE_STANDARD_HANDLE(ShapeUpgrade_UnifySameDomain, MMgt_TShared)
 //! on the BSpline or Bezier curves with C1 continuity on their common vertices will be merged into one common edge 
 //! The output result of tool is an unified shape
 //! All the modifications of initial shape are recorded during unifying.
-//! Method Generated() can be used to obtain the new (unified) shape from the old one 
+//! Methods History are intended to: <br>
+//! - set a place holder for the history of the changing of the sub-shapes of
+//!   the initial shape; <br>
+//! - get the collected history. <br>
+//! The algorithm provides a place holder for the history and collects the
+//! history by default.
+//! To avoid collecting of the history the place holder should be set to the null handle.
 class ShapeUpgrade_UnifySameDomain : public MMgt_TShared
 {
 
 public:
-
-  
   //! empty constructor
   Standard_EXPORT ShapeUpgrade_UnifySameDomain();
   
@@ -98,23 +103,10 @@ public:
   Standard_EXPORT void Build();
   
   //! Gives the resulting shape
-  Standard_EXPORT const TopoDS_Shape& Shape() const;
-  
-  //! Returns list of new common shapes from the old one shape.
-  //! After successful common operation based on <aShape> list 
-  //! will contain new generated shape.
-  //! In other cases it will return an empty list
-  Standard_EXPORT const TopTools_ListOfShape& Generated(const TopoDS_Shape& aShape);
-
-  //! Returns list of new modified shapes.
-  //! After successful modifying <aShape> without geometry changes list 
-  //! will contain new modified shape.
-  //! In other cases it will return an empty list
-  Standard_EXPORT const TopTools_ListOfShape& Modified(const TopoDS_Shape& aShape);
-
-  //! Returns true if the <aShape> has been deleted. The
-  //! result shape of the operation does not contain even trace of <aShape>.
-  Standard_EXPORT Standard_Boolean IsDeleted(const TopoDS_Shape& aShape);
+  const TopoDS_Shape& Shape() const
+  {
+    return myShape;
+  }
   
   //! this method makes if possible a common face from each
   //! group of faces lying on coincident surfaces
@@ -127,8 +119,17 @@ public:
   //! this method unifies same domain faces and edges
   Standard_EXPORT void UnifyFacesAndEdges();
 
+  //! Returns the history of the processed shapes.
+  const Handle(BRepTools_History)& History() const
+  {
+    return myHistory;
+  }
 
-
+  //! Returns the history of the processed shapes.
+  Handle(BRepTools_History)& History()
+  {
+    return myHistory;
+  }
 
   DEFINE_STANDARD_RTTIEXT(ShapeUpgrade_UnifySameDomain,MMgt_TShared)
 
@@ -153,12 +154,10 @@ private:
   Standard_Boolean mySafeInputMode;
   TopoDS_Shape myShape;
   Handle(ShapeBuild_ReShape) myContext;
-  TopTools_DataMapOfShapeShape myOldToGeneratedShapes;
-  TopTools_ListOfShape myHistShapes;
-  TopTools_MapOfShape myRemovedShapes;
   TopTools_MapOfShape myKeepShapes;
 
-
+  Handle(BRepTools_History) myHistory; //!< The history.
+  TopTools_MapOfShape myRemoved;
 };
 
 
index 5d3af85c02f44373db31ba630a8b42cbd4862e2b..874b9ec2fb6eacbd7aabc648441063f2fa2d8a10 100755 (executable)
@@ -15,19 +15,19 @@ explode b1 f
 vinit
 vsetdispmode 1
 
-unifysamedomgen x1 b1_1
+unifysamedommod x1 b1_1
 vclear
 vdisplay x1
 vfit
 vdump ${imagedir}/${casename}_1.png
 
-unifysamedomgen x2 b1_2
+unifysamedommod x2 b1_2
 vclear
 vdisplay x2
 vfit
 vdump ${imagedir}/${casename}_2.png
 
-unifysamedomgen x3 b1_3
+unifysamedommod x3 b1_3
 vclear
 vdisplay x3
 vfit
index 82b024edf8727afc336ddc3660b40866a3b0347f..fb2965230af2bb0d33a5068a3f69328db5b8ccf4 100644 (file)
@@ -14,47 +14,25 @@ explode a e
 
 unifysamedom result a a_3 a_1_3 a_1_4
 
-set bug_info [unifysamedomgen res a_9]
+set bug_info [unifysamedommod res a_9]
 set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "No shapes were generated from the shape"} {
-  puts "ERROR: OCC28226 is reproduced. Command unifysamedomgen does not work correctly."
-}
-
-set bug_info [unifysamedomgen res a_10]
-if {$bug_info != ""} {
-  puts "ERROR: OCC28226 is reproduced. Command unifysamedomgen does not work correctly."
-}
-
-set bug_info [unifysamedomgen res a_11]
-if {$bug_info != ""} {
-  puts "ERROR: OCC28226 is reproduced. Command unifysamedomgen does not work correctly."
-}
-
-set bug_info [unifysamedomgen res a_3]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "No shapes were generated from the shape"} {
-  puts "ERROR: OCC28226 is reproduced. Command unifysamedomgen does not work correctly."
-}
-
-set bug_info [unifysamedommod res a_1]
-if {$bug_info != ""} {
+if {$bug_info != "The shape has not been modified"} {
   puts "ERROR: OCC28226 is reproduced. Command unifysamedommod does not work correctly."
 }
 
-set bug_info [unifysamedommod res a_3]
+set bug_info [unifysamedommod res a_10]
 if {$bug_info != ""} {
   puts "ERROR: OCC28226 is reproduced. Command unifysamedommod does not work correctly."
 }
 
-set bug_info [unifysamedommod res a_10]
-set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has not been modified"} {
+set bug_info [unifysamedommod res a_11]
+if {$bug_info != ""} {
   puts "ERROR: OCC28226 is reproduced. Command unifysamedommod does not work correctly."
 }
 
-set bug_info [unifysamedommod res a_11]
+set bug_info [unifysamedommod res a_3]
 set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has not been modified"} {
+if {$bug_info != ""} {
   puts "ERROR: OCC28226 is reproduced. Command unifysamedommod does not work correctly."
 }
 
@@ -98,7 +76,7 @@ unifysamedom result2 a a_3 a_1_3 a_1_4 -e
 
 set bug_info [unifysamedomisdel a_1_8]
 set bug_info [string trim [string range $bug_info 0 [expr {[string first "\n" $bug_info] - 1}]]]
-if {$bug_info != "The shape has not been deleted"} {
+if {$bug_info != "The shape has been deleted"} {
   puts "ERROR: OCC28226 is reproduced. Command unifysamedomisdel does not work correctly."
 }