diff --git a/src/blenderbim/blenderbim/bim/module/attribute/operator.py b/src/blenderbim/blenderbim/bim/module/attribute/operator.py index 89b32597be..a86ff15e21 100644 --- a/src/blenderbim/blenderbim/bim/module/attribute/operator.py +++ b/src/blenderbim/blenderbim/bim/module/attribute/operator.py @@ -47,10 +47,18 @@ class EnableEditingAttributes(bpy.types.Operator): obj = bpy.data.objects.get(self.obj) elif self.obj_type == "Material": obj = bpy.data.materials.get(self.obj) - oprops = obj.BIMObjectProperties props = obj.BIMAttributeProperties props.attributes.clear() + element = tool.Ifc.get_entity(obj) + has_inherited_predefined_type = False + if not element.is_a("IfcTypeObject") and (element_type := ifcopenshell.util.element.get_type(element)): + # Allow for None due to https://github.com/buildingSMART/IFC4.3.x-development/issues/818 + has_inherited_predefined_type = ifcopenshell.util.element.get_predefined_type(element_type) not in ( + "NOTDEFINED", + None, + ) + def callback(name, prop, data): if name in ("RefLatitude", "RefLongitude"): new = props.attributes.add() @@ -62,10 +70,11 @@ class EnableEditingAttributes(bpy.types.Operator): new.string_value = "" if new.is_null else json.dumps(data[name]) blenderbim.bim.helper.add_attribute_description(new) new.description += " The degrees, minutes and seconds should follow this format : [12,34,56]" + if name in ("PredefinedType", "ObjectType") and has_inherited_predefined_type: + props.attributes.remove(len(props.attributes) - 1) + return True - blenderbim.bim.helper.import_attributes2( - tool.Ifc.get().by_id(oprops.ifc_definition_id), props.attributes, callback=callback - ) + blenderbim.bim.helper.import_attributes2(element, props.attributes, callback=callback) props.is_editing_attributes = True return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/root/data.py b/src/blenderbim/blenderbim/bim/module/root/data.py index 3ee83bb6db..18f7fbffcd 100644 --- a/src/blenderbim/blenderbim/bim/module/root/data.py +++ b/src/blenderbim/blenderbim/bim/module/root/data.py @@ -169,7 +169,8 @@ class IfcClassData: if not element: return if element_type := ifcopenshell.util.element.get_type(element): - return ifcopenshell.util.element.get_predefined_type(element_type) != "NOTDEFINED" + # Allow for None due to https://github.com/buildingSMART/IFC4.3.x-development/issues/818 + return ifcopenshell.util.element.get_predefined_type(element_type) not in ("NOTDEFINED", None) return False @classmethod diff --git a/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py b/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py index 072427057a..42365ca802 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py +++ b/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py @@ -64,7 +64,8 @@ class Usecase: self.settings["product"].PredefinedType = "USERDEFINED" elif hasattr(self.settings["product"], "ObjectType"): relating_type = ifcopenshell.util.element.get_type(self.settings["product"]) - if relating_type and relating_type.PredefinedType != "NOTDEFINED": + # Allow for None due to https://github.com/buildingSMART/IFC4.3.x-development/issues/818 + if relating_type and relating_type.PredefinedType not in ("NOTDEFINED", None): self.settings["product"].ObjectType = None self.settings["product"].PredefinedType = None elif (