mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-23 14:06:26 +00:00
Bonsai: guard set_objects_selection against excluded/hidden collections
When an object's collection is excluded or hidden in the view layer, Object.select_set() and setting view_layer.objects.active both raise RuntimeError. tool.Blender.set_objects_selection() called them directly for every object being reselected, so any operator reapplying a prior selection through it would crash if one of those objects had become unselectable (e.g. it was moved by the operator into a container whose collection the user had excluded/hidden), aborting after already completing the underlying IFC changes. set_object_selection() (singular) already tolerates this for a single object. set_objects_selection() now reuses it per object and guards the active-object assignment the same way, so all 9 existing callers benefit without each having to pre-filter the selection themselves. Fixes #7410 AI-generated
This commit is contained in:
@@ -1160,14 +1160,24 @@ class Blender(bonsai.core.tool.Blender):
|
|||||||
selected_objects: Sequence[bpy.types.Object] = (),
|
selected_objects: Sequence[bpy.types.Object] = (),
|
||||||
clear_previous_selection=True,
|
clear_previous_selection=True,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
"""Reapply a selection, tolerating objects that can no longer be selected
|
||||||
|
(e.g. their collection is now excluded or hidden in the view layer).
|
||||||
|
|
||||||
|
Callers that need to know whether the selection was fully honoured
|
||||||
|
should validate it beforehand with ``validate_object_selection``.
|
||||||
|
"""
|
||||||
if clear_previous_selection:
|
if clear_previous_selection:
|
||||||
for obj in context.selected_objects:
|
for obj in context.selected_objects:
|
||||||
obj.select_set(False)
|
cls.set_object_selection(obj, False)
|
||||||
for obj in selected_objects:
|
for obj in selected_objects:
|
||||||
obj.select_set(True)
|
cls.set_object_selection(obj, True)
|
||||||
context.view_layer.objects.active = active_object
|
try:
|
||||||
if active_object:
|
context.view_layer.objects.active = active_object
|
||||||
active_object.select_set(True)
|
except RuntimeError: # Object's collection may be excluded/hidden in the view layer.
|
||||||
|
context.view_layer.objects.active = None
|
||||||
|
else:
|
||||||
|
if active_object:
|
||||||
|
cls.set_object_selection(active_object, True)
|
||||||
|
|
||||||
class ObjectsSelectionArgs(NamedTuple):
|
class ObjectsSelectionArgs(NamedTuple):
|
||||||
context: bpy.types.Context
|
context: bpy.types.Context
|
||||||
|
|||||||
Reference in New Issue
Block a user