diff --git a/src/blenderbim/test/bim/feature/geometry.feature b/src/blenderbim/test/bim/feature/geometry.feature index db809402d2..163f0e5c7d 100644 --- a/src/blenderbim/test/bim/feature/geometry.feature +++ b/src/blenderbim/test/bim/feature/geometry.feature @@ -439,6 +439,62 @@ Scenario: Override duplicate move - copying an aggregate And the object "IfcElementAssembly/Assembly.001" is in the collection "IfcElementAssembly/Assembly.001" And the collection "IfcElementAssembly/Assembly.001" is in the collection "IfcBuildingStorey/My Storey" +Scenario: Override duplicate move - copying objects with connection + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcWallType" + And the variable "element_type" is "[e for e in {ifc}.by_type('IfcWallType') if e.Name == 'WAL100'][0].id()" + And I set "scene.BIMModelProperties.relating_type_id" to "{element_type}" + When I press "bim.add_constr_type_instance" + Then the object "IfcWall/Wall" is an "IfcWall" + And the object "IfcWall/Wall" dimensions are "1,0.1,3" + And the object "IfcWall/Wall" bottom left corner is at "0,0,0" + When I set "scene.BIMModelProperties.ifc_class" to "IfcSlabType" + And the variable "element_type" is "[e for e in {ifc}.by_type('IfcSlabType') if e.Name == 'FLR150'][0].id()" + And I set "scene.BIMModelProperties.relating_type_id" to "{element_type}" + When I press "bim.add_constr_type_instance" + Then the object "IfcSlab/Slab" is an "IfcSlab" + When the object "IfcSlab/Slab" is selected + And the object "IfcSlab/Slab" is moved to "0,0,4" + When I deselect all objects + And the object "IfcWall/Wall" is selected + And additionally the object "IfcSlab/Slab" is selected + When I press "bim.hotkey(hotkey='S_E')" + Then the object "IfcWall/Wall" dimensions are "1,0.1,4" + When I duplicate the selected objects + Then the object "IfcWall/Wall.001" exists + And the variable "wall_name" is "[o.name for o in bpy.context.selected_objects if o.name == 'IfcWall/Wall.001'][0]" + Then the object "IfcSlab/Slab.001" exists + And the variable "slab_name" is "[o.name for o in bpy.context.selected_objects if o.name == 'IfcSlab/Slab.001'][0]" + Then the object "{wall_name}" has a connection with "{slab_name}" + +Scenario: Override duplicate move - copying walls with mitre joint + Given an empty IFC project + And I load the demo construction library + And I set "scene.BIMModelProperties.ifc_class" to "IfcWallType" + And the variable "element_type" is "[e for e in {ifc}.by_type('IfcWallType') if e.Name == 'WAL100'][0].id()" + And I set "scene.BIMModelProperties.relating_type_id" to "{element_type}" + And I press "bim.hotkey(hotkey='S_A')" + And the cursor is at "0.5,0,0" + And I press "bim.hotkey(hotkey='S_A')" + And the object "IfcWall/Wall" is selected + And additionally the object "IfcWall/Wall.001" is selected + When I press "bim.hotkey(hotkey='S_Y')" + Then the object "IfcWall/Wall.001" dimensions are "0.5,0.1,3" + And the object "IfcWall/Wall.001" bottom left corner is at "0.5,0,0" + And the object "IfcWall/Wall" dimensions are "1.1,0.1,3" + And the object "IfcWall/Wall" bottom left corner is at "0.5,0.1,0" + And the object "IfcWall/Wall" top right corner is at "0.6,-1,3" + When I deselect all objects + And the object "IfcWall/Wall" is selected + And additionally the object "IfcWall/Wall.001" is selected + When I duplicate the selected objects + Then the object "IfcWall/Wall.002" exists + And the variable "wall_name1" is "[o.name for o in bpy.context.selected_objects if o.name == 'IfcWall/Wall.002'][0]" + Then the object "IfcWall/Wall.003" exists + And the variable "wall_name2" is "[o.name for o in bpy.context.selected_objects if o.name == 'IfcWall/Wall.003'][0]" + Then the object "{wall_name1}" has a connection with "{wall_name2}" + Scenario: Override duplicate move linked - without active IFC data Given an empty Blender session And I add a cube diff --git a/src/blenderbim/test/bim/test_feature.py b/src/blenderbim/test/bim/test_feature.py index 9fd1c4317f..ae424f1444 100644 --- a/src/blenderbim/test/bim/test_feature.py +++ b/src/blenderbim/test/bim/test_feature.py @@ -837,3 +837,28 @@ def run_pdb(): import pdb pdb.set_trace() + +@then(parsers.parse('the object "{obj_name1}" has a connection with "{obj_name2}"')) +def the_obj1_has_a_connection_with_obj2(obj_name1, obj_name2): + element1 = replace_variables(obj_name1) + element1 = tool.Ifc.get_entity(the_object_name_exists(element1)) + element2 = replace_variables(obj_name2) + element2 = tool.Ifc.get_entity(the_object_name_exists(element2)) + connections = [] + if hasattr(element1, "ConnectedTo") and element1.ConnectedTo: + connections = [connection for connection in element1.ConnectedTo] + elif hasattr(element1, "ConnectedFrom") and element1.ConnectedFrom: + connections = [connection for connection in element1.ConnectedFrom] + else: + assert False, f'Object "{obj_name1}" has no connections' + + + relationships = {} + for conn in connections: + relationships[conn.RelatedElement] = conn.RelatingElement + + for key, value in relationships.items(): + print(key, value) + # assert False, f"1-{key} and {element1.id()} and {key.id()}" + assert (key.id() == element1.id() and value.id() == element2.id()) or (key.id() == element2.id() and value.id() == element1.id()), f"The object {obj_name1} is connected to {obj_name2}" +