]> SALOME platform Git repositories - modules/shaper.git/blobdiff - src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp
Salome HOME
Add tools
[modules/shaper.git] / src / GeomAlgoAPI / GeomAlgoAPI_MakeShapeList.cpp
index d5c050caad8497bcba19ee72a6fec4a70dbb9613..71ed1594745a4cda3130287f39d806d2106e1621 100644 (file)
@@ -1,6 +1,6 @@
 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
 
-// File:        GeomAlgoAPI_MakeShapeListList.h
+// File:        GeomAlgoAPI_MakeShapeListList.cpp
 // Created:     27 May 2015
 // Author:      Dmitry Bobylev
 
@@ -26,16 +26,31 @@ GeomAlgoAPI_MakeShapeList::GeomAlgoAPI_MakeShapeList(const ListOfMakeShape& theM
 //=================================================================================================
 void GeomAlgoAPI_MakeShapeList::init(const ListOfMakeShape& theMakeShapeList)
 {
-  myMakeShapeList = theMakeShapeList;
+  myListOfMakeShape = theMakeShapeList;
+}
+
+//=================================================================================================
+void GeomAlgoAPI_MakeShapeList::append(const std::shared_ptr<GeomAlgoAPI_MakeShape> theMakeShape)
+{
+  myListOfMakeShape.push_back(theMakeShape);
+}
+
+//=================================================================================================
+void GeomAlgoAPI_MakeShapeList::append(const GeomAlgoAPI_MakeShapeList& theMakeShapeList)
+{
+  for(ListOfMakeShape::const_iterator anIt = theMakeShapeList.myListOfMakeShape.cbegin();
+    anIt != theMakeShapeList.myListOfMakeShape.cend(); anIt++) {
+    myListOfMakeShape.push_back(*anIt);
+  }
 }
 
 //=================================================================================================
 const std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_MakeShapeList::shape() const
 {
-  if(myMakeShapeList.empty()) {
+  if(myListOfMakeShape.empty()) {
     return std::shared_ptr<GeomAPI_Shape>();
   } else {
-    return myMakeShapeList.back()->shape();
+    return myListOfMakeShape.back()->shape();
   }
 }
 
@@ -53,34 +68,58 @@ void GeomAlgoAPI_MakeShapeList::modified(const std::shared_ptr<GeomAPI_Shape> th
   result(theShape, theHistory, GeomAlgoAPI_MakeShapeList::Modified);
 }
 
+bool GeomAlgoAPI_MakeShapeList::isDeleted(const std::shared_ptr<GeomAPI_Shape> theShape)
+{
+  for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) {
+    std::shared_ptr<GeomAlgoAPI_MakeShape> aMakeShape = *aBuilderIt;
+    if(aMakeShape->isDeleted(theShape)) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
 void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr<GeomAPI_Shape> theShape,
                                        ListOfShape& theHistory,
                                        OperationType theOperationType)
 {
-  if(myMakeShapeList.empty()) {
+  if(myListOfMakeShape.empty()) {
     return;
   }
 
-  NCollection_Map<TopoDS_Shape> aTempShapes;
+  NCollection_Map<TopoDS_Shape> anAlgoShapes;
   NCollection_Map<TopoDS_Shape> aResultShapes;
-  aTempShapes.Add(theShape->impl<TopoDS_Shape>());
-
-  for(ListOfMakeShape::iterator aBuilderIt = myMakeShapeList.begin(); aBuilderIt != myMakeShapeList.end(); aBuilderIt++) {
-    BRepBuilderAPI_MakeShape* aBuilder = (*aBuilderIt)->implPtr<BRepBuilderAPI_MakeShape>();
-    for(NCollection_Map<TopoDS_Shape>::Iterator aShapeIt(aTempShapes); aShapeIt.More(); aShapeIt.Next()) {
-      const TopoDS_Shape& aShape = aShapeIt.Value();
-      const TopTools_ListOfShape& aList = theOperationType == GeomAlgoAPI_MakeShapeList::Generated ?
-                                          aBuilder->Generated(aShape) : aBuilder->Modified(aShape);
-      bool prevResRemoved = false;
-      for(TopTools_ListIteratorOfListOfShape anIt(aList); anIt.More(); anIt.Next()) {
-        aTempShapes.Add(anIt.Value());
-        aResultShapes.Add(anIt.Value());
-        if(!prevResRemoved) {
-          aResultShapes.Remove(aShape);
-          prevResRemoved = true;
-        }
+  anAlgoShapes.Add(theShape->impl<TopoDS_Shape>());
+  aResultShapes.Add(theShape->impl<TopoDS_Shape>());
+
+  for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) {
+    std::shared_ptr<GeomAlgoAPI_MakeShape> aMakeShape = *aBuilderIt;
+    NCollection_Map<TopoDS_Shape> aTempShapes;
+    bool hasResults = false;
+    for(NCollection_Map<TopoDS_Shape>::Iterator aShapeIt(anAlgoShapes); aShapeIt.More(); aShapeIt.Next()) {
+      std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape);
+      aShape->setImpl(new TopoDS_Shape(aShapeIt.Value()));
+      ListOfShape aGeneratedShapes;
+      const TopoDS_Shape& aSh = aShape->impl<TopoDS_Shape>();
+      aMakeShape->generated(aShape, aGeneratedShapes);
+      for(ListOfShape::const_iterator anIt = aGeneratedShapes.cbegin(); anIt != aGeneratedShapes.cend(); anIt++) {
+        aTempShapes.Add((*anIt)->impl<TopoDS_Shape>());
+        aResultShapes.Add((*anIt)->impl<TopoDS_Shape>());
+        hasResults = true;
+      }
+      ListOfShape aModifiedShapes;
+      aMakeShape->modified(aShape, aModifiedShapes);
+      for(ListOfShape::const_iterator anIt = aModifiedShapes.cbegin(); anIt != aModifiedShapes.cend(); anIt++) {
+        aTempShapes.Add((*anIt)->impl<TopoDS_Shape>());
+        aResultShapes.Add((*anIt)->impl<TopoDS_Shape>());
+        hasResults = true;
+      }
+      if(hasResults) {
+        aResultShapes.Remove(aShape->impl<TopoDS_Shape>());
       }
     }
+    anAlgoShapes.Unite(aTempShapes);
   }
 
   for(NCollection_Map<TopoDS_Shape>::Iterator aShapeIt(aResultShapes); aShapeIt.More(); aShapeIt.Next()) {
@@ -89,4 +128,3 @@ void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr<GeomAPI_Shape> theS
     theHistory.push_back(aShape);
   }
 }
-