diff --git a/src/bonsai/bonsai/bim/module/drawing/decoration.py b/src/bonsai/bonsai/bim/module/drawing/decoration.py index 4273feba9d..d1f02ca248 100644 --- a/src/bonsai/bonsai/bim/module/drawing/decoration.py +++ b/src/bonsai/bonsai/bim/module/drawing/decoration.py @@ -1205,22 +1205,11 @@ class PlanLevelDecorator(BaseDecorator): def get_text(): abs_z = verts[0].z - z = abs_z - - if element: - spatial_container = ifcopenshell.util.element.get_container(element) - - if spatial_container: - container_obj = tool.Ifc.get_object(spatial_container) - - if container_obj: - spatial_container_z = container_obj.matrix_world.translation.z - z = abs_z - spatial_container_z + z = helper.get_relative_z(obj, element, abs_z) rl = self.format_value(context, z) text = "{}{}".format("" if z < 0 else "+", rl) return text - self.draw_dimension_text( context, get_text, diff --git a/src/bonsai/bonsai/bim/module/drawing/helper.py b/src/bonsai/bonsai/bim/module/drawing/helper.py index 6999c8536e..bfd943afa6 100644 --- a/src/bonsai/bonsai/bim/module/drawing/helper.py +++ b/src/bonsai/bonsai/bim/module/drawing/helper.py @@ -539,3 +539,26 @@ def add_newline_between_words(text: str, newline_at: int) -> str: start = space_index + 1 # Skip the space itself return "\n".join(result) + + +def get_relative_z(obj: bpy.types.Object, element, abs_z: float) -> float: + """Return relative Z of an element, accounting for its spatial container. + + Args: + obj: The Blender object representing the element. + element: The IFC entity for the object. + abs_z: The absolute Z value in world coordinates. + + Returns: + Relative Z value if the element is inside a spatial container, + otherwise the absolute Z. + """ + z = abs_z + if element: + spatial_container = ifcopenshell.util.element.get_container(element) + if spatial_container: + container_obj = tool.Ifc.get_object(spatial_container) + if container_obj: + spatial_container_z = container_obj.matrix_world.translation.z + z = abs_z - spatial_container_z + return z diff --git a/src/bonsai/bonsai/bim/module/drawing/svgwriter.py b/src/bonsai/bonsai/bim/module/drawing/svgwriter.py index 50da1fc52c..6b0c3a4dcf 100644 --- a/src/bonsai/bonsai/bim/module/drawing/svgwriter.py +++ b/src/bonsai/bonsai/bim/module/drawing/svgwriter.py @@ -1012,7 +1012,9 @@ class SvgWriter: # TODO: allow metric to be configurable def get_text(): - z = (matrix_world @ points[0].co.xyz).z + abs_z = (matrix_world @ points[0].co.xyz).z + z = helper.get_relative_z(obj, element, abs_z) + rl = helper.format_distance( z, precision=self.precision,