From fbab13339c5220bcbd7a03b4ee521124a974f06f Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 24 Jan 2025 18:39:51 +0500 Subject: [PATCH] set_material_name to prevent triggering name callback if it's not necessary --- src/bonsai/bonsai/bim/handler.py | 8 ++++++-- src/bonsai/bonsai/bim/module/style/operator.py | 3 ++- src/bonsai/bonsai/bim/module/style/prop.py | 1 + src/bonsai/bonsai/tool/root.py | 9 +++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/bonsai/bonsai/bim/handler.py b/src/bonsai/bonsai/bim/handler.py index ca97c4d94d..21730aedd2 100644 --- a/src/bonsai/bonsai/bim/handler.py +++ b/src/bonsai/bonsai/bim/handler.py @@ -56,9 +56,13 @@ def name_callback(obj: Union[bpy.types.Object, bpy.types.Material], data: str) - return if isinstance(obj, bpy.types.Material): - if ifc_definition_id := obj.BIMStyleProperties.ifc_definition_id: + props = obj.BIMStyleProperties + if ifc_definition_id := props.ifc_definition_id: + if props.is_renaming: + props.is_renmaing = False + return IfcStore.get_file().by_id(ifc_definition_id).Name = obj.name - refresh_ui_data() + refresh_ui_data() return if not obj.BIMObjectProperties.ifc_definition_id: diff --git a/src/bonsai/bonsai/bim/module/style/operator.py b/src/bonsai/bonsai/bim/module/style/operator.py index 52655087df..ac8da79417 100644 --- a/src/bonsai/bonsai/bim/module/style/operator.py +++ b/src/bonsai/bonsai/bim/module/style/operator.py @@ -848,7 +848,8 @@ class EditSurfaceStyle(bpy.types.Operator, tool.Ifc.Operator): new_name = attributes_data["Name"] if new_name != original_name: material = tool.Ifc.get_object(self.surface_style) - material.name = new_name or "Unnamed" + assert isinstance(material, bpy.types.Material) + tool.Root.set_material_name(material, new_name or "Unnamed") else: attributes = tool.Style.get_style_ui_props_attributes(self.surface_style.is_a()) assert attributes diff --git a/src/bonsai/bonsai/bim/module/style/prop.py b/src/bonsai/bonsai/bim/module/style/prop.py index 1221159be0..9111514d46 100644 --- a/src/bonsai/bonsai/bim/module/style/prop.py +++ b/src/bonsai/bonsai/bim/module/style/prop.py @@ -294,3 +294,4 @@ class BIMStyleProperties(PropertyGroup): default="Shading", update=update_shading_style, ) + is_renaming: BoolProperty(description="Used to prevent triggering handler callback.", default=False) diff --git a/src/bonsai/bonsai/tool/root.py b/src/bonsai/bonsai/tool/root.py index b5b4deb91a..7b64e173af 100644 --- a/src/bonsai/bonsai/tool/root.py +++ b/src/bonsai/bonsai/tool/root.py @@ -402,6 +402,15 @@ class Root(bonsai.core.tool.Root): obj.BIMObjectProperties.is_renaming = True obj.name = name # The handler will trigger, and reset is_renaming to False + @classmethod + def set_material_name(cls, material: bpy.types.Material, name: str) -> None: + """Rename material without triggerring name callback and unnecessary writing to IFC.""" + if material.name == name: + return + props = material.BIMStyleProperties + props.is_renaming = True + material.name = name # The handler will trigger, and reset is_renaming to False. + @classmethod def unlink_object(cls, obj: bpy.types.Object) -> None: """Purge all IFC data associated with a Blender object.