diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index dc378db190..6df397b30f 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -748,6 +748,7 @@ class IfcImporter: # positionally significant and is left alone. This handles # scenarios where often spatial elements are left at 0,0,0 and # everything else is at map coordinates. + obj.BIMObjectProperties.blender_offset_type = "NOT_APPLICABLE" return mathutils.Matrix(matrix.tolist()) elif obj.data and obj.data.get("has_cartesian_point_offset", None): obj.BIMObjectProperties.blender_offset_type = "CARTESIAN_POINT" diff --git a/src/blenderbim/blenderbim/bim/prop.py b/src/blenderbim/blenderbim/bim/prop.py index 4a777bfd6e..e578fde4f1 100644 --- a/src/blenderbim/blenderbim/bim/prop.py +++ b/src/blenderbim/blenderbim/bim/prop.py @@ -441,7 +441,7 @@ class BIMObjectProperties(PropertyGroup): collection: PointerProperty(type=bpy.types.Collection) ifc_definition_id: IntProperty(name="IFC Definition ID") blender_offset_type: EnumProperty( - items=[(o, o, "") for o in ["NONE", "OBJECT_PLACEMENT", "CARTESIAN_POINT"]], + items=[(o, o, "") for o in ["NONE", "OBJECT_PLACEMENT", "CARTESIAN_POINT", "NOT_APPLICABLE"]], name="Blender Offset", default="NONE", ) diff --git a/src/blenderbim/blenderbim/core/geometry.py b/src/blenderbim/blenderbim/core/geometry.py index e2b27cc35e..70898b7b49 100644 --- a/src/blenderbim/blenderbim/core/geometry.py +++ b/src/blenderbim/blenderbim/core/geometry.py @@ -33,6 +33,7 @@ def edit_object_placement( return geometry.clear_cache(element) geometry.clear_scale(obj) + geometry.get_blender_offset_type(obj) ifc.run("geometry.edit_object_placement", product=element, matrix=surveyor.get_absolute_matrix(obj)) geometry.record_object_position(obj) diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 9888176aa9..2a50a5d419 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -40,7 +40,7 @@ import blenderbim.bim.import_ifc from math import radians, pi from mathutils import Vector, Matrix from blenderbim.bim.ifc import IfcStore -from typing import Union, Iterable +from typing import Union, Iterable, Optional class Geometry(blenderbim.core.tool.Geometry): @@ -982,3 +982,11 @@ class Geometry(blenderbim.core.tool.Geometry): def delete_opening_object_placement(cls, placement): model = tool.Ifc.get() ifcopenshell.util.element.remove_deep2(model, placement) + + @classmethod + def get_blender_offset_type(cls, obj: bpy.types.Object) -> Optional[str]: + props = bpy.context.scene.BIMGeoreferenceProperties + if props.has_blender_offset: + if (result := obj.BIMObjectProperties.blender_offset_type) == "NONE": + result = obj.BIMObjectProperties.blender_offset_type = "OBJECT_PLACEMENT" + return result diff --git a/src/blenderbim/blenderbim/tool/surveyor.py b/src/blenderbim/blenderbim/tool/surveyor.py index e1ced18793..1ddeab6618 100644 --- a/src/blenderbim/blenderbim/tool/surveyor.py +++ b/src/blenderbim/blenderbim/tool/surveyor.py @@ -28,7 +28,7 @@ class Surveyor(blenderbim.core.tool.Surveyor): def get_absolute_matrix(cls, obj): matrix = np.array(obj.matrix_world) props = bpy.context.scene.BIMGeoreferenceProperties - if props.has_blender_offset and obj.BIMObjectProperties.blender_offset_type == "OBJECT_PLACEMENT": + if props.has_blender_offset and obj.BIMObjectProperties.blender_offset_type != "NOT_APPLICABLE": unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) matrix = np.array( ifcopenshell.util.geolocation.local2global(