From f11e09c7d88200ffc9815fa3bd31274c21061447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Tue, 18 Feb 2025 19:36:14 -0300 Subject: [PATCH] See #6121. Area measurement tool now uses IFC area unit. --- .../bonsai/bim/module/drawing/helper.py | 43 ++++++++++++++++++- src/bonsai/bonsai/tool/polyline.py | 6 ++- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/drawing/helper.py b/src/bonsai/bonsai/bim/module/drawing/helper.py index 5bd1661bfa..720459f85b 100644 --- a/src/bonsai/bonsai/bim/module/drawing/helper.py +++ b/src/bonsai/bonsai/bim/module/drawing/helper.py @@ -19,6 +19,7 @@ import bpy import math import mathutils.geometry +import ifcopenshell import bonsai.tool as tool from mathutils import Vector @@ -135,6 +136,7 @@ def format_distance( scaleFactor = bpy.context.scene.unit_settings.scale_length unit_system = bpy.context.scene.unit_settings.system unit_length = bpy.context.scene.unit_settings.length_unit + area_unit_symbol = " " + ifcopenshell.util.unit.get_unit_symbol(ifcopenshell.util.unit.get_project_unit(tool.Ifc.get(), "AREAUNIT")) value *= scaleFactor @@ -225,7 +227,24 @@ def format_distance( if add_inches or frac: tx_dist += '"' else: - tx_dist = str("%1.3f" % (value * toInches / inPerFoot)) + " sq. ft." + fmt = "%1.3f" + sq_feet = round(value * toInches / inPerFoot, 4) + tx_dist = "" + if area_unit_symbol == " ft2": + fmt += area_unit_symbol + tx_dist = fmt % sq_feet + if area_unit_symbol == " in2": + sq_inch = sq_feet * 144 + fmt += area_unit_symbol + tx_dist = fmt % sq_inch + if area_unit_symbol == " yd2": + sq_yard = sq_feet / 9 + fmt += area_unit_symbol + tx_dist = fmt % sq_yard + if area_unit_symbol == " mi2": + sq_mile = sq_feet / 27878400 + fmt += area_unit_symbol + tx_dist = fmt % sq_mile # METRIC FORMATTING elif unit_system == "METRIC": @@ -287,7 +306,27 @@ def format_distance( d_mm = value * (1000) tx_dist = fmt % d_mm if isArea: - tx_dist += s_code + if area_unit_symbol == " m2": + if decimal_places is None: + fmt = "%1.3f" + if hide_units is False: + fmt += area_unit_symbol + tx_dist = fmt % value + if area_unit_symbol == " cm2": + if decimal_places is None: + fmt = "%1.1f" + if hide_units is False: + fmt += area_unit_symbol + d_cm = value * (10000) + tx_dist = fmt % d_cm + if area_unit_symbol == " mm2": + if decimal_places is None: + fmt = "%1.0f" + if hide_units is False: + fmt += area_unit_symbol + d_cm = value * (1000000) + tx_dist = fmt % d_cm + else: tx_dist = fmt % value diff --git a/src/bonsai/bonsai/tool/polyline.py b/src/bonsai/bonsai/tool/polyline.py index 00fbad7483..8554e182f1 100644 --- a/src/bonsai/bonsai/tool/polyline.py +++ b/src/bonsai/bonsai/tool/polyline.py @@ -453,12 +453,14 @@ class Polyline(bonsai.core.tool.Polyline): unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) if bpy.context.scene.unit_settings.system == "IMPERIAL": precision = bpy.context.scene.DocProperties.imperial_precision + if is_area: + area_unit = bpy.context.scene.BIMProperties.area_unit + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get(), unit_type=area_unit) else: precision = None - value = value if is_area else value / unit_scale return format_distance( - value, + value / unit_scale, precision=precision, hide_units=False, isArea=is_area,