From e3311825d24291a1dcde5624a769cac0c06336b8 Mon Sep 17 00:00:00 2001 From: PaddleStroke Date: Mon, 17 Nov 2025 17:59:40 +0100 Subject: [PATCH] Assembly: Sub-assembly: fix support for Part-wb objects (#25279) * Assembly: Sub-assembly: fix support for Part-wb objects * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/Mod/Assembly/App/AssemblyLink.cpp | 35 ++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/Mod/Assembly/App/AssemblyLink.cpp b/src/Mod/Assembly/App/AssemblyLink.cpp index 5fc633f29f..f61537f515 100644 --- a/src/Mod/Assembly/App/AssemblyLink.cpp +++ b/src/Mod/Assembly/App/AssemblyLink.cpp @@ -252,8 +252,41 @@ void AssemblyLink::synchronizeComponents() std::vector assemblyGroup = assembly->Group.getValues(); std::vector assemblyLinkGroup = Group.getValues(); - // We check if a component needs to be added to the AssemblyLink + // Filter out child objects from Part-workbench features to get only top-level components. + // An object is considered a child if it's referenced by another object's 'Base', 'Tool', + // or 'Shapes' property within the same group. + std::set children; for (auto* obj : assemblyGroup) { + if (auto* partFeat = dynamic_cast(obj)) { + if (auto* prop = dynamic_cast(partFeat->getPropertyByName("Base"))) { + if (prop->getValue()) { + children.insert(prop->getValue()); + } + } + if (auto* prop = dynamic_cast(partFeat->getPropertyByName("Tool"))) { + if (prop->getValue()) { + children.insert(prop->getValue()); + } + } + if (auto* prop + = dynamic_cast(partFeat->getPropertyByName("Shapes"))) { + for (auto* shapeObj : prop->getValues()) { + children.insert(shapeObj); + } + } + } + } + + std::vector topLevelComponents; + std::copy_if( + assemblyGroup.begin(), + assemblyGroup.end(), + std::back_inserter(topLevelComponents), + [&children](App::DocumentObject* obj) { return children.find(obj) == children.end(); } + ); + + // We check if a component needs to be added to the AssemblyLink + for (auto* obj : topLevelComponents) { if (!obj->isDerivedFrom() && !obj->isDerivedFrom() && !obj->isDerivedFrom()) { continue;