From 74a025b81ca18a6fb356c85209bd54ac6046cbf3 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 5 Jul 2023 16:44:55 +0500 Subject: [PATCH] type selection error #3318 if you switch ifc_class then relating_type_id can become invalid and we wasn't taking it into account Also fixed bunch of warning like `pyrna_enum_to_py: current value '17' matches no enum in 'BIMModelProperties', '', 'relating_type_id'`` when some ifc_class has N related types and then you switch to other ifc_class that has less than N related types. --- src/blenderbim/blenderbim/bim/module/model/data.py | 9 +++++++-- src/blenderbim/blenderbim/bim/module/model/prop.py | 2 ++ src/blenderbim/blenderbim/tool/blender.py | 11 +++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/data.py b/src/blenderbim/blenderbim/bim/module/model/data.py index 0b0225e539..646e6b7cd6 100644 --- a/src/blenderbim/blenderbim/bim/module/model/data.py +++ b/src/blenderbim/blenderbim/bim/module/model/data.py @@ -48,15 +48,18 @@ class AuthoringData: cls.is_loaded = True cls.props = bpy.context.scene.BIMModelProperties cls.data["ifc_classes"] = cls.ifc_classes() - cls.data["relating_type_id"] = cls.relating_type_id() + cls.data["relating_type_id"] = cls.relating_type_id() # only after .ifc_classes() cls.data["type_class"] = cls.type_class() + + # only after .type_class() cls.data["type_predefined_type"] = cls.type_predefined_type() cls.data["total_types"] = cls.total_types() cls.data["total_pages"] = cls.total_pages() cls.data["next_page"] = cls.next_page() cls.data["prev_page"] = cls.prev_page() cls.data["paginated_relating_types"] = cls.paginated_relating_types() - cls.data["type_thumbnail"] = cls.type_thumbnail() + + cls.data["type_thumbnail"] = cls.type_thumbnail() # only after .relating_type_id() cls.data["is_voidable_element"] = cls.is_voidable_element() cls.data["has_visible_openings"] = cls.has_visible_openings() cls.data["has_visible_boundaries"] = cls.has_visible_boundaries() @@ -112,6 +115,8 @@ class AuthoringData: def type_thumbnail(cls): if not cls.data["relating_type_id"]: return 0 + if not tool.Blender.enum_property_has_valid_index(cls.props, "relating_type_id", cls.data["relating_type_id"]): + return 0 element = tool.Ifc.get().by_id(int(cls.props.relating_type_id)) return cls.type_thumbnails.get(element.id(), None) or 0 diff --git a/src/blenderbim/blenderbim/bim/module/model/prop.py b/src/blenderbim/blenderbim/bim/module/model/prop.py index c848218b6b..0e1c8d39c2 100644 --- a/src/blenderbim/blenderbim/bim/module/model/prop.py +++ b/src/blenderbim/blenderbim/bim/module/model/prop.py @@ -59,6 +59,8 @@ def update_ifc_class(self, context): bpy.ops.bim.load_type_thumbnails(ifc_class=self.ifc_class) AuthoringData.data["relating_type_id"] = AuthoringData.relating_type_id() AuthoringData.data["type_thumbnail"] = AuthoringData.type_thumbnail() + if not tool.Blender.enum_property_has_valid_index(self, "relating_type_id", AuthoringData.data["relating_type_id"]): + self["relating_type_id"] = 0 def update_type_class(self, context): diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index e7b1515754..4d9867aacc 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -329,6 +329,17 @@ class Blender: context.view_layer.objects.active = active_object active_object.select_set(True) + @classmethod + def enum_property_has_valid_index(cls, props, prop_name, enum_items): + """method created for readibility and to avoid console warnings like + `pyrna_enum_to_py: current value '17' matches no enum in 'BIMModelProperties', '', 'relating_type_id'` + """ + current_value_index = props.get(prop_name, None) + # assuming the default value is fine + if current_value_index is None: + return True + return current_value_index < len(enum_items) + @classmethod def append_data_block(cls, filepath, data_block_type, name, link=False, relative=False): if Path(filepath) == Path(bpy.data.filepath):