diff --git a/src/bonsai/bonsai/bim/__init__.py b/src/bonsai/bonsai/bim/__init__.py index 81dd85f72a..52a33368a6 100644 --- a/src/bonsai/bonsai/bim/__init__.py +++ b/src/bonsai/bonsai/bim/__init__.py @@ -144,6 +144,7 @@ classes = [ prop.ISODuration, prop.BIMAreaProperties, prop.BIMTabProperties, + prop.BIMTabVisibility, # Must be registered before BIMProperties prop.BIMPanelProperties, # Must be registered before BIMProperties prop.BIMProperties, prop.IfcParameter, @@ -285,8 +286,6 @@ def register(): bpy.types.Camera.BIMMeshProperties = bpy.props.PointerProperty(type=prop.BIMMeshProperties) bpy.types.PointLight.BIMMeshProperties = bpy.props.PointerProperty(type=prop.BIMMeshProperties) - ui.initialize_panel_properties() - if hasattr(bpy.types, "UI_MT_button_context_menu"): bpy.types.UI_MT_button_context_menu.append(ui.draw_custom_context_menu) bpy.types.STATUSBAR_HT_header.append(ui.draw_statusbar) diff --git a/src/bonsai/bonsai/bim/operator.py b/src/bonsai/bonsai/bim/operator.py index 1a646ec0b3..5f6eec8d59 100644 --- a/src/bonsai/bonsai/bim/operator.py +++ b/src/bonsai/bonsai/bim/operator.py @@ -33,7 +33,7 @@ import bonsai.bim import bonsai.tool as tool import bonsai.bim.handler from enum import Enum -from bonsai.bim.ui import get_all_tab_panels, get_tab_visibility, set_tab_visibility, get_tab_names, get_panel_config, initialize_panel_properties +from bonsai.bim.ui import get_all_tab_panels, get_tab_visibility, set_tab_visibility, get_tab_names, get_panel_config, initialize_panel_properties, initialize_tab_visibilities from bpy_extras.io_utils import ImportHelper from bonsai.bim import import_ifc from bonsai.bim.prop import StrProperty @@ -1794,6 +1794,7 @@ class BIM_OT_manage_tab_panels(bpy.types.Operator): context.scene.active_tab_name = self.tab_name context.scene.tab_panels.clear() + initialize_tab_visibilities() initialize_panel_properties() all_panels = get_all_tab_panels(force_refresh=True) diff --git a/src/bonsai/bonsai/bim/prop.py b/src/bonsai/bonsai/bim/prop.py index 7c501d6184..f0d3f8e5c0 100644 --- a/src/bonsai/bonsai/bim/prop.py +++ b/src/bonsai/bonsai/bim/prop.py @@ -530,6 +530,15 @@ class BIMTabProperties(PropertyGroup): inactive_tab: bool +class BIMTabVisibility(PropertyGroup): + name: StringProperty(name="Tab Name") + is_visible: BoolProperty(name="Is Visible", default=True) + + if TYPE_CHECKING: + name: str + is_visible: bool + + class BIMPanelProperties(PropertyGroup): is_visible_in_tab: BoolProperty(name="Is Visible in Tab", default=True) is_visible_in_bookmarks: BoolProperty(name="Is Visible in Bookmarks", default=True) @@ -624,16 +633,8 @@ class BIMProperties(PropertyGroup): ], name="Time Unit", default="HOUR", - ) tab_visibility_project: BoolProperty(name="Project Tab Visible", default=True) - tab_visibility_object: BoolProperty(name="Object Tab Visible", default=True) - tab_visibility_geometry: BoolProperty(name="Geometry Tab Visible", default=True) - tab_visibility_drawings: BoolProperty(name="Drawings Tab Visible", default=True) - tab_visibility_services: BoolProperty(name="Services Tab Visible", default=True) - tab_visibility_structure: BoolProperty(name="Structure Tab Visible", default=True) - tab_visibility_scheduling: BoolProperty(name="Scheduling Tab Visible", default=True) - tab_visibility_fm: BoolProperty(name="FM Tab Visible", default=True) - tab_visibility_quality: BoolProperty(name="Quality Tab Visible", default=True) - tab_visibility_bookmark: BoolProperty(name="Bookmark Tab Visible", default=True) + ) + tab_visibilities: CollectionProperty(type=BIMTabVisibility, name="Tab Visibilities") panel_properties: CollectionProperty(type=BIMPanelProperties, name="Panel Properties") if TYPE_CHECKING: @@ -650,16 +651,7 @@ class BIMProperties(PropertyGroup): volume_unit: str mass_unit: str time_unit: str - tab_visibility_project: bool - tab_visibility_object: bool - tab_visibility_geometry: bool - tab_visibility_drawings: bool - tab_visibility_services: bool - tab_visibility_structure: bool - tab_visibility_scheduling: bool - tab_visibility_fm: bool - tab_visibility_quality: bool - tab_visibility_bookmark: bool + tab_visibilities: bpy.types.bpy_prop_collection[BIMTabVisibility] panel_properties: bpy.types.bpy_prop_collection[BIMPanelProperties] diff --git a/src/bonsai/bonsai/bim/ui.py b/src/bonsai/bonsai/bim/ui.py index 6589197f56..8968821244 100644 --- a/src/bonsai/bonsai/bim/ui.py +++ b/src/bonsai/bonsai/bim/ui.py @@ -35,7 +35,7 @@ from bonsai import get_debug_info import bonsai.bim import bonsai.tool as tool from ifcopenshell.util.file import IfcHeaderExtractor -from bonsai.bim.prop import Attribute +from bonsai.bim.prop import Attribute, get_tab from bonsai.bim.module.bsdd.prop import BIMBSDDProperties, BSDDProperty from bonsai.bim.module.pset.prop import IfcProperty from bonsai.bim.module.model.prop import ( @@ -62,10 +62,9 @@ if TYPE_CHECKING: from bonsai.bim.module.project.prop import BIMProjectProperties -TAB_NAMES = ["PROJECT", "OBJECT", "GEOMETRY", "DRAWINGS", "SERVICES", "STRUCTURE", "SCHEDULING", "FM", "QUALITY", "BOOKMARK"] - def get_tab_names(): - return TAB_NAMES + enum_items = get_tab(None, None) + return [item[0] for item in enum_items if item is not None] def get_panel_tab_name(panel_class): if hasattr(panel_class, 'bim_tab_name'): @@ -82,6 +81,23 @@ def should_show_panel(panel_id, panel_tab_name, context): return False +def initialize_tab_visibilities(): + """Initialize tab visibility collection with all tabs set to visible by default.""" + try: + bim_props = tool.Blender.get_bim_props() + except (AttributeError, AssertionError): + # Context not available during registration, skip initialization + return + + if len(bim_props.tab_visibilities) > 0: + return + + for tab_name in get_tab_names(): + tab_vis = bim_props.tab_visibilities.add() + tab_vis.name = tab_name + tab_vis.is_visible = True + + def initialize_panel_properties(): try: bim_props = tool.Blender.get_bim_props() @@ -161,14 +177,20 @@ def get_all_tab_panels(force_refresh=False): def get_tab_visibility(tab_name): bim_props = tool.Blender.get_bim_props() - prop_name = f"tab_visibility_{tab_name.lower()}" - return getattr(bim_props, prop_name, True) + tab_vis = bim_props.tab_visibilities.get(tab_name) + return tab_vis.is_visible if tab_vis else True def set_tab_visibility(tab_name, visible): bim_props = tool.Blender.get_bim_props() - prop_name = f"tab_visibility_{tab_name.lower()}" - setattr(bim_props, prop_name, visible) + tab_vis = bim_props.tab_visibilities.get(tab_name) + if tab_vis: + tab_vis.is_visible = visible + else: + # Create if doesn't exist + new_tab = bim_props.tab_visibilities.add() + new_tab.name = tab_name + new_tab.is_visible = visible def get_panel_visibility(panel_id, current_tab=None):