X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_MakeShapeList.cpp;h=1442c5b324204398f776174c4e77fb6a022258a2;hb=b2a662eec6a0258d51a67ee7e341541e7a710752;hp=d5c050caad8497bcba19ee72a6fec4a70dbb9613;hpb=5e90be5a37588dd936e6d5f1a6426141bfda7170;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp index d5c050caa..1442c5b32 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,61 +24,92 @@ GeomAlgoAPI_MakeShapeList::GeomAlgoAPI_MakeShapeList(const ListOfMakeShape& theM //================================================================================================= void GeomAlgoAPI_MakeShapeList::init(const ListOfMakeShape& theMakeShapeList) { - myMakeShapeList = theMakeShapeList; + myListOfMakeShape = theMakeShapeList; +} + +//================================================================================================= +void GeomAlgoAPI_MakeShapeList::appendAlgo(const std::shared_ptr theMakeShape) +{ + myListOfMakeShape.push_back(theMakeShape); } //================================================================================================= const std::shared_ptr GeomAlgoAPI_MakeShapeList::shape() const { - if(myMakeShapeList.empty()) { - return std::shared_ptr(); - } else { - return myMakeShapeList.back()->shape(); + 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++) { + std::shared_ptr aMakeShape = *aBuilderIt; + if(aMakeShape->isDeleted(theShape)) { + return true; + } + } + + return false; } void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr theShape, - ListOfShape& theHistory, - OperationType theOperationType) + OperationType theOperationType, + ListOfShape& theHistory) { - if(myMakeShapeList.empty()) { + if(myListOfMakeShape.empty()) { return; } - NCollection_Map aTempShapes; + NCollection_Map anAlgoShapes; NCollection_Map aResultShapes; - aTempShapes.Add(theShape->impl()); - - for(ListOfMakeShape::iterator aBuilderIt = myMakeShapeList.begin(); aBuilderIt != myMakeShapeList.end(); aBuilderIt++) { - BRepBuilderAPI_MakeShape* aBuilder = (*aBuilderIt)->implPtr(); - for(NCollection_Map::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()); + aResultShapes.Add(theShape->impl()); + + for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) { + std::shared_ptr aMakeShape = *aBuilderIt; + NCollection_Map aTempShapes; + bool hasResults = false; + for(NCollection_Map::Iterator aShapeIt(anAlgoShapes); aShapeIt.More(); aShapeIt.Next()) { + 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; + } + 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->impl()); } } + anAlgoShapes.Unite(aTempShapes); } for(NCollection_Map::Iterator aShapeIt(aResultShapes); aShapeIt.More(); aShapeIt.Next()) { @@ -89,4 +118,3 @@ void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr theS theHistory.push_back(aShape); } } -