0024491: Partition algorithm history bug (faces).
[occt.git] / src / BOPAlgo / BOPAlgo_Builder_4.cxx
index 9c17052..ca706f2 100644 (file)
@@ -1,24 +1,19 @@
 // Created by: Peter KURNEV
-// Copyright (c) 2010-2012 OPEN CASCADE SAS
+// Copyright (c) 2010-2014 OPEN CASCADE SAS
 // Copyright (c) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
 // Copyright (c) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT,
 //                         EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 //
-// The content of this file is subject to the Open CASCADE Technology Public
-// License Version 6.5 (the "License"). You may not use the content of this file
-// except in compliance with the License. Please obtain a copy of the License
-// at http://www.opencascade.org and read it completely before using this file.
+// This file is part of Open CASCADE Technology software library.
 //
-// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
-// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+// This library is free software; you can redistribute it and / or modify it
+// under the terms of the GNU Lesser General Public version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
 //
-// The Original Code and all software distributed under the License is
-// distributed on an "AS IS" basis, without warranty of any kind, and the
-// Initial Developer hereby disclaims all such warranties, including without
-// limitation, any warranties of merchantability, fitness for a particular
-// purpose or non-infringement. Please see the License for the specific terms
-// and conditions governing the rights and limitations under the License.
-
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
 
 #include <BOPAlgo_Builder.ixx>
 
 //function : Generated
 //purpose  : 
 //=======================================================================
-  const TopTools_ListOfShape& BOPAlgo_Builder::Generated(const TopoDS_Shape& theS)
+  const TopTools_ListOfShape& BOPAlgo_Builder::Generated(const TopoDS_Shape&)
 {
-  Standard_Boolean bHasImage, bToReverse;
-  TopAbs_ShapeEnum aType;
-  BOPCol_ListIteratorOfListOfShape aIt;
-  //
   myHistShapes.Clear();
-  //
-  if (theS.IsNull()) {
-    return myHistShapes;
-  }
-  //
-  bHasImage=myImages.IsBound(theS);
-  if (!bHasImage) {
-    return myHistShapes;
-  }
-  //
-  aType=theS.ShapeType();
-  //
-  if (!(aType==TopAbs_EDGE   || aType==TopAbs_FACE || 
-      aType==TopAbs_VERTEX || aType==TopAbs_SOLID)) {
-    return myHistShapes;
-  } 
-  //
-  //PrepareHistory();
-  //
-  const BOPCol_ListOfShape& aLSp=myImages.Find(theS);
-  aIt.Initialize(aLSp);
-  for (; aIt.More(); aIt.Next()) {
-    const TopoDS_Shape& aSp=aIt.Value();
-    if (myShapesSD.IsBound(aSp)) {
-      if (myMapShape.Contains(aSp)) {
-       TopoDS_Shape aSpR=myShapesSD.Find(aSp);
-       //
-       if (aType==TopAbs_VERTEX || aType==TopAbs_SOLID) {
-         aSpR.Orientation(theS.Orientation());
-       }
-       else {
-         bToReverse=BOPTools_AlgoTools::IsSplitToReverse(aSpR, theS, myContext);
-         if (bToReverse) {
-           aSpR.Reverse();
-         }
-       }
-       //
-         myHistShapes.Append(aSpR);
-      }
-    }
-  }
-  //
   return myHistShapes;
 }
 //=======================================================================
   aIt.Initialize(aLSp);
   for (; aIt.More(); aIt.Next()) {
     TopoDS_Shape aSp=aIt.Value();
-    if (!myShapesSD.IsBound(aSp)) {
-      if (myMapShape.Contains(aSp)) {
-       //
-       if (aType==TopAbs_VERTEX || aType==TopAbs_SOLID) {
-         aSp.Orientation(theS.Orientation());
-       }
-       else {
-         bToReverse=BOPTools_AlgoTools::IsSplitToReverse(aSp, theS, myContext);
-         if (bToReverse) {
-           aSp.Reverse();
-         }
-       }
-       //
-       myHistShapes.Append(aSp);
+    if (myShapesSD.IsBound(aSp)) {
+      aSp = myShapesSD.Find(aSp);
+    }
+    //
+    if (myMapShape.Contains(aSp)) {
+      //
+      if (aType==TopAbs_VERTEX || aType==TopAbs_SOLID) {
+        aSp.Orientation(theS.Orientation());
+      }
+      else {
+        bToReverse=BOPTools_AlgoTools::IsSplitToReverse(aSp, theS, myContext);
+        if (bToReverse) {
+          aSp.Reverse();
+        }
       }
+      //
+      myHistShapes.Append(aSp);
     }
   }
   //
     //
     if (!myShapesSD.IsBound(aSp)) {
       if (myMapShape.Contains(aSp)) {
-       return bRet; //false
+        return bRet; //false
       }
     }
     else {
       TopoDS_Shape aSpR=myShapesSD.Find(aSp);
       if (myMapShape.Contains(aSpR)) {
-       return bRet; //false
+        return bRet; //false
       }
     }
   }
     return;
   }
   //
-  Standard_Boolean bHasImage, bContainsSD;
+  Standard_Boolean bHasImage;
   TopAbs_ShapeEnum aType;
   BOPCol_MapOfShape aMS;
   BOPCol_ListIteratorOfListOfShape aIt;
     BOPCol_ListOfShape aLSx;
     if (!bHasImage) {
       if (myMapShape.Contains(aSx)) {
-       aLSx.Append(aSx);
-       myImagesResult.Add(aSx, aLSx);
+        aLSx.Append(aSx);
+        myImagesResult.Add(aSx, aLSx);
       }
     }
     else {
       const BOPCol_ListOfShape& aLSp=myImages.Find(aSx);
       aIt.Initialize(aLSp);
       for (; aIt.More(); aIt.Next()) {
-       const TopoDS_Shape& aSp=aIt.Value();
-       if (myMapShape.Contains(aSp)) {
-         aLSx.Append(aSp);
-       }
+        const TopoDS_Shape& aSp=aIt.Value();
+        if (myMapShape.Contains(aSp)) {
+          aLSx.Append(aSp);
+        }
       }
       myImagesResult.Add(aSx, aLSx);
     }
       myHasDeleted=IsDeleted(aSx);
     }
     //
-    if (!myHasGenerated || !myHasModified) {
+    if (!myHasModified && bHasImage) {
       if (aType==TopAbs_EDGE   || aType==TopAbs_FACE || 
-         aType==TopAbs_VERTEX || aType==TopAbs_SOLID) {
-       if (bHasImage) {
-         const BOPCol_ListOfShape& aLSp=myImages.Find(aSx);
-         aIt.Initialize(aLSp);
-         for (; aIt.More(); aIt.Next()) {
-           const TopoDS_Shape& aSp=aIt.Value();
-           //
-           if (myMapShape.Contains(aSp)) {
-             bContainsSD=myShapesSD.IsBound(aSp);
-             //
-             if (!myHasGenerated) {
-               if (bContainsSD) {
-                 myHasGenerated=Standard_True;
-               }
-             }
-             if (!myHasModified) {
-               if (!bContainsSD) {
-                 myHasModified=Standard_True;
-               }
-             }
-           } // if (myMapShape.Contains(aSp))
-         }
-       }
+          aType==TopAbs_VERTEX || aType==TopAbs_SOLID) {
+        myHasModified = Standard_True;
       } 
     }
+    //
+    if (!myHasGenerated) {
+      if (aType==TopAbs_FACE) {
+        const TopTools_ListOfShape& aLG = Generated(aSx);
+        myHasGenerated = aLG.Extent() > 0;
+      }
+    }
   }
   myFlagHistory=Standard_True;
 }
-
-// <- A
-    /*
-    BOPCol_ListOfShape aLSx;
-    if (!bHasImage) {
-      if (myMapShape.Contains(aSx)) {
-       aLSx.Append(aSx);
-       myImagesResult.Add(aSx, aLSx);
-      }
-    }
-    else {
-      const BOPCol_ListOfShape& aLSp=myImages.Find(aSx);
-      aIt.Initialize(aLSp);
-      for (; aIt.More(); aIt.Next()) {
-       const TopoDS_Shape& aSp=aIt.Value();
-       if (myMapShape.Contains(aSp)) {
-         aLSx.Append(aSp);
-       }
-      }
-      myImagesResult.Add(aSx, aLSx);
-    }
-    */