Salome HOME
Extract ShapeHierarchy as a separate object
[modules/shaper.git] / src / FeaturesPlugin / FeaturesPlugin_VersionedBoolean.h
index 098509c3c4842a85aab0afd590119efc428896de..074a59bcea526b52fbe4978177bfbe21100141bc 100644 (file)
@@ -23,6 +23,7 @@
 #include "FeaturesPlugin.h"
 #include "FeaturesPlugin_Tools.h"
 
+#include <GeomAPI_ShapeHierarchy.h>
 #include <GeomAlgoAPI_Tools.h>
 
 #include <ModelAPI_Feature.h>
@@ -55,92 +56,9 @@ protected:
                    const std::shared_ptr<ModelAPI_Attribute> theToolsAttr
                             = std::shared_ptr<ModelAPI_Attribute>());
 
-  /// Auxiliary class to store hierarchy of Boolean operation objects/tools
-  /// and their parent shapes (compounds or compsolids)
-  class ObjectHierarchy {
-    typedef std::pair<GeomShapePtr, ListOfShape> ShapeAndSubshapes;
-    typedef std::map<GeomShapePtr, GeomShapePtr, GeomAPI_Shape::Comparator> MapShapeToParent;
-    typedef std::map<GeomShapePtr, size_t, GeomAPI_Shape::Comparator> MapShapeToIndex;
-    typedef std::set<GeomShapePtr, GeomAPI_Shape::Comparator> SetOfShape;
-
-    ListOfShape myObjects; ///< list of objects/tools of Boolean operation
-    MapShapeToParent myParent; ///< refer a shape to compound/compsolid containing it
-    /// indices of compounds/compsolids to keep the order of parent shapes
-    /// corresponding to the order of objects
-    MapShapeToIndex  myParentIndices;
-    /// list of shape and its subshapes stored according to the index of parent shape
-    std::vector<ShapeAndSubshapes> mySubshapes;
-
-    SetOfShape myProcessedObjects;
-
-  public:
-    /// Add object of Boolean opration
-    void AddObject(const GeomShapePtr& theObject);
-
-    /// Maps shape and its parent
-    void AddParent(const GeomShapePtr& theShape, const GeomShapePtr& theParent);
-
-    /// Return parent shape for the given, or empty if it is a high-level shape.
-    /// By default, the parent and all its subshapes are marked as processed for further skip.
-    GeomShapePtr Parent(const GeomShapePtr& theShape, bool theMarkProcessed = true);
-
-    /// Marke the shape as already processed
-    void MarkProcessed(const GeomShapePtr& theShape);
-    /// Marke list ofshapes as already processed
-    void MarkProcessed(const ListOfShape& theShapes);
-
-    /// Split compound/compsolid shape for subshapes selected for Boolean operation and the other.
-    void SplitCompound(const GeomShapePtr& theCompShape,
-                       ListOfShape& theUsed,
-                       ListOfShape& theNotUsed) const;
-
-    /// Generates the list of top-level compounds, which contain the objects of Boolean operation.
-    /// The generated list will contain only shapes unused during the Boolean operation.
-    void CompoundsOfUnusedObjects(ListOfShape& theDestination) const;
-
-    /// Return \c true if there is no object in hierarchy
-    bool IsEmpty() const;
-
-    /// Return list of objects
-    const ListOfShape& Objects() const { return myObjects; }
-    /// Separate objects of the given range of types and all other objects
-    void ObjectsByType(ListOfShape& theShapesByType, ListOfShape& theOtherShapes,
-        const GeomAPI_Shape::ShapeType theMinType = GeomAPI_Shape::COMPOUND,
-        const GeomAPI_Shape::ShapeType theMaxType = GeomAPI_Shape::SHAPE) const;
-
-  private:
-    GeomShapePtr collectUnusedSubs(const GeomShapePtr theTopLevelCompound,
-                                   const SetOfShape& theUsed) const;
-
-  public:
-    class Iterator {
-      friend class ObjectHierarchy;
-
-      ObjectHierarchy* myHierarchy;
-      ListOfShape::iterator myObject;
-
-      Iterator() {}
-      Iterator(ObjectHierarchy* theHierarchy, bool isBegin = true);
-
-      void SkipAlreadyProcessed();
-
-    public:
-      bool operator==(const Iterator&) const;
-      bool operator!=(const Iterator&) const;
-
-      Iterator& operator++();
-      Iterator  operator++(int);
-
-      GeomShapePtr operator*() const;
-    };
-
-    Iterator Begin();
-    Iterator End();
-  };
-
   /// Process SelectionList attribute and fill the objects hierarchy.
   bool processAttribute(const std::string& theAttributeName,
-                        ObjectHierarchy& theObjects,
+                        GeomAPI_ShapeHierarchy& theObjects,
                         ListOfShape& thePlanesList);
 
   /// Perform Boolean operation of the object with the tools.
@@ -161,7 +79,7 @@ protected:
   /// is added to this compound, and corresponding ResultBody is not generated.
   /// \return \c false if something went wrong
   bool processCompsolid(const GeomAlgoAPI_Tools::BOPType theBooleanType,
-                        ObjectHierarchy& theCompsolidHierarchy,
+                        GeomAPI_ShapeHierarchy& theCompsolidHierarchy,
                         const GeomShapePtr& theCompsolid,
                         const ListOfShape& theTools,
                         const ListOfShape& thePlanes,
@@ -175,7 +93,7 @@ protected:
   /// is added to this compound, and corresponding ResultBody is not generated.
   /// \return \c false if something went wrong
   bool processCompound(const GeomAlgoAPI_Tools::BOPType theBooleanType,
-                       ObjectHierarchy& theCompoundHierarchy,
+                       GeomAPI_ShapeHierarchy& theCompoundHierarchy,
                        const GeomShapePtr& theCompound,
                        const ListOfShape& theTools,
                        int& theResultIndex,
@@ -193,14 +111,9 @@ protected:
   /// into a single compound and add the result of the FUSE operation.
   GeomShapePtr keepUnusedSubsOfCompound(
       const GeomShapePtr& theResult,
-      const ObjectHierarchy& theObjectsHierarchy,
-      const ObjectHierarchy& theToolsHierarchy,
+      const GeomAPI_ShapeHierarchy& theObjectsHierarchy,
+      const GeomAPI_ShapeHierarchy& theToolsHierarchy,
       std::shared_ptr<GeomAlgoAPI_MakeShapeList> theMakeShapeList);
-
-private:
-  void parentForShape(const GeomShapePtr& theShape,
-                      const std::shared_ptr<ModelAPI_Result>& theContext,
-                      ObjectHierarchy& theShapesHierarchy);
 };
 
 #endif