From 4149292a131c2a17ec8647a7f2ef9acb2b241517 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 6 Nov 2021 18:51:00 +1100 Subject: [PATCH] Fix bug where adding a representation to a type instance didn't share meshes --- src/blenderbim/blenderbim/core/geometry.py | 1 + src/blenderbim/blenderbim/tool/geometry.py | 3 +-- .../test/bim/feature/geometry.feature | 21 ++++++++++++++++++- src/blenderbim/test/core/test_geometry.py | 2 ++ src/blenderbim/test/tool/test_geometry.py | 6 +++--- 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/blenderbim/blenderbim/core/geometry.py b/src/blenderbim/blenderbim/core/geometry.py index d5214fd742..f5f081a57e 100644 --- a/src/blenderbim/blenderbim/core/geometry.py +++ b/src/blenderbim/blenderbim/core/geometry.py @@ -66,6 +66,7 @@ def add_representation( ifc.run("geometry.assign_representation", product=element, representation=representation) data = geometry.duplicate_object_data(obj) + geometry.change_object_data(obj, data, is_global=True) name = geometry.get_representation_name(representation) geometry.rename_object(data, name) geometry.link(representation, data) diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 8152a79bda..bdba057ec7 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -63,8 +63,7 @@ class Geometry(blenderbim.core.tool.Geometry): @classmethod def duplicate_object_data(cls, obj): - obj.data = obj.data.copy() - return obj.data + return obj.data.copy() @classmethod def get_cartesian_point_coordinate_offset(cls, obj): diff --git a/src/blenderbim/test/bim/feature/geometry.feature b/src/blenderbim/test/bim/feature/geometry.feature index 78a231f8c2..c09f1339c2 100644 --- a/src/blenderbim/test/bim/feature/geometry.feature +++ b/src/blenderbim/test/bim/feature/geometry.feature @@ -18,10 +18,29 @@ Scenario: Add representation And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" And I press "bim.assign_class" And the object "IfcWall/Cube" is selected + Then the object "IfcWall/Cube" has a "Tessellation" representation of "Model/Body/MODEL_VIEW" When the variable "context" is "{ifc}.by_type('IfcGeometricRepresentationSubContext')[-1].id()" And I set "scene.BIMProperties.contexts" to "{context}" And I press "bim.add_representation" - Then nothing happens + Then the object "IfcWall/Cube" has a "Annotation2D" representation of "Plan/Annotation/PLAN_VIEW" + +Scenario: Add representation - add a new representation to a typed instance + Given an empty IFC project + And I add a cube + And the object "Cube" is selected + And I set "scene.BIMRootProperties.ifc_product" to "IfcElementType" + And I set "scene.BIMRootProperties.ifc_class" to "IfcWallType" + And I press "bim.assign_class" + And I press "bim.add_type_instance" + And I press "bim.add_type_instance" + Then the object "IfcWall/Instance" has a "MappedRepresentation" representation of "Model/Body/MODEL_VIEW" + And the object "IfcWall/Instance.001" has a "MappedRepresentation" representation of "Model/Body/MODEL_VIEW" + When the object "IfcWall/Instance" is selected + And the variable "context" is "{ifc}.by_type('IfcGeometricRepresentationSubContext')[-1].id()" + And I set "scene.BIMProperties.contexts" to "{context}" + And I press "bim.add_representation" + Then the object "IfcWall/Instance" has a "MappedRepresentation" representation of "Plan/Annotation/PLAN_VIEW" + And the object "IfcWall/Instance.001" has a "MappedRepresentation" representation of "Plan/Annotation/PLAN_VIEW" Scenario: Switch representation Given an empty IFC project diff --git a/src/blenderbim/test/core/test_geometry.py b/src/blenderbim/test/core/test_geometry.py index e8dacfc2ea..9d83184153 100644 --- a/src/blenderbim/test/core/test_geometry.py +++ b/src/blenderbim/test/core/test_geometry.py @@ -76,6 +76,7 @@ class TestAddRepresentation: # Update mesh geometry.duplicate_object_data("obj").should_be_called().will_return("data") + geometry.change_object_data("obj", "data", is_global=True).should_be_called() geometry.get_representation_name("representation").should_be_called().will_return("name") geometry.rename_object("data", "name").should_be_called() geometry.link("representation", "data").should_be_called() @@ -124,6 +125,7 @@ class TestAddRepresentation: # Update mesh geometry.duplicate_object_data("obj").should_be_called().will_return("data") + geometry.change_object_data("obj", "data", is_global=True).should_be_called() geometry.get_representation_name("representation").should_be_called().will_return("name") geometry.rename_object("data", "name").should_be_called() geometry.link("representation", "data").should_be_called() diff --git a/src/blenderbim/test/tool/test_geometry.py b/src/blenderbim/test/tool/test_geometry.py index b043a713ec..6005642b0f 100644 --- a/src/blenderbim/test/tool/test_geometry.py +++ b/src/blenderbim/test/tool/test_geometry.py @@ -112,9 +112,9 @@ class TestDuplicateObjectData(NewFile): def test_run(self): data = bpy.data.meshes.new("Mesh") obj = bpy.data.objects.new("Object", data) - assert subject.duplicate_object_data(obj) == obj.data - assert obj.data != data - assert isinstance(obj.data, bpy.types.Mesh) + new_data = subject.duplicate_object_data(obj) + assert obj.data == data + assert isinstance(new_data, bpy.types.Mesh) class TestGetObjectData(NewFile):