From 28336140cabb1add10d806c8053f8be2bd73c751 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 27 Mar 2022 14:43:05 +1100 Subject: [PATCH] #2048. Blender materials, IFC materials and IFC presentation style names are now bi-directional. --- src/blenderbim/blenderbim/bim/handler.py | 7 ++---- .../blenderbim/bim/module/model/handler.py | 1 + .../blenderbim/bim/module/model/root.py | 22 ++++++++++++++----- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/handler.py b/src/blenderbim/blenderbim/bim/handler.py index 16c924c24f..9f615158ab 100644 --- a/src/blenderbim/blenderbim/bim/handler.py +++ b/src/blenderbim/blenderbim/bim/handler.py @@ -26,9 +26,7 @@ from blenderbim.bim.module.drawing.prop import RasterStyleProperty from bpy.app.handlers import persistent from blenderbim.bim.ifc import IfcStore from blenderbim.bim.module.owner.prop import get_user_person, get_user_organisation -from ifcopenshell.api.attribute.data import Data as AttributeData from ifcopenshell.api.material.data import Data as MaterialData -from ifcopenshell.api.style.data import Data as StyleData from ifcopenshell.api.type.data import Data as TypeData @@ -68,11 +66,10 @@ def name_callback(obj, data): if isinstance(obj, bpy.types.Material): if obj.BIMObjectProperties.ifc_definition_id: IfcStore.get_file().by_id(obj.BIMObjectProperties.ifc_definition_id).Name = obj.name - AttributeData.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) MaterialData.load_materials() if obj.BIMMaterialProperties.ifc_style_id: IfcStore.get_file().by_id(obj.BIMMaterialProperties.ifc_style_id).Name = obj.name - StyleData.load(IfcStore.get_file(), obj.BIMMaterialProperties.ifc_style_id) + refresh_ui_data() return if not obj.BIMObjectProperties.ifc_definition_id or "/" not in obj.name: @@ -96,7 +93,7 @@ def name_callback(obj, data): if element.is_a("IfcTypeProduct"): TypeData.purge() element.Name = "/".join(obj.name.split("/")[1:]) - AttributeData.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) + refresh_ui_data() def color_callback(obj, data): diff --git a/src/blenderbim/blenderbim/bim/module/model/handler.py b/src/blenderbim/blenderbim/bim/module/model/handler.py index 894a3873cb..407d896e16 100644 --- a/src/blenderbim/blenderbim/bim/module/model/handler.py +++ b/src/blenderbim/blenderbim/bim/module/model/handler.py @@ -27,6 +27,7 @@ from bpy.app.handlers import persistent @persistent def load_post(*args): ifcopenshell.api.add_pre_listener("attribute.edit_attributes", "BlenderBIM.Root.SyncName", root.sync_name) + ifcopenshell.api.add_pre_listener("style.edit_presentation_style", "BlenderBIM.Root.SyncStyleName", root.sync_name) ifcopenshell.api.add_post_listener( "geometry.add_representation", "BlenderBIM.Product.GenerateBox", product.generate_box diff --git a/src/blenderbim/blenderbim/bim/module/model/root.py b/src/blenderbim/blenderbim/bim/module/model/root.py index 65c72152f1..a3a72e6e98 100644 --- a/src/blenderbim/blenderbim/bim/module/model/root.py +++ b/src/blenderbim/blenderbim/bim/module/model/root.py @@ -17,24 +17,34 @@ # along with BlenderBIM Add-on. If not, see . import bpy +import blenderbim.bim.handler +import blenderbim.tool as tool from blenderbim.bim.ifc import IfcStore -from ifcopenshell.api.style.data import Data as StyleData def sync_name(usecase_path, ifc_file, settings): + if usecase_path == "attribute.edit_attributes": + element = settings["product"] + elif usecase_path == "style.edit_presentation_style": + element = settings["style"] + if "Name" not in settings["attributes"]: return - obj = IfcStore.get_element(settings["product"].id()) + obj = tool.Ifc.get_object(element) if not obj: return if isinstance(obj, bpy.types.Object): - new_name = "{}/{}".format(settings["product"].is_a(), settings["attributes"]["Name"] or "Unnamed") + new_name = "{}/{}".format(element.is_a(), settings["attributes"]["Name"] or "Unnamed") elif isinstance(obj, bpy.types.Material): new_name = settings["attributes"]["Name"] or "Unnamed" - if obj.BIMMaterialProperties.ifc_style_id: - IfcStore.get_file().by_id(obj.BIMMaterialProperties.ifc_style_id).Name = new_name - StyleData.load(IfcStore.get_file(), obj.BIMMaterialProperties.ifc_style_id) + material = tool.Ifc.get_entity(obj) + if material and material != element: + material.Name = new_name + style = tool.Style.get_style(obj) + if style and style != element: + style.Name = new_name collection = bpy.data.collections.get(obj.name) if collection: collection.name = new_name obj.name = new_name + blenderbim.bim.handler.refresh_ui_data()