From 1b1588359f2bac6973ffc089de782902e6192f48 Mon Sep 17 00:00:00 2001 From: Gorgious56 Date: Tue, 19 Jul 2022 10:19:58 +0200 Subject: [PATCH] Ifc class suggestion (#2290) * You can now use suggestions in ifc class enum search popup * Move data to data submodule * Fix error when suggestion mapping contains only one value * Add predefined types to the search popup * Use defaultdict to be able to add suggestions later * Support predefined types and format name to display the ifc class and fix bug where the prop is not defined in the suggestion dictionary * Move data retrieval to data module * Simplify prop search items retrieval * Support prop search for more enums --- .../blenderbim/bim/module/brick/prop.py | 6 -- .../blenderbim/bim/module/context/ui.py | 4 +- .../blenderbim/bim/module/material/prop.py | 2 - .../blenderbim/bim/module/material/ui.py | 4 +- .../blenderbim/bim/module/patch/prop.py | 4 -- .../blenderbim/bim/module/project/prop.py | 25 -------- .../blenderbim/bim/module/pset/prop.py | 13 ---- .../blenderbim/bim/module/pset/ui.py | 14 ++--- .../bim/module/pset_template/prop.py | 12 ---- .../blenderbim/bim/module/root/data.py | 38 ++++++++++++ .../blenderbim/bim/module/root/operator.py | 2 +- .../blenderbim/bim/module/root/prop.py | 12 ++-- .../blenderbim/bim/module/structural/ui.py | 6 +- .../blenderbim/bim/module/style/ui.py | 2 +- .../blenderbim/bim/module/system/ui.py | 3 +- .../blenderbim/bim/module/unit/prop.py | 6 -- src/blenderbim/blenderbim/bim/operator.py | 62 ++++++++++++++----- src/blenderbim/blenderbim/bim/prop.py | 4 -- 18 files changed, 108 insertions(+), 111 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/brick/prop.py b/src/blenderbim/blenderbim/bim/module/brick/prop.py index 8d523b68df..6e0ba7c814 100644 --- a/src/blenderbim/blenderbim/bim/module/brick/prop.py +++ b/src/blenderbim/blenderbim/bim/module/brick/prop.py @@ -69,9 +69,3 @@ class BIMBrickProperties(PropertyGroup): libraries: EnumProperty(name="Libraries", items=get_libraries) namespace: EnumProperty(name="Namespace", items=get_namespaces) brick_equipment_class: EnumProperty(name="Brick Equipment Class", items=get_brick_equipment_classes) - - getter_enum = { - "libraries": get_libraries, - "namespace": get_namespaces, - "brick_equipment_class": get_brick_equipment_classes, - } diff --git a/src/blenderbim/blenderbim/bim/module/context/ui.py b/src/blenderbim/blenderbim/bim/module/context/ui.py index 685acb1817..58449f6d45 100644 --- a/src/blenderbim/blenderbim/bim/module/context/ui.py +++ b/src/blenderbim/blenderbim/bim/module/context/ui.py @@ -64,8 +64,8 @@ class BIM_PT_context(bpy.types.Panel): row.operator("bim.remove_context", icon="X", text="").context = ifc_context["id"] row = box.row(align=True) - row.prop(props, "subcontexts", text="") - row.prop(props, "target_views", text="") + blenderbim.bim.helper.prop_with_search(row, props, "subcontexts", text="") + blenderbim.bim.helper.prop_with_search(row, props, "target_views", text="") op = row.operator("bim.add_context", icon="ADD", text="") op.context_type = ifc_context["context_type"] op.context_identifier = props.subcontexts diff --git a/src/blenderbim/blenderbim/bim/module/material/prop.py b/src/blenderbim/blenderbim/bim/module/material/prop.py index 1795156ebe..8f400ab07f 100644 --- a/src/blenderbim/blenderbim/bim/module/material/prop.py +++ b/src/blenderbim/blenderbim/bim/module/material/prop.py @@ -137,5 +137,3 @@ class BIMObjectMaterialProperties(PropertyGroup): parameterized_profile_classes: EnumProperty( items=getParameterizedProfileClasses, name="Parameterized Profile Classes" ) - - getter_enum = {"material": get_materials} diff --git a/src/blenderbim/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py index cddd181189..01391fa5f7 100644 --- a/src/blenderbim/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -51,7 +51,7 @@ class BIM_PT_materials(Panel): row.operator("bim.disable_editing_materials", text="", icon="CANCEL") else: row = self.layout.row(align=True) - row.prop(self.props, "material_type", text="") + prop_with_search(row, self.props, "material_type", text="") row.operator("bim.load_materials", text="", icon="IMPORT") return @@ -189,7 +189,7 @@ class BIM_PT_object_material(Panel): return self.draw_material_ui() row = self.layout.row(align=True) - row.prop(self.props, "material_type", text="") + prop_with_search(row, self.props, "material_type", text="") if self.props.material_type == "IfcMaterial" or self.props.material_type == "IfcMaterialList": prop_with_search(row, self.props, "material", text="") row.operator("bim.assign_material", icon="ADD", text="") diff --git a/src/blenderbim/blenderbim/bim/module/patch/prop.py b/src/blenderbim/blenderbim/bim/module/patch/prop.py index 0fb0a5f341..27c0e44ab5 100644 --- a/src/blenderbim/blenderbim/bim/module/patch/prop.py +++ b/src/blenderbim/blenderbim/bim/module/patch/prop.py @@ -66,7 +66,3 @@ class BIMPatchProperties(PropertyGroup): ifc_patch_output: StringProperty(default="", name="IFC Patch Output IFC") ifc_patch_args: StringProperty(default="", name="Arguments") ifc_patch_args_attr: CollectionProperty(type=Attribute, name="Arguments") - - getter_enum = { - "ifc_patch_recipes": get_ifcpatch_recipes, - } diff --git a/src/blenderbim/blenderbim/bim/module/project/prop.py b/src/blenderbim/blenderbim/bim/module/project/prop.py index 4d38d465fe..3fe5e5077f 100644 --- a/src/blenderbim/blenderbim/bim/module/project/prop.py +++ b/src/blenderbim/blenderbim/bim/module/project/prop.py @@ -167,28 +167,3 @@ class BIMProjectProperties(PropertyGroup): def get_library_element_index(self, lib_element): return next((i for i in range(len(self.library_elements)) if self.library_elements[i] == lib_element)) - - getter_enum = { - "collection_mode": lambda self, context: [ - ("DECOMPOSITION", "Decomposition", "Collections represent aggregates and spatial containers"), - ("SPATIAL_DECOMPOSITION", "Spatial Decomposition", "Collections represent spatial containers"), - ("IFC_CLASS", "IFC Class", "Collections represent IFC class"), - ("NONE", "None", "No collections are created"), - ], - "filter_mode": lambda self, context: [ - ("NONE", "None", "No filtering is performed"), - ("DECOMPOSITION", "Decomposition", "Filter objects by decomposition"), - ("IFC_CLASS", "IFC Class", "Filter objects by class"), - ("IFC_TYPE", "IFC Type", "Filter objects by type"), - ("WHITELIST", "Whitelist", "Filter objects using a custom whitelist query"), - ("BLACKLIST", "Blacklist", "Filter objects using a custom blacklist query"), - ], - "merge_mode": lambda self, context: [ - ("NONE", "None", "No objects are merged"), - ("IFC_CLASS", "IFC Class", "One object per IFC class"), - ("IFC_TYPE", "IFC Type", "One object per IFC construction type"), - ("MATERIAL", "Material", "One object per material"), - ], - "export_schema": get_export_schema, - "template_file": get_template_file, - } diff --git a/src/blenderbim/blenderbim/bim/module/pset/prop.py b/src/blenderbim/blenderbim/bim/module/pset/prop.py index 7bf754e389..547947b850 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset/prop.py @@ -158,11 +158,6 @@ class PsetProperties(PropertyGroup): pset_name: EnumProperty(items=get_pset_names, name="Pset Name") qto_name: EnumProperty(items=get_qto_names, name="Qto Name") - getter_enum = { - "qto_name": get_qto_names, - "pset_name": get_pset_names, - } - class MaterialPsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") @@ -223,14 +218,6 @@ class AddEditProperties(PropertyGroup): ) enum_values: CollectionProperty(name="Enum Values", type=Attribute) - getter_enum = { - "primary_measure_type": get_primary_measure_type, - "template_type": lambda self, context: [ - ("IfcPropertySingleValue", "IfcPropertySingleValue", "IfcPropertySingleValue"), - ("IfcPropertyEnumeratedValue", "IfcPropertyEnumeratedValue", "IfcPropertyEnumeratedValue"), - ], - } - def get_value_name(self): ifc_data_type = IfcStore.get_schema().declaration_by_name(self.primary_measure_type) data_type = ifcopenshell.util.attribute.get_primitive_type(ifc_data_type) diff --git a/src/blenderbim/blenderbim/bim/module/pset/ui.py b/src/blenderbim/blenderbim/bim/module/pset/ui.py index b6c67b1611..a0b1984fb4 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/ui.py +++ b/src/blenderbim/blenderbim/bim/module/pset/ui.py @@ -252,7 +252,7 @@ class BIM_PT_material_psets(Panel): props = context.active_object.active_material.PsetProperties row = self.layout.row(align=True) - row.prop(props, "pset_name", text="") + prop_with_search(row, props, "pset_name", text="") op = row.operator("bim.add_pset", icon="ADD", text="") op.obj = context.active_object.active_material.name op.obj_type = "Material" @@ -348,7 +348,7 @@ class BIM_PT_resource_psets(Panel): props = context.scene.ResourcePsetProperties row = self.layout.row(align=True) - row.prop(props, "pset_name", text="") + prop_with_search(row, props, "pset_name", text="") op = row.operator("bim.add_pset", icon="ADD", text="") op.obj_type = "Resource" @@ -381,7 +381,7 @@ class BIM_PT_profile_psets(Panel): props = context.scene.ProfilePsetProperties row = self.layout.row(align=True) - row.prop(props, "pset_name", text="") + prop_with_search(row, props, "pset_name", text="") op = row.operator("bim.add_pset", icon="ADD", text="") op.obj_type = "Profile" @@ -410,7 +410,7 @@ class BIM_PT_work_schedule_psets(Panel): props = context.scene.WorkSchedulePsetProperties row = self.layout.row(align=True) - row.prop(props, "pset_name", text="") + prop_with_search(row, props, "pset_name", text="") op = row.operator("bim.add_pset", icon="ADD", text="") op.obj_type = "WorkSchedule" @@ -450,7 +450,7 @@ class BIM_PT_rename_parameters(Panel): if props: for index, prop in enumerate(props): row = layout.row(align=True) - row.prop(prop, "pset_name", text="") + prop_with_search(row, prop, "pset_name", text="") row.prop(prop, "existing_property_name", text="") row.prop(prop, "new_property_name", text="") op = row.operator("bim.remove_property_to_edit", icon="X", text="") @@ -485,7 +485,7 @@ class BIM_PT_add_edit_custom_properties(Panel): if props: for index, prop in enumerate(props): row = layout.row(align=True) - row.prop(prop, "pset_name", text="") + prop_with_search(row, prop, "pset_name", text="") row.prop(prop, "property_name", text="") if prop.template_type == "IfcPropertySingleValue": row.prop(prop, prop.get_value_name(), text="") @@ -537,7 +537,7 @@ class BIM_PT_delete_psets(Panel): if props: for index, prop in enumerate(props): row = layout.row(align=True) - row.prop(prop, "pset_name", text="") + prop_with_search(row, prop, "pset_name", text="") op = row.operator("bim.remove_property_to_edit", icon="X", text="") op.index = index op.option = "DeletePsets" diff --git a/src/blenderbim/blenderbim/bim/module/pset_template/prop.py b/src/blenderbim/blenderbim/bim/module/pset_template/prop.py index 62a6bcf474..6642534e88 100644 --- a/src/blenderbim/blenderbim/bim/module/pset_template/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset_template/prop.py @@ -146,10 +146,6 @@ class PsetTemplate(PropertyGroup): template_type: EnumProperty(items=get_template_type, name="Template Type") applicable_entity: StringProperty(name="Applicable Entity") - getter_enum = { - "template_type": get_template_type, - } - class EnumerationValues(PropertyGroup): string_value: StringProperty(name="Value") @@ -168,9 +164,6 @@ class PropTemplate(PropertyGroup): name="Template Type", ) enum_values: CollectionProperty(type=EnumerationValues) - getter_enum = { - "primary_measure_type": get_primary_measure_type, - } def get_value_name(self): ifc_data_type = IfcStore.get_schema().declaration_by_name(self.primary_measure_type) @@ -195,8 +188,3 @@ class BIMPsetTemplateProperties(PropertyGroup): active_pset_template: PointerProperty(type=PsetTemplate) active_prop_template: PointerProperty(type=PropTemplate) new_template_filename: StringProperty("New TemplateFileName") - - getter_enum = { - "pset_template_files": getPsetTemplateFiles, - "pset_templates": getPsetTemplates, - } diff --git a/src/blenderbim/blenderbim/bim/module/root/data.py b/src/blenderbim/blenderbim/bim/module/root/data.py index 9d2ee77ae4..dda12cdac8 100644 --- a/src/blenderbim/blenderbim/bim/module/root/data.py +++ b/src/blenderbim/blenderbim/bim/module/root/data.py @@ -16,9 +16,11 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +from collections import defaultdict import bpy import ifcopenshell.util.element import blenderbim.tool as tool +from blenderbim.bim.ifc import IfcStore def refresh(): @@ -35,6 +37,7 @@ class IfcClassData: cls.data = {} cls.data["ifc_products"] = cls.ifc_products() cls.data["ifc_classes"] = cls.ifc_classes() + cls.data["ifc_classes_suggestions"] = cls.ifc_classes_suggestions() cls.data["contexts"] = cls.contexts() cls.data["has_entity"] = cls.has_entity() cls.data["name"] = cls.name() @@ -74,6 +77,41 @@ class IfcClassData: names.extend(("IfcDoorStyle", "IfcWindowStyle")) return [(c, c, "") for c in sorted(names)] + @classmethod + def ifc_classes_suggestions(cls): + suggestions = defaultdict(list) + suggestions.update( + { + "IfcWall": ["Glazing", "Glass", "Pane"], + "IfcWindow": ["Glazing", "Glass", "Pane"], + "IfcPlate": ["Glazing", "Glass", "Pane"], + "IfcFurniture": ["Signage"], + "IfcSlab": ["Hob"], + "IfcCovering": ["Flashing", "Capping"], + "IfcCableSegment": ["Lighting Rod"], + "IfcSensor": ["Card Reader", "Fob Reader"], + "IfcSwitchingDevice": ["Reed Switch", "Electric Isolating Switch"], + "IfcActuator": ["Electric Strike"], + "IfcAirTerminalBox": ["VAV Box"], + "IfcUnitaryEquipment": ["Fan Coil Unit"], + } + ) + file = IfcStore.get_file() + if file: + for ifc_class in cls.ifc_classes(): + ifc_class = ifc_class[0] + declaration = IfcStore.get_schema().declaration_by_name(ifc_class) + for attribute in declaration.attributes(): + if attribute.name() == "PredefinedType": + for e in attribute.type_of_attribute().declared_type().enumeration_items(): + if e in ( + "NOTDEFINED", + "USERDEFINED", + ): + continue + suggestions[ifc_class].append(e.title()) + return suggestions + @classmethod def contexts(cls): results = [] diff --git a/src/blenderbim/blenderbim/bim/module/root/operator.py b/src/blenderbim/blenderbim/bim/module/root/operator.py index b2c39b7b44..b1632668b9 100644 --- a/src/blenderbim/blenderbim/bim/module/root/operator.py +++ b/src/blenderbim/blenderbim/bim/module/root/operator.py @@ -131,7 +131,7 @@ class AssignClass(bpy.types.Operator, Operator): ifc_class = self.ifc_class or props.ifc_class predefined_type = self.userdefined_type if self.predefined_type == "USERDEFINED" else self.predefined_type ifc_context = self.context_id - if not ifc_context and props.getter_enum["contexts"](props, context): + if not ifc_context and props._annotations__["contexts"].keywords.get("items")(props, context): ifc_context = int(props.contexts or "0") or None if ifc_context: ifc_context = tool.Ifc.get().by_id(ifc_context) diff --git a/src/blenderbim/blenderbim/bim/module/root/prop.py b/src/blenderbim/blenderbim/bim/module/root/prop.py index 2b009a551b..39f1729876 100644 --- a/src/blenderbim/blenderbim/bim/module/root/prop.py +++ b/src/blenderbim/blenderbim/bim/module/root/prop.py @@ -88,6 +88,11 @@ def get_ifc_classes(self, context): return IfcClassData.data["ifc_classes"] +def get_ifc_classes_suggestions(): + if not IfcClassData.is_loaded: + IfcClassData.load() + return IfcClassData.data["ifc_classes_suggestions"] + def get_contexts(self, context): if not IfcClassData.is_loaded: IfcClassData.load() @@ -101,9 +106,6 @@ class BIMRootProperties(PropertyGroup): ifc_predefined_type: EnumProperty(items=getIfcPredefinedTypes, name="Predefined Type", default=None) ifc_userdefined_type: StringProperty(name="Userdefined Type") - getter_enum = { - "contexts": get_contexts, - "ifc_product": get_ifc_products, - "ifc_class": get_ifc_classes, - "ifc_predefined_type": getIfcPredefinedTypes, + getter_enum_suggestions = { + "ifc_class": get_ifc_classes_suggestions, } diff --git a/src/blenderbim/blenderbim/bim/module/structural/ui.py b/src/blenderbim/blenderbim/bim/module/structural/ui.py index c5b226a58e..5ebad12343 100644 --- a/src/blenderbim/blenderbim/bim/module/structural/ui.py +++ b/src/blenderbim/blenderbim/bim/module/structural/ui.py @@ -20,7 +20,7 @@ import bpy import blenderbim.bim.helper from bpy.types import Panel, UIList from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.helper import draw_attributes +from blenderbim.bim.helper import draw_attributes, prop_with_search from ifcopenshell.api.structural.data import Data from blenderbim.bim.module.structural.data import StructuralData @@ -482,7 +482,7 @@ class BIM_PT_structural_loads(Panel): row.operator("bim.disable_structural_load_editing_ui", text="", icon="SCREEN_BACK") row = self.layout.row(align=True) - row.prop(self.props, "structural_load_types", text="") + prop_with_search(row, self.props, "structural_load_types", text="") row.operator("bim.add_structural_load", text="", icon="ADD").ifc_class = self.props.structural_load_types else: row.operator("bim.load_structural_loads", text="", icon="GREASEPENCIL") @@ -551,7 +551,7 @@ class BIM_PT_boundary_conditions(Panel): row.operator("bim.disable_boundary_condition_editing_ui", text="", icon="SCREEN_BACK") row = self.layout.row(align=True) - row.prop(self.props, "boundary_condition_types", text="") + prop_with_search(row, self.props, "boundary_condition_types", text="") row.operator( "bim.add_boundary_condition", text="", icon="ADD" ).ifc_class = self.props.boundary_condition_types diff --git a/src/blenderbim/blenderbim/bim/module/style/ui.py b/src/blenderbim/blenderbim/bim/module/style/ui.py index b5a0cfe586..b4e573d101 100644 --- a/src/blenderbim/blenderbim/bim/module/style/ui.py +++ b/src/blenderbim/blenderbim/bim/module/style/ui.py @@ -47,7 +47,7 @@ class BIM_PT_styles(Panel): if self.props.is_editing: row.operator("bim.disable_editing_styles", text="", icon="CANCEL") else: - row.prop(self.props, "style_type", text="") + blenderbim.bim.helper.prop_with_search(row, self.props, "style_type", text="") row.operator("bim.load_styles", text="", icon="IMPORT").style_type = self.props.style_type return diff --git a/src/blenderbim/blenderbim/bim/module/system/ui.py b/src/blenderbim/blenderbim/bim/module/system/ui.py index e65e90f87f..7a4be0b16a 100644 --- a/src/blenderbim/blenderbim/bim/module/system/ui.py +++ b/src/blenderbim/blenderbim/bim/module/system/ui.py @@ -16,6 +16,7 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +from blenderbim.bim.helper import prop_with_search import blenderbim.tool as tool from bpy.types import Panel, UIList from blenderbim.bim.ifc import IfcStore @@ -46,7 +47,7 @@ class BIM_PT_systems(Panel): row.operator("bim.disable_system_editing_ui", text="", icon="CANCEL") row = self.layout.row(align=True) - row.prop(self.props, "system_class", text="") + prop_with_search(row, self.props, "system_class", text="") row.operator("bim.add_system", text="", icon="ADD") else: row.operator("bim.load_systems", text="", icon="GREASEPENCIL") diff --git a/src/blenderbim/blenderbim/bim/module/unit/prop.py b/src/blenderbim/blenderbim/bim/module/unit/prop.py index f631ac1b69..22ef9c7a0e 100644 --- a/src/blenderbim/blenderbim/bim/module/unit/prop.py +++ b/src/blenderbim/blenderbim/bim/module/unit/prop.py @@ -68,9 +68,3 @@ class BIMUnitProperties(PropertyGroup): conversion_unit_types: EnumProperty(items=get_conversion_unit_types, name="Conversion Unit Types") named_unit_types: EnumProperty(items=get_named_unit_types, name="Named Unit Types") unit_attributes: CollectionProperty(name="Unit Attributes", type=Attribute) - - getter_enum = { - "unit_classes": get_unit_classes, - "conversion_unit_types": get_conversion_unit_types, - "named_unit_types": get_named_unit_types, - } diff --git a/src/blenderbim/blenderbim/bim/operator.py b/src/blenderbim/blenderbim/bim/operator.py index 91131d772f..0f1f230287 100644 --- a/src/blenderbim/blenderbim/bim/operator.py +++ b/src/blenderbim/blenderbim/bim/operator.py @@ -527,9 +527,10 @@ class ConfigureVisibility(bpy.types.Operator): def update_enum_property_search_prop(self, context): - for i, prop in enumerate(self.collection_name): + for i, prop in enumerate(self.collection_names): if prop.name == self.dummy_name: - setattr(context.data, self.prop_name, self.collection_identifier[i].name) + setattr(context.data, self.prop_name, self.collection_identifiers[i].name) + break class BIM_OT_enum_property_search(bpy.types.Operator): @@ -537,28 +538,55 @@ class BIM_OT_enum_property_search(bpy.types.Operator): bl_label = "Search For Property" bl_options = {"REGISTER", "UNDO"} dummy_name: bpy.props.StringProperty(name="Property", update=update_enum_property_search_prop) - collection_name: bpy.props.CollectionProperty(type=StrProperty) - collection_identifier: bpy.props.CollectionProperty(type=StrProperty) + collection_names: bpy.props.CollectionProperty(type=StrProperty) + collection_identifiers: bpy.props.CollectionProperty(type=StrProperty) prop_name: bpy.props.StringProperty() def invoke(self, context, event): + self.clear_collections() self.data = context.data - getter = self.data.getter_enum.get(self.prop_name, None) - if getter is None: + items = self.data.__annotations__[self.prop_name].keywords.get("items") + if items is None: return {"FINISHED"} - self.collection_name.clear() - self.collection_identifier.clear() - for item in getter(self.data, context): - self.collection_identifier.add().name = item[0] - if item[0] == getattr(self.data, self.prop_name): - self.dummy_name = item[1] # We found the current enum value - self.collection_name.add().name = item[1] + if not isinstance(items, list): + items = items(self.data, context) + self.add_items_regular(items) + self.add_items_suggestions() return context.window_manager.invoke_props_dialog(self) - def execute(self, context): - return {"FINISHED"} - def draw(self, context): # Mandatory to access context.data in update : self.layout.context_pointer_set(name="data", data=self.data) - self.layout.prop_search(self, "dummy_name", self, "collection_name") + self.layout.prop_search(self, "dummy_name", self, "collection_names") + + def execute(self, context): + return {"FINISHED"} + + def clear_collections(self): + self.collection_names.clear() + self.collection_identifiers.clear() + + def add_item(self, identifier: str, name: str): + self.collection_identifiers.add().name = identifier + self.collection_names.add().name = name + + def add_items_regular(self, items): + self.identifiers = [] + for item in items: + self.identifiers.append(item[0]) + self.add_item(identifier=item[0], name=item[1]) + if item[0] == getattr(self.data, self.prop_name): + self.dummy_name = item[1] # We found the current enum name + + def add_items_suggestions(self): + getter_suggestions = getattr(self.data, "getter_enum_suggestions", None) + if getter_suggestions is not None: + mapping = getter_suggestions.get(self.prop_name) + if mapping is None: + return + for key, values in mapping().items(): + if key in self.identifiers: + if not isinstance(values, (tuple, list)): + values = [values] + for value in values: + self.add_item(identifier=key, name=key + " (" + value + ")") diff --git a/src/blenderbim/blenderbim/bim/prop.py b/src/blenderbim/blenderbim/bim/prop.py index e86896fd39..ffdfc8bb27 100644 --- a/src/blenderbim/blenderbim/bim/prop.py +++ b/src/blenderbim/blenderbim/bim/prop.py @@ -240,10 +240,6 @@ class Attribute(PropertyGroup): value = str(value) setattr(self, self.get_value_name(), value) - getter_enum = { - "enum_value": getAttributeEnumValues, - } - class ModuleVisibility(PropertyGroup): name: StringProperty(name="Name")