mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-12 02:23:34 +00:00
Fix bug where incorrect units were calculated in the geometry offset UI
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user