From c195799801fa0947ad61b40bba90608f68babee3 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 6 Oct 2025 12:18:57 +1100 Subject: [PATCH] See #7202. Revert to safer way to control visibility. Pity can't control hide_viewport in bulk, but this is perhaps the next best thing. --- .../bonsai/bim/module/drawing/operator.py | 8 +----- src/bonsai/bonsai/tool/blender.py | 28 +++++++++++++++++++ src/bonsai/bonsai/tool/drawing.py | 13 ++++----- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/drawing/operator.py b/src/bonsai/bonsai/bim/module/drawing/operator.py index b58d9997d6..b5b9ae7d6d 100644 --- a/src/bonsai/bonsai/bim/module/drawing/operator.py +++ b/src/bonsai/bonsai/bim/module/drawing/operator.py @@ -2220,13 +2220,7 @@ class ActivateModel(bpy.types.Operator): should_sync_changes_first=True, ) - for obj in bpy.context.view_layer.objects: - obj.update_tag() # Ensure refresh viewport after foreach_set visibility - should_hides = np.full(len(bpy.context.view_layer.objects), 0, dtype=np.uint8) - should_hides = np.ascontiguousarray(should_hides) - bpy.context.view_layer.objects.foreach_set("hide_viewport", should_hides) - bpy.context.view_layer.objects.foreach_set("hide_render", should_hides) - + tool.Blender.reset_object_visibility() tool.Blender.update_viewport() bonsai.bim.handler.refresh_ui_data() diff --git a/src/bonsai/bonsai/tool/blender.py b/src/bonsai/bonsai/tool/blender.py index 48cbe60cb7..1e1b6426a5 100644 --- a/src/bonsai/bonsai/tool/blender.py +++ b/src/bonsai/bonsai/tool/blender.py @@ -1859,6 +1859,34 @@ class Blender(bonsai.core.tool.Blender): return unit_scale + @classmethod + def reset_object_visibility(cls): + override = cls.get_viewport_context() + with bpy.context.temp_override(**override): + bpy.ops.object.hide_view_clear(select=False) + + @classmethod + def isolate_objects(cls, objs): + previously_selected = {o.name for o in bpy.context.selected_objects} + previously_active = bpy.context.view_layer.objects.active + + override = cls.get_viewport_context() + with bpy.context.temp_override(**override): + bpy.ops.object.hide_view_clear(select=False) + + bpy.ops.object.select_all(action="DESELECT") + for o in objs_to_show: + o.select_set(True) + with bpy.context.temp_override(**override): + bpy.ops.object.hide_view_set(unselected=True) + + bpy.ops.object.select_all(action="DESELECT") + for name in previously_selected: + obj = bpy.data.objects.get(name) + if obj: + obj.select_set(True) + bpy.context.view_layer.objects.active = previously_active + @classmethod def validate_shader_batch_data(cls, pos: Any, indices: Optional[Any]) -> bool: """Validate shader batch data. diff --git a/src/bonsai/bonsai/tool/drawing.py b/src/bonsai/bonsai/tool/drawing.py index 3371ae0771..281872eccd 100644 --- a/src/bonsai/bonsai/tool/drawing.py +++ b/src/bonsai/bonsai/tool/drawing.py @@ -2230,16 +2230,15 @@ class Drawing(bonsai.core.tool.Drawing): has_context = True break - should_hides = [] + visible_objects = [] for obj in bpy.context.view_layer.objects: if element := tool.Ifc.get_entity(obj): - should_hides.append(0 if element in filtered_elements else 1) + if element in filtered_elements: + visible_objects.append(obj) else: - should_hides.append(obj.hide_viewport) - obj.update_tag() # Ensure refresh viewport after foreach_set visibility - should_hides = np.fromiter(should_hides, dtype=np.uint8, count=len(should_hides)) - bpy.context.view_layer.objects.foreach_set("hide_viewport", should_hides) - bpy.context.view_layer.objects.foreach_set("hide_render", should_hides) + if obj.hide_get() is False: + visible_objects.append(obj) + tool.Blender.isolate_objects(visible_objects) cls.import_camera_props(drawing, camera.data)