From 01a5e457a20b3f6105f3a85eae4354d09ea16dd2 Mon Sep 17 00:00:00 2001 From: Robin Quint Date: Mon, 18 Aug 2025 16:27:53 +0200 Subject: [PATCH] copy_representation now properly copies explicitly assigned IfcStyledItems --- src/bonsai/bonsai/core/root.py | 6 +++--- src/bonsai/bonsai/tool/root.py | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/bonsai/bonsai/core/root.py b/src/bonsai/bonsai/core/root.py index 2276e0623f..48b3aa8687 100644 --- a/src/bonsai/bonsai/core/root.py +++ b/src/bonsai/bonsai/core/root.py @@ -55,9 +55,9 @@ def copy_class( geometry.copy_data_links(data, copied_entities) geometry.change_object_data(obj, data, is_global=True) geometry.rename_object(data, geometry.get_representation_name(ifc.get_entity(data))) - # Only assign styles if element doesn't get them from material - if not root.has_material_styles(new): - root.assign_body_styles(new, obj) + # not sure what the purpose of this is, but removing it fixes wrong IfcStyledItems being assigned to + # a duplicated object. Instead, copy_representation now properly copies IfcStyledItems directly. + # root.assign_body_styles(new, obj) collector.assign(obj) return new diff --git a/src/bonsai/bonsai/tool/root.py b/src/bonsai/bonsai/tool/root.py index d0dcd1f708..fddff903aa 100644 --- a/src/bonsai/bonsai/tool/root.py +++ b/src/bonsai/bonsai/tool/root.py @@ -111,6 +111,14 @@ class Root(bonsai.core.tool.Root): exclude_callback=exclude_callback, copied_entities=copied_entities, ) + + for representation in source.Representation.Representations: + for item in representation.Items: + if item.StyledByItem: + for styled_by in item.StyledByItem: + new_styled_by = ifcopenshell.util.element.copy(tool.Ifc.get(), styled_by) + new_styled_by.Item = copied_entities[styled_by.Item.id()] + copied_entities[styled_by.id()] = new_styled_by elif dest.is_a("IfcTypeProduct"): if not source.RepresentationMaps: @@ -134,6 +142,13 @@ class Root(bonsai.core.tool.Root): exclude_callback=exclude_callback, copied_entities=copied_entities, ) + + for item in map.MappedRepresentation.Items: + if item.StyledByItem: + for styled_by in item.StyledByItem: + new_styled_by = ifcopenshell.util.element.copy(tool.Ifc.get(), styled_by) + new_styled_by.Item = copied_entities[styled_by.Item.id()] + copied_entities[styled_by.id()] = new_styled_by new_representation_maps.append(new_map) dest.RepresentationMaps = new_representation_maps