From 1c06d12efc7852d1f6fe8b147f8bf942d270b4d5 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 5 Aug 2025 11:13:23 +0500 Subject: [PATCH] Support 2f1de2f when adding bsdd properties Previously you would still need to open bsdd ui and preload dictionaries. --- src/bonsai/bonsai/bim/module/pset/data.py | 31 +++++++++++++++++++++++ src/bonsai/bonsai/bim/module/pset/prop.py | 28 ++++++++++---------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/pset/data.py b/src/bonsai/bonsai/bim/module/pset/data.py index e9c9c0a210..2a12d0951b 100644 --- a/src/bonsai/bonsai/bim/module/pset/data.py +++ b/src/bonsai/bonsai/bim/module/pset/data.py @@ -16,6 +16,8 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from typing import Any + import bpy import ifcopenshell import ifcopenshell.util.attribute @@ -43,6 +45,7 @@ def refresh(): WorkSchedulePsetsData.is_loaded = False ZonePsetsData.is_loaded = False AddEditCustomPropertiesData.is_loaded = False + PsetsGeneralData.is_loaded = False class Data: @@ -357,3 +360,31 @@ class AddEditCustomPropertiesData: return [ (t, t, ifcopenshell.util.doc.get_type_doc(version, t).get("description", "")) for t in sorted(declarations) ] + + +class PsetsGeneralData: + data: dict[str, Any] = {} + is_loaded = False + + @classmethod + def load(cls) -> None: + cls.data = { + "bsdd_enum_items": cls.bsdd_enum_items(), + } + cls.is_loaded = True + + @classmethod + def bsdd_enum_items(cls) -> tool.Blender.BLENDER_ENUM_ITEMS: + res: list[tuple[str, str, str]] = [] + dictionaries = tool.Bsdd.get_active_bsdd_enum_items() + if not dictionaries: + return res + res.append( + ( + "BBIM_BSDD", + "All Data Dictionaries", + "Manage properties from all active buildingSMART Data Dictionaries", + ) + ) + res.extend([(uri, f"bSDD: {name}", descr) for uri, name, descr in tool.Bsdd.get_active_bsdd_enum_items()]) + return res diff --git a/src/bonsai/bonsai/bim/module/pset/prop.py b/src/bonsai/bonsai/bim/module/pset/prop.py index 2a16c29a79..d89ba62be1 100644 --- a/src/bonsai/bonsai/bim/module/pset/prop.py +++ b/src/bonsai/bonsai/bim/module/pset/prop.py @@ -24,7 +24,12 @@ import ifcopenshell.util.doc import ifcopenshell.util.element import bonsai.tool as tool from bonsai.bim.prop import Attribute, StrProperty -from bonsai.bim.module.pset.data import AddEditCustomPropertiesData, ObjectPsetsData, MaterialPsetsData +from bonsai.bim.module.pset.data import ( + AddEditCustomPropertiesData, + ObjectPsetsData, + MaterialPsetsData, + PsetsGeneralData, +) from bonsai.bim.module.material.data import ObjectMaterialData from bpy.types import PropertyGroup from bpy.props import ( @@ -84,22 +89,15 @@ def get_pset_name(self: "PsetProperties", context: bpy.types.Context) -> tool.Bl elif prop_type == "ZonePsetProperties": results = get_zone_pset_names(self, context) + if not PsetsGeneralData.is_loaded: + PsetsGeneralData.load() + items: list[tool.Blender.BLENDER_ENUM_ITEM] items = [("BBIM_CUSTOM", "Custom Pset", "Create a property set without using a template.")] - bprops = tool.Bsdd.get_bsdd_props() - dictionaries = [(d.uri, f"bSDD: {d.name}", "") for d in bprops.dictionaries if d.is_active] - if dictionaries: - items.extend( - [ - None, - ( - "BBIM_BSDD", - "All Data Dictionaries", - "Manage properties from all active buildingSMART Data Dictionaries", - ), - ] - ) - items.extend(dictionaries) + bsdd_items = PsetsGeneralData.data["bsdd_enum_items"] + if bsdd_items: + items.append(None) + items.extend(bsdd_items) items.append(None) items.extend(results) return items