X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_MakeShapeList.cpp;h=fa5f9f098ae634b8e63e6d0a060a5b131b33d948;hb=e675b9eb8df755fff9763560ddf36d5bfeb6fe35;hp=618bc7c96e1372abc6e3be6c76c4006a8a65ada1;hpb=98c1bd47dd95b02b7c512f9fb8b368ef21037635;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp index 618bc7c96..fa5f9f098 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp @@ -1,15 +1,29 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: GeomAlgoAPI_MakeShapeListList.h -// Created: 27 May 2015 -// Author: Dmitry Bobylev - -#include - -#include +// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or +// email : webmaster.salome@opencascade.com +// + +#include "GeomAlgoAPI_MakeShapeList.h" + + +#include #include -#include -#include +#include //================================================================================================= GeomAlgoAPI_MakeShapeList::GeomAlgoAPI_MakeShapeList() @@ -26,38 +40,63 @@ 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)) { + for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); + aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) { + std::shared_ptr aMakeShape = *aBuilderIt; + if(aMakeShape->isDeleted(theShape)) { return true; } } @@ -66,47 +105,71 @@ 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; } NCollection_Map anAlgoShapes; - NCollection_Map aResultShapes; + NCollection_Map aResultShapesMap; + NCollection_List aResultShapesList; anAlgoShapes.Add(theShape->impl()); - aResultShapes.Add(theShape->impl()); + aResultShapesMap.Add(theShape->impl()); + aResultShapesList.Append(theShape->impl()); - for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) { - BRepBuilderAPI_MakeShape* aBuilder = (*aBuilderIt)->implPtr(); + 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()) { - const TopoDS_Shape& aShape = aShapeIt.Value(); - const TopTools_ListOfShape& aGeneratedList = aBuilder->Generated(aShape); - const TopTools_ListOfShape& aModifiedList = aBuilder->Modified(aShape); - for(TopTools_ListIteratorOfListOfShape anIt(aGeneratedList); anIt.More(); anIt.Next()) { - aTempShapes.Add(anIt.Value()); - aResultShapes.Add(anIt.Value()); + 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++) { + const TopoDS_Shape& anItShape = (*anIt)->impl(); + aTempShapes.Add(anItShape); + if(aResultShapesMap.Add(anItShape) == Standard_True) { + aResultShapesList.Append(anItShape); + } hasResults = true; } - 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++) { + const TopoDS_Shape& anItShape = (*anIt)->impl(); + aTempShapes.Add(anItShape); + if(aResultShapesMap.Add(anItShape) == Standard_True) { + aResultShapesList.Append(anItShape); + } hasResults = true; } if(hasResults) { - aResultShapes.Remove(aShape); + const TopoDS_Shape& aTopoDSShape = aShapeIt.Value(); + if(aResultShapesMap.Remove(aTopoDSShape) == Standard_True) { + for(NCollection_List::Iterator + aResIt(aResultShapesList); aResIt.More(); aResIt.Next()) { + if(aTopoDSShape.IsEqual(aResIt.Value())) { + aResultShapesList.Remove(aResIt); + break; + } + } + } } } anAlgoShapes.Unite(aTempShapes); } - for(NCollection_Map::Iterator aShapeIt(aResultShapes); aShapeIt.More(); aShapeIt.Next()) { + for(NCollection_List::Iterator + aShapeIt(aResultShapesList); aShapeIt.More(); aShapeIt.Next()) { std::shared_ptr aShape(new GeomAPI_Shape()); aShape->setImpl(new TopoDS_Shape(aShapeIt.Value())); theHistory.push_back(aShape); } } -