Fix #4974 - remap parent relationships when duplicating objects

This commit is contained in:
Gorgious
2025-11-22 00:30:01 +01:00
parent 481676e51b
commit ca2058d56b
+15
View File
@@ -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"):