Salome HOME
ab03866d84f4911ff53e0cf3a51b836f91fb1908
[modules/shaper.git] / src / GeomAPI / GeomAPI_ShapeHierarchy.h
1 // Copyright (C) 2014-2023  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #ifndef GeomAPI_ShapeHierarchy_H_
21 #define GeomAPI_ShapeHierarchy_H_
22
23 #include "GeomAPI.h"
24 #include "GeomAPI_Shape.h"
25
26 #include <map>
27 #include <set>
28 #include <vector>
29
30 /// \class GeomAPI_ShapeHierarchy
31 /// \ingroup Plugins
32 /// \brief Storage for the hierarchy of shapes and their parents (compounds or compsolids)
33 class GeomAPI_ShapeHierarchy
34 {
35   typedef std::pair<GeomShapePtr, ListOfShape> ShapeAndSubshapes;
36   typedef std::map<GeomShapePtr, GeomShapePtr, GeomAPI_Shape::Comparator> MapShapeToShape;
37   typedef std::map<GeomShapePtr, size_t, GeomAPI_Shape::Comparator> MapShapeToIndex;
38   typedef std::set<GeomShapePtr, GeomAPI_Shape::Comparator> SetOfShape;
39
40   ListOfShape myObjects; ///< list of objects of some operation
41   MapShapeToShape myParent; ///< refer a shape to compound/compsolid containing it
42   /// indices of compounds/compsolids to keep the order of parent shapes
43   /// corresponding to the order of objects
44   MapShapeToIndex  myParentIndices;
45   /// list of shape and its subshapes stored according to the index of parent shape
46   std::vector<ShapeAndSubshapes> mySubshapes;
47
48   SetOfShape myProcessedObjects;
49   MapShapeToShape myModifiedObjects;
50
51 public:
52   /// Add an object of the operation (low-level shape in the hierarchy)
53   GEOMAPI_EXPORT void addObject(const GeomShapePtr& theObject);
54
55   /// Store link between shape and its parent.
56   /// Has to be called by high-level algorithm, because the parent compound/compsolid
57   /// is usually stored as a top-level result
58   GEOMAPI_EXPORT void addParent(const GeomShapePtr& theShape, const GeomShapePtr& theParent);
59
60   /// Return parent shape for the given, or empty if it is a high-level shape.
61   /// By default, the parent and all its subshapes are marked as processed for further skip.
62   GEOMAPI_EXPORT GeomShapePtr parent(const GeomShapePtr& theShape, bool theMarkProcessed = true);
63   /// Get root shape for the specified sub-shape.
64   /// By default, the parent and all its subshapes are marked as processed for further skip.
65   GEOMAPI_EXPORT GeomShapePtr root(const GeomShapePtr& theShape, bool theMarkProcessed = true);
66
67   /// Mark the shape as already processed
68   GEOMAPI_EXPORT void markProcessed(const GeomShapePtr& theShape);
69   /// Mark list ofshapes as already processed
70   GEOMAPI_EXPORT void markProcessed(const ListOfShape& theShapes);
71
72   /// Mark the shape as modified and store its image
73   GEOMAPI_EXPORT void markModified(const GeomShapePtr& theSource, const GeomShapePtr& theModified);
74
75   /// Split compound/compsolid shape for subshapes selected for operation and the others.
76   GEOMAPI_EXPORT void splitCompound(const GeomShapePtr& theCompShape,
77                                     ListOfShape& theUsed,
78                                     ListOfShape& theNotUsed) const;
79
80   /// Generates the list of top-level compounds, which exclude the objects of operation.
81   GEOMAPI_EXPORT void compoundsOfUnusedObjects(ListOfShape& theDestination) const;
82
83   /// Generates the list of top-level compounds, with modified objects of operation.
84   GEOMAPI_EXPORT void topLevelObjects(ListOfShape& theDestination) const;
85
86   /// Return \c true if there is no object in hierarchy
87   GEOMAPI_EXPORT bool empty() const;
88
89   /// Return list of objects
90   const ListOfShape& objects() const { return myObjects; }
91   /// Return list of low-level objects for the parent shape
92   GEOMAPI_EXPORT const ListOfShape& objects(GeomShapePtr theParent) const;
93   /// Separate objects of the given range of types and all other objects
94   GEOMAPI_EXPORT void objectsByType(ListOfShape& theShapesByType, ListOfShape& theOtherShapes,
95       const GeomAPI_Shape::ShapeType theMinType = GeomAPI_Shape::COMPOUND,
96       const GeomAPI_Shape::ShapeType theMaxType = GeomAPI_Shape::SHAPE) const;
97
98 private:
99   /// Collect subs of a top-level compound, excluding the set of given objects
100   /// and substitute the shapes which were modified
101   GeomShapePtr collectSubs(const GeomShapePtr theTopLevelCompound,
102                            const SetOfShape& theExcluded = SetOfShape(),
103                            const MapShapeToShape& theModified = MapShapeToShape()) const;
104
105 public:
106   class iterator : public std::iterator<std::forward_iterator_tag, GeomShapePtr>
107   {
108   public:
109     GEOMAPI_EXPORT iterator() {}
110
111   protected:
112     iterator(GeomAPI_ShapeHierarchy* theHierarchy, bool isBegin = true);
113
114     void skipAlreadyProcessed();
115
116   public:
117     GEOMAPI_EXPORT bool operator==(const iterator&) const;
118     GEOMAPI_EXPORT bool operator!=(const iterator&) const;
119
120     GEOMAPI_EXPORT iterator& operator++();
121     GEOMAPI_EXPORT iterator  operator++(int);
122
123     GEOMAPI_EXPORT GeomShapePtr operator*() const;
124
125   private:
126     GeomAPI_ShapeHierarchy* myHierarchy;
127     ListOfShape::iterator myObject;
128
129     friend class GeomAPI_ShapeHierarchy;
130   };
131
132   GEOMAPI_EXPORT iterator begin();
133   GEOMAPI_EXPORT iterator end();
134 };
135
136 #endif