From ca2058d56b3b494e0504d7956d1fce647f014870 Mon Sep 17 00:00:00 2001 From: Gorgious Date: Sat, 22 Nov 2025 00:30:01 +0100 Subject: [PATCH] Fix #4974 - remap parent relationships when duplicating objects --- src/bonsai/bonsai/tool/geometry.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/bonsai/bonsai/tool/geometry.py b/src/bonsai/bonsai/tool/geometry.py index 83a9435665..27eed8c9fd 100644 --- a/src/bonsai/bonsai/tool/geometry.py +++ b/src/bonsai/bonsai/tool/geometry.py @@ -2096,6 +2096,7 @@ class Geometry(bonsai.core.tool.Geometry): decomposition_relationships = tool.Root.get_decomposition_relationships(objects_to_duplicate) connection_relationships = tool.Root.get_connection_relationships(objects_to_duplicate) old_to_new: dict[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]] = {} + old_obj_name_to_new_obj_name: dict[str, str] = {} for obj in objects_to_duplicate: element = tool.Ifc.get_entity(obj) @@ -2147,6 +2148,7 @@ class Geometry(bonsai.core.tool.Geometry): collection.objects.link(new_obj) obj.select_set(False) new_obj.select_set(True) + old_obj_name_to_new_obj_name[obj.name] = new_obj.name if not element: continue @@ -2179,6 +2181,19 @@ class Geometry(bonsai.core.tool.Geometry): if new.is_a("IfcRelSpaceBoundary"): tool.Boundary.decorate_boundary(new_obj) + # Remap Blender parent relationships for duplicated objects + for old_obj_name, new_obj_name in old_obj_name_to_new_obj_name.items(): + new_obj = bpy.data.objects.get(new_obj_name) + if new_obj and new_obj.parent and new_obj.parent.name in old_obj_name_to_new_obj_name: + # Store world matrix before reparenting to preserve transform + world_matrix = new_obj.matrix_world.copy() + new_parent_name = old_obj_name_to_new_obj_name[new_obj.parent.name] + new_parent = bpy.data.objects.get(new_parent_name) + if new_parent: + new_obj.parent = new_parent + # Restore world transform by setting matrix_world + new_obj.matrix_world = world_matrix + # Recreate aggregate relationship for old in old_to_new.keys(): if old.is_a("IfcElementAssembly"):