From 8f64ef446507b56c9614e1651ad9643aaa1c40c0 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 7 Jun 2024 10:40:23 +1000 Subject: [PATCH] Fix bug where incorrect units were calculated in the geometry offset UI --- src/blenderbim/blenderbim/bim/import_ifc.py | 1 + .../blenderbim/bim/module/geometry/data.py | 59 +++++++------------ src/blenderbim/blenderbim/bim/prop.py | 1 + 3 files changed, 23 insertions(+), 38 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 4a31abfe34..dc378db190 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -752,6 +752,7 @@ class IfcImporter: elif obj.data and obj.data.get("has_cartesian_point_offset", None): obj.BIMObjectProperties.blender_offset_type = "CARTESIAN_POINT" if cartesian_point_offset := obj.data.get("cartesian_point_offset", None): + obj.BIMObjectProperties.cartesian_point_offset = cartesian_point_offset offset_x, offset_y, offset_z = map(float, cartesian_point_offset.split(",")) matrix[0][3] += offset_x matrix[1][3] += offset_y diff --git a/src/blenderbim/blenderbim/bim/module/geometry/data.py b/src/blenderbim/blenderbim/bim/module/geometry/data.py index baf9f356ae..a65a49283b 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/data.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/data.py @@ -328,12 +328,17 @@ class PlacementData: @classmethod def load(cls): - cls.data = { - "has_placement": cls.has_placement(), - "original_x": cls.original_x(), - "original_y": cls.original_y(), - "original_z": cls.original_z(), - } + cls.data = {"has_placement": cls.has_placement()} + + props = bpy.context.scene.BIMGeoreferenceProperties + obj = bpy.context.active_object + if obj and props.has_blender_offset: + xyz = cls.original_xyz(obj) + cls.data.update({ + "original_x": str(xyz[0]), + "original_y": str(xyz[1]), + "original_z": str(xyz[2]), + }) cls.is_loaded = True @classmethod @@ -344,40 +349,18 @@ class PlacementData: return False @classmethod - def original_x(cls): + def original_xyz(cls, obj): + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) props = bpy.context.scene.BIMGeoreferenceProperties - obj = bpy.context.active_object - if not obj or not props.has_blender_offset: - return - return str(round(cls.original_xyz(obj.location)[0], 3)) - - @classmethod - def original_y(cls): - props = bpy.context.scene.BIMGeoreferenceProperties - obj = bpy.context.active_object - if not obj or not props.has_blender_offset: - return - return str(round(cls.original_xyz(obj.location)[1], 3)) - - @classmethod - def original_z(cls): - props = bpy.context.scene.BIMGeoreferenceProperties - obj = bpy.context.active_object - if not obj or not props.has_blender_offset: - return - return str(round(cls.original_xyz(obj.location)[2], 3)) - - @classmethod - def original_xyz(cls, location): - props = bpy.context.scene.BIMGeoreferenceProperties - return ifcopenshell.util.geolocation.xyz2enh( - location[0], - location[1], - location[2], - float(props.blender_eastings), - float(props.blender_northings), - float(props.blender_orthogonal_height), + xyz = ifcopenshell.util.geolocation.xyz2enh( + obj.matrix_world[0][3], + obj.matrix_world[1][3], + obj.matrix_world[2][3], + float(props.blender_eastings) * unit_scale, + float(props.blender_northings) * unit_scale, + float(props.blender_orthogonal_height) / unit_scale, float(props.blender_x_axis_abscissa), float(props.blender_x_axis_ordinate), 1.0, ) + return [round(o, 3) / unit_scale for o in xyz] # To nearest mm of precision diff --git a/src/blenderbim/blenderbim/bim/prop.py b/src/blenderbim/blenderbim/bim/prop.py index 386db3b82c..4a777bfd6e 100644 --- a/src/blenderbim/blenderbim/bim/prop.py +++ b/src/blenderbim/blenderbim/bim/prop.py @@ -445,6 +445,7 @@ class BIMObjectProperties(PropertyGroup): name="Blender Offset", default="NONE", ) + cartesian_point_offset: StringProperty(name="Cartesian Point Offset") is_reassigning_class: BoolProperty(name="Is Reassigning Class") is_renaming: BoolProperty(name="Is Renaming", default=False) location_checksum: StringProperty(name="Location Checksum")