Salome HOME
Fixed Placement centering of faces (issue #1714)
[modules/shaper.git] / src / GeomAlgoAPI / GeomAlgoAPI_MakeShapeList.cpp
index 50e621abe4e9eb494f53972e7becc6839bf91bba..7be7d7c12571d913d033c8ed67d144dbbaad4f4d 100644 (file)
@@ -1,15 +1,13 @@
 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
 
-// File:        GeomAlgoAPI_MakeShapeListList.h
+// File:        GeomAlgoAPI_MakeShapeListList.cpp
 // Created:     27 May 2015
 // Author:      Dmitry Bobylev
 
-#include <GeomAlgoAPI_MakeShapeList.h>
+#include "GeomAlgoAPI_MakeShapeList.h"
 
-#include <BRepBuilderAPI_MakeShape.hxx>
 #include <NCollection_Map.hxx>
-#include <TopTools_ListOfShape.hxx>
-#include <TopTools_ListIteratorOfListOfShape.hxx>
+#include <TopoDS_Shape.hxx>
 
 //=================================================================================================
 GeomAlgoAPI_MakeShapeList::GeomAlgoAPI_MakeShapeList()
@@ -26,38 +24,61 @@ GeomAlgoAPI_MakeShapeList::GeomAlgoAPI_MakeShapeList(const ListOfMakeShape& theM
 //=================================================================================================
 void GeomAlgoAPI_MakeShapeList::init(const ListOfMakeShape& theMakeShapeList)
 {
+  if(myMap.get()) {
+    myMap->clear();
+  } else {
+    myMap.reset(new GeomAPI_DataMapOfShapeShape);
+  }
+
   myListOfMakeShape = theMakeShapeList;
+
+  for(ListOfMakeShape::const_iterator anIt = theMakeShapeList.cbegin();
+      anIt != theMakeShapeList.cend(); ++anIt) {
+    myMap->merge((*anIt)->mapOfSubShapes());
+  }
+}
+
+//=================================================================================================
+void GeomAlgoAPI_MakeShapeList::appendAlgo(const std::shared_ptr<GeomAlgoAPI_MakeShape> theMakeShape)
+{
+  myListOfMakeShape.push_back(theMakeShape);
+  if(!myMap.get()) {
+    myMap.reset(new GeomAPI_DataMapOfShapeShape());
+  }
+  myMap->merge(theMakeShape->mapOfSubShapes());
 }
 
 //=================================================================================================
 const std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_MakeShapeList::shape() const
 {
-  if(myListOfMakeShape.empty()) {
-    return std::shared_ptr<GeomAPI_Shape>();
-  } else {
+  std::shared_ptr<GeomAPI_Shape> aShape = GeomAlgoAPI_MakeShape::shape();
+  if(aShape.get() && !aShape->impl<TopoDS_Shape>().IsNull()) {
+    return aShape;
+  } else if(!myListOfMakeShape.empty()) {
     return myListOfMakeShape.back()->shape();
   }
+  return std::shared_ptr<GeomAPI_Shape>();
 }
 
 //=================================================================================================
 void GeomAlgoAPI_MakeShapeList::generated(const std::shared_ptr<GeomAPI_Shape> theShape,
                                           ListOfShape& theHistory)
 {
-  result(theShape, theHistory, GeomAlgoAPI_MakeShapeList::Generated);
+  result(theShape,  GeomAlgoAPI_MakeShapeList::Generated, theHistory);
 }
 
 //=================================================================================================
 void GeomAlgoAPI_MakeShapeList::modified(const std::shared_ptr<GeomAPI_Shape> theShape,
                                          ListOfShape& theHistory)
 {
-  result(theShape, theHistory, GeomAlgoAPI_MakeShapeList::Modified);
+  result(theShape, GeomAlgoAPI_MakeShapeList::Modified, theHistory);
 }
 
 bool GeomAlgoAPI_MakeShapeList::isDeleted(const std::shared_ptr<GeomAPI_Shape> theShape)
 {
   for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) {
-    BRepBuilderAPI_MakeShape* aBuilder = (*aBuilderIt)->implPtr<BRepBuilderAPI_MakeShape>();
-    if(aBuilder && (aBuilder->IsDeleted(theShape->impl<TopoDS_Shape>()) == Standard_True)) {
+    std::shared_ptr<GeomAlgoAPI_MakeShape> aMakeShape = *aBuilderIt;
+    if(aMakeShape->isDeleted(theShape)) {
       return true;
     }
   }
@@ -66,8 +87,8 @@ bool GeomAlgoAPI_MakeShapeList::isDeleted(const std::shared_ptr<GeomAPI_Shape> t
 }
 
 void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr<GeomAPI_Shape> theShape,
-                                       ListOfShape& theHistory,
-                                       OperationType theOperationType)
+                                       OperationType theOperationType,
+                                       ListOfShape& theHistory)
 {
   if(myListOfMakeShape.empty()) {
     return;
@@ -79,25 +100,28 @@ void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr<GeomAPI_Shape> theS
   aResultShapes.Add(theShape->impl<TopoDS_Shape>());
 
   for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) {
-    BRepBuilderAPI_MakeShape* aBuilder = (*aBuilderIt)->implPtr<BRepBuilderAPI_MakeShape>();
+    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()) {
-      const TopoDS_Shape& aShape = aShapeIt.Value();
-      const TopTools_ListOfShape& aGeneratedList = aBuilder->Generated(aShape);
-      for(TopTools_ListIteratorOfListOfShape anIt(aGeneratedList); anIt.More(); anIt.Next()) {
-        aTempShapes.Add(anIt.Value());
-        aResultShapes.Add(anIt.Value());
+      std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape);
+      aShape->setImpl(new TopoDS_Shape(aShapeIt.Value()));
+      ListOfShape aGeneratedShapes;
+      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;
       }
-      const TopTools_ListOfShape& aModifiedList = aBuilder->Modified(aShape);
-      for(TopTools_ListIteratorOfListOfShape anIt(aModifiedList); anIt.More(); anIt.Next()) {
-        aTempShapes.Add(anIt.Value());
-        aResultShapes.Add(anIt.Value());
+      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);
+        aResultShapes.Remove(aShape->impl<TopoDS_Shape>());
       }
     }
     anAlgoShapes.Unite(aTempShapes);
@@ -109,4 +133,3 @@ void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr<GeomAPI_Shape> theS
     theHistory.push_back(aShape);
   }
 }
-