diff --git a/src/blenderbim/blenderbim/bim/module/georeference/prop.py b/src/blenderbim/blenderbim/bim/module/georeference/prop.py index f62c002ac6..26a47f819c 100644 --- a/src/blenderbim/blenderbim/bim/module/georeference/prop.py +++ b/src/blenderbim/blenderbim/bim/module/georeference/prop.py @@ -113,18 +113,32 @@ class BIMGeoreferenceProperties(PropertyGroup): x_axis_abscissa: StringProperty(name="X Axis Abscissa", update=update_grid_north_vector) x_axis_ordinate: StringProperty(name="X Axis Ordinate", update=update_grid_north_vector) x_axis_is_null: BoolProperty(name="X Axis Is Null") + + # These are only for reference to capture data about a host model from a linked model + # If you relink a model from a new host origin, we can autodetect it in theory with this host_model_origin: StringProperty(name="Host Model Origin") + host_model_project_north: StringProperty(name="Host Model Angle to Grid North") + + # These are only for reference, calculated using tool.Loader.calculate_model_origin model_origin: StringProperty(name="Model Origin") + model_project_north: StringProperty(name="Model Angle to Grid North") + + # True if there is a temporary Blender session coordinate system has_blender_offset: BoolProperty(name="Has Blender Offset") + + # These E, N, H, and project north are the absolute map coordinates of the Blender session blender_eastings: StringProperty(name="Blender Eastings", default="0") blender_northings: StringProperty(name="Blender Northings", default="0") blender_orthogonal_height: StringProperty(name="Blender Orthogonal Height", default="0") blender_project_north: StringProperty(name="Blender Angle to Grid North", default="0") + + # These are the helmert transformation parameters of the Blender session blender_offset_x: StringProperty(name="Blender Offset X", default="0") blender_offset_y: StringProperty(name="Blender Offset Y", default="0") blender_offset_z: StringProperty(name="Blender Offset Z", default="0") blender_x_axis_abscissa: StringProperty(name="Blender X Axis Abscissa", default="1") blender_x_axis_ordinate: StringProperty(name="Blender X Axis Ordinate", default="0") + true_north_angle: StringProperty(name="True North Angle", update=update_true_north_angle) true_north_abscissa: StringProperty(name="True North Abscissa", update=update_true_north_vector) true_north_ordinate: StringProperty(name="True North Ordinate", update=update_true_north_vector) diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index b0ebb61039..e52886ddd7 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -1060,10 +1060,12 @@ def run(): gprops = bpy.context.scene.BIMGeoreferenceProperties # Our model origin becomes their host model origin gprops.host_model_origin = "{gprops.model_origin}" + gprops.host_model_project_north = "{gprops.model_project_north}" gprops.has_blender_offset = {gprops.has_blender_offset} gprops.blender_eastings = "{gprops.blender_eastings}" gprops.blender_northings = "{gprops.blender_northings}" gprops.blender_orthogonal_height = "{gprops.blender_orthogonal_height}" + gprops.blender_project_north = "{gprops.blender_project_north}" gprops.blender_offset_x = "{gprops.blender_offset_x}" gprops.blender_offset_y = "{gprops.blender_offset_y}" gprops.blender_offset_z = "{gprops.blender_offset_z}" @@ -1395,6 +1397,7 @@ class LoadLinkedProject(bpy.types.Operator): elif tool.Loader.settings.false_origin_mode == "AUTOMATIC": if gprops.host_model_origin: tool.Loader.settings.false_origin = list(map(float, gprops.host_model_origin.split(","))) + tool.Loader.settings.project_north = float(gprops.host_model_project_north) tool.Loader.set_manual_blender_offset(self.file) else: tool.Loader.guess_false_origin(self.file) @@ -1403,7 +1406,9 @@ class LoadLinkedProject(bpy.types.Operator): self.json_filepath = self.filepath + ".cache.json" data = { "host_model_origin": gprops.host_model_origin, + "host_model_project_north": gprops.host_model_project_north, "model_origin": gprops.model_origin, + "model_project_north": gprops.model_project_north, "has_blender_offset": gprops.has_blender_offset, "blender_eastings": gprops.blender_eastings, "blender_northings": gprops.blender_northings, diff --git a/src/blenderbim/blenderbim/tool/loader.py b/src/blenderbim/blenderbim/tool/loader.py index 7e17704c6b..15067b16e4 100644 --- a/src/blenderbim/blenderbim/tool/loader.py +++ b/src/blenderbim/blenderbim/tool/loader.py @@ -570,8 +570,7 @@ class Loader(blenderbim.core.tool.Loader): zero_origin = np.array((0, 0, 0)) has_offset = not np.allclose(model_offset, zero_origin) - parameters = ifcopenshell.util.geolocation.get_helmert_transformation_parameters(ifc_file) - model_north = ifcopenshell.util.geolocation.xaxis2angle(parameters.xaa, parameters.xao) + model_north = ifcopenshell.util.geolocation.get_grid_north(ifc_file) project_north = cls.settings.project_north model_rotation = project_north - model_north if model_rotation > 180: @@ -741,7 +740,9 @@ class Loader(blenderbim.core.tool.Loader): gprops.model_origin = ( f"{gprops.blender_eastings},{gprops.blender_northings},{gprops.blender_orthogonal_height}" ) + gprops.model_project_north = gprops.blender_project_north else: gprops.model_origin = ",".join( map(str, ifcopenshell.util.geolocation.auto_xyz2enh(ifc_file, 0, 0, 0)) ) + gprops.model_project_north = str(ifcopenshell.util.geolocation.get_grid_north(ifc_file))