diff --git a/src/bonsai/bonsai/bim/module/clash/operator.py b/src/bonsai/bonsai/bim/module/clash/operator.py index 94866a4e97..3788130a12 100644 --- a/src/bonsai/bonsai/bim/module/clash/operator.py +++ b/src/bonsai/bonsai/bim/module/clash/operator.py @@ -457,9 +457,7 @@ class HideClash(bpy.types.Operator): def execute(self, context): ClashDecorator.uninstall() - for area in context.screen.areas: - if area.type == "VIEW_3D": - area.tag_redraw() + tool.Blender.update_all_viewports(context) return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/drawing/gizmos.py b/src/bonsai/bonsai/bim/module/drawing/gizmos.py index a83bd0a46a..af5b9d8d5a 100644 --- a/src/bonsai/bonsai/bim/module/drawing/gizmos.py +++ b/src/bonsai/bonsai/bim/module/drawing/gizmos.py @@ -1243,9 +1243,7 @@ class SnapManager: @staticmethod def _redraw_viewport() -> None: """Force 3D viewport redraw.""" - for area in bpy.context.screen.areas: - if area.type == "VIEW_3D": - area.tag_redraw() + tool.Blender.update_all_viewports() def build_snap_cache( self, context: bpy.types.Context, active_obj: bpy.types.Object, include_active: bool = False diff --git a/src/bonsai/bonsai/bim/module/project/operator.py b/src/bonsai/bonsai/bim/module/project/operator.py index ade7472146..997972ddff 100644 --- a/src/bonsai/bonsai/bim/module/project/operator.py +++ b/src/bonsai/bonsai/bim/module/project/operator.py @@ -2699,10 +2699,7 @@ class CreateClippingPlane(bpy.types.Operator): self.report({"INFO"}, "Maximum of six clipping planes allowed.") return {"FINISHED"} - assert context.screen - for area in context.screen.areas: - if area.type == "VIEW_3D": - area.tag_redraw() + tool.Blender.update_all_viewports(context) assert context.region and context.region_data region = context.region diff --git a/src/bonsai/bonsai/bim/module/structural/operator.py b/src/bonsai/bonsai/bim/module/structural/operator.py index 500dce4371..20b32c7a0c 100644 --- a/src/bonsai/bonsai/bim/module/structural/operator.py +++ b/src/bonsai/bonsai/bim/module/structural/operator.py @@ -42,14 +42,10 @@ class ShowLoads(bpy.types.Operator): assert context.screen if event.type == "F5": LoadsDecorator.update() - for area in context.screen.areas: - if area.type == "VIEW_3D": - area.tag_redraw() + tool.Blender.update_all_viewports(context) if event.type == "ESC": LoadsDecorator.uninstall() - for area in context.screen.areas: - if area.type == "VIEW_3D": - area.tag_redraw() + tool.Blender.update_all_viewports(context) return {"FINISHED"} return {"PASS_THROUGH"} @@ -69,9 +65,7 @@ class ShowLoads(bpy.types.Operator): raise exc context.window.cursor_modal_restore() context.window_manager.modal_handler_add(self) - for area in context.screen.areas: - if area.type == "VIEW_3D": - area.tag_redraw() + tool.Blender.update_all_viewports(context) return {"RUNNING_MODAL"} diff --git a/src/bonsai/bonsai/tool/blender.py b/src/bonsai/bonsai/tool/blender.py index 9650db8de5..a9b376f389 100644 --- a/src/bonsai/bonsai/tool/blender.py +++ b/src/bonsai/bonsai/tool/blender.py @@ -473,6 +473,14 @@ class Blender(bonsai.core.tool.Blender): def update_viewport(cls) -> None: cls.get_viewport_context()["area"].tag_redraw() + @classmethod + def update_all_viewports(cls, context: bpy.types.Context | None = None) -> None: + context = context or bpy.context + assert context.screen + for area in context.screen.areas: + if area.type == "VIEW_3D": + area.tag_redraw() + @classmethod def force_depsgraph_update(cls) -> None: """useful if you need to trigger callbacks like `depsgraph_update_pre`"""