X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_MakeShapeList.cpp;h=7be7d7c12571d913d033c8ed67d144dbbaad4f4d;hb=f0cec241aae9ca16d86e166f45cb5c4987d2c792;hp=50e621abe4e9eb494f53972e7becc6839bf91bba;hpb=98713097930edb46d37ffb835d685ec2ef9439dc;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp index 50e621abe..7be7d7c12 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp @@ -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 +#include "GeomAlgoAPI_MakeShapeList.h" -#include #include -#include -#include +#include //================================================================================================= 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 theMakeShape) +{ + myListOfMakeShape.push_back(theMakeShape); + if(!myMap.get()) { + myMap.reset(new GeomAPI_DataMapOfShapeShape()); + } + myMap->merge(theMakeShape->mapOfSubShapes()); } //================================================================================================= const std::shared_ptr GeomAlgoAPI_MakeShapeList::shape() const { - if(myListOfMakeShape.empty()) { - return std::shared_ptr(); - } else { + std::shared_ptr aShape = GeomAlgoAPI_MakeShape::shape(); + if(aShape.get() && !aShape->impl().IsNull()) { + return aShape; + } else if(!myListOfMakeShape.empty()) { return myListOfMakeShape.back()->shape(); } + return std::shared_ptr(); } //================================================================================================= void GeomAlgoAPI_MakeShapeList::generated(const std::shared_ptr theShape, ListOfShape& theHistory) { - result(theShape, theHistory, GeomAlgoAPI_MakeShapeList::Generated); + result(theShape, GeomAlgoAPI_MakeShapeList::Generated, theHistory); } //================================================================================================= void GeomAlgoAPI_MakeShapeList::modified(const std::shared_ptr theShape, ListOfShape& theHistory) { - result(theShape, theHistory, GeomAlgoAPI_MakeShapeList::Modified); + result(theShape, GeomAlgoAPI_MakeShapeList::Modified, theHistory); } bool GeomAlgoAPI_MakeShapeList::isDeleted(const std::shared_ptr theShape) { for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) { - BRepBuilderAPI_MakeShape* aBuilder = (*aBuilderIt)->implPtr(); - if(aBuilder && (aBuilder->IsDeleted(theShape->impl()) == Standard_True)) { + std::shared_ptr aMakeShape = *aBuilderIt; + if(aMakeShape->isDeleted(theShape)) { return true; } } @@ -66,8 +87,8 @@ bool GeomAlgoAPI_MakeShapeList::isDeleted(const std::shared_ptr t } void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr 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 theS aResultShapes.Add(theShape->impl()); for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) { - BRepBuilderAPI_MakeShape* aBuilder = (*aBuilderIt)->implPtr(); + std::shared_ptr aMakeShape = *aBuilderIt; NCollection_Map aTempShapes; bool hasResults = false; for(NCollection_Map::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 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()); + aResultShapes.Add((*anIt)->impl()); 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()); + aResultShapes.Add((*anIt)->impl()); hasResults = true; } if(hasResults) { - aResultShapes.Remove(aShape); + aResultShapes.Remove(aShape->impl()); } } anAlgoShapes.Unite(aTempShapes); @@ -109,4 +133,3 @@ void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr theS theHistory.push_back(aShape); } } -