From a3b04997efff8ddcdc52a1e93892aeb1ddb2cf47 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 15 Sep 2025 12:19:22 +0500 Subject: [PATCH] Systems UI - display icons for each system type in the dropdown Example - https://files.catbox.moe/rnyuro.png --- src/bonsai/bonsai/bim/module/system/data.py | 6 +++--- src/bonsai/bonsai/bim/module/system/ui.py | 12 +----------- src/bonsai/bonsai/tool/system.py | 14 +++++++++++--- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/system/data.py b/src/bonsai/bonsai/bim/module/system/data.py index 19a77e425d..5db3d60114 100644 --- a/src/bonsai/bonsai/bim/module/system/data.py +++ b/src/bonsai/bonsai/bim/module/system/data.py @@ -57,9 +57,9 @@ class SystemData: # We're only interested in systems for services. Not sure why IFC groups these together. return [ - (c, c, get_entity_doc(version, c).get("description", "")) - for c in sorted([d.name() for d in declarations]) - if c not in ("IfcStructuralAnalysisModel") + (c, c, get_entity_doc(version, c).get("description", ""), tool.System.SYSTEM_ICONS[c], i) + for i, c in enumerate(sorted([d.name() for d in declarations])) + if c != "IfcStructuralAnalysisModel" ] @classmethod diff --git a/src/bonsai/bonsai/bim/module/system/ui.py b/src/bonsai/bonsai/bim/module/system/ui.py index fc5d1cf3ea..804ff4516f 100644 --- a/src/bonsai/bonsai/bim/module/system/ui.py +++ b/src/bonsai/bonsai/bim/module/system/ui.py @@ -36,16 +36,6 @@ FLOW_DIRECTION_TO_ICON = { "NOTDEFINED": "CHECKBOX_DEHLT", } -SYSTEM_ICONS = { - "IfcSystem": "EXTERNAL_DRIVE", - "IfcDistributionSystem": "NETWORK_DRIVE", - "IfcDistributionCircuit": "DRIVER", - "IfcBuildingSystem": "MOD_BUILD", - "IfcBuiltSystem": "MOD_BUILD", - "IfcZone": "CUBE", -} -SYSTEM_ICONS["IfcElectricalCircuit"] = SYSTEM_ICONS["IfcDistributionCircuit"] - class BIM_PT_systems(Panel): bl_label = "Systems" @@ -446,7 +436,7 @@ class BIM_UL_systems(UIList): op.option = "COLLAPSE" if item.is_expanded else "EXPAND" if data.edited_system_id == system_id: row.label(text="", icon="GREASEPENCIL") - row.prop(item, "name", text="", icon=SYSTEM_ICONS[item.ifc_class], emboss=False) + row.prop(item, "name", text="", icon=tool.System.SYSTEM_ICONS[item.ifc_class], emboss=False) class BIM_UL_zones(UIList): diff --git a/src/bonsai/bonsai/tool/system.py b/src/bonsai/bonsai/tool/system.py index 154d030384..efaaa802c5 100644 --- a/src/bonsai/bonsai/tool/system.py +++ b/src/bonsai/bonsai/tool/system.py @@ -48,6 +48,16 @@ class System(bonsai.core.tool.System): def get_zone_props(cls) -> BIMZoneProperties: return bpy.context.scene.BIMZoneProperties + SYSTEM_ICONS = { + "IfcSystem": "EXTERNAL_DRIVE", + "IfcDistributionSystem": "NETWORK_DRIVE", + "IfcDistributionCircuit": "DRIVER", + "IfcBuildingSystem": "MOD_BUILD", + "IfcBuiltSystem": "MOD_BUILD", + "IfcZone": "CUBE", + } + SYSTEM_ICONS["IfcElectricalCircuit"] = SYSTEM_ICONS["IfcDistributionCircuit"] + @classmethod def add_ports( cls, @@ -430,10 +440,8 @@ class System(bonsai.core.tool.System): @classmethod def draw_system_ui(cls, layout: bpy.types.UILayout, system_id: int, system_name: str, system_class: str) -> None: - from bonsai.bim.module.system.ui import SYSTEM_ICONS - row = layout.row(align=True) - row.label(text=system_name, icon=SYSTEM_ICONS[system_class]) + row.label(text=system_name, icon=cls.SYSTEM_ICONS[system_class]) op = row.operator("bim.select_system_products", text="", icon="RESTRICT_SELECT_OFF") op.system = system_id op = row.operator("bim.unassign_system", text="", icon="X")