X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_MakeShapeList.cpp;h=7cf3b3fb44c74768de6adb32fa4162565cc9fe33;hb=3c3a34a6515ac15f7cb8a77e2f307d3835b72b78;hp=cdcc4596dadc8b541ea65f98bedd3f9d896e1a81;hpb=868158fe6d39b25e60ac528295b1c908821e4af5;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp index cdcc4596d..7cf3b3fb4 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.cpp -// 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,32 +40,41 @@ 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; -} -//================================================================================================= -void GeomAlgoAPI_MakeShapeList::append(const std::shared_ptr theMakeShape) -{ - myListOfMakeShape.push_back(theMakeShape); + for(ListOfMakeShape::const_iterator anIt = theMakeShapeList.cbegin(); + anIt != theMakeShapeList.cend(); ++anIt) { + myMap->merge((*anIt)->mapOfSubShapes()); + } } //================================================================================================= -void GeomAlgoAPI_MakeShapeList::append(const GeomAlgoAPI_MakeShapeList& theMakeShapeList) +void GeomAlgoAPI_MakeShapeList::appendAlgo( + const std::shared_ptr theMakeShape) { - for(ListOfMakeShape::const_iterator anIt = theMakeShapeList.myListOfMakeShape.cbegin(); - anIt != theMakeShapeList.myListOfMakeShape.cend(); anIt++) { - myListOfMakeShape.push_back(*anIt); + 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(); } //================================================================================================= @@ -70,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; @@ -89,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()) { + bool hasResults = false; 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);