From 97387325c85cba1190544eb4bf59845727f28a8c Mon Sep 17 00:00:00 2001 From: PaddleStroke Date: Mon, 18 Nov 2024 15:11:52 +0100 Subject: [PATCH] Assembly: Fix joints not being deleted when subassembly is deleted. --- src/Mod/Assembly/Gui/ViewProviderAssembly.cpp | 64 +++++++++++++------ 1 file changed, 46 insertions(+), 18 deletions(-) diff --git a/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp b/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp index dabbcd7c81..674fc5dcf5 100644 --- a/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp +++ b/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp @@ -60,6 +60,7 @@ #include #include +#include #include #include #include @@ -1066,36 +1067,63 @@ bool ViewProviderAssembly::onDelete(const std::vector& subNames) return ViewProviderPart::onDelete(subNames); } -bool ViewProviderAssembly::canDelete(App::DocumentObject* obj) const +bool ViewProviderAssembly::canDelete(App::DocumentObject* objBeingDeleted) const { - bool res = ViewProviderPart::canDelete(obj); + bool res = ViewProviderPart::canDelete(objBeingDeleted); if (res) { // If a component is deleted, then we delete the joints as well. auto* assemblyPart = static_cast(getObject()); std::vector objToDel; + std::vector objsBeingDeleted; + objsBeingDeleted.push_back(objBeingDeleted); - // List its joints - std::vector joints = assemblyPart->getJointsOfObj(obj); - for (auto* joint : joints) { - objToDel.push_back(joint); + auto addSubComponents = + std::function&)> {}; + addSubComponents = [&](AssemblyLink* asmLink, std::vector& objs) { + std::vector assemblyLinkGroup = asmLink->Group.getValues(); + for (auto* obj : assemblyLinkGroup) { + auto* subAsmLink = dynamic_cast(obj); + auto* link = dynamic_cast(obj); + if (subAsmLink || link) { + if (std::find(objs.begin(), objs.end(), obj) == objs.end()) { + objs.push_back(obj); + if (subAsmLink && !asmLink->isRigid()) { + addSubComponents(subAsmLink, objs); + } + } + } + } + }; + + auto* asmLink = dynamic_cast(objBeingDeleted); + if (asmLink && !asmLink->isRigid()) { + addSubComponents(asmLink, objsBeingDeleted); } - joints = assemblyPart->getJointsOfPart(obj); - for (auto* joint : joints) { - if (std::find(objToDel.begin(), objToDel.end(), joint) == objToDel.end()) { + + for (auto* obj : objsBeingDeleted) { + // List its joints + std::vector joints = assemblyPart->getJointsOfObj(obj); + for (auto* joint : joints) { objToDel.push_back(joint); } - } - - // List its grounded joints - std::vector inList = obj->getInList(); - for (auto* parent : inList) { - if (!parent) { - continue; + joints = assemblyPart->getJointsOfPart(obj); + for (auto* joint : joints) { + if (std::find(objToDel.begin(), objToDel.end(), joint) == objToDel.end()) { + objToDel.push_back(joint); + } } - if (dynamic_cast(parent->getPropertyByName("ObjectToGround"))) { - objToDel.push_back(parent); + // List its grounded joints + std::vector inList = obj->getInList(); + for (auto* parent : inList) { + if (!parent) { + continue; + } + + if (dynamic_cast(parent->getPropertyByName("ObjectToGround"))) { + objToDel.push_back(parent); + } } }