X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_MakeShapeList.cpp;h=798b3d1696032e0c0ef2cf4899dc0f2ad660c816;hb=fc72d43b677baa05ae7fd317346fd8b723b799ed;hp=1442c5b324204398f776174c4e77fb6a022258a2;hpb=2a232230cb243c76c34315623d6e6689f57e83f4;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp index 1442c5b32..798b3d169 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp @@ -1,69 +1,110 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: GeomAlgoAPI_MakeShapeListList.cpp -// Created: 27 May 2015 -// Author: Dmitry Bobylev +// Copyright (C) 2014-2023 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 -//================================================================================================= +//================================================================================================== GeomAlgoAPI_MakeShapeList::GeomAlgoAPI_MakeShapeList() : GeomAlgoAPI_MakeShape() {} -//================================================================================================= +//================================================================================================== GeomAlgoAPI_MakeShapeList::GeomAlgoAPI_MakeShapeList(const ListOfMakeShape& theMakeShapeList) : GeomAlgoAPI_MakeShape() { init(theMakeShapeList); } -//================================================================================================= +//================================================================================================== 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) +const ListOfMakeShape& GeomAlgoAPI_MakeShapeList::list() const +{ + return myListOfMakeShape; +} + + +//================================================================================================== +void GeomAlgoAPI_MakeShapeList::appendAlgo( + const GeomMakeShapePtr 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 +//================================================================================================== +const GeomShapePtr GeomAlgoAPI_MakeShapeList::shape() const { - std::shared_ptr aShape = GeomAlgoAPI_MakeShape::shape(); + GeomShapePtr aShape = GeomAlgoAPI_MakeShape::shape(); if(aShape.get() && !aShape->impl().IsNull()) { return aShape; } else if(!myListOfMakeShape.empty()) { return myListOfMakeShape.back()->shape(); } - return std::shared_ptr(); + return GeomShapePtr(); } -//================================================================================================= -void GeomAlgoAPI_MakeShapeList::generated(const std::shared_ptr theShape, - ListOfShape& theHistory) +//================================================================================================== +void GeomAlgoAPI_MakeShapeList::generated(const GeomShapePtr theOldShape, + ListOfShape& theNewShapes) { - result(theShape, GeomAlgoAPI_MakeShapeList::Generated, theHistory); + result(theOldShape, theNewShapes); } -//================================================================================================= -void GeomAlgoAPI_MakeShapeList::modified(const std::shared_ptr theShape, - ListOfShape& theHistory) +//================================================================================================== +void GeomAlgoAPI_MakeShapeList::modified(const GeomShapePtr theOldShape, + ListOfShape& theNewShapes) { - result(theShape, GeomAlgoAPI_MakeShapeList::Modified, theHistory); + result(theOldShape, theNewShapes); } -bool GeomAlgoAPI_MakeShapeList::isDeleted(const std::shared_ptr theShape) +//================================================================================================== +bool GeomAlgoAPI_MakeShapeList::isDeleted(const GeomShapePtr theOldShape) { - for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) { - std::shared_ptr aMakeShape = *aBuilderIt; - if(aMakeShape->isDeleted(theShape)) { + for (ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); + aBuilderIt != myListOfMakeShape.end(); + ++aBuilderIt) + { + GeomMakeShapePtr aMakeShape = *aBuilderIt; + if(aMakeShape->isDeleted(theOldShape)) { return true; } } @@ -71,50 +112,93 @@ bool GeomAlgoAPI_MakeShapeList::isDeleted(const std::shared_ptr t return false; } -void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr theShape, - OperationType theOperationType, - ListOfShape& theHistory) +//================================================================================================== +void GeomAlgoAPI_MakeShapeList::result(const GeomShapePtr theOldShape, + ListOfShape& theNewShapes) { if(myListOfMakeShape.empty()) { return; } NCollection_Map anAlgoShapes; - NCollection_Map aResultShapes; - 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 aResultShapesMap; + NCollection_List aResultShapesList; + anAlgoShapes.Add(theOldShape->impl()); + aResultShapesMap.Add(theOldShape->impl()); + aResultShapesList.Append(theOldShape->impl()); + + for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); + aBuilderIt != myListOfMakeShape.end(); + ++aBuilderIt) + { + GeomMakeShapePtr 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); + for (NCollection_Map::Iterator aShapeIt(anAlgoShapes); + aShapeIt.More(); + aShapeIt.Next()) + { + bool hasResults = false; + bool anArgumentIsInResult = false; + GeomShapePtr 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(); + if (anItShape.IsSame(aShapeIt.Value())) { + anArgumentIsInResult = true; + continue; + } + 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(); + if (anItShape.IsSame(aShapeIt.Value())) { + anArgumentIsInResult = true; + continue; + } + aTempShapes.Add(anItShape); + if(aResultShapesMap.Add(anItShape) == Standard_True) { + aResultShapesList.Append(anItShape); + } hasResults = true; } - if(hasResults) { - aResultShapes.Remove(aShape->impl()); + if(hasResults && !anArgumentIsInResult) { + 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()) { - std::shared_ptr aShape(new GeomAPI_Shape()); + for (NCollection_List::Iterator aShapeIt(aResultShapesList); + aShapeIt.More(); + aShapeIt.Next()) + { + GeomShapePtr aShape(new GeomAPI_Shape()); aShape->setImpl(new TopoDS_Shape(aShapeIt.Value())); - theHistory.push_back(aShape); + if (!isValidForHistory(aShape)) continue; + fixOrientation(aShape); + theNewShapes.push_back(aShape); } }