]> SALOME platform Git repositories - modules/shaper.git/blob - src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp
Salome HOME
7b1bb7be33aa20b7e9cfa3df985cc45355f3b2b9
[modules/shaper.git] / src / GeomAlgoAPI / GeomAlgoAPI_MakeShapeList.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:        GeomAlgoAPI_MakeShapeListList.cpp
4 // Created:     27 May 2015
5 // Author:      Dmitry Bobylev
6
7 #include <GeomAlgoAPI_MakeShapeList.h>
8
9 #include <BRepBuilderAPI_MakeShape.hxx>
10 #include <NCollection_Map.hxx>
11 #include <TopTools_ListOfShape.hxx>
12 #include <TopTools_ListIteratorOfListOfShape.hxx>
13
14 //=================================================================================================
15 GeomAlgoAPI_MakeShapeList::GeomAlgoAPI_MakeShapeList()
16 : GeomAlgoAPI_MakeShape()
17 {}
18
19 //=================================================================================================
20 GeomAlgoAPI_MakeShapeList::GeomAlgoAPI_MakeShapeList(const ListOfMakeShape& theMakeShapeList)
21 : GeomAlgoAPI_MakeShape()
22 {
23   init(theMakeShapeList);
24 }
25
26 //=================================================================================================
27 void GeomAlgoAPI_MakeShapeList::init(const ListOfMakeShape& theMakeShapeList)
28 {
29   myListOfMakeShape = theMakeShapeList;
30 }
31
32 //=================================================================================================
33 const std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_MakeShapeList::shape() const
34 {
35   if(myListOfMakeShape.empty()) {
36     return std::shared_ptr<GeomAPI_Shape>();
37   } else {
38     return myListOfMakeShape.back()->shape();
39   }
40 }
41
42 //=================================================================================================
43 void GeomAlgoAPI_MakeShapeList::generated(const std::shared_ptr<GeomAPI_Shape> theShape,
44                                           ListOfShape& theHistory)
45 {
46   result(theShape, theHistory, GeomAlgoAPI_MakeShapeList::Generated);
47 }
48
49 //=================================================================================================
50 void GeomAlgoAPI_MakeShapeList::modified(const std::shared_ptr<GeomAPI_Shape> theShape,
51                                          ListOfShape& theHistory)
52 {
53   result(theShape, theHistory, GeomAlgoAPI_MakeShapeList::Modified);
54 }
55
56 bool GeomAlgoAPI_MakeShapeList::isDeleted(const std::shared_ptr<GeomAPI_Shape> theShape)
57 {
58   for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) {
59     BRepBuilderAPI_MakeShape* aBuilder = (*aBuilderIt)->implPtr<BRepBuilderAPI_MakeShape>();
60     if(aBuilder && (aBuilder->IsDeleted(theShape->impl<TopoDS_Shape>()) == Standard_True)) {
61       return true;
62     }
63   }
64
65   return false;
66 }
67
68 void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr<GeomAPI_Shape> theShape,
69                                        ListOfShape& theHistory,
70                                        OperationType theOperationType)
71 {
72   if(myListOfMakeShape.empty()) {
73     return;
74   }
75
76   NCollection_Map<TopoDS_Shape> anAlgoShapes;
77   NCollection_Map<TopoDS_Shape> aResultShapes;
78   anAlgoShapes.Add(theShape->impl<TopoDS_Shape>());
79   aResultShapes.Add(theShape->impl<TopoDS_Shape>());
80
81   for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) {
82     std::shared_ptr<GeomAlgoAPI_MakeShape> aMakeShape = *aBuilderIt;
83     NCollection_Map<TopoDS_Shape> aTempShapes;
84     bool hasResults = false;
85     for(NCollection_Map<TopoDS_Shape>::Iterator aShapeIt(anAlgoShapes); aShapeIt.More(); aShapeIt.Next()) {
86       std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape);
87       aShape->setImpl(new TopoDS_Shape(aShapeIt.Value()));
88       ListOfShape aGeneratedShapes;
89       const TopoDS_Shape& aSh = aShape->impl<TopoDS_Shape>();
90       aMakeShape->generated(aShape, aGeneratedShapes);
91       for(ListOfShape::const_iterator anIt = aGeneratedShapes.cbegin(); anIt != aGeneratedShapes.cend(); anIt++) {
92         aTempShapes.Add((*anIt)->impl<TopoDS_Shape>());
93         aResultShapes.Add((*anIt)->impl<TopoDS_Shape>());
94         hasResults = true;
95       }
96       ListOfShape aModifiedShapes;
97       aMakeShape->modified(aShape, aModifiedShapes);
98       for(ListOfShape::const_iterator anIt = aModifiedShapes.cbegin(); anIt != aModifiedShapes.cend(); anIt++) {
99         aTempShapes.Add((*anIt)->impl<TopoDS_Shape>());
100         aResultShapes.Add((*anIt)->impl<TopoDS_Shape>());
101         hasResults = true;
102       }
103       if(hasResults) {
104         aResultShapes.Remove(aShape->impl<TopoDS_Shape>());
105       }
106     }
107     anAlgoShapes.Unite(aTempShapes);
108   }
109
110   for(NCollection_Map<TopoDS_Shape>::Iterator aShapeIt(aResultShapes); aShapeIt.More(); aShapeIt.Next()) {
111     std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
112     aShape->setImpl(new TopoDS_Shape(aShapeIt.Value()));
113     theHistory.push_back(aShape);
114   }
115 }
116