From 901318b73bffef6c43fd06f8ea7dfdb6a38d4cfd Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 3 Nov 2021 19:03:48 +1100 Subject: [PATCH] Fix bug where copying an instance did not auto link the meshes. --- src/blenderbim/blenderbim/core/root.py | 1 + src/blenderbim/blenderbim/core/tool.py | 1 + src/blenderbim/blenderbim/tool/root.py | 4 ++++ src/blenderbim/test/core/test_root.py | 4 ++++ src/blenderbim/test/tool/test_root.py | 10 ++++++++++ 5 files changed, 20 insertions(+) diff --git a/src/blenderbim/blenderbim/core/root.py b/src/blenderbim/blenderbim/core/root.py index 5ca8e3f276..2cf249bce6 100644 --- a/src/blenderbim/blenderbim/core/root.py +++ b/src/blenderbim/blenderbim/core/root.py @@ -26,6 +26,7 @@ def copy_class(ifc, collector, geometry, root, obj=None): relating_type = root.get_element_type(element) if relating_type and root.does_type_have_representations(relating_type): ifc.run("type.map_type_representations", related_object=element, relating_type=relating_type) + root.link_object_data(ifc.get_object(relating_type), obj) else: representation = root.get_object_representation(obj) if representation: diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index feefe4cac8..73489a2d3c 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -160,6 +160,7 @@ class Root: def get_object_representation(cls, obj): pass def get_representation_context(cls, representation): pass def is_opening_element(cls, element): pass + def link_object_data(cls, source_obj, destination_obj): pass def run_geometry_add_representation(cls, obj=None, context=None, ifc_representation_class=None, profile_set_usage=None): pass diff --git a/src/blenderbim/blenderbim/tool/root.py b/src/blenderbim/blenderbim/tool/root.py index d36c5aa34a..048fb04326 100644 --- a/src/blenderbim/blenderbim/tool/root.py +++ b/src/blenderbim/blenderbim/tool/root.py @@ -61,6 +61,10 @@ class Root(blenderbim.core.tool.Root): def is_opening_element(cls, element): return element.is_a("IfcOpeningElement") + @classmethod + def link_object_data(cls, source_obj, destination_obj): + destination_obj.data = source_obj.data + @classmethod def run_geometry_add_representation( cls, obj=None, context=None, ifc_representation_class=None, profile_set_usage=None diff --git a/src/blenderbim/test/core/test_root.py b/src/blenderbim/test/core/test_root.py index 442ee4c942..72e5718f7c 100644 --- a/src/blenderbim/test/core/test_root.py +++ b/src/blenderbim/test/core/test_root.py @@ -33,6 +33,8 @@ class TestCopyClass: root.get_element_type("element").should_be_called().will_return("type") root.does_type_have_representations("type").should_be_called().will_return(True) ifc.run("type.map_type_representations", related_object="element", relating_type="type").should_be_called() + ifc.get_object("type").should_be_called().will_return("type_obj") + root.link_object_data("type_obj", "obj").should_be_called() collector.assign("obj").should_be_called() root.is_opening_element("element").should_be_called().will_return(False) subject.copy_class(ifc, collector, geometry, root, obj="obj") @@ -78,6 +80,8 @@ class TestCopyClass: root.get_element_type("element").should_be_called().will_return("type") root.does_type_have_representations("type").should_be_called().will_return(True) ifc.run("type.map_type_representations", related_object="element", relating_type="type").should_be_called() + ifc.get_object("type").should_be_called().will_return("type_obj") + root.link_object_data("type_obj", "obj").should_be_called() collector.assign("obj").should_be_called() root.is_opening_element("element").should_be_called().will_return(True) root.add_dynamic_opening_voids("element", "obj").should_be_called() diff --git a/src/blenderbim/test/tool/test_root.py b/src/blenderbim/test/tool/test_root.py index 56fbd8c9d3..ef6ee73861 100644 --- a/src/blenderbim/test/tool/test_root.py +++ b/src/blenderbim/test/tool/test_root.py @@ -100,6 +100,16 @@ class TestIsOpeningElement(NewFile): assert subject.is_opening_element(ifc.createIfcOpeningElement()) is True +class TestLinkObjectData(NewFile): + def test_run(self): + data = bpy.data.meshes.new("Mesh") + source = bpy.data.objects.new("Object", data) + destination = bpy.data.objects.new("Object", bpy.data.meshes.new("Mesh")) + subject.link_object_data(source, destination) + assert source.data == data + assert source.data == destination.data + + class TestRunGeometryAddRepresntation(NewFile): def test_nothing(self): pass