diff --git a/src/blenderbim/blenderbim/bim/export_ifc.py b/src/blenderbim/blenderbim/bim/export_ifc.py index 4203113fc6..f765025b32 100644 --- a/src/blenderbim/blenderbim/bim/export_ifc.py +++ b/src/blenderbim/blenderbim/bim/export_ifc.py @@ -155,7 +155,7 @@ class IfcExporter: def sync_object_placement(self, obj): element = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) - if element.is_a("IfcTypeProduct") or element.is_a("IfcProject") or not tool.Ifc.is_moved(obj): + if not tool.Ifc.is_moved(obj): return blender_matrix = np.array(obj.matrix_world) if (obj.scale - Vector((1.0, 1.0, 1.0))).length > 1e-4: diff --git a/src/blenderbim/blenderbim/tool/ifc.py b/src/blenderbim/blenderbim/tool/ifc.py index 6637d37096..b801387fdd 100644 --- a/src/blenderbim/blenderbim/tool/ifc.py +++ b/src/blenderbim/blenderbim/tool/ifc.py @@ -56,6 +56,9 @@ class Ifc(blenderbim.core.tool.Ifc): @classmethod def is_moved(cls, obj): + element = cls.get_entity(obj) + if not element or element.is_a("IfcTypeProduct") or element.is_a("IfcProject"): + return False if not obj.BIMObjectProperties.location_checksum: return True # Let's be conservative loc_check = np.frombuffer(eval(obj.BIMObjectProperties.location_checksum)) diff --git a/src/blenderbim/test/tool/test_ifc.py b/src/blenderbim/test/tool/test_ifc.py index 0501618bec..f8a17e2bd9 100644 --- a/src/blenderbim/test/tool/test_ifc.py +++ b/src/blenderbim/test/tool/test_ifc.py @@ -20,6 +20,7 @@ import bpy import ifcopenshell import test.bim.bootstrap import blenderbim.core.tool +import blenderbim.tool as tool from blenderbim.tool.ifc import Ifc as subject @@ -64,6 +65,36 @@ class TestGetSchema(test.bim.bootstrap.NewFile): assert subject.get_schema() == "IFC4" +class TestIsMoved(test.bim.bootstrap.NewFile): + def test_run(self): + ifc = ifcopenshell.file() + subject.set(ifc) + obj = bpy.data.objects.new("Object", None) + element = ifc.createIfcWall() + subject.link(element, obj) + obj.BIMObjectProperties.ifc_definition_id = element.id() + assert subject.is_moved(obj) is True + tool.Geometry.record_object_position(obj) + assert subject.is_moved(obj) is False + obj.matrix_world[0][2] += 1 + assert subject.is_moved(obj) is True + + def test_that_a_type_or_project_never_moves_but_a_grid_axis_does(self): + ifc = ifcopenshell.file() + subject.set(ifc) + obj = bpy.data.objects.new("Object", None) + element = ifc.createIfcWallType() + subject.link(element, obj) + obj.BIMObjectProperties.ifc_definition_id = element.id() + assert subject.is_moved(obj) is False + element = ifc.createIfcProject() + subject.link(element, obj) + assert subject.is_moved(obj) is False + element = ifc.createIfcGridAxis() + subject.link(element, obj) + assert subject.is_moved(obj) is True + + class TestGetEntity(test.bim.bootstrap.NewFile): def test_run(self): ifc = ifcopenshell.file()