mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-20 15:08:51 +00:00
Implement user interface customization features and enhance metadata handling
This commit is contained in:
@@ -1056,6 +1056,18 @@ class LoadProject(bpy.types.Operator, IFCFileSelector, ImportHelper):
|
|||||||
return tooltip
|
return tooltip
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
|
if (tool.Blender.get_addon_preferences().user_ui_customization
|
||||||
|
and self.should_start_fresh_session
|
||||||
|
and not self.is_advanced):
|
||||||
|
filepath = self.get_filepath()
|
||||||
|
metadata_path = Path(str(filepath) + ".metadata.blend")
|
||||||
|
if metadata_path.exists() and metadata_path.is_file():
|
||||||
|
try:
|
||||||
|
bpy.ops.bim.load_blend_metadata_and_ifc(filepath=filepath)
|
||||||
|
return {"FINISHED"}
|
||||||
|
except Exception as e:
|
||||||
|
self.report({"WARNING"}, f"Failed to load metadata file, using regular load: {e}")
|
||||||
|
|
||||||
@persistent
|
@persistent
|
||||||
def load_handler(*args):
|
def load_handler(*args):
|
||||||
bpy.app.handlers.load_post.remove(load_handler)
|
bpy.app.handlers.load_post.remove(load_handler)
|
||||||
@@ -1748,6 +1760,13 @@ class ExportIFC(bpy.types.Operator, ExportHelper):
|
|||||||
if save_blend_file:
|
if save_blend_file:
|
||||||
bpy.ops.wm.save_mainfile(filepath=bpy.data.filepath)
|
bpy.ops.wm.save_mainfile(filepath=bpy.data.filepath)
|
||||||
bim_props.is_dirty = False
|
bim_props.is_dirty = False
|
||||||
|
|
||||||
|
if tool.Blender.get_addon_preferences().user_ui_customization:
|
||||||
|
try:
|
||||||
|
bpy.ops.bim.save_blend_metadata_file()
|
||||||
|
except Exception as e:
|
||||||
|
settings.logger.warning(f"Failed to save blend metadata file: {e}")
|
||||||
|
|
||||||
bonsai.bim.handler.refresh_ui_data()
|
bonsai.bim.handler.refresh_ui_data()
|
||||||
self.report(
|
self.report(
|
||||||
{"INFO"},
|
{"INFO"},
|
||||||
|
|||||||
@@ -331,18 +331,12 @@ class BIM_PT_project(Panel):
|
|||||||
col.prop(props, "ifc_file", text="")
|
col.prop(props, "ifc_file", text="")
|
||||||
row.operator("bim.select_ifc_file", icon="FILE_FOLDER", text="")
|
row.operator("bim.select_ifc_file", icon="FILE_FOLDER", text="")
|
||||||
|
|
||||||
# Blend metadata file UI
|
if tool.Blender.get_addon_preferences().user_ui_customization:
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
col = row.column()
|
col = row.column()
|
||||||
col.enabled = False
|
col.enabled = False
|
||||||
# Show blend metadata file as a label, not editable
|
metadata_filename = os.path.basename(props.ifc_file) + ".metadata.blend"
|
||||||
blendmetadata_path = ""
|
col.label(text=f"Saving session data to: {metadata_filename}")
|
||||||
if props.ifc_file:
|
|
||||||
blendmetadata_path = props.ifc_file + ".blendmetadata"
|
|
||||||
col.label(text=blendmetadata_path)
|
|
||||||
row.operator("bim.save_blend_metadata_file", icon="FILE_TICK", text="")
|
|
||||||
row = self.layout.row(align=True)
|
|
||||||
row.operator("bim.load_blend_metadata_and_ifc", icon="FILE_REFRESH", text="Load Metadata + IFC")
|
|
||||||
|
|
||||||
|
|
||||||
class BIM_PT_new_project_wizard(Panel):
|
class BIM_PT_new_project_wizard(Panel):
|
||||||
|
|||||||
@@ -304,10 +304,14 @@ class LoadBlendMetadataAndIFC(bpy.types.Operator):
|
|||||||
bl_idname = "bim.load_blend_metadata_and_ifc"
|
bl_idname = "bim.load_blend_metadata_and_ifc"
|
||||||
bl_label = "Load Blend Metadata and IFC"
|
bl_label = "Load Blend Metadata and IFC"
|
||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
|
filepath: bpy.props.StringProperty(name="IFC File Path", default="")
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
props = tool.Blender.get_bim_props()
|
ifc_file = self.filepath
|
||||||
ifc_file = getattr(props, "ifc_file", None)
|
if not ifc_file:
|
||||||
|
props = tool.Blender.get_bim_props()
|
||||||
|
ifc_file = getattr(props, "ifc_file", None)
|
||||||
|
|
||||||
if not ifc_file:
|
if not ifc_file:
|
||||||
self.report({"WARNING"}, "No IFC file path set.")
|
self.report({"WARNING"}, "No IFC file path set.")
|
||||||
return {"CANCELLED"}
|
return {"CANCELLED"}
|
||||||
|
|||||||
@@ -702,7 +702,12 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences):
|
|||||||
description="Show mass and time units section in the new project wizard panel",
|
description="Show mass and time units section in the new project wizard panel",
|
||||||
default=False,
|
default=False,
|
||||||
)
|
)
|
||||||
|
user_ui_customization: BoolProperty(
|
||||||
|
name="User UI Customization",
|
||||||
|
description="Enable user interface customization features (hide/show tabs and panels, bookmark panels) and save the session settings as part of the .metadata.blend file",
|
||||||
|
default=False,
|
||||||
|
)
|
||||||
|
|
||||||
chain_filter_with_set_operations: BoolProperty(
|
chain_filter_with_set_operations: BoolProperty(
|
||||||
name="NEW filter mode: Enable chained filters with set operations",
|
name="NEW filter mode: Enable chained filters with set operations",
|
||||||
description="Enable chaining search filters with set operations: ADD (union: combine sets), SUBTRACT (difference: remove from set), FILTER (intersection: only elements in both sets), with autocomplete suggestions for filter values",
|
description="Enable chaining search filters with set operations: ADD (union: combine sets), SUBTRACT (difference: remove from set), FILTER (intersection: only elements in both sets), with autocomplete suggestions for filter values",
|
||||||
@@ -753,6 +758,7 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences):
|
|||||||
mass_time_units_in_wizard: bool
|
mass_time_units_in_wizard: bool
|
||||||
chain_filter_with_set_operations: bool
|
chain_filter_with_set_operations: bool
|
||||||
default_filter_with_set_operations_for_globalid_and_class: bool
|
default_filter_with_set_operations_for_globalid_and_class: bool
|
||||||
|
user_ui_customization: bool
|
||||||
|
|
||||||
def draw(self, context: bpy.types.Context) -> None:
|
def draw(self, context: bpy.types.Context) -> None:
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
@@ -943,6 +949,7 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences):
|
|||||||
row = box.row(align=True)
|
row = box.row(align=True)
|
||||||
row.prop(self, "default_filter_with_set_operations_for_globalid_and_class")
|
row.prop(self, "default_filter_with_set_operations_for_globalid_and_class")
|
||||||
row.operator("bim.open_uri", text="", icon="HELP").uri = "https://community.osarch.org/discussion/comment/27030"
|
row.operator("bim.open_uri", text="", icon="HELP").uri = "https://community.osarch.org/discussion/comment/27030"
|
||||||
|
layout.prop(self, "user_ui_customization")
|
||||||
|
|
||||||
|
|
||||||
# Scene panel groups
|
# Scene panel groups
|
||||||
@@ -989,8 +996,8 @@ class BIM_PT_tabs(Panel):
|
|||||||
self.draw_tab_entry(row_left, "PACKAGE", "FM", True, aprops.tab == "FM")
|
self.draw_tab_entry(row_left, "PACKAGE", "FM", True, aprops.tab == "FM")
|
||||||
if get_tab_visibility("QUALITY"):
|
if get_tab_visibility("QUALITY"):
|
||||||
self.draw_tab_entry(row_left, "COMMUNITY", "QUALITY", True, aprops.tab == "QUALITY")
|
self.draw_tab_entry(row_left, "COMMUNITY", "QUALITY", True, aprops.tab == "QUALITY")
|
||||||
if get_tab_visibility("BOOKMARK"):
|
if tool.Blender.get_addon_preferences().user_ui_customization and get_tab_visibility("BOOKMARK"):
|
||||||
self.draw_tab_entry(row_left, "SOLO_ON", "BOOKMARK", True, aprops.tab == "BOOKMARK") # New BOOKMARK tab
|
self.draw_tab_entry(row_left, "SOLO_ON", "BOOKMARK", True, aprops.tab == "BOOKMARK")
|
||||||
row_left.operator("bim.switch_tab", text="", emboss=False, icon="UV_SYNC_SELECT")
|
row_left.operator("bim.switch_tab", text="", emboss=False, icon="UV_SYNC_SELECT")
|
||||||
|
|
||||||
row_left = col_left.row(align=True)
|
row_left = col_left.row(align=True)
|
||||||
@@ -1010,16 +1017,17 @@ class BIM_PT_tabs(Panel):
|
|||||||
row_right = col_right.row(align=True)
|
row_right = col_right.row(align=True)
|
||||||
row_right.alignment = "RIGHT"
|
row_right.alignment = "RIGHT"
|
||||||
|
|
||||||
row_right.operator("bim.manage_tab_visibility", icon="PREFERENCES", text="")
|
if tool.Blender.get_addon_preferences().user_ui_customization:
|
||||||
|
row_right.operator("bim.manage_tab_visibility", icon="PREFERENCES", text="")
|
||||||
|
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
row.prop(aprops, "tab", text="")
|
row.prop(aprops, "tab", text="")
|
||||||
|
|
||||||
# Add gear icons for all tabs except SWITCH_TAB
|
if tool.Blender.get_addon_preferences().user_ui_customization:
|
||||||
for tab in get_tab_names():
|
for tab in get_tab_names():
|
||||||
if get_tab_visibility(tab):
|
if get_tab_visibility(tab):
|
||||||
if aprops.tab == tab:
|
if aprops.tab == tab:
|
||||||
row.operator("bim.manage_tab_panels", text="", icon="PREFERENCES").tab_name = tab
|
row.operator("bim.manage_tab_panels", text="", icon="PREFERENCES").tab_name = tab
|
||||||
|
|
||||||
if bonsai.REINSTALLED_BBIM_VERSION:
|
if bonsai.REINSTALLED_BBIM_VERSION:
|
||||||
box = self.layout.box()
|
box = self.layout.box()
|
||||||
|
|||||||
Reference in New Issue
Block a user