1 // Copyright (C) 2014-2020 CEA/DEN, EDF R&D
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.
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.
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
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #ifndef GeomAPI_ShapeHierarchy_H_
21 #define GeomAPI_ShapeHierarchy_H_
24 #include "GeomAPI_Shape.h"
30 /// \class GeomAPI_ShapeHierarchy
32 /// \brief Storage for the hierarchy of shapes and their parents (compounds or compsolids)
33 class GeomAPI_ShapeHierarchy
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;
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;
48 SetOfShape myProcessedObjects;
49 MapShapeToShape myModifiedObjects;
52 /// Add an object of the operation (low-level shape in the hierarchy)
53 GEOMAPI_EXPORT void addObject(const GeomShapePtr& theObject);
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);
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);
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);
72 /// Mark the shape as modified and store its image
73 GEOMAPI_EXPORT void markModified(const GeomShapePtr& theSource, const GeomShapePtr& theModified);
75 /// Split compound/compsolid shape for subshapes selected for operation and the others.
76 GEOMAPI_EXPORT void splitCompound(const GeomShapePtr& theCompShape,
78 ListOfShape& theNotUsed) const;
80 /// Generates the list of top-level compounds, which exclude the objects of operation.
81 GEOMAPI_EXPORT void compoundsOfUnusedObjects(ListOfShape& theDestination) const;
83 /// Generates the list of top-level compounds, with modified objects of operation.
84 GEOMAPI_EXPORT void topLevelObjects(ListOfShape& theDestination) const;
86 /// Return \c true if there is no object in hierarchy
87 GEOMAPI_EXPORT bool empty() const;
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;
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;
106 class iterator : public std::iterator<std::forward_iterator_tag, GeomShapePtr>
109 GEOMAPI_EXPORT iterator() {}
112 iterator(GeomAPI_ShapeHierarchy* theHierarchy, bool isBegin = true);
114 void skipAlreadyProcessed();
117 GEOMAPI_EXPORT bool operator==(const iterator&) const;
118 GEOMAPI_EXPORT bool operator!=(const iterator&) const;
120 GEOMAPI_EXPORT iterator& operator++();
121 GEOMAPI_EXPORT iterator operator++(int);
123 GEOMAPI_EXPORT GeomShapePtr operator*() const;
126 GeomAPI_ShapeHierarchy* myHierarchy;
127 ListOfShape::iterator myObject;
129 friend class GeomAPI_ShapeHierarchy;
132 GEOMAPI_EXPORT iterator begin();
133 GEOMAPI_EXPORT iterator end();