From 31c9f60bca1ebed82544d47bae461975ab15e7b9 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 1 Apr 2025 11:31:03 +0500 Subject: [PATCH] Fix errors creating objects if default container is hidden #6456 --- src/bonsai/bonsai/bim/module/model/door.py | 2 +- src/bonsai/bonsai/bim/module/model/profile.py | 2 +- src/bonsai/bonsai/bim/module/model/railing.py | 2 +- src/bonsai/bonsai/bim/module/model/roof.py | 2 +- src/bonsai/bonsai/bim/module/model/slab.py | 2 +- src/bonsai/bonsai/bim/module/model/stair.py | 2 +- src/bonsai/bonsai/bim/module/model/wall.py | 2 +- src/bonsai/bonsai/bim/module/model/window.py | 2 +- src/bonsai/bonsai/tool/blender.py | 8 ++++++++ 9 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/model/door.py b/src/bonsai/bonsai/bim/module/model/door.py index 3021d47f92..b131e074ee 100644 --- a/src/bonsai/bonsai/bim/module/model/door.py +++ b/src/bonsai/bonsai/bim/module/model/door.py @@ -513,7 +513,7 @@ class BIM_OT_add_door(bpy.types.Operator, tool.Ifc.Operator): bpy.ops.object.select_all(action="DESELECT") bpy.context.view_layer.objects.active = None bpy.context.view_layer.objects.active = obj - obj.select_set(True) + tool.Blender.select_object(obj) bpy.ops.bim.add_door() return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/model/profile.py b/src/bonsai/bonsai/bim/module/model/profile.py index 40e3ab9992..ea3f16ed20 100644 --- a/src/bonsai/bonsai/bim/module/model/profile.py +++ b/src/bonsai/bonsai/bim/module/model/profile.py @@ -170,7 +170,7 @@ class DumbProfileGenerator: pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric") ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Engine": "Bonsai.DumbProfile"}) - obj.select_set(True) + tool.Blender.select_object(obj) return obj diff --git a/src/bonsai/bonsai/bim/module/model/railing.py b/src/bonsai/bonsai/bim/module/model/railing.py index 632e1748be..ba8a5de7d0 100644 --- a/src/bonsai/bonsai/bim/module/model/railing.py +++ b/src/bonsai/bonsai/bim/module/model/railing.py @@ -316,7 +316,7 @@ class BIM_OT_add_railing(bpy.types.Operator, tool.Ifc.Operator): bpy.ops.object.select_all(action="DESELECT") bpy.context.view_layer.objects.active = None bpy.context.view_layer.objects.active = obj - obj.select_set(True) + tool.Blender.select_object(obj) bpy.ops.bim.add_railing() return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/model/roof.py b/src/bonsai/bonsai/bim/module/model/roof.py index 5f19800362..1522844d0b 100644 --- a/src/bonsai/bonsai/bim/module/model/roof.py +++ b/src/bonsai/bonsai/bim/module/model/roof.py @@ -550,7 +550,7 @@ class BIM_OT_add_roof(bpy.types.Operator, tool.Ifc.Operator): bpy.ops.object.select_all(action="DESELECT") bpy.context.view_layer.objects.active = None bpy.context.view_layer.objects.active = obj - obj.select_set(True) + tool.Blender.select_object(obj) bpy.ops.bim.add_roof() return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/model/slab.py b/src/bonsai/bonsai/bim/module/model/slab.py index 1f89f27c00..a8f71eb5eb 100644 --- a/src/bonsai/bonsai/bim/module/model/slab.py +++ b/src/bonsai/bonsai/bim/module/model/slab.py @@ -193,7 +193,7 @@ class DumbSlabGenerator: ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Engine": "Bonsai.DumbLayer3"}) material = ifcopenshell.util.element.get_material(element) material.LayerSetDirection = "AXIS3" - obj.select_set(True) + tool.Blender.select_object(obj) return obj diff --git a/src/bonsai/bonsai/bim/module/model/stair.py b/src/bonsai/bonsai/bim/module/model/stair.py index e325497525..8034857007 100644 --- a/src/bonsai/bonsai/bim/module/model/stair.py +++ b/src/bonsai/bonsai/bim/module/model/stair.py @@ -169,7 +169,7 @@ class BIM_OT_add_stair(bpy.types.Operator, tool.Ifc.Operator): bpy.ops.object.select_all(action="DESELECT") bpy.context.view_layer.objects.active = None bpy.context.view_layer.objects.active = obj - obj.select_set(True) + tool.Blender.select_object(obj) bpy.ops.bim.add_stair() return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/model/wall.py b/src/bonsai/bonsai/bim/module/model/wall.py index 7363844d9a..9e552db553 100644 --- a/src/bonsai/bonsai/bim/module/model/wall.py +++ b/src/bonsai/bonsai/bim/module/model/wall.py @@ -882,7 +882,7 @@ class DumbWallGenerator: ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Engine": "Bonsai.DumbLayer2"}) material = ifcopenshell.util.element.get_material(element) material.LayerSetDirection = "AXIS2" - obj.select_set(True) + tool.Blender.select_object(obj) return obj def get_relating_type_class(self, relating_type): diff --git a/src/bonsai/bonsai/bim/module/model/window.py b/src/bonsai/bonsai/bim/module/model/window.py index a2ef7507f3..55f3ebd75d 100644 --- a/src/bonsai/bonsai/bim/module/model/window.py +++ b/src/bonsai/bonsai/bim/module/model/window.py @@ -437,7 +437,7 @@ class BIM_OT_add_window(bpy.types.Operator, tool.Ifc.Operator): bpy.ops.object.select_all(action="DESELECT") bpy.context.view_layer.objects.active = None bpy.context.view_layer.objects.active = obj - obj.select_set(True) + tool.Blender.select_object(obj) bpy.ops.bim.add_window() return {"FINISHED"} diff --git a/src/bonsai/bonsai/tool/blender.py b/src/bonsai/bonsai/tool/blender.py index 6136c0e6da..b7cca4f0c7 100644 --- a/src/bonsai/bonsai/tool/blender.py +++ b/src/bonsai/bonsai/tool/blender.py @@ -605,6 +605,10 @@ class Blender(bonsai.core.tool.Blender): @classmethod def set_object_selection(cls, obj: bpy.types.Object, state: bool = True): + """Run ``Object.select_set`` but ignore errors if the object is hidden. + + Therefore, doesn't guarantee that the object is actually selected. + """ try: obj.select_set(state) except RuntimeError: # Trying to select a hidden object throws an error @@ -612,10 +616,14 @@ class Blender(bonsai.core.tool.Blender): @classmethod def select_object(cls, obj: bpy.types.Object): + """Shortcut for ``set_object_selection(obj, True)``.""" cls.set_object_selection(obj, True) @classmethod def deselect_object(cls, obj: bpy.types.Object, ensure_active_object: bool = True): + """Deselect object (using ``set_object_selection``) and optionally ensure that active + object is not the deselected object (last selected object used to replace it as active). + """ cls.set_object_selection(obj, False) if ensure_active_object and bpy.context.view_layer.objects.active == obj: if bpy.context.selected_objects: