0028747: Incorrect result of the section operation after edge refinement
[occt.git] / src / BOPAlgo / BOPAlgo_BuilderShape.hxx
index 10acdef..ffdf8b1 100644 (file)
 #include <Standard.hxx>
 #include <Standard_DefineAlloc.hxx>
 #include <Standard_Handle.hxx>
-#include <Standard_Boolean.hxx>
 
 #include <BOPAlgo_Algo.hxx>
+#include <BRepTools_History.hxx>
+
+#include <Standard_Boolean.hxx>
+
 #include <NCollection_BaseAllocator.hxx>
 #include <TopoDS_Shape.hxx>
 #include <TopTools_ListOfShape.hxx>
 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
 class TopoDS_Shape;
 
-
-//! Root class for algorithms that has shape as result.<br>
+//! Root class for algorithms that has shape as result.
+//!
 //! The class provides the History mechanism, which allows
 //! tracking the modification of the input shapes during
-//! the operation.
-class BOPAlgo_BuilderShape  : public BOPAlgo_Algo
+//! the operation. It uses the *BRepTools_History* tool
+//! as a storer for history objects.
+class BOPAlgo_BuilderShape : public BOPAlgo_Algo
 {
 public:
 
   DEFINE_STANDARD_ALLOC
 
-  
+public: //! @name Getting the result
+
   //! Returns the result of algorithm
-  Standard_EXPORT const TopoDS_Shape& Shape() const;
-  
-  //! Returns the list of shapes generated from the
-  //! shape theS.
-  Standard_EXPORT virtual const TopTools_ListOfShape& Generated (const TopoDS_Shape& theS);
-  
-  //! Returns the list of shapes modified from the
-  //! shape theS.
-  Standard_EXPORT virtual const TopTools_ListOfShape& Modified (const TopoDS_Shape& theS);
-  
+  const TopoDS_Shape& Shape() const { return myShape; }
+
+
+public: //! @name History methods
+
+  //! Returns the list of shapes Modified from the shape theS.
+  const TopTools_ListOfShape& Modified(const TopoDS_Shape& theS)
+  {
+    if (myFillHistory && myHistory)
+      return myHistory->Modified(theS);
+    myHistShapes.Clear();
+    return myHistShapes;
+  }
+
+  //! Returns the list of shapes Generated from the shape theS.
+  const TopTools_ListOfShape& Generated(const TopoDS_Shape& theS)
+  {
+    if (myFillHistory && myHistory)
+      return myHistory->Generated(theS);
+    myHistShapes.Clear();
+    return myHistShapes;
+  }
+
   //! Returns true if the shape theS has been deleted.
-  Standard_EXPORT virtual Standard_Boolean IsDeleted (const TopoDS_Shape& theS);
-  
-  //! Returns true if the at least one shape(or subshape)
-  //! of arguments has been deleted.
-  Standard_EXPORT Standard_Boolean HasDeleted() const;
-  
-  //! Returns true if the at least one shape(or subshape)
-  //! of arguments has generated shapes.
-  Standard_EXPORT Standard_Boolean HasGenerated() const;
-  
-  //! Returns true if the at least one shape(or subshape)
-  //! of arguments has modified shapes.
-  Standard_EXPORT Standard_Boolean HasModified() const;
-  
-  Standard_EXPORT const TopTools_IndexedDataMapOfShapeListOfShape& ImagesResult() const;
-
-
-
-
-protected:
-
-  
-  Standard_EXPORT BOPAlgo_BuilderShape();
-Standard_EXPORT virtual ~BOPAlgo_BuilderShape();
-  
-  Standard_EXPORT BOPAlgo_BuilderShape(const Handle(NCollection_BaseAllocator)& theAllocator);
-  
-  //! Prepare information for history support
-  Standard_EXPORT virtual void PrepareHistory();
-
-
-  TopoDS_Shape myShape;
-  TopTools_ListOfShape myHistShapes;
-  TopTools_MapOfShape myMapShape;
-  Standard_Boolean myHasDeleted;
-  Standard_Boolean myHasGenerated;
-  Standard_Boolean myHasModified;
-  TopTools_IndexedDataMapOfShapeListOfShape myImagesResult;
-  Standard_Boolean myFlagHistory;
-
-private:
+  //! In this case the shape will have no Modified elements,
+  //! but can have Generated elements.
+  Standard_Boolean IsDeleted(const TopoDS_Shape& theS)
+  {
+    return (myFillHistory && myHistory ? myHistory->IsRemoved(theS) : Standard_False);
+  }
+
+  //! Returns true if any of the input shapes has been modified during operation.
+  Standard_Boolean HasModified() const
+  {
+    return (myFillHistory && myHistory ? myHistory->HasModified() : Standard_False);
+  }
+
+  //! Returns true if any of the input shapes has generated shapes during operation.
+  Standard_Boolean HasGenerated() const
+  {
+    return (myFillHistory && myHistory ? myHistory->HasGenerated() : Standard_False);
+  }
+
+  //! Returns true if any of the input shapes has been deleted during operation.
+  Standard_Boolean HasDeleted() const
+  {
+    return (myFillHistory && myHistory ? myHistory->HasRemoved() : Standard_False);
+  }
+
+  //! History Tool
+  Handle(BRepTools_History) History() const
+  {
+    return myFillHistory ? myHistory : NULL;
+  }
+
+public: //! @name Enabling/Disabling the history collection.
+
+  //! Allows disabling the history collection
+  void SetToFillHistory(const Standard_Boolean theHistFlag) { myFillHistory = theHistFlag; }
+
+  //! Returns flag of history availability
+  Standard_Boolean HasHistory() const { return myFillHistory; }
+
+protected: //! @name Constructors
+
+  //! Empty constructor
+  BOPAlgo_BuilderShape()
+  :
+    BOPAlgo_Algo(),
+    myFillHistory(Standard_True)
+  {}
+
+  //! Constructor with allocator
+  BOPAlgo_BuilderShape(const Handle(NCollection_BaseAllocator)& theAllocator)
+  :
+    BOPAlgo_Algo(theAllocator),
+    myFillHistory(Standard_True)
+  {}
+
+
+protected: //! @name Clearing
+
+  //! Clears the content of the algorithm.
+  virtual void Clear() Standard_OVERRIDE
+  {
+    BOPAlgo_Algo::Clear();
+    myHistory.Nullify();
+    myMapShape.Clear();
+  }
+
+protected: //! @name Fields
+
+  TopoDS_Shape myShape; //!< Result of the operation
+
+  TopTools_ListOfShape myHistShapes;   //!< Storer for the history shapes
+  TopTools_MapOfShape myMapShape;      //!< Cashed map of all arguments shapes
+
+  Standard_Boolean myFillHistory;      //!< Controls the history filling
+  Handle(BRepTools_History) myHistory; //!< History tool
 
 };