mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-22 20:02:30 +00:00
Bonsai: promote load-warning banners to top-level UI
Multi-instance cache-lock, "Opening Cuts Skipped", and "Arrays With Missing Children" banners now draw in BIM_PT_tabs alongside the existing global error / outdated-model banners, so they remain visible regardless of the active Bonsai tab. The corresponding blocks are removed from BIM_PT_project. Dead imports (is_cache_locked_by_other_process, draw_multiline_text) dropped from project/ui.py. Generated with the assistance of an AI coding tool.
This commit is contained in:
@@ -28,9 +28,8 @@ from bpy.types import Menu, Panel, UIList
|
|||||||
import bonsai.bim
|
import bonsai.bim
|
||||||
import bonsai.tool as tool
|
import bonsai.tool as tool
|
||||||
from bonsai.bim.helper import draw_attributes, prop_with_search
|
from bonsai.bim.helper import draw_attributes, prop_with_search
|
||||||
from bonsai.bim.ifc import IfcStore, is_cache_locked_by_other_process
|
from bonsai.bim.ifc import IfcStore
|
||||||
from bonsai.bim.module.project.data import LinksData, ProjectData
|
from bonsai.bim.module.project.data import LinksData, ProjectData
|
||||||
from bonsai.bim.ui import draw_multiline_text
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from bonsai.bim.module.project.prop import (
|
from bonsai.bim.module.project.prop import (
|
||||||
@@ -167,20 +166,6 @@ class BIM_PT_project(Panel):
|
|||||||
if pprops.is_loading:
|
if pprops.is_loading:
|
||||||
self.draw_advanced_loading_ui(context)
|
self.draw_advanced_loading_ui(context)
|
||||||
elif self.file or props.ifc_file:
|
elif self.file or props.ifc_file:
|
||||||
if is_cache_locked_by_other_process():
|
|
||||||
box = self.layout.box()
|
|
||||||
box.alert = True
|
|
||||||
row = box.row(align=True)
|
|
||||||
row.label(text="IFC Already Open in Another Blender Instance", icon="ERROR")
|
|
||||||
row.operator("bim.dismiss_multi_instance_warning", text="", icon="CANCEL")
|
|
||||||
draw_multiline_text(
|
|
||||||
box.column(align=True),
|
|
||||||
"This file is open in another Blender instance. Editing the same "
|
|
||||||
"IFC from two instances at once can lose your work or display "
|
|
||||||
"outdated geometry. Close the other Blender instances to continue safely.",
|
|
||||||
context=context,
|
|
||||||
)
|
|
||||||
|
|
||||||
if props.has_blend_warning:
|
if props.has_blend_warning:
|
||||||
box = self.layout.box()
|
box = self.layout.box()
|
||||||
box.alert = True
|
box.alert = True
|
||||||
@@ -190,35 +175,6 @@ class BIM_PT_project(Panel):
|
|||||||
op.uri = "https://docs.bonsaibim.org/guides/troubleshooting.html#saving-and-loading-blend-files"
|
op.uri = "https://docs.bonsaibim.org/guides/troubleshooting.html#saving-and-loading-blend-files"
|
||||||
row.operator("bim.close_blend_warning", text="", icon="CANCEL")
|
row.operator("bim.close_blend_warning", text="", icon="CANCEL")
|
||||||
|
|
||||||
if pending := pprops.pending_opening_recut:
|
|
||||||
box = self.layout.box()
|
|
||||||
box.alert = True
|
|
||||||
box.label(text="Opening Cuts Skipped", icon="ERROR")
|
|
||||||
draw_multiline_text(
|
|
||||||
box.column(align=True),
|
|
||||||
f"{len(pending)} element(s) had too many openings to cut during load. "
|
|
||||||
f"Apply to recompute their meshes, or dismiss to leave them as they are.",
|
|
||||||
context=context,
|
|
||||||
)
|
|
||||||
row = box.row(align=True)
|
|
||||||
row.operator("bim.select_pending_opening_cuts", text="Select Elements", icon="RESTRICT_SELECT_OFF")
|
|
||||||
row.operator("bim.apply_pending_opening_cuts", text="Apply Openings", icon="PLAY")
|
|
||||||
row.operator("bim.dismiss_pending_opening_cuts", text="", icon="CANCEL")
|
|
||||||
|
|
||||||
if pending := pprops.pending_array_repair:
|
|
||||||
box = self.layout.box()
|
|
||||||
box.alert = True
|
|
||||||
box.label(text="Arrays With Missing Children", icon="ERROR")
|
|
||||||
draw_multiline_text(
|
|
||||||
box.column(align=True),
|
|
||||||
f"{len(pending)} array parent(s) reference child GUIDs that don't exist in this file. "
|
|
||||||
f"The arrays loaded incomplete. Select to inspect, or dismiss.",
|
|
||||||
context=context,
|
|
||||||
)
|
|
||||||
row = box.row(align=True)
|
|
||||||
row.operator("bim.select_pending_array_repair", text="Select Elements", icon="RESTRICT_SELECT_OFF")
|
|
||||||
row.operator("bim.dismiss_pending_array_repair", text="", icon="CANCEL")
|
|
||||||
|
|
||||||
if props.ifc_file:
|
if props.ifc_file:
|
||||||
self.draw_loaded_project_ui(context)
|
self.draw_loaded_project_ui(context)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ from natsort import natsorted
|
|||||||
import bonsai.bim
|
import bonsai.bim
|
||||||
import bonsai.bim.helper
|
import bonsai.bim.helper
|
||||||
import bonsai.tool as tool
|
import bonsai.tool as tool
|
||||||
|
from bonsai.bim.ifc import is_cache_locked_by_other_process
|
||||||
from bonsai.bim.module.bsdd.prop import BIMBSDDProperties, BSDDProperty
|
from bonsai.bim.module.bsdd.prop import BIMBSDDProperties, BSDDProperty
|
||||||
from bonsai.bim.module.model.prop import (
|
from bonsai.bim.module.model.prop import (
|
||||||
BIMDoorProperties,
|
BIMDoorProperties,
|
||||||
@@ -974,6 +975,50 @@ class BIM_PT_tabs(Panel):
|
|||||||
op.uri = "https://docs.bonsaibim.org/guides/troubleshooting.html#saving-and-loading-blend-files"
|
op.uri = "https://docs.bonsaibim.org/guides/troubleshooting.html#saving-and-loading-blend-files"
|
||||||
row.operator("bim.close_blend_warning", text="", icon="CANCEL")
|
row.operator("bim.close_blend_warning", text="", icon="CANCEL")
|
||||||
|
|
||||||
|
if is_cache_locked_by_other_process():
|
||||||
|
box = self.layout.box()
|
||||||
|
box.alert = True
|
||||||
|
row = box.row(align=True)
|
||||||
|
row.label(text="IFC Already Open in Another Blender Instance", icon="ERROR")
|
||||||
|
row.operator("bim.dismiss_multi_instance_warning", text="", icon="CANCEL")
|
||||||
|
draw_multiline_text(
|
||||||
|
box.column(align=True),
|
||||||
|
"This file is open in another Blender instance. Editing the same "
|
||||||
|
"IFC from two instances at once can lose your work or display "
|
||||||
|
"outdated geometry. Close the other Blender instances to continue safely.",
|
||||||
|
context=context,
|
||||||
|
)
|
||||||
|
|
||||||
|
pprops = tool.Project.get_project_props()
|
||||||
|
if pending := pprops.pending_opening_recut:
|
||||||
|
box = self.layout.box()
|
||||||
|
box.alert = True
|
||||||
|
box.label(text="Opening Cuts Skipped", icon="ERROR")
|
||||||
|
draw_multiline_text(
|
||||||
|
box.column(align=True),
|
||||||
|
f"{len(pending)} element(s) had too many openings to cut during load. "
|
||||||
|
f"Apply to recompute their meshes, or dismiss to leave them as they are.",
|
||||||
|
context=context,
|
||||||
|
)
|
||||||
|
row = box.row(align=True)
|
||||||
|
row.operator("bim.select_pending_opening_cuts", text="Select Elements", icon="RESTRICT_SELECT_OFF")
|
||||||
|
row.operator("bim.apply_pending_opening_cuts", text="Apply Openings", icon="PLAY")
|
||||||
|
row.operator("bim.dismiss_pending_opening_cuts", text="", icon="CANCEL")
|
||||||
|
|
||||||
|
if pending := pprops.pending_array_repair:
|
||||||
|
box = self.layout.box()
|
||||||
|
box.alert = True
|
||||||
|
box.label(text="Arrays With Missing Children", icon="ERROR")
|
||||||
|
draw_multiline_text(
|
||||||
|
box.column(align=True),
|
||||||
|
f"{len(pending)} array parent(s) reference child GUIDs that don't exist in this file. "
|
||||||
|
f"The arrays loaded incomplete. Select to inspect, or dismiss.",
|
||||||
|
context=context,
|
||||||
|
)
|
||||||
|
row = box.row(align=True)
|
||||||
|
row.operator("bim.select_pending_array_repair", text="Select Elements", icon="RESTRICT_SELECT_OFF")
|
||||||
|
row.operator("bim.dismiss_pending_array_repair", text="", icon="CANCEL")
|
||||||
|
|
||||||
gprops = tool.Geometry.get_geometry_props()
|
gprops = tool.Geometry.get_geometry_props()
|
||||||
# Check that Blender mode and IFC Mode do match.
|
# Check that Blender mode and IFC Mode do match.
|
||||||
if context.mode == "OBJECT" and gprops.mode in ("OBJECT", "ITEM"):
|
if context.mode == "OBJECT" and gprops.mode in ("OBJECT", "ITEM"):
|
||||||
|
|||||||
Reference in New Issue
Block a user