From 1cac12dc531507b08eecbf2a5e9561dd2efb4dad Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 31 Mar 2025 13:48:30 +0500 Subject: [PATCH] Use fallback elevation value if default container is missing #6470 I guess it's always theoretically possible that user end up without a default container. --- src/bonsai/bonsai/bim/module/model/decorator.py | 2 +- src/bonsai/bonsai/bim/module/model/polyline.py | 2 +- src/bonsai/bonsai/tool/polyline.py | 6 +++--- src/bonsai/bonsai/tool/raycast.py | 2 +- src/bonsai/bonsai/tool/root.py | 9 +++++++++ src/bonsai/bonsai/tool/snap.py | 4 ++-- src/bonsai/bonsai/tool/spatial.py | 5 ++--- 7 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/model/decorator.py b/src/bonsai/bonsai/bim/module/model/decorator.py index 020b6e11ad..d54551610b 100644 --- a/src/bonsai/bonsai/bim/module/model/decorator.py +++ b/src/bonsai/bonsai/bim/module/model/decorator.py @@ -649,7 +649,7 @@ class PolylineDecorator: # Plane Method or Default Container if tool.Ifc.get(): - default_container_elevation = tool.Ifc.get_object(tool.Root.get_default_container()).location.z + default_container_elevation = tool.Root.get_default_container_elevation() else: default_container_elevation = 0.0 projection_point = [] diff --git a/src/bonsai/bonsai/bim/module/model/polyline.py b/src/bonsai/bonsai/bim/module/model/polyline.py index a4cd9cc22f..8d0429dd00 100644 --- a/src/bonsai/bonsai/bim/module/model/polyline.py +++ b/src/bonsai/bonsai/bim/module/model/polyline.py @@ -529,7 +529,7 @@ def get_generic_product_preview_data(context, relating_type): else: rl = 0 snap_prop = context.scene.BIMPolylineProperties.snap_mouse_point[0] - default_container_elevation = tool.Ifc.get_object(tool.Root.get_default_container()).location.z + default_container_elevation = tool.Root.get_default_container_elevation() mouse_point = Vector((snap_prop.x, snap_prop.y, default_container_elevation)) snap_obj = bpy.data.objects.get(snap_prop.snap_object) snap_element = tool.Ifc.get_entity(snap_obj) diff --git a/src/bonsai/bonsai/tool/polyline.py b/src/bonsai/bonsai/tool/polyline.py index 870cd1b278..c2fecfaf66 100644 --- a/src/bonsai/bonsai/tool/polyline.py +++ b/src/bonsai/bonsai/tool/polyline.py @@ -119,7 +119,7 @@ class Polyline(bonsai.core.tool.Polyline): last_point_data = None if tool.Ifc.get(): - default_container_elevation = tool.Ifc.get_object(tool.Root.get_default_container()).location.z + default_container_elevation = tool.Root.get_default_container_elevation() else: default_container_elevation = 0 @@ -267,7 +267,7 @@ class Polyline(bonsai.core.tool.Polyline): last_point = Vector((0, 0, 0)) if tool.Ifc.get(): - default_container_elevation = tool.Ifc.get_object(tool.Root.get_default_container()).location.z + default_container_elevation = tool.Root.get_default_container_elevation() else: default_container_elevation = 0 @@ -505,7 +505,7 @@ class Polyline(bonsai.core.tool.Polyline): snap_vertex = bpy.context.scene.BIMPolylineProperties.snap_mouse_point[0] if tool_state and tool_state.use_default_container: - z = tool.Ifc.get_object(tool.Root.get_default_container()).location.z + z = tool.Root.get_default_container_elevation() # Lock one dimension when in plane method if tool_state.plane_origin: diff --git a/src/bonsai/bonsai/tool/raycast.py b/src/bonsai/bonsai/tool/raycast.py index 628660077a..5cea172dc0 100644 --- a/src/bonsai/bonsai/tool/raycast.py +++ b/src/bonsai/bonsai/tool/raycast.py @@ -331,7 +331,7 @@ class Raycast(bonsai.core.tool.Raycast): ray_origin, ray_target, ray_direction = cls.get_viewport_ray_data(context, event) if tool.Ifc.get(): - default_container_elevation = tool.Ifc.get_object(tool.Root.get_default_container()).location.z + default_container_elevation = tool.Root.get_default_container_elevation() else: default_container_elevation = 0.0 intersection = Vector((0, 0, default_container_elevation)) diff --git a/src/bonsai/bonsai/tool/root.py b/src/bonsai/bonsai/tool/root.py index b8269f4134..7ce135b730 100644 --- a/src/bonsai/bonsai/tool/root.py +++ b/src/bonsai/bonsai/tool/root.py @@ -128,6 +128,15 @@ class Root(bonsai.core.tool.Root): props.default_container = 0 return None + @classmethod + def get_default_container_elevation(cls) -> float: + default_container = cls.get_default_container() + if not default_container: + return 0.0 + obj = tool.Ifc.get_object(default_container) + assert isinstance(obj, bpy.types.Object) + return obj.location.z + @classmethod def get_connection_relationships( cls, objs: list[bpy.types.Object] diff --git a/src/bonsai/bonsai/tool/snap.py b/src/bonsai/bonsai/tool/snap.py index f1b3f04464..49e9a25e8b 100644 --- a/src/bonsai/bonsai/tool/snap.py +++ b/src/bonsai/bonsai/tool/snap.py @@ -162,7 +162,7 @@ class Snap(bonsai.core.tool.Snap): snap_threshold = 1 * cls.get_increment_snap_value(bpy.context) if tool.Ifc.get(): - default_container_elevation = tool.Ifc.get_object(tool.Root.get_default_container()).location.z + default_container_elevation = tool.Root.get_default_container_elevation() else: default_container_elevation = 0.0 polyline_data = bpy.context.scene.BIMPolylineProperties.insertion_polyline @@ -396,7 +396,7 @@ class Snap(bonsai.core.tool.Snap): # Axis and Plane if tool.Ifc.get(): - elevation = tool.Ifc.get_object(tool.Root.get_default_container()).location.z + elevation = tool.Root.get_default_container_elevation() else: elevation = 0.0 diff --git a/src/bonsai/bonsai/tool/spatial.py b/src/bonsai/bonsai/tool/spatial.py index 93d0478f4a..1e67da47b5 100644 --- a/src/bonsai/bonsai/tool/spatial.py +++ b/src/bonsai/bonsai/tool/spatial.py @@ -846,9 +846,8 @@ class Spatial(bonsai.core.tool.Spatial): `mat` - identity matrix """ x, y, z = bpy.context.scene.cursor.location.xyz - if container := tool.Root.get_default_container(): - if container_obj := tool.Ifc.get_object(container): - z = container_obj.matrix_world.translation.z + if tool.Root.get_default_container(): + z = tool.Root.get_default_container_elevation() mat = Matrix() h = 3 return x, y, z, h, mat