From 27bb619323c1b480e419c4b54bec8ed7b3bc5afc Mon Sep 17 00:00:00 2001 From: PaddleStroke Date: Tue, 12 Mar 2024 18:22:40 +0100 Subject: [PATCH] Assembly: Fix #12889 : deleting a part does not delete joint and later crashes freecad. --- src/Mod/Assembly/App/AssemblyObject.cpp | 15 ++++++++++++--- src/Mod/Assembly/App/AssemblyObject.h | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/Mod/Assembly/App/AssemblyObject.cpp b/src/Mod/Assembly/App/AssemblyObject.cpp index f37713ff7a..6a2dedc42f 100644 --- a/src/Mod/Assembly/App/AssemblyObject.cpp +++ b/src/Mod/Assembly/App/AssemblyObject.cpp @@ -235,7 +235,7 @@ void AssemblyObject::undoSolve() previousPositions.clear(); // update joint placements: - getJoints(); + getJoints(/*updateJCS*/ true, /*delBadJoints*/ false); } void AssemblyObject::clearUndo() @@ -398,7 +398,7 @@ JointGroup* AssemblyObject::getJointGroup() return nullptr; } -std::vector AssemblyObject::getJoints(bool updateJCS) +std::vector AssemblyObject::getJoints(bool updateJCS, bool delBadJoints) { std::vector joints = {}; @@ -414,7 +414,16 @@ std::vector AssemblyObject::getJoints(bool updateJCS) } auto* prop = dynamic_cast(joint->getPropertyByName("Activated")); - if (prop && !prop->getValue()) { + if (!prop || !prop->getValue()) { + // Filter grounded joints and deactivated joints. + continue; + } + + if (!getLinkObjFromProp(joint, "Part1") || !getLinkObjFromProp(joint, "Part2")) { + // Remove incomplete joints. Left-over when the user delets a part. + if (delBadJoints) { + getDocument()->removeObject(joint->getNameInDocument()); + } continue; } diff --git a/src/Mod/Assembly/App/AssemblyObject.h b/src/Mod/Assembly/App/AssemblyObject.h index 1971a07cb6..d9a4426e33 100644 --- a/src/Mod/Assembly/App/AssemblyObject.h +++ b/src/Mod/Assembly/App/AssemblyObject.h @@ -167,7 +167,7 @@ public: void jointParts(std::vector joints); JointGroup* getJointGroup(); - std::vector getJoints(bool updateJCS = true); + std::vector getJoints(bool updateJCS = true, bool delBadJoints = true); std::vector getGroundedJoints(); std::vector getJointsOfObj(App::DocumentObject* obj); std::vector getJointsOfPart(App::DocumentObject* part);