X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_MakeShapeList.cpp;h=fa5f9f098ae634b8e63e6d0a060a5b131b33d948;hb=e675b9eb8df755fff9763560ddf36d5bfeb6fe35;hp=1442c5b324204398f776174c4e77fb6a022258a2;hpb=2a232230cb243c76c34315623d6e6689f57e83f4;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp index 1442c5b32..fa5f9f098 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp @@ -1,11 +1,27 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: GeomAlgoAPI_MakeShapeListList.cpp -// Created: 27 May 2015 -// Author: Dmitry Bobylev +// 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 @@ -24,13 +40,29 @@ 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) +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()); } //================================================================================================= @@ -61,7 +93,8 @@ void GeomAlgoAPI_MakeShapeList::modified(const std::shared_ptr th bool GeomAlgoAPI_MakeShapeList::isDeleted(const std::shared_ptr theShape) { - for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) { + for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); + aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) { std::shared_ptr aMakeShape = *aBuilderIt; if(aMakeShape->isDeleted(theShape)) { return true; @@ -80,39 +113,61 @@ void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr theS } 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++) { + 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()) { + 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()); + 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; } 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()); + 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->impl()); + 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);