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.
This commit is contained in:
Dion Moult
2025-10-06 12:18:57 +11:00
parent ac5a44a962
commit c195799801
3 changed files with 35 additions and 14 deletions
@@ -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()
+28
View File
@@ -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.
+6 -7
View File
@@ -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)