]> SALOME platform Git repositories - modules/shaper.git/blob - src/GeomAPI/GeomAPI_ShapeHierarchy.h
Salome HOME
Task 3.2. To keep compounds’ sub-shapes for all operations (issue #3139)
[modules/shaper.git] / src / GeomAPI / GeomAPI_ShapeHierarchy.h
1 // Copyright (C) 2014-2020  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
64   /// Mark the shape as already processed
65   GEOMAPI_EXPORT void markProcessed(const GeomShapePtr& theShape);
66   /// Mark list ofshapes as already processed
67   GEOMAPI_EXPORT void markProcessed(const ListOfShape& theShapes);
68
69   /// Mark the shape as modified and store its image
70   GEOMAPI_EXPORT void markModified(const GeomShapePtr& theSource, const GeomShapePtr& theModified);
71
72   /// Split compound/compsolid shape for subshapes selected for operation and the others.
73   GEOMAPI_EXPORT void splitCompound(const GeomShapePtr& theCompShape,
74                                     ListOfShape& theUsed,
75                                     ListOfShape& theNotUsed) const;
76
77   /// Generates the list of top-level compounds, which exclude the objects of operation.
78   GEOMAPI_EXPORT void compoundsOfUnusedObjects(ListOfShape& theDestination) const;
79
80   /// Generates the list of top-level compounds, with modified objects of operation.
81   GEOMAPI_EXPORT void topLevelObjects(ListOfShape& theDestination) const;
82
83   /// Return \c true if there is no object in hierarchy
84   GEOMAPI_EXPORT bool empty() const;
85
86   /// Return list of objects
87   const ListOfShape& objects() const { return myObjects; }
88   /// Separate objects of the given range of types and all other objects
89   GEOMAPI_EXPORT void objectsByType(ListOfShape& theShapesByType, ListOfShape& theOtherShapes,
90       const GeomAPI_Shape::ShapeType theMinType = GeomAPI_Shape::COMPOUND,
91       const GeomAPI_Shape::ShapeType theMaxType = GeomAPI_Shape::SHAPE) const;
92
93 private:
94   /// Collect subs of a top-level compound, excluding the set of given objects
95   /// and substitute the shapes which were modified
96   GeomShapePtr collectSubs(const GeomShapePtr theTopLevelCompound,
97                            const SetOfShape& theExcluded = SetOfShape(),
98                            const MapShapeToShape& theModified = MapShapeToShape()) const;
99
100 public:
101   class iterator : public std::iterator<std::forward_iterator_tag, GeomShapePtr>
102   {
103   public:
104     GEOMAPI_EXPORT iterator() {}
105
106   protected:
107     iterator(GeomAPI_ShapeHierarchy* theHierarchy, bool isBegin = true);
108
109     void skipAlreadyProcessed();
110
111   public:
112     GEOMAPI_EXPORT bool operator==(const iterator&) const;
113     GEOMAPI_EXPORT bool operator!=(const iterator&) const;
114
115     GEOMAPI_EXPORT iterator& operator++();
116     GEOMAPI_EXPORT iterator  operator++(int);
117
118     GEOMAPI_EXPORT GeomShapePtr operator*() const;
119
120   private:
121     GeomAPI_ShapeHierarchy* myHierarchy;
122     ListOfShape::iterator myObject;
123
124     friend class GeomAPI_ShapeHierarchy;
125   };
126
127   GEOMAPI_EXPORT iterator begin();
128   GEOMAPI_EXPORT iterator end();
129 };
130
131 #endif