-// 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);
aResultShape = anAttrSelectionInList->value();
}
// deleted and copied must be jointed to one list which keeps all the history
- GeomAlgoAPI_MakeShapeList aMakeShapeList;
+ std::shared_ptr<GeomAlgoAPI_MakeShapeList> aMakeShapeList(new GeomAlgoAPI_MakeShapeList());
// find all removed shapes
std::shared_ptr<GeomAlgoAPI_MakeShapeCustom> aDeletedSubs(new GeomAlgoAPI_MakeShapeCustom);
}
}
}
- aMakeShapeList.appendAlgo(aDeletedSubs);
+ aMakeShapeList->appendAlgo(aDeletedSubs);
std::shared_ptr<GeomAlgoAPI_Copy> aCopy(new GeomAlgoAPI_Copy(aResultShape));
aResultShape = aCopy->shape();
- aMakeShapeList.appendAlgo(aCopy);
+ aMakeShapeList->appendAlgo(aCopy);
+
+ if (aResultShape->shapeType() == GeomAPI_Shape::COMPOUND) {
+ aResultShape = GeomAlgoAPI_ShapeTools::groupSharedTopology(aResultShape);
+ if (aResultShape->shapeType() == GeomAPI_Shape::COMPOUND) {
+ // if the result has only one sub-shape, discard the compound
+ GeomAPI_ShapeIterator aSubIt(aResultShape);
+ GeomShapePtr aSub = aSubIt.current();
+ aSubIt.next();
+ if (!aSubIt.more())
+ aResultShape = aSub;
+ }
+ }
// Store result.
ResultBodyPtr aResultBody = document()->createBody(data());
- aResultBody->storeModified(aBaseShape, aResultShape, 1);
- std::set<GeomAPI_Shape::ShapeType>::iterator aTypeIter = aTypes.begin();
- for(; aTypeIter != aTypes.end(); aTypeIter++)
- aResultBody->loadDeletedShapes(&aMakeShapeList, aBaseShape, *aTypeIter, 1);
- aResultBody->loadAndOrientModifiedShapes(&aMakeShapeList, aBaseShape, GeomAPI_Shape::FACE,
- 2, "Modified_Face", *aMakeShapeList.mapOfSubShapes().get(), true, false, true);
- aResultBody->loadAndOrientModifiedShapes(&aMakeShapeList, aBaseShape, GeomAPI_Shape::EDGE,
- 3, "Modified_Edge", *aMakeShapeList.mapOfSubShapes().get(), false, false, true);
- aResultBody->loadAndOrientModifiedShapes(&aMakeShapeList, aBaseShape, GeomAPI_Shape::VERTEX,
- 4, "Modified_Vertex", *aMakeShapeList.mapOfSubShapes().get());
+ 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->loadDeletedShapes(aMakeShapeList, aBaseShape, *aTypeIter);
+ }
+
+ aResultBody->loadModifiedShapes(aMakeShapeList,
+ aBaseShape,
+ GeomAPI_Shape::FACE);
+ aResultBody->loadModifiedShapes(aMakeShapeList,
+ aBaseShape,
+ GeomAPI_Shape::EDGE);
+ aResultBody->loadModifiedShapes(aMakeShapeList,
+ aBaseShape,
+ GeomAPI_Shape::VERTEX);
setResult(aResultBody);
}