1 // Copyright (C) 2014-2017 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
18 // email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
21 #include "GeomAlgoAPI_MakeShapeList.h"
24 #include <NCollection_List.hxx>
25 #include <NCollection_Map.hxx>
26 #include <TopoDS_Shape.hxx>
28 //=================================================================================================
29 GeomAlgoAPI_MakeShapeList::GeomAlgoAPI_MakeShapeList()
30 : GeomAlgoAPI_MakeShape()
33 //=================================================================================================
34 GeomAlgoAPI_MakeShapeList::GeomAlgoAPI_MakeShapeList(const ListOfMakeShape& theMakeShapeList)
35 : GeomAlgoAPI_MakeShape()
37 init(theMakeShapeList);
40 //=================================================================================================
41 void GeomAlgoAPI_MakeShapeList::init(const ListOfMakeShape& theMakeShapeList)
46 myMap.reset(new GeomAPI_DataMapOfShapeShape);
49 myListOfMakeShape = theMakeShapeList;
51 for(ListOfMakeShape::const_iterator anIt = theMakeShapeList.cbegin();
52 anIt != theMakeShapeList.cend(); ++anIt) {
53 myMap->merge((*anIt)->mapOfSubShapes());
57 //=================================================================================================
58 void GeomAlgoAPI_MakeShapeList::appendAlgo(
59 const std::shared_ptr<GeomAlgoAPI_MakeShape> theMakeShape)
61 myListOfMakeShape.push_back(theMakeShape);
63 myMap.reset(new GeomAPI_DataMapOfShapeShape());
65 myMap->merge(theMakeShape->mapOfSubShapes());
68 //=================================================================================================
69 const std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_MakeShapeList::shape() const
71 std::shared_ptr<GeomAPI_Shape> aShape = GeomAlgoAPI_MakeShape::shape();
72 if(aShape.get() && !aShape->impl<TopoDS_Shape>().IsNull()) {
74 } else if(!myListOfMakeShape.empty()) {
75 return myListOfMakeShape.back()->shape();
77 return std::shared_ptr<GeomAPI_Shape>();
80 //=================================================================================================
81 void GeomAlgoAPI_MakeShapeList::generated(const std::shared_ptr<GeomAPI_Shape> theShape,
82 ListOfShape& theHistory)
84 result(theShape, GeomAlgoAPI_MakeShapeList::Generated, theHistory);
87 //=================================================================================================
88 void GeomAlgoAPI_MakeShapeList::modified(const std::shared_ptr<GeomAPI_Shape> theShape,
89 ListOfShape& theHistory)
91 result(theShape, GeomAlgoAPI_MakeShapeList::Modified, theHistory);
94 bool GeomAlgoAPI_MakeShapeList::isDeleted(const std::shared_ptr<GeomAPI_Shape> theShape)
96 for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin();
97 aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) {
98 std::shared_ptr<GeomAlgoAPI_MakeShape> aMakeShape = *aBuilderIt;
99 if(aMakeShape->isDeleted(theShape)) {
107 void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr<GeomAPI_Shape> theShape,
108 OperationType theOperationType,
109 ListOfShape& theHistory)
111 if(myListOfMakeShape.empty()) {
115 NCollection_Map<TopoDS_Shape> anAlgoShapes;
116 NCollection_Map<TopoDS_Shape> aResultShapesMap;
117 NCollection_List<TopoDS_Shape> aResultShapesList;
118 anAlgoShapes.Add(theShape->impl<TopoDS_Shape>());
119 aResultShapesMap.Add(theShape->impl<TopoDS_Shape>());
120 aResultShapesList.Append(theShape->impl<TopoDS_Shape>());
122 for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin();
123 aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) {
124 std::shared_ptr<GeomAlgoAPI_MakeShape> aMakeShape = *aBuilderIt;
125 NCollection_Map<TopoDS_Shape> aTempShapes;
126 bool hasResults = false;
127 for(NCollection_Map<TopoDS_Shape>::Iterator
128 aShapeIt(anAlgoShapes); aShapeIt.More(); aShapeIt.Next()) {
129 std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape);
130 aShape->setImpl(new TopoDS_Shape(aShapeIt.Value()));
131 ListOfShape aGeneratedShapes;
132 aMakeShape->generated(aShape, aGeneratedShapes);
133 for(ListOfShape::const_iterator
134 anIt = aGeneratedShapes.cbegin(); anIt != aGeneratedShapes.cend(); anIt++) {
135 const TopoDS_Shape& anItShape = (*anIt)->impl<TopoDS_Shape>();
136 aTempShapes.Add(anItShape);
137 if(aResultShapesMap.Add(anItShape) == Standard_True) {
138 aResultShapesList.Append(anItShape);
142 ListOfShape aModifiedShapes;
143 aMakeShape->modified(aShape, aModifiedShapes);
144 for(ListOfShape::const_iterator
145 anIt = aModifiedShapes.cbegin(); anIt != aModifiedShapes.cend(); anIt++) {
146 const TopoDS_Shape& anItShape = (*anIt)->impl<TopoDS_Shape>();
147 aTempShapes.Add(anItShape);
148 if(aResultShapesMap.Add(anItShape) == Standard_True) {
149 aResultShapesList.Append(anItShape);
154 const TopoDS_Shape& aTopoDSShape = aShapeIt.Value();
155 if(aResultShapesMap.Remove(aTopoDSShape) == Standard_True) {
156 for(NCollection_List<TopoDS_Shape>::Iterator
157 aResIt(aResultShapesList); aResIt.More(); aResIt.Next()) {
158 if(aTopoDSShape.IsEqual(aResIt.Value())) {
159 aResultShapesList.Remove(aResIt);
166 anAlgoShapes.Unite(aTempShapes);
169 for(NCollection_List<TopoDS_Shape>::Iterator
170 aShapeIt(aResultShapesList); aShapeIt.More(); aShapeIt.Next()) {
171 std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
172 aShape->setImpl(new TopoDS_Shape(aShapeIt.Value()));
173 theHistory.push_back(aShape);