From c9199caba524275ccf25f833472016004e75c765 Mon Sep 17 00:00:00 2001 From: Gorgious56 Date: Mon, 30 Oct 2023 15:04:37 +0100 Subject: [PATCH] You can now eyedrop an object in the viewport to copy class and predefined type when reassigning class --- .../blenderbim/bim/module/root/operator.py | 1 + .../blenderbim/bim/module/root/prop.py | 35 +++++++++++++++++++ .../blenderbim/bim/module/root/ui.py | 1 + 3 files changed, 37 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/root/operator.py b/src/blenderbim/blenderbim/bim/module/root/operator.py index 425738f4f7..fccbb2c850 100644 --- a/src/blenderbim/blenderbim/bim/module/root/operator.py +++ b/src/blenderbim/blenderbim/bim/module/root/operator.py @@ -66,6 +66,7 @@ class EnableReassignClass(bpy.types.Operator): context.scene.BIMRootProperties.ifc_product = ifc_product element = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) context.scene.BIMRootProperties.ifc_class = element.is_a() + context.scene.BIMRootProperties.relating_class_object = None if hasattr(element, "PredefinedType") and element.PredefinedType: context.scene.BIMRootProperties.ifc_predefined_type = element.PredefinedType return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/root/prop.py b/src/blenderbim/blenderbim/bim/module/root/prop.py index cd0b47949f..33887fe2c5 100644 --- a/src/blenderbim/blenderbim/bim/module/root/prop.py +++ b/src/blenderbim/blenderbim/bim/module/root/prop.py @@ -19,6 +19,7 @@ import bpy import ifcopenshell import ifcopenshell.util.schema +import blenderbim.tool as tool from blenderbim.bim.module.root.data import IfcClassData from bpy.types import PropertyGroup from bpy.props import ( @@ -80,12 +81,46 @@ def get_contexts(self, context): return IfcClassData.data["contexts"] +def update_relating_class_from_object(self, context): + if self.relating_class_object is None: + return + element = tool.Ifc.get_entity(self.relating_class_object) + if not element: + return + self.ifc_class = element.is_a() + predefined_type = ifcopenshell.util.element.get_predefined_type(element) + if predefined_type: + if element.PredefinedType == "USERDEFINED": + self.ifc_predefined_type = "USERDEFINED" + self.ifc_userdefined_type = predefined_type + else: + self.ifc_predefined_type = predefined_type + bpy.ops.bim.reassign_class() + + +def is_object_class_applicable(self, obj): + element = tool.Ifc.get_entity(obj) + if not element: + return False + active_element = tool.Ifc.get_entity(bpy.context.active_object) + if not active_element: + return False + return element.is_a("IfcTypeObject") == active_element.is_a("IfcTypeObject") + + class BIMRootProperties(PropertyGroup): contexts: EnumProperty(items=get_contexts, name="Contexts") ifc_product: EnumProperty(items=get_ifc_products, name="Products", update=refresh_classes) ifc_class: EnumProperty(items=get_ifc_classes, name="Class", update=refresh_predefined_types) ifc_predefined_type: EnumProperty(items=get_ifc_predefined_types, name="Predefined Type", default=None) ifc_userdefined_type: StringProperty(name="Userdefined Type") + relating_class_object: PointerProperty( + type=bpy.types.Object, + name="Copy Class", + update=update_relating_class_from_object, + poll=is_object_class_applicable, + description="Copy the selected object's class and predefined type to the active object", + ) getter_enum_suggestions = { "ifc_class": get_ifc_classes_suggestions, diff --git a/src/blenderbim/blenderbim/bim/module/root/ui.py b/src/blenderbim/blenderbim/bim/module/root/ui.py index 76f5546594..f5bfb6a26b 100644 --- a/src/blenderbim/blenderbim/bim/module/root/ui.py +++ b/src/blenderbim/blenderbim/bim/module/root/ui.py @@ -58,6 +58,7 @@ class BIM_PT_class(Panel): root_prop.get_ifc_predefined_types(context.scene.BIMRootProperties, context), is_reassigning_class=True, ) + self.layout.prop(context.scene.BIMRootProperties, "relating_class_object", icon="COPYDOWN") else: row = self.layout.row(align=True) row.label(text=IfcClassData.data["name"])