-// Copyright (C) 2014-2017 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2023 CEA, EDF
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
//
// 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
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or
-// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include "FeaturesPlugin_RemoveSubShapes.h"
}
myChangedInCode = true;
+ if (theID == BASE_SHAPE_ID() || theID == SUBSHAPES_TO_KEEP_ID() ||
+ theID == SUBSHAPES_TO_REMOVE_ID()) {
+ std::list<ResultPtr> anAllSubs;
+ ModelAPI_Tools::allSubs(aResultBody, anAllSubs);
- if(theID == BASE_SHAPE_ID()) {
- aSubShapesToKeepAttrList->clear();
- aSubShapesToRemoveAttrList->clear();
+ if(theID == BASE_SHAPE_ID()) {
+ aSubShapesToKeepAttrList->clear();
+ aSubShapesToRemoveAttrList->clear();
- if (!aBaseShape.get()) {
- return;
- }
+ if (!aBaseShape.get()) {
+ return;
+ }
- std::list<GeomShapePtr> aSubShapes = GeomAlgoAPI_ShapeTools::getLowLevelSubShapes(aBaseShape);
- for (ListOfShape::const_iterator anIt = aSubShapes.cbegin(); anIt != aSubShapes.cend(); ++anIt)
- {
- GeomShapePtr aSubShape = *anIt;
- if(!isHasSubs) {
- aSubShapesToKeepAttrList->append(aContext, aSubShape);
- } else {
- std::list<ResultPtr> anAllSubs;
- ModelAPI_Tools::allSubs(aResultBody, anAllSubs);
- std::list<ResultPtr>::iterator aSubsIt = anAllSubs.begin();
- for(; aSubsIt != anAllSubs.end(); aSubsIt++) {
- ResultBodyPtr aSub = std::dynamic_pointer_cast<ModelAPI_ResultBody>(*aSubsIt);
- if (aSub && aSub->shape().get() && aSub->shape()->isSubShape(aSubShape)) {
- aSubShapesToKeepAttrList->append(aSub, aSubShape);
- break;
+ std::list<GeomShapePtr> aSubShapes = GeomAlgoAPI_ShapeTools::getLowLevelSubShapes(aBaseShape);
+ ListOfShape::const_iterator anIt = aSubShapes.cbegin();
+ for (; anIt != aSubShapes.cend(); ++anIt)
+ {
+ GeomShapePtr aSubShape = *anIt;
+ if(!isHasSubs) {
+ aSubShapesToKeepAttrList->append(aContext, aSubShape);
+ } else {
+ std::list<ResultPtr>::iterator aSubsIt = anAllSubs.begin();
+ for(; aSubsIt != anAllSubs.end(); aSubsIt++) {
+ ResultBodyPtr aSub = std::dynamic_pointer_cast<ModelAPI_ResultBody>(*aSubsIt);
+ if (aSub && aSub->shape().get() && aSub->shape()->isSubShape(aSubShape)) {
+ aSubShapesToKeepAttrList->append(aSub, aSubShape);
+ break;
+ }
}
}
}
}
- }
- else if (theID == SUBSHAPES_TO_KEEP_ID())
- {
- aSubShapesToRemoveAttrList->clear();
+ else if (theID == SUBSHAPES_TO_KEEP_ID())
+ {
+ aSubShapesToRemoveAttrList->clear();
- if (!aBaseShape.get()) {
- return;
- }
+ if (!aBaseShape.get()) {
+ return;
+ }
- int anIndex;
- const int aSubsToKeepNb = aSubShapesToKeepAttrList->size();
- std::list<GeomShapePtr> aSubShapes = GeomAlgoAPI_ShapeTools::getLowLevelSubShapes(aBaseShape);
- for (ListOfShape::const_iterator anIt = aSubShapes.cbegin(); anIt != aSubShapes.cend(); ++anIt)
- {
- GeomShapePtr aSubShape = *anIt;
+ int anIndex;
+ // optimization: collect selection attribute values into a map
+ const int aSubsToKeepNb = aSubShapesToKeepAttrList->size();
+ GeomAPI_DataMapOfShapeShape aSubShapesToKeep;
for(anIndex = 0; anIndex < aSubsToKeepNb; ++anIndex) {
AttributeSelectionPtr anAttrSelectionInList = aSubShapesToKeepAttrList->value(anIndex);
GeomShapePtr aSubShapeToKeep = anAttrSelectionInList->value();
- if (aSubShapeToKeep.get() && aSubShapeToKeep->isEqual(aSubShape)) {
- break;
- }
+ if (aSubShapeToKeep.get())
+ aSubShapesToKeep.bind(aSubShapeToKeep, aSubShapeToKeep);
}
- if (anIndex == aSubsToKeepNb) {
+ std::list<GeomShapePtr> aSubShapes = GeomAlgoAPI_ShapeTools::getLowLevelSubShapes(aBaseShape);
+ ListOfShape::const_iterator anIt = aSubShapes.cbegin();
+ for (; anIt != aSubShapes.cend(); ++anIt)
+ {
+ GeomShapePtr aSubShape = *anIt;
+ if (aSubShapesToKeep.isBound(aSubShape))
+ continue;
+
if(!isHasSubs) {
aSubShapesToRemoveAttrList->append(aContext, aSubShape);
- } else {
- std::list<ResultPtr> anAllSubs;
- ModelAPI_Tools::allSubs(aResultBody, anAllSubs);
+ }
+ else {
std::list<ResultPtr>::iterator aSubsIt = anAllSubs.begin();
- for(; aSubsIt != anAllSubs.end(); aSubsIt++) {
+ for (; aSubsIt != anAllSubs.end(); aSubsIt++) {
ResultBodyPtr aSub = std::dynamic_pointer_cast<ModelAPI_ResultBody>(*aSubsIt);
if (aSub && aSub->shape().get() && aSub->shape()->isSubShape(aSubShape)) {
aSubShapesToRemoveAttrList->append(aSub, aSubShape);
}
}
}
- }
- else if (theID == SUBSHAPES_TO_REMOVE_ID())
- {
- aSubShapesToKeepAttrList->clear();
+ else if (theID == SUBSHAPES_TO_REMOVE_ID())
+ {
+ aSubShapesToKeepAttrList->clear();
- if (!aBaseShape.get()) {
- return;
- }
+ if (!aBaseShape.get()) {
+ return;
+ }
- int anIndex;
- const int aSubsToRemoveNb = aSubShapesToRemoveAttrList->size();
- std::list<GeomShapePtr> aSubShapes = GeomAlgoAPI_ShapeTools::getLowLevelSubShapes(aBaseShape);
- for (ListOfShape::const_iterator anIt = aSubShapes.cbegin(); anIt != aSubShapes.cend(); ++anIt)
- {
- GeomShapePtr aSubShape = *anIt;
+ int anIndex;
+ const int aSubsToRemoveNb = aSubShapesToRemoveAttrList->size();
+ GeomAPI_DataMapOfShapeShape aSubShapesToRemove;
for(anIndex = 0; anIndex < aSubsToRemoveNb; ++anIndex) {
AttributeSelectionPtr anAttrSelectionInList = aSubShapesToRemoveAttrList->value(anIndex);
GeomShapePtr aSubShapeToRemove = anAttrSelectionInList->value();
- if (aSubShapeToRemove.get() && aSubShapeToRemove->isEqual(aSubShape)) {
- break;
- }
+ if (aSubShapeToRemove.get())
+ aSubShapesToRemove.bind(aSubShapeToRemove, aSubShapeToRemove);
}
- if (anIndex == aSubsToRemoveNb) {
- if(!isHasSubs) {
+
+ std::list<GeomShapePtr> aSubShapes = GeomAlgoAPI_ShapeTools::getLowLevelSubShapes(aBaseShape);
+ ListOfShape::const_iterator anIt = aSubShapes.cbegin();
+ for (; anIt != aSubShapes.cend(); ++anIt)
+ {
+ GeomShapePtr aSubShape = *anIt;
+ if (aSubShapesToRemove.isBound(aSubShape))
+ continue;
+
+ if (!isHasSubs) {
aSubShapesToKeepAttrList->append(aContext, aSubShape);
- } else {
- std::list<ResultPtr> anAllSubs;
- ModelAPI_Tools::allSubs(aResultBody, anAllSubs);
+ }
+ else {
std::list<ResultPtr>::iterator aSubsIt = anAllSubs.begin();
- for(; aSubsIt != anAllSubs.end(); aSubsIt++) {
+ for (; aSubsIt != anAllSubs.end(); aSubsIt++) {
ResultBodyPtr aSub = std::dynamic_pointer_cast<ModelAPI_ResultBody>(*aSubsIt);
if (aSub && aSub->shape().get() && aSub->shape()->isSubShape(aSubShape)) {
aSubShapesToKeepAttrList->append(aSub, aSubShape);
// Store result.
ResultBodyPtr aResultBody = document()->createBody(data());
- aResultBody->storeModified(aBaseShape, aResultShape);
+ std::list<GeomShapePtr> anOldShapes;
+ anOldShapes.push_back(aBaseShape);
+ aResultBody->storeModified(anOldShapes, aResultShape, aMakeShapeList);
for (std::set<GeomAPI_Shape::ShapeType>::iterator aTypeIter = aTypes.begin();
aTypeIter != aTypes.end();
++aTypeIter)
aResultBody->loadModifiedShapes(aMakeShapeList,
aBaseShape,
- GeomAPI_Shape::FACE,
- "Modified_Face");
+ GeomAPI_Shape::FACE);
aResultBody->loadModifiedShapes(aMakeShapeList,
aBaseShape,
- GeomAPI_Shape::EDGE,
- "Modified_Edge");
+ GeomAPI_Shape::EDGE);
aResultBody->loadModifiedShapes(aMakeShapeList,
aBaseShape,
- GeomAPI_Shape::VERTEX,
- "Modified_Vertex");
+ GeomAPI_Shape::VERTEX);
setResult(aResultBody);
}