mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-17 22:11:36 +00:00
Linking in models now considers multiple project norths and federates it properly
This commit is contained in:
@@ -113,18 +113,32 @@ class BIMGeoreferenceProperties(PropertyGroup):
|
|||||||
x_axis_abscissa: StringProperty(name="X Axis Abscissa", update=update_grid_north_vector)
|
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_ordinate: StringProperty(name="X Axis Ordinate", update=update_grid_north_vector)
|
||||||
x_axis_is_null: BoolProperty(name="X Axis Is Null")
|
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_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_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")
|
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_eastings: StringProperty(name="Blender Eastings", default="0")
|
||||||
blender_northings: StringProperty(name="Blender Northings", default="0")
|
blender_northings: StringProperty(name="Blender Northings", default="0")
|
||||||
blender_orthogonal_height: StringProperty(name="Blender Orthogonal Height", default="0")
|
blender_orthogonal_height: StringProperty(name="Blender Orthogonal Height", default="0")
|
||||||
blender_project_north: StringProperty(name="Blender Angle to Grid North", 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_x: StringProperty(name="Blender Offset X", default="0")
|
||||||
blender_offset_y: StringProperty(name="Blender Offset Y", default="0")
|
blender_offset_y: StringProperty(name="Blender Offset Y", default="0")
|
||||||
blender_offset_z: StringProperty(name="Blender Offset Z", 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_abscissa: StringProperty(name="Blender X Axis Abscissa", default="1")
|
||||||
blender_x_axis_ordinate: StringProperty(name="Blender X Axis Ordinate", default="0")
|
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_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_abscissa: StringProperty(name="True North Abscissa", update=update_true_north_vector)
|
||||||
true_north_ordinate: StringProperty(name="True North Ordinate", update=update_true_north_vector)
|
true_north_ordinate: StringProperty(name="True North Ordinate", update=update_true_north_vector)
|
||||||
|
|||||||
@@ -1060,10 +1060,12 @@ def run():
|
|||||||
gprops = bpy.context.scene.BIMGeoreferenceProperties
|
gprops = bpy.context.scene.BIMGeoreferenceProperties
|
||||||
# Our model origin becomes their host model origin
|
# Our model origin becomes their host model origin
|
||||||
gprops.host_model_origin = "{gprops.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.has_blender_offset = {gprops.has_blender_offset}
|
||||||
gprops.blender_eastings = "{gprops.blender_eastings}"
|
gprops.blender_eastings = "{gprops.blender_eastings}"
|
||||||
gprops.blender_northings = "{gprops.blender_northings}"
|
gprops.blender_northings = "{gprops.blender_northings}"
|
||||||
gprops.blender_orthogonal_height = "{gprops.blender_orthogonal_height}"
|
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_x = "{gprops.blender_offset_x}"
|
||||||
gprops.blender_offset_y = "{gprops.blender_offset_y}"
|
gprops.blender_offset_y = "{gprops.blender_offset_y}"
|
||||||
gprops.blender_offset_z = "{gprops.blender_offset_z}"
|
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":
|
elif tool.Loader.settings.false_origin_mode == "AUTOMATIC":
|
||||||
if gprops.host_model_origin:
|
if gprops.host_model_origin:
|
||||||
tool.Loader.settings.false_origin = list(map(float, gprops.host_model_origin.split(",")))
|
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)
|
tool.Loader.set_manual_blender_offset(self.file)
|
||||||
else:
|
else:
|
||||||
tool.Loader.guess_false_origin(self.file)
|
tool.Loader.guess_false_origin(self.file)
|
||||||
@@ -1403,7 +1406,9 @@ class LoadLinkedProject(bpy.types.Operator):
|
|||||||
self.json_filepath = self.filepath + ".cache.json"
|
self.json_filepath = self.filepath + ".cache.json"
|
||||||
data = {
|
data = {
|
||||||
"host_model_origin": gprops.host_model_origin,
|
"host_model_origin": gprops.host_model_origin,
|
||||||
|
"host_model_project_north": gprops.host_model_project_north,
|
||||||
"model_origin": gprops.model_origin,
|
"model_origin": gprops.model_origin,
|
||||||
|
"model_project_north": gprops.model_project_north,
|
||||||
"has_blender_offset": gprops.has_blender_offset,
|
"has_blender_offset": gprops.has_blender_offset,
|
||||||
"blender_eastings": gprops.blender_eastings,
|
"blender_eastings": gprops.blender_eastings,
|
||||||
"blender_northings": gprops.blender_northings,
|
"blender_northings": gprops.blender_northings,
|
||||||
|
|||||||
@@ -570,8 +570,7 @@ class Loader(blenderbim.core.tool.Loader):
|
|||||||
zero_origin = np.array((0, 0, 0))
|
zero_origin = np.array((0, 0, 0))
|
||||||
has_offset = not np.allclose(model_offset, zero_origin)
|
has_offset = not np.allclose(model_offset, zero_origin)
|
||||||
|
|
||||||
parameters = ifcopenshell.util.geolocation.get_helmert_transformation_parameters(ifc_file)
|
model_north = ifcopenshell.util.geolocation.get_grid_north(ifc_file)
|
||||||
model_north = ifcopenshell.util.geolocation.xaxis2angle(parameters.xaa, parameters.xao)
|
|
||||||
project_north = cls.settings.project_north
|
project_north = cls.settings.project_north
|
||||||
model_rotation = project_north - model_north
|
model_rotation = project_north - model_north
|
||||||
if model_rotation > 180:
|
if model_rotation > 180:
|
||||||
@@ -741,7 +740,9 @@ class Loader(blenderbim.core.tool.Loader):
|
|||||||
gprops.model_origin = (
|
gprops.model_origin = (
|
||||||
f"{gprops.blender_eastings},{gprops.blender_northings},{gprops.blender_orthogonal_height}"
|
f"{gprops.blender_eastings},{gprops.blender_northings},{gprops.blender_orthogonal_height}"
|
||||||
)
|
)
|
||||||
|
gprops.model_project_north = gprops.blender_project_north
|
||||||
else:
|
else:
|
||||||
gprops.model_origin = ",".join(
|
gprops.model_origin = ",".join(
|
||||||
map(str, ifcopenshell.util.geolocation.auto_xyz2enh(ifc_file, 0, 0, 0))
|
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))
|
||||||
|
|||||||
Reference in New Issue
Block a user