Fix bug where adding a representation to a type instance didn't share meshes

This commit is contained in:
Dion Moult
2021-11-06 18:51:00 +11:00
parent 117f663f48
commit 4149292a13
5 changed files with 27 additions and 6 deletions
@@ -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)
+1 -2
View File
@@ -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):
@@ -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
@@ -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()
+3 -3
View File
@@ -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):