Salome HOME
50e621abe4e9eb494f53972e7becc6839bf91bba
[modules/shaper.git] / src / GeomAlgoAPI / GeomAlgoAPI_MakeShapeList.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:        GeomAlgoAPI_MakeShapeListList.h
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     BRepBuilderAPI_MakeShape* aBuilder = (*aBuilderIt)->implPtr<BRepBuilderAPI_MakeShape>();
83     NCollection_Map<TopoDS_Shape> aTempShapes;
84     bool hasResults = false;
85     for(NCollection_Map<TopoDS_Shape>::Iterator aShapeIt(anAlgoShapes); aShapeIt.More(); aShapeIt.Next()) {
86       const TopoDS_Shape& aShape = aShapeIt.Value();
87       const TopTools_ListOfShape& aGeneratedList = aBuilder->Generated(aShape);
88       for(TopTools_ListIteratorOfListOfShape anIt(aGeneratedList); anIt.More(); anIt.Next()) {
89         aTempShapes.Add(anIt.Value());
90         aResultShapes.Add(anIt.Value());
91         hasResults = true;
92       }
93       const TopTools_ListOfShape& aModifiedList = aBuilder->Modified(aShape);
94       for(TopTools_ListIteratorOfListOfShape anIt(aModifiedList); anIt.More(); anIt.Next()) {
95         aTempShapes.Add(anIt.Value());
96         aResultShapes.Add(anIt.Value());
97         hasResults = true;
98       }
99       if(hasResults) {
100         aResultShapes.Remove(aShape);
101       }
102     }
103     anAlgoShapes.Unite(aTempShapes);
104   }
105
106   for(NCollection_Map<TopoDS_Shape>::Iterator aShapeIt(aResultShapes); aShapeIt.More(); aShapeIt.Next()) {
107     std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
108     aShape->setImpl(new TopoDS_Shape(aShapeIt.Value()));
109     theHistory.push_back(aShape);
110   }
111 }
112