diff --git a/src/bonsai/bonsai/bim/module/drawing/prop.py b/src/bonsai/bonsai/bim/module/drawing/prop.py index 4270f9f72d..710d1f3918 100644 --- a/src/bonsai/bonsai/bim/module/drawing/prop.py +++ b/src/bonsai/bonsai/bim/module/drawing/prop.py @@ -47,14 +47,11 @@ from bpy.props import ( diagram_scales_enum = [] -sheets_enum = [] def purge(): global diagram_scales_enum - global sheets_enum diagram_scales_enum = [] - sheets_enum = [] def update_target_view(self, context): diff --git a/src/bonsai/bonsai/bim/module/material/operator.py b/src/bonsai/bonsai/bim/module/material/operator.py index ac56232a1e..b8d5de5ce0 100644 --- a/src/bonsai/bonsai/bim/module/material/operator.py +++ b/src/bonsai/bonsai/bim/module/material/operator.py @@ -28,7 +28,6 @@ import bonsai.tool as tool import bonsai.core.style import bonsai.core.material as core import bonsai.bim.module.model.profile as model_profile -from bonsai.bim.module.material.prop import purge as material_prop_purge from bonsai.bim.ifc import IfcStore from typing import Any, Union @@ -143,7 +142,6 @@ class AddMaterial(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): core.add_material(tool.Ifc, tool.Material, name=self.name, category=self.category, description=self.description) - material_prop_purge() class DuplicateMaterial(bpy.types.Operator, tool.Ifc.Operator): @@ -155,7 +153,6 @@ class DuplicateMaterial(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): material = tool.Ifc.get().by_id(self.material) tool.Material.duplicate_material(material) - material_prop_purge() bpy.ops.bim.load_materials() @@ -168,7 +165,6 @@ class AddMaterialSet(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): core.add_material_set(tool.Ifc, tool.Material, set_type=self.set_type) - material_prop_purge() class RemoveMaterial(bpy.types.Operator, tool.Ifc.Operator): diff --git a/src/bonsai/bonsai/bim/module/material/prop.py b/src/bonsai/bonsai/bim/module/material/prop.py index 4e745175a7..e6cf5ae827 100644 --- a/src/bonsai/bonsai/bim/module/material/prop.py +++ b/src/bonsai/bonsai/bim/module/material/prop.py @@ -20,6 +20,7 @@ import bpy from ifcopenshell.util.doc import get_entity_doc import bonsai.tool as tool from bonsai.bim.module.material.data import MaterialsData, ObjectMaterialData +from bonsai.bim.module.profile.data import ProfileData from bonsai.bim.ifc import IfcStore from bonsai.bim.prop import StrProperty, Attribute from bpy.types import PropertyGroup @@ -34,51 +35,17 @@ from bpy.props import ( CollectionProperty, ) -materialtypes_enum = [] -profileclasses_enum = [] -parameterizedprofileclasses_enum = [] - -def purge(): - global materialtypes_enum - global profileclasses_enum - global parameterizedprofileclasses_enum - materialtypes_enum = [] - profileclasses_enum = [] - parameterizedprofileclasses_enum = [] - - -# TODO: unsafe? def get_profile_classes(self, context): - global profileclasses_enum - if len(profileclasses_enum) == 0 and IfcStore.get_schema(): - version = tool.Ifc.get_schema() - profileclasses_enum.clear() - profileclasses_enum = [ - (t.name(), t.name(), get_entity_doc(version, t.name()).get("description", "")) - for t in IfcStore.get_schema().declaration_by_name("IfcProfileDef").subtypes() - ] - return profileclasses_enum + if not ProfileData.is_loaded: + ProfileData.load() + return ProfileData.data["profile_def_classes_enum"] -# TODO: unsafe? def get_parameterized_profile_classes(self, context): - global parameterizedprofileclasses_enum - if len(parameterizedprofileclasses_enum) == 0 and IfcStore.get_schema(): - version = tool.Ifc.get_schema() - parameterizedprofileclasses_enum.clear() - parameterizedprofileclasses_enum = [ - (t.name(), t.name(), get_entity_doc(version, t.name()).get("description", "")) - for t in IfcStore.get_schema().declaration_by_name("IfcParameterizedProfileDef").subtypes() - ] - for ifc_class in parameterizedprofileclasses_enum: - parameterizedprofileclasses_enum.extend( - [ - (t.name(), t.name(), get_entity_doc(version, t.name()).get("description", "")) - for t in IfcStore.get_schema().declaration_by_name(ifc_class[0]).subtypes() or [] - ] - ) - return parameterizedprofileclasses_enum + if not ProfileData.is_loaded: + ProfileData.load() + return ProfileData.data["profile_classes"] def get_materials(self, context): diff --git a/src/bonsai/bonsai/bim/module/profile/data.py b/src/bonsai/bonsai/bim/module/profile/data.py index 2ea97a9a20..9f89cf01ed 100644 --- a/src/bonsai/bonsai/bim/module/profile/data.py +++ b/src/bonsai/bonsai/bim/module/profile/data.py @@ -41,6 +41,7 @@ class ProfileData: "profile_classes": cls.profile_classes(), "is_arbitrary_profile": cls.is_arbitrary_profile(), "is_editing_arbitrary_profile": cls.is_editing_arbitrary_profile(), + "profile_def_classes_enum": cls.profile_def_classes_enum(), } cls.is_loaded = True @@ -72,6 +73,14 @@ class ProfileData: for c in sorted(classes) ] + @classmethod + def profile_def_classes_enum(cls) -> list[tuple[str, str, str]]: + version = tool.Ifc.get_schema() + return [ + (t.name(), t.name(), ifcopenshell.util.doc.get_entity_doc(version, t.name()).get("description", "")) + for t in tool.Ifc.schema().declaration_by_name("IfcProfileDef").subtypes() + ] + @classmethod def is_arbitrary_profile(cls): props = bpy.context.scene.BIMProfileProperties diff --git a/src/bonsai/bonsai/bim/module/sequence/data.py b/src/bonsai/bonsai/bim/module/sequence/data.py index ca4e76aa5f..5f5d23331a 100644 --- a/src/bonsai/bonsai/bim/module/sequence/data.py +++ b/src/bonsai/bonsai/bim/module/sequence/data.py @@ -45,6 +45,8 @@ class SequenceData: "has_work_schedules": cls.has_work_schedules(), "has_work_calendars": cls.has_work_calendars(), "schedule_predefined_types_enum": cls.schedule_predefined_types_enum(), + "task_columns_enum": cls.task_columns_enum(), + "tasktimecolumns_enum": cls.tasktimecolumns_enum(), } cls.load_work_plans() cls.load_work_schedules() @@ -259,6 +261,38 @@ class SequenceData: break return results + @classmethod + def task_columns_enum(cls) -> list[tuple[str, str, str]]: + schema = tool.Ifc.schema() + taskcolumns_enum = [] + for a in schema.declaration_by_name("IfcTask").all_attributes(): + if (primitive_type := ifcopenshell.util.attribute.get_primitive_type(a)) not in ( + "string", + "float", + "integer", + "boolean", + "enum", + ): + continue + schema.append((f"{a.name()}/{primitive_type}", a.name(), "")) + return taskcolumns_enum + + @classmethod + def tasktimecolumns_enum(cls) -> list[tuple[str, str, str]]: + schema = tool.Ifc.schema() + tasktimecolumns_enum = [] + for a in schema.declaration_by_name("IfcTaskTime").all_attributes(): + if (primitive_type := ifcopenshell.util.attribute.get_primitive_type(a)) not in ( + "string", + "float", + "integer", + "boolean", + "enum", + ): + continue + schema.append((f"{a.name()}/{primitive_type}", a.name(), "")) + return tasktimecolumns_enum + class WorkScheduleData: data = {} diff --git a/src/bonsai/bonsai/bim/module/sequence/prop.py b/src/bonsai/bonsai/bim/module/sequence/prop.py index 6d2866ae8d..c94f93ec23 100644 --- a/src/bonsai/bonsai/bim/module/sequence/prop.py +++ b/src/bonsai/bonsai/bim/module/sequence/prop.py @@ -41,43 +41,17 @@ from bpy.props import ( CollectionProperty, ) -taskcolumns_enum = [] -tasktimecolumns_enum = [] - - -def purge(): - global taskcolumns_enum - global tasktimecolumns_enum - taskcolumns_enum = [] - tasktimecolumns_enum = [] - def getTaskColumns(self, context): - global taskcolumns_enum - if not len(taskcolumns_enum) and IfcStore.get_schema(): - taskcolumns_enum.extend( - [ - (a.name() + "/" + ifcopenshell.util.attribute.get_primitive_type(a), a.name(), "") - for a in IfcStore.get_schema().declaration_by_name("IfcTask").all_attributes() - if ifcopenshell.util.attribute.get_primitive_type(a) - in ["string", "float", "integer", "boolean", "enum"] - ] - ) - return taskcolumns_enum + if not SequenceData.is_loaded: + SequenceData.load() + return SequenceData.data["taskcolumns_enum"] def getTaskTimeColumns(self, context): - global tasktimecolumns_enum - if not len(tasktimecolumns_enum) and IfcStore.get_schema(): - tasktimecolumns_enum.extend( - [ - (a.name() + "/" + ifcopenshell.util.attribute.get_primitive_type(a), a.name(), "") - for a in IfcStore.get_schema().declaration_by_name("IfcTaskTime").all_attributes() - if ifcopenshell.util.attribute.get_primitive_type(a) - in ["string", "float", "integer", "boolean", "enum"] - ] - ) - return tasktimecolumns_enum + if not SequenceData.is_loaded: + SequenceData.load() + return SequenceData.data["tasktimecolumns_enum"] def getWorkSchedules(self, context):