From 8fdbeeced6bd3ca46ec3c16584f3cd23071b85e2 Mon Sep 17 00:00:00 2001 From: PaddleStroke Date: Tue, 6 Aug 2024 18:17:57 +0200 Subject: [PATCH] Assembly: Make sure that when a components is deleted its joints are as well. --- src/Mod/Assembly/App/AssemblyObject.cpp | 2 +- src/Mod/Assembly/Gui/ViewProviderAssembly.cpp | 39 ++++++++++++++----- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/Mod/Assembly/App/AssemblyObject.cpp b/src/Mod/Assembly/App/AssemblyObject.cpp index a68db6d72d..1dd739d3c3 100644 --- a/src/Mod/Assembly/App/AssemblyObject.cpp +++ b/src/Mod/Assembly/App/AssemblyObject.cpp @@ -575,7 +575,7 @@ std::vector AssemblyObject::getJointsOfObj(App::DocumentOb App::DocumentObject* obj1 = getObjFromRef(joint, "Reference1"); App::DocumentObject* obj2 = getObjFromRef(joint, "Reference2"); if (obj == obj1 || obj == obj2) { - jointsOf.push_back(obj); + jointsOf.push_back(joint); } } diff --git a/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp b/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp index da04e29f54..1edd205c48 100644 --- a/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp +++ b/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp @@ -980,22 +980,41 @@ bool ViewProviderAssembly::canDelete(App::DocumentObject* obj) const bool res = ViewProviderPart::canDelete(obj); if (res) { // If a component is deleted, then we delete the joints as well. - for (auto parent : obj->getInList()) { + auto* assemblyPart = static_cast(getObject()); + + std::vector objToDel; + + // List its joints + std::vector joints = assemblyPart->getJointsOfObj(obj); + for (auto* joint : joints) { + objToDel.push_back(joint); + } + joints = assemblyPart->getJointsOfPart(obj); + for (auto* joint : joints) { + if (std::find(objToDel.begin(), objToDel.end(), joint) == objToDel.end()) { + objToDel.push_back(joint); + } + } + + // List its grounded joints + std::vector inList = obj->getInList(); + for (auto* parent : inList) { if (!parent) { continue; } - auto* prop = - dynamic_cast(parent->getPropertyByName("EnableLimits")); - auto* prop2 = - dynamic_cast(parent->getPropertyByName("ObjectToGround")); - if (prop || prop2) { - Gui::Command::doCommand(Gui::Command::Doc, - "App.getDocument(\"%s\").removeObject(\"%s\")", - parent->getDocument()->getName(), - parent->getNameInDocument()); + if (dynamic_cast(parent->getPropertyByName("ObjectToGround"))) { + objToDel.push_back(parent); } } + + // Deletes them. + for (auto* joint : objToDel) { + Gui::Command::doCommand(Gui::Command::Doc, + "App.getDocument(\"%s\").removeObject(\"%s\")", + joint->getDocument()->getName(), + joint->getNameInDocument()); + } } return res;