diff --git a/src/blenderbim/pytest.ini b/src/blenderbim/pytest.ini index 07f53e6d6d..fab708981e 100644 --- a/src/blenderbim/pytest.ini +++ b/src/blenderbim/pytest.ini @@ -1,6 +1,7 @@ [pytest] markers = aggregate + bimtester context geometry material @@ -11,6 +12,7 @@ markers = pset_template qto root + sequence spatial style type diff --git a/src/blenderbim/test/bim/feature/bimtester.feature b/src/blenderbim/test/bim/feature/bimtester.feature new file mode 100644 index 0000000000..cbfdceab1a --- /dev/null +++ b/src/blenderbim/test/bim/feature/bimtester.feature @@ -0,0 +1,9 @@ +@bimtester +Feature: Bimtester + +Scenario: Execute Bimtester + Given an empty IFC project + When I set "scene.BimTesterProperties.should_load_from_memory" to "True" + And I set "scene.BimTesterProperties.feature" to "{cwd}/test/files/sample-ids.xml" + And I press "bim.execute_bim_tester" + Then the file "{cwd}/test/files/sample-ids.xml.html" should contain "Tests passed: 1 / 1 (100%)" diff --git a/src/blenderbim/test/bim/feature/root.feature b/src/blenderbim/test/bim/feature/root.feature index 407d60d4f8..23d9cbcc6b 100644 --- a/src/blenderbim/test/bim/feature/root.feature +++ b/src/blenderbim/test/bim/feature/root.feature @@ -1,5 +1,6 @@ @root Feature: Root + Covers IFC class operations on Blender objects Scenario: Unlink object Given an empty IFC project @@ -14,7 +15,6 @@ Scenario: Unlink object And the material "Material" is not an IFC material And the material "Material" is not an IFC style - Scenario: Copy class Given an empty IFC project And I add a cube @@ -23,3 +23,90 @@ Scenario: Copy class And I press "bim.assign_class" When I press "bim.copy_class(obj='IfcWall/Cube')" Then the object "IfcWall/Cube" is an "IfcWall" + +Scenario: Assign a class to a cube + Given an empty IFC project + And I add a cube + When the object "Cube" is selected + And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" + And I press "bim.assign_class" + Then the object "IfcWall/Cube" is an "IfcWall" + And the object "IfcWall/Cube" is in the collection "Collection" + And the object "IfcWall/Cube" has a "Tessellation" representation of "Model/Body/MODEL_VIEW" + +Scenario: Assign a type class to a cube + Given an empty IFC project + And I add a cube + When 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" + Then the object "IfcWallType/Cube" is an "IfcWallType" + And the object "IfcWallType/Cube" is in the collection "Types" + And the object "IfcWallType/Cube" has a "Tessellation" representation of "Model/Body/MODEL_VIEW" + +Scenario: Assign a spatial class to a cube + Given an empty IFC project + And I add a cube + When the object "Cube" is selected + And I set "scene.BIMRootProperties.ifc_product" to "IfcSpatialElement" + And I set "scene.BIMRootProperties.ifc_class" to "IfcBuilding" + And I press "bim.assign_class" + Then the object "IfcBuilding/Cube" is an "IfcBuilding" + And the object "IfcBuilding/Cube" is in the collection "IfcBuilding/Cube" + And the object "IfcBuilding/Cube" has a "Tessellation" representation of "Model/Body/MODEL_VIEW" + +Scenario: Assign an opening class to a cube + Given an empty IFC project + And I add a cube + When the object "Cube" is selected + And I set "scene.BIMRootProperties.ifc_product" to "IfcElement" + And I set "scene.BIMRootProperties.ifc_class" to "IfcOpeningElement" + And I press "bim.assign_class" + Then the object "IfcOpeningElement/Cube" is an "IfcOpeningElement" + And the object "IfcOpeningElement/Cube" should display as "WIRE" + And the object "IfcOpeningElement/Cube" is in the collection "IfcOpeningElements" + And the object "IfcOpeningElement/Cube" has a "Tessellation" representation of "Model/Body/MODEL_VIEW" + +Scenario: Assign a class to a cube in a collection + Given an empty IFC project + And I add a cube + When the object "Cube" is selected + And the object "Cube" is placed in the collection "IfcBuildingStorey/My Storey" + And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" + And I press "bim.assign_class" + Then the object "IfcWall/Cube" is contained in "My Storey" + +Scenario: Copy a wall + Given an empty IFC project + And I add a cube + When the object "Cube" is selected + And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" + And I press "bim.assign_class" + And I duplicate the selected objects + Then the object "IfcWall/Cube" and "IfcWall/Cube.001" are different elements + +Scenario: Copy a storey + Given an empty IFC project + And the object "IfcBuildingStorey/My Storey" is selected + When I duplicate the selected objects + Then the object "IfcBuildingStorey/My Storey" and "IfcBuildingStorey/My Storey.001" are different elements + And the object "IfcBuildingStorey/My Storey" is in the collection "IfcBuildingStorey/My Storey" + And the object "IfcBuildingStorey/My Storey.001" is in the collection "IfcBuildingStorey/My Storey.001" + And the collection "IfcBuildingStorey/My Storey.001" is in the collection "IfcBuilding/My Building" + +Scenario: Copy an opening + Given an empty IFC project + And I add a cube + When the object "Cube" is selected + And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" + And I press "bim.assign_class" + And I add a cube + And the object "Cube" is selected + And additionally the object "IfcWall/Cube" is selected + And I press "bim.add_opening(opening='Cube', obj='IfcWall/Cube')" + And the object "IfcOpeningElement/Cube" is selected + And I duplicate the selected objects + Then the object "IfcOpeningElement/Cube" and "IfcOpeningElement/Cube.001" are different elements + And the object "IfcWall/Cube" has a boolean difference by "IfcOpeningElement/Cube" + And the object "IfcWall/Cube" has a boolean difference by "IfcOpeningElement/Cube.001" diff --git a/src/blenderbim/test/bim/feature/sequence.feature b/src/blenderbim/test/bim/feature/sequence.feature new file mode 100644 index 0000000000..8c498c2dc5 --- /dev/null +++ b/src/blenderbim/test/bim/feature/sequence.feature @@ -0,0 +1,217 @@ +@sequence +Feature: Sequence + Covers Visualising Work Schedule Date Range. + +Scenario: See the current frame date as text + Given an empty IFC project + And I press "bim.add_work_schedule" + And the variable "work_schedule" is "IfcStore.get_file().by_type('IfcWorkSchedule')[0].id()" + And I press "bim.enable_editing_tasks(work_schedule={work_schedule})" + And I set "scene.BIMWorkScheduleProperties.visualisation_start" to "01/01/21" + And I set "scene.BIMWorkScheduleProperties.visualisation_finish" to "01/02/21" + And I set "scene.BIMWorkScheduleProperties.speed_types" to "FRAME_SPEED" + And I set "scene.BIMWorkScheduleProperties.speed_animation_frames" to "7" + And I set "scene.BIMWorkScheduleProperties.speed_real_duration" to "P1W" + And I press "bim.visualise_work_schedule_date_range(work_schedule={work_schedule})" + When I am on frame "1" + Then the object "Timeline" has a body of "2021-01-01" + When I am on frame "2" + Then the object "Timeline" has a body of "2021-01-02" + +Scenario: Animate the construction of a wall + Given an empty IFC project + And I press "bim.add_work_schedule" + And the variable "work_schedule" is "IfcStore.get_file().by_type('IfcWorkSchedule')[0].id()" + And I press "bim.enable_editing_tasks(work_schedule={work_schedule})" + And I press "bim.add_summary_task(work_schedule={work_schedule})" + And the variable "task" is "IfcStore.get_file().by_type('IfcTask')[0].id()" + And I press "bim.enable_editing_task(task={task})" + And I set "scene.BIMWorkScheduleProperties.task_attributes.get('PredefinedType').enum_value" to "CONSTRUCTION" + And I press "bim.edit_task" + And I press "bim.enable_editing_task_time(task={task})" + And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get('ScheduleStart').string_value" to "2021-01-02" + And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get('ScheduleFinish').string_value" to "2021-01-06" + And I press "bim.edit_task_time" + And I add a cube + And the object "Cube" is selected + And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" + And I press "bim.assign_class" + And the object "IfcWall/Cube" is selected + And I press "bim.assign_product(task={task}, relating_product='')" + And I set "scene.BIMWorkScheduleProperties.visualisation_start" to "01/01/21" + And I set "scene.BIMWorkScheduleProperties.visualisation_finish" to "01/02/21" + And I set "scene.BIMWorkScheduleProperties.speed_types" to "FRAME_SPEED" + And I set "scene.BIMWorkScheduleProperties.speed_animation_frames" to "7" + And I set "scene.BIMWorkScheduleProperties.speed_real_duration" to "P1W" + And I press "bim.visualise_work_schedule_date_range(work_schedule={work_schedule})" + When I am on frame "1" + Then "scene.objects.get('IfcWall/Cube').hide_viewport" is "True" + And "scene.objects.get('IfcWall/Cube').hide_render" is "True" + When I am on frame "2" + Then "scene.objects.get('IfcWall/Cube').hide_viewport" is "False" + And "scene.objects.get('IfcWall/Cube').hide_render" is "False" + And "scene.objects.get('IfcWall/Cube').color" is "[0.0, 1.0, 0.0, 1]" + When I am on frame "6" + Then "scene.objects.get('IfcWall/Cube').color" is "[1.0, 1.0, 1.0, 1]" + +Scenario: Animate the demolition of a wall + Given an empty IFC project + And I press "bim.add_work_schedule" + And the variable "work_schedule" is "IfcStore.get_file().by_type('IfcWorkSchedule')[0].id()" + And I press "bim.enable_editing_tasks(work_schedule={work_schedule})" + And I press "bim.add_summary_task(work_schedule={work_schedule})" + And the variable "task" is "IfcStore.get_file().by_type('IfcTask')[0].id()" + And I press "bim.enable_editing_task(task={task})" + And I set "scene.BIMWorkScheduleProperties.task_attributes.get('PredefinedType').enum_value" to "DEMOLITION" + And I press "bim.edit_task" + And I press "bim.enable_editing_task_time(task={task})" + And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get('ScheduleStart').string_value" to "2021-01-02" + And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get('ScheduleFinish').string_value" to "2021-01-06" + And I press "bim.edit_task_time" + And I add a cube + And the object "Cube" is selected + And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" + And I press "bim.assign_class" + And the object "IfcWall/Cube" is selected + And I press "bim.assign_product(task={task}, relating_product='')" + And I set "scene.BIMWorkScheduleProperties.visualisation_start" to "01/01/21" + And I set "scene.BIMWorkScheduleProperties.visualisation_finish" to "01/02/21" + And I set "scene.BIMWorkScheduleProperties.speed_types" to "FRAME_SPEED" + And I set "scene.BIMWorkScheduleProperties.speed_animation_frames" to "7" + And I set "scene.BIMWorkScheduleProperties.speed_real_duration" to "P1W" + And I press "bim.visualise_work_schedule_date_range(work_schedule={work_schedule})" + When I am on frame "1" + Then "scene.objects.get('IfcWall/Cube').hide_viewport" is "False" + And "scene.objects.get('IfcWall/Cube').hide_render" is "False" + And "scene.objects.get('IfcWall/Cube').color" is "[1.0, 1.0, 1.0, 1]" + When I am on frame "2" + Then "scene.objects.get('IfcWall/Cube').hide_viewport" is "False" + And "scene.objects.get('IfcWall/Cube').hide_render" is "False" + And "scene.objects.get('IfcWall/Cube').color" is "[1.0, 0.0, 0.0, 1]" + When I am on frame "6" + Then "scene.objects.get('IfcWall/Cube').hide_viewport" is "True" + And "scene.objects.get('IfcWall/Cube').hide_render" is "True" + And "scene.objects.get('IfcWall/Cube').color" is "[0.0, 0.0, 0.0, 1]" + +Scenario: Animate the operation of a wall + Given an empty IFC project + And I press "bim.add_work_schedule" + And the variable "work_schedule" is "IfcStore.get_file().by_type('IfcWorkSchedule')[0].id()" + And I press "bim.enable_editing_tasks(work_schedule={work_schedule})" + And I press "bim.add_summary_task(work_schedule={work_schedule})" + And the variable "task" is "IfcStore.get_file().by_type('IfcTask')[0].id()" + And I press "bim.enable_editing_task(task={task})" + And I set "scene.BIMWorkScheduleProperties.task_attributes.get('PredefinedType').enum_value" to "OPERATION" + And I press "bim.edit_task" + And I press "bim.enable_editing_task_time(task={task})" + And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get('ScheduleStart').string_value" to "2021-01-02" + And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get('ScheduleFinish').string_value" to "2021-01-06" + And I press "bim.edit_task_time" + And I add a cube + And the object "Cube" is selected + And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" + And I press "bim.assign_class" + And the object "IfcWall/Cube" is selected + And I press "bim.assign_product(task={task}, relating_product='')" + And I set "scene.BIMWorkScheduleProperties.visualisation_start" to "01/01/21" + And I set "scene.BIMWorkScheduleProperties.visualisation_finish" to "01/02/21" + And I set "scene.BIMWorkScheduleProperties.speed_types" to "FRAME_SPEED" + And I set "scene.BIMWorkScheduleProperties.speed_animation_frames" to "7" + And I set "scene.BIMWorkScheduleProperties.speed_real_duration" to "P1W" + And I press "bim.visualise_work_schedule_date_range(work_schedule={work_schedule})" + When I am on frame "1" + Then "scene.objects.get('IfcWall/Cube').color" is "[1.0, 1.0, 1.0, 1]" + When I am on frame "2" + Then "scene.objects.get('IfcWall/Cube').color" is "[0.0, 0.0, 1.0, 1]" + When I am on frame "6" + Then "scene.objects.get('IfcWall/Cube').color" is "[1.0, 1.0, 1.0, 1]" + +Scenario: Animate the movement of a wall + Given an empty IFC project + And I press "bim.add_work_schedule" + And the variable "work_schedule" is "IfcStore.get_file().by_type('IfcWorkSchedule')[0].id()" + And I press "bim.enable_editing_tasks(work_schedule={work_schedule})" + And I press "bim.add_summary_task(work_schedule={work_schedule})" + And the variable "task" is "IfcStore.get_file().by_type('IfcTask')[0].id()" + And I press "bim.enable_editing_task(task={task})" + And I set "scene.BIMWorkScheduleProperties.task_attributes.get('PredefinedType').enum_value" to "MOVE" + And I press "bim.edit_task" + And I press "bim.enable_editing_task_time(task={task})" + And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get('ScheduleStart').string_value" to "2021-01-02" + And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get('ScheduleFinish').string_value" to "2021-01-06" + And I press "bim.edit_task_time" + And I add a cube + And I rename the object "Cube" to "ToObject" + And the object "ToObject" is selected + And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" + And I press "bim.assign_class" + And the object "IfcWall/ToObject" is selected + And I press "bim.assign_product(task={task}, relating_product='')" + When I add a cube + And I rename the object "Cube" to "FromObject" + And the object "FromObject" is selected + And I press "bim.assign_class" + And the object "IfcWall/FromObject" is selected + And I press "bim.assign_process(task={task}, related_object_type='PRODUCT', related_object='')" + And I set "scene.BIMWorkScheduleProperties.visualisation_start" to "01/01/21" + And I set "scene.BIMWorkScheduleProperties.visualisation_finish" to "01/02/21" + And I set "scene.BIMWorkScheduleProperties.speed_types" to "FRAME_SPEED" + And I set "scene.BIMWorkScheduleProperties.speed_animation_frames" to "7" + And I set "scene.BIMWorkScheduleProperties.speed_real_duration" to "P1W" + And I press "bim.visualise_work_schedule_date_range(work_schedule={work_schedule})" + When I am on frame "1" + Then "scene.objects.get('IfcWall/FromObject').color" is "[1.0, 1.0, 1.0, 1]" + And "scene.objects.get('IfcWall/FromObject').hide_viewport" is "False" + And "scene.objects.get('IfcWall/FromObject').hide_render" is "False" + And "scene.objects.get('IfcWall/ToObject').hide_viewport" is "True" + And "scene.objects.get('IfcWall/ToObject').hide_render" is "True" + When I am on frame "2" + Then "scene.objects.get('IfcWall/FromObject').color" is "[1.0, 0.5, 0.0, 1]" + And "scene.objects.get('IfcWall/FromObject').hide_viewport" is "False" + And "scene.objects.get('IfcWall/FromObject').hide_render" is "False" + And "scene.objects.get('IfcWall/ToObject').color" is "[1.0, 1.0, 0.0, 1]" + And "scene.objects.get('IfcWall/ToObject').hide_viewport" is "False" + And "scene.objects.get('IfcWall/ToObject').hide_render" is "False" + When I am on frame "6" + Then "scene.objects.get('IfcWall/FromObject').color" is "[0.0, 0.0, 0.0, 1]" + Then "scene.objects.get('IfcWall/FromObject').hide_viewport" is "True" + Then "scene.objects.get('IfcWall/FromObject').hide_render" is "True" + And "scene.objects.get('IfcWall/ToObject').color" is "[1.0, 1.0, 1.0, 1]" + And "scene.objects.get('IfcWall/ToObject').hide_viewport" is "False" + And "scene.objects.get('IfcWall/ToObject').hide_render" is "False" + +Scenario: Animate the consumption of a wall + Given an empty IFC project + And I press "bim.add_work_schedule" + And the variable "work_schedule" is "IfcStore.get_file().by_type('IfcWorkSchedule')[0].id()" + And I press "bim.enable_editing_tasks(work_schedule={work_schedule})" + And I press "bim.add_summary_task(work_schedule={work_schedule})" + And the variable "task" is "IfcStore.get_file().by_type('IfcTask')[0].id()" + And I press "bim.enable_editing_task_time(task={task})" + And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get('ScheduleStart').string_value" to "2021-01-02" + And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get('ScheduleFinish').string_value" to "2021-01-06" + And I press "bim.edit_task_time" + And I add a cube + And the object "Cube" is selected + And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" + And I press "bim.assign_class" + And the object "IfcWall/Cube" is selected + And I press "bim.assign_process(task={task}, related_object_type='PRODUCT', related_object='')" + And I set "scene.BIMWorkScheduleProperties.visualisation_start" to "01/01/21" + And I set "scene.BIMWorkScheduleProperties.visualisation_finish" to "01/02/21" + And I set "scene.BIMWorkScheduleProperties.speed_types" to "FRAME_SPEED" + And I set "scene.BIMWorkScheduleProperties.speed_animation_frames" to "7" + And I set "scene.BIMWorkScheduleProperties.speed_real_duration" to "P1W" + And I press "bim.visualise_work_schedule_date_range(work_schedule={work_schedule})" + When I am on frame "1" + Then "scene.objects.get('IfcWall/Cube').color" is "[1.0, 1.0, 1.0, 1]" + And "scene.objects.get('IfcWall/Cube').hide_viewport" is "False" + And "scene.objects.get('IfcWall/Cube').hide_render" is "False" + When I am on frame "2" + Then "scene.objects.get('IfcWall/Cube').color" is "[0.0, 1.0, 1.0, 1]" + And "scene.objects.get('IfcWall/Cube').hide_viewport" is "False" + And "scene.objects.get('IfcWall/Cube').hide_render" is "False" + When I am on frame "6" + Then "scene.objects.get('IfcWall/Cube').color" is "[0.0, 0.0, 0.0, 1]" + Then "scene.objects.get('IfcWall/Cube').hide_viewport" is "True" + Then "scene.objects.get('IfcWall/Cube').hide_render" is "True" diff --git a/src/blenderbim/test/bim/module/bimtester/__init__.py b/src/blenderbim/test/bim/module/bimtester/__init__.py deleted file mode 100644 index fb33323db9..0000000000 --- a/src/blenderbim/test/bim/module/bimtester/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# BlenderBIM Add-on - OpenBIM Blender Add-on -# Copyright (C) 2021 Dion Moult -# -# This file is part of BlenderBIM Add-on. -# -# BlenderBIM Add-on is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# BlenderBIM Add-on is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with BlenderBIM Add-on. If not, see . diff --git a/src/blenderbim/test/bim/module/bimtester/test_operator.py b/src/blenderbim/test/bim/module/bimtester/test_operator.py deleted file mode 100644 index 0834a8fbb0..0000000000 --- a/src/blenderbim/test/bim/module/bimtester/test_operator.py +++ /dev/null @@ -1,31 +0,0 @@ -# BlenderBIM Add-on - OpenBIM Blender Add-on -# Copyright (C) 2021 Dion Moult -# -# This file is part of BlenderBIM Add-on. -# -# BlenderBIM Add-on is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# BlenderBIM Add-on is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with BlenderBIM Add-on. If not, see . - -import test.bim.bootstrap - - -class TestExecuteBIMTester(test.bim.bootstrap.NewFile): - @test.bim.bootstrap.scenario - def test_executing_bimtester(self): - return """ - Given an empty IFC project - When I enable "scene.BimTesterProperties.should_load_from_memory" - And I set "scene.BimTesterProperties.feature" to "{cwd}/test/files/sample-ids.xml" - And I press "bim.execute_bim_tester" - Then the file "{cwd}/test/files/sample-ids.xml.html" should contain "Tests passed: 1 / 1 (100%)" - """ diff --git a/src/blenderbim/test/bim/module/root/__init__.py b/src/blenderbim/test/bim/module/root/__init__.py deleted file mode 100644 index fb33323db9..0000000000 --- a/src/blenderbim/test/bim/module/root/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# BlenderBIM Add-on - OpenBIM Blender Add-on -# Copyright (C) 2021 Dion Moult -# -# This file is part of BlenderBIM Add-on. -# -# BlenderBIM Add-on is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# BlenderBIM Add-on is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with BlenderBIM Add-on. If not, see . diff --git a/src/blenderbim/test/bim/module/root/test_operator.py b/src/blenderbim/test/bim/module/root/test_operator.py deleted file mode 100644 index a875c6f2d4..0000000000 --- a/src/blenderbim/test/bim/module/root/test_operator.py +++ /dev/null @@ -1,134 +0,0 @@ -# BlenderBIM Add-on - OpenBIM Blender Add-on -# Copyright (C) 2021 Dion Moult -# -# This file is part of BlenderBIM Add-on. -# -# BlenderBIM Add-on is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# BlenderBIM Add-on is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with BlenderBIM Add-on. If not, see . - -import test.bim.bootstrap - - -class TestAssignClass(test.bim.bootstrap.NewFile): - @test.bim.bootstrap.scenario - def test_assigning_a_class_to_a_cube(self): - return """ - Given an empty IFC project - And I add a cube - When the object "Cube" is selected - And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" - And I press "bim.assign_class" - Then the object "IfcWall/Cube" is an "IfcWall" - And the object "IfcWall/Cube" is in the collection "Collection" - And the object "IfcWall/Cube" has a "Tessellation" representation of "Model/Body/MODEL_VIEW" - """ - - @test.bim.bootstrap.scenario - def test_assigning_a_type_class_to_a_cube(self): - return """ - Given an empty IFC project - And I add a cube - When 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" - Then the object "IfcWallType/Cube" is an "IfcWallType" - And the object "IfcWallType/Cube" is in the collection "Types" - And the object "IfcWallType/Cube" has a "Tessellation" representation of "Model/Body/MODEL_VIEW" - """ - - @test.bim.bootstrap.scenario - def test_assigning_a_spatial_class_to_a_cube(self): - return """ - Given an empty IFC project - And I add a cube - When the object "Cube" is selected - And I set "scene.BIMRootProperties.ifc_product" to "IfcSpatialElement" - And I set "scene.BIMRootProperties.ifc_class" to "IfcBuilding" - And I press "bim.assign_class" - Then the object "IfcBuilding/Cube" is an "IfcBuilding" - And the object "IfcBuilding/Cube" is in the collection "IfcBuilding/Cube" - And the object "IfcBuilding/Cube" has a "Tessellation" representation of "Model/Body/MODEL_VIEW" - """ - - @test.bim.bootstrap.scenario - def test_assigning_an_opening_class_to_a_cube(self): - return """ - Given an empty IFC project - And I add a cube - When the object "Cube" is selected - And I set "scene.BIMRootProperties.ifc_product" to "IfcElement" - And I set "scene.BIMRootProperties.ifc_class" to "IfcOpeningElement" - And I press "bim.assign_class" - Then the object "IfcOpeningElement/Cube" is an "IfcOpeningElement" - And the object "IfcOpeningElement/Cube" should display as "WIRE" - And the object "IfcOpeningElement/Cube" is in the collection "IfcOpeningElements" - And the object "IfcOpeningElement/Cube" has a "Tessellation" representation of "Model/Body/MODEL_VIEW" - """ - - @test.bim.bootstrap.scenario - def test_assigning_a_class_to_a_cube_in_a_collection(self): - return """ - Given an empty IFC project - And I add a cube - When the object "Cube" is selected - And the object "Cube" is placed in the collection "IfcBuildingStorey/My Storey" - And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" - And I press "bim.assign_class" - Then the object "IfcWall/Cube" is contained in "My Storey" - """ - - -class TestCopyClass(test.bim.bootstrap.NewFile): - @test.bim.bootstrap.scenario - def test_copying_a_wall(self): - return """ - Given an empty IFC project - And I add a cube - When the object "Cube" is selected - And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" - And I press "bim.assign_class" - And I duplicate the selected objects - Then the object "IfcWall/Cube" and "IfcWall/Cube.001" are different elements - """ - - @test.bim.bootstrap.scenario - def test_copying_a_storey(self): - return """ - Given an empty IFC project - And the object "IfcBuildingStorey/My Storey" is selected - When I duplicate the selected objects - Then the object "IfcBuildingStorey/My Storey" and "IfcBuildingStorey/My Storey.001" are different elements - And the object "IfcBuildingStorey/My Storey" is in the collection "IfcBuildingStorey/My Storey" - And the object "IfcBuildingStorey/My Storey.001" is in the collection "IfcBuildingStorey/My Storey.001" - And the collection "IfcBuildingStorey/My Storey.001" is in the collection "IfcBuilding/My Building" - """ - - @test.bim.bootstrap.scenario - def test_copying_an_opening(self): - return """ - Given an empty IFC project - And I add a cube - When the object "Cube" is selected - And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" - And I press "bim.assign_class" - And I add a cube - And the object "Cube" is selected - And additionally the object "IfcWall/Cube" is selected - And I press "bim.add_opening(opening='Cube', obj='IfcWall/Cube')" - And the object "IfcOpeningElement/Cube" is selected - And I duplicate the selected objects - Then the object "IfcOpeningElement/Cube" and "IfcOpeningElement/Cube.001" are different elements - And the object "IfcWall/Cube" has a boolean difference by "IfcOpeningElement/Cube" - And the object "IfcWall/Cube" has a boolean difference by "IfcOpeningElement/Cube.001" - """ diff --git a/src/blenderbim/test/bim/module/sequence/__init__.py b/src/blenderbim/test/bim/module/sequence/__init__.py deleted file mode 100644 index fb33323db9..0000000000 --- a/src/blenderbim/test/bim/module/sequence/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# BlenderBIM Add-on - OpenBIM Blender Add-on -# Copyright (C) 2021 Dion Moult -# -# This file is part of BlenderBIM Add-on. -# -# BlenderBIM Add-on is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# BlenderBIM Add-on is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with BlenderBIM Add-on. If not, see . diff --git a/src/blenderbim/test/bim/module/sequence/test_operator.py b/src/blenderbim/test/bim/module/sequence/test_operator.py deleted file mode 100644 index a84c3acb26..0000000000 --- a/src/blenderbim/test/bim/module/sequence/test_operator.py +++ /dev/null @@ -1,253 +0,0 @@ -# BlenderBIM Add-on - OpenBIM Blender Add-on -# Copyright (C) 2021 Dion Moult -# -# This file is part of BlenderBIM Add-on. -# -# BlenderBIM Add-on is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# BlenderBIM Add-on is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with BlenderBIM Add-on. If not, see . - -import test.bim.bootstrap - - -class TestVisualiseWorkScheduleDateRange(test.bim.bootstrap.NewFile): - @test.bim.bootstrap.scenario - def test_seeing_the_current_frame_date_as_text(self): - return """ - Given an empty IFC project - And I press "bim.add_work_schedule" - And the variable "work_schedule" is "IfcStore.get_file().by_type("IfcWorkSchedule")[0].id()" - And I press "bim.enable_editing_tasks(work_schedule={work_schedule})" - And I set "scene.BIMWorkScheduleProperties.visualisation_start" to "01/01/21" - And I set "scene.BIMWorkScheduleProperties.visualisation_finish" to "01/02/21" - And I set "scene.BIMWorkScheduleProperties.speed_types" to "FRAME_SPEED" - And I set "scene.BIMWorkScheduleProperties.speed_animation_frames" to "7" - And I set "scene.BIMWorkScheduleProperties.speed_real_duration" to "P1W" - And I press "bim.visualise_work_schedule_date_range(work_schedule={work_schedule})" - When I am on frame "1" - Then the object "Timeline" has a body of "2021-01-01" - When I am on frame "2" - Then the object "Timeline" has a body of "2021-01-02" - """ - - @test.bim.bootstrap.scenario - def test_animating_the_construction_of_a_wall(self): - return """ - Given an empty IFC project - And I press "bim.add_work_schedule" - And the variable "work_schedule" is "IfcStore.get_file().by_type("IfcWorkSchedule")[0].id()" - And I press "bim.enable_editing_tasks(work_schedule={work_schedule})" - And I press "bim.add_summary_task(work_schedule={work_schedule})" - And the variable "task" is "IfcStore.get_file().by_type("IfcTask")[0].id()" - And I press "bim.enable_editing_task(task={task})" - And I set "scene.BIMWorkScheduleProperties.task_attributes.get("PredefinedType").enum_value" to "CONSTRUCTION" - And I press "bim.edit_task" - And I press "bim.enable_editing_task_time(task={task})" - And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get("ScheduleStart").string_value" to "2021-01-02" - And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get("ScheduleFinish").string_value" to "2021-01-06" - And I press "bim.edit_task_time" - And I add a cube - And the object "Cube" is selected - And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" - And I press "bim.assign_class" - And the object "IfcWall/Cube" is selected - And I press "bim.assign_product(task={task}, relating_product='')" - And I set "scene.BIMWorkScheduleProperties.visualisation_start" to "01/01/21" - And I set "scene.BIMWorkScheduleProperties.visualisation_finish" to "01/02/21" - And I set "scene.BIMWorkScheduleProperties.speed_types" to "FRAME_SPEED" - And I set "scene.BIMWorkScheduleProperties.speed_animation_frames" to "7" - And I set "scene.BIMWorkScheduleProperties.speed_real_duration" to "P1W" - And I press "bim.visualise_work_schedule_date_range(work_schedule={work_schedule})" - When I am on frame "1" - Then "scene.objects.get('IfcWall/Cube').hide_viewport" is "True" - And "scene.objects.get('IfcWall/Cube').hide_render" is "True" - When I am on frame "2" - Then "scene.objects.get('IfcWall/Cube').hide_viewport" is "False" - And "scene.objects.get('IfcWall/Cube').hide_render" is "False" - And "scene.objects.get('IfcWall/Cube').color" is "[0.0, 1.0, 0.0, 1]" - When I am on frame "6" - Then "scene.objects.get('IfcWall/Cube').color" is "[1.0, 1.0, 1.0, 1]" - """ - - @test.bim.bootstrap.scenario - def test_animating_the_demolition_of_a_wall(self): - return """ - Given an empty IFC project - And I press "bim.add_work_schedule" - And the variable "work_schedule" is "IfcStore.get_file().by_type("IfcWorkSchedule")[0].id()" - And I press "bim.enable_editing_tasks(work_schedule={work_schedule})" - And I press "bim.add_summary_task(work_schedule={work_schedule})" - And the variable "task" is "IfcStore.get_file().by_type("IfcTask")[0].id()" - And I press "bim.enable_editing_task(task={task})" - And I set "scene.BIMWorkScheduleProperties.task_attributes.get("PredefinedType").enum_value" to "DEMOLITION" - And I press "bim.edit_task" - And I press "bim.enable_editing_task_time(task={task})" - And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get("ScheduleStart").string_value" to "2021-01-02" - And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get("ScheduleFinish").string_value" to "2021-01-06" - And I press "bim.edit_task_time" - And I add a cube - And the object "Cube" is selected - And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" - And I press "bim.assign_class" - And the object "IfcWall/Cube" is selected - And I press "bim.assign_product(task={task}, relating_product='')" - And I set "scene.BIMWorkScheduleProperties.visualisation_start" to "01/01/21" - And I set "scene.BIMWorkScheduleProperties.visualisation_finish" to "01/02/21" - And I set "scene.BIMWorkScheduleProperties.speed_types" to "FRAME_SPEED" - And I set "scene.BIMWorkScheduleProperties.speed_animation_frames" to "7" - And I set "scene.BIMWorkScheduleProperties.speed_real_duration" to "P1W" - And I press "bim.visualise_work_schedule_date_range(work_schedule={work_schedule})" - When I am on frame "1" - Then "scene.objects.get('IfcWall/Cube').hide_viewport" is "False" - And "scene.objects.get('IfcWall/Cube').hide_render" is "False" - And "scene.objects.get('IfcWall/Cube').color" is "[1.0, 1.0, 1.0, 1]" - When I am on frame "2" - Then "scene.objects.get('IfcWall/Cube').hide_viewport" is "False" - And "scene.objects.get('IfcWall/Cube').hide_render" is "False" - And "scene.objects.get('IfcWall/Cube').color" is "[1.0, 0.0, 0.0, 1]" - When I am on frame "6" - Then "scene.objects.get('IfcWall/Cube').hide_viewport" is "True" - And "scene.objects.get('IfcWall/Cube').hide_render" is "True" - And "scene.objects.get('IfcWall/Cube').color" is "[0.0, 0.0, 0.0, 1]" - """ - - @test.bim.bootstrap.scenario - def test_animating_the_operation_of_a_wall(self): - return """ - Given an empty IFC project - And I press "bim.add_work_schedule" - And the variable "work_schedule" is "IfcStore.get_file().by_type("IfcWorkSchedule")[0].id()" - And I press "bim.enable_editing_tasks(work_schedule={work_schedule})" - And I press "bim.add_summary_task(work_schedule={work_schedule})" - And the variable "task" is "IfcStore.get_file().by_type("IfcTask")[0].id()" - And I press "bim.enable_editing_task(task={task})" - And I set "scene.BIMWorkScheduleProperties.task_attributes.get("PredefinedType").enum_value" to "OPERATION" - And I press "bim.edit_task" - And I press "bim.enable_editing_task_time(task={task})" - And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get("ScheduleStart").string_value" to "2021-01-02" - And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get("ScheduleFinish").string_value" to "2021-01-06" - And I press "bim.edit_task_time" - And I add a cube - And the object "Cube" is selected - And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" - And I press "bim.assign_class" - And the object "IfcWall/Cube" is selected - And I press "bim.assign_product(task={task}, relating_product='')" - And I set "scene.BIMWorkScheduleProperties.visualisation_start" to "01/01/21" - And I set "scene.BIMWorkScheduleProperties.visualisation_finish" to "01/02/21" - And I set "scene.BIMWorkScheduleProperties.speed_types" to "FRAME_SPEED" - And I set "scene.BIMWorkScheduleProperties.speed_animation_frames" to "7" - And I set "scene.BIMWorkScheduleProperties.speed_real_duration" to "P1W" - And I press "bim.visualise_work_schedule_date_range(work_schedule={work_schedule})" - When I am on frame "1" - Then "scene.objects.get('IfcWall/Cube').color" is "[1.0, 1.0, 1.0, 1]" - When I am on frame "2" - Then "scene.objects.get('IfcWall/Cube').color" is "[0.0, 0.0, 1.0, 1]" - When I am on frame "6" - Then "scene.objects.get('IfcWall/Cube').color" is "[1.0, 1.0, 1.0, 1]" - """ - - @test.bim.bootstrap.scenario - def test_animating_the_movement_of_a_wall(self): - return """ - Given an empty IFC project - And I press "bim.add_work_schedule" - And the variable "work_schedule" is "IfcStore.get_file().by_type("IfcWorkSchedule")[0].id()" - And I press "bim.enable_editing_tasks(work_schedule={work_schedule})" - And I press "bim.add_summary_task(work_schedule={work_schedule})" - And the variable "task" is "IfcStore.get_file().by_type("IfcTask")[0].id()" - And I press "bim.enable_editing_task(task={task})" - And I set "scene.BIMWorkScheduleProperties.task_attributes.get("PredefinedType").enum_value" to "MOVE" - And I press "bim.edit_task" - And I press "bim.enable_editing_task_time(task={task})" - And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get("ScheduleStart").string_value" to "2021-01-02" - And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get("ScheduleFinish").string_value" to "2021-01-06" - And I press "bim.edit_task_time" - And I add a cube - And I rename the object "Cube" to "ToObject" - And the object "ToObject" is selected - And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" - And I press "bim.assign_class" - And the object "IfcWall/ToObject" is selected - And I press "bim.assign_product(task={task}, relating_product='')" - When I add a cube - And I rename the object "Cube" to "FromObject" - And the object "FromObject" is selected - And I press "bim.assign_class" - And the object "IfcWall/FromObject" is selected - And I press "bim.assign_process(task={task}, related_object_type="PRODUCT", related_object='')" - And I set "scene.BIMWorkScheduleProperties.visualisation_start" to "01/01/21" - And I set "scene.BIMWorkScheduleProperties.visualisation_finish" to "01/02/21" - And I set "scene.BIMWorkScheduleProperties.speed_types" to "FRAME_SPEED" - And I set "scene.BIMWorkScheduleProperties.speed_animation_frames" to "7" - And I set "scene.BIMWorkScheduleProperties.speed_real_duration" to "P1W" - And I press "bim.visualise_work_schedule_date_range(work_schedule={work_schedule})" - When I am on frame "1" - Then "scene.objects.get('IfcWall/FromObject').color" is "[1.0, 1.0, 1.0, 1]" - And "scene.objects.get('IfcWall/FromObject').hide_viewport" is "False" - And "scene.objects.get('IfcWall/FromObject').hide_render" is "False" - And "scene.objects.get('IfcWall/ToObject').hide_viewport" is "True" - And "scene.objects.get('IfcWall/ToObject').hide_render" is "True" - When I am on frame "2" - Then "scene.objects.get('IfcWall/FromObject').color" is "[1.0, 0.5, 0.0, 1]" - And "scene.objects.get('IfcWall/FromObject').hide_viewport" is "False" - And "scene.objects.get('IfcWall/FromObject').hide_render" is "False" - And "scene.objects.get('IfcWall/ToObject').color" is "[1.0, 1.0, 0.0, 1]" - And "scene.objects.get('IfcWall/ToObject').hide_viewport" is "False" - And "scene.objects.get('IfcWall/ToObject').hide_render" is "False" - When I am on frame "6" - Then "scene.objects.get('IfcWall/FromObject').color" is "[0.0, 0.0, 0.0, 1]" - Then "scene.objects.get('IfcWall/FromObject').hide_viewport" is "True" - Then "scene.objects.get('IfcWall/FromObject').hide_render" is "True" - And "scene.objects.get('IfcWall/ToObject').color" is "[1.0, 1.0, 1.0, 1]" - And "scene.objects.get('IfcWall/ToObject').hide_viewport" is "False" - And "scene.objects.get('IfcWall/ToObject').hide_render" is "False" - """ - - @test.bim.bootstrap.scenario - def test_animating_the_consumption_of_a_wall(self): - return """ - Given an empty IFC project - And I press "bim.add_work_schedule" - And the variable "work_schedule" is "IfcStore.get_file().by_type("IfcWorkSchedule")[0].id()" - And I press "bim.enable_editing_tasks(work_schedule={work_schedule})" - And I press "bim.add_summary_task(work_schedule={work_schedule})" - And the variable "task" is "IfcStore.get_file().by_type("IfcTask")[0].id()" - And I press "bim.enable_editing_task_time(task={task})" - And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get("ScheduleStart").string_value" to "2021-01-02" - And I set "scene.BIMWorkScheduleProperties.task_time_attributes.get("ScheduleFinish").string_value" to "2021-01-06" - And I press "bim.edit_task_time" - And I add a cube - And the object "Cube" is selected - And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" - And I press "bim.assign_class" - And the object "IfcWall/Cube" is selected - And I press "bim.assign_process(task={task}, related_object_type="PRODUCT", related_object='')" - And I set "scene.BIMWorkScheduleProperties.visualisation_start" to "01/01/21" - And I set "scene.BIMWorkScheduleProperties.visualisation_finish" to "01/02/21" - And I set "scene.BIMWorkScheduleProperties.speed_types" to "FRAME_SPEED" - And I set "scene.BIMWorkScheduleProperties.speed_animation_frames" to "7" - And I set "scene.BIMWorkScheduleProperties.speed_real_duration" to "P1W" - And I press "bim.visualise_work_schedule_date_range(work_schedule={work_schedule})" - When I am on frame "1" - Then "scene.objects.get('IfcWall/Cube').color" is "[1.0, 1.0, 1.0, 1]" - And "scene.objects.get('IfcWall/Cube').hide_viewport" is "False" - And "scene.objects.get('IfcWall/Cube').hide_render" is "False" - When I am on frame "2" - Then "scene.objects.get('IfcWall/Cube').color" is "[0.0, 1.0, 1.0, 1]" - And "scene.objects.get('IfcWall/Cube').hide_viewport" is "False" - And "scene.objects.get('IfcWall/Cube').hide_render" is "False" - When I am on frame "6" - Then "scene.objects.get('IfcWall/Cube').color" is "[0.0, 0.0, 0.0, 1]" - Then "scene.objects.get('IfcWall/Cube').hide_viewport" is "True" - Then "scene.objects.get('IfcWall/Cube').hide_render" is "True" - """ diff --git a/src/blenderbim/test/bim/test_feature.py b/src/blenderbim/test/bim/test_feature.py index b896ecf337..664a0ca73e 100644 --- a/src/blenderbim/test/bim/test_feature.py +++ b/src/blenderbim/test/bim/test_feature.py @@ -20,6 +20,7 @@ import os import bpy import ifcopenshell import blenderbim.tool as tool +import blenderbim.bim from blenderbim.bim.ifc import IfcStore from pytest_bdd import scenarios, given, when, then, parsers from mathutils import Vector @@ -104,6 +105,12 @@ def i_press_operator(operator): exec(f"bpy.ops.{operator}()") +@when("I duplicate the selected objects") +def i_duplicate_the_selected_objects(): + bpy.ops.object.duplicate_move() + blenderbim.bim.handler.active_object_callback() + + @when("I deselect all objects") def i_deselect_all_objects(): bpy.context.view_layer.objects.active = None @@ -117,6 +124,13 @@ def the_object_name_is_selected(name): additionally_the_object_name_is_selected(name) +@when(parsers.parse('the object "{name}" is placed in the collection "{collection}"')) +def the_object_name_is_placed_in_the_collection_collection(name, collection): + obj = the_object_name_exists(name) + [c.objects.unlink(obj) for c in obj.users_collection] + bpy.data.collections.get(collection).objects.link(obj) + + @given(parsers.parse('additionally the object "{name}" is selected')) @when(parsers.parse('additionally the object "{name}" is selected')) def additionally_the_object_name_is_selected(name): @@ -127,6 +141,12 @@ def additionally_the_object_name_is_selected(name): obj.select_set(True) +@given(parsers.parse('I rename the object "{name1}" to "{name2}"')) +@when(parsers.parse('I rename the object "{name1}" to "{name2}"')) +def i_rename_the_object_name1_to_name2(name1, name2): + the_object_name_exists(name1).name = name2 + + @given(parsers.parse('I set "{prop}" to "{value}"')) @when(parsers.parse('I set "{prop}" to "{value}"')) def i_set_prop_to_value(prop, value): @@ -141,6 +161,11 @@ def i_set_prop_to_value(prop, value): exec(f"bpy.context.{prop} = {value}") +@when(parsers.parse('I am on frame "{number}"')) +def i_am_on_frame_number(number): + bpy.context.scene.frame_set(int(number)) + + @when("I delete the selected objects") def i_delete_the_selected_objects(): bpy.ops.object.delete() @@ -166,6 +191,29 @@ def the_object_name_exists(name) -> bpy.types.Object: return obj +@then(parsers.parse('the object "{name1}" and "{name2}" are different elements')) +def the_object_name1_and_name2_are_different_elements(name1, name2): + ifc = an_ifc_file_exists() + element1 = ifc.by_id(the_object_name_exists(name1).BIMObjectProperties.ifc_definition_id) + element2 = ifc.by_id(the_object_name_exists(name2).BIMObjectProperties.ifc_definition_id) + assert element1 != element2, f"Objects {name1} and {name2} have same elements {element1} and {element2}" + + +@then(parsers.parse('the object "{name}" has a body of "{value}"')) +def the_object_name_has_a_body_of_value(name, value): + assert the_object_name_exists(name).data.body == value + + +@then(parsers.parse('the object "{name}" has a "{_type}" representation of "{context}"')) +def the_object_name_has_a_type_representation_of_context(name, _type, context): + ifc = an_ifc_file_exists() + element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id) + context, subcontext, target_view = context.split("/") + assert ifcopenshell.util.representation.get_representation( + element, context, subcontext or None, target_view or None + ) + + @then(parsers.parse('the material "{name}" exists')) def the_material_name_exists(name) -> bpy.types.Material: obj = bpy.data.materials.get(name) @@ -330,7 +378,7 @@ def prop_is_value(prop, value): @then(parsers.parse('the object "{name}" has the material "{material}"')) -def the_object_name_is_in_the_collection_collection(name, material): +def the_object_name_has_the_material_material(name, material): assert material in [ms.material.name for ms in the_object_name_exists(name).material_slots] @@ -357,6 +405,16 @@ def the_object_name_is_at_location(name, location): ).length < 0.1, f"Object is at {obj_location}" +@then(parsers.parse('the object "{name}" is contained in "{container_name}"')) +def the_object_name_is_contained_in_container_name(name, container_name): + ifc = an_ifc_file_exists() + element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id) + container = ifcopenshell.util.element.get_container(element) + if not container: + assert False, f'Object "{name}" is not in any container' + assert container.Name == container_name, f'Object "{name}" is in {container}' + + @then(parsers.parse('the file "{name}" should contain "{value}"')) def the_file_name_should_contain_value(name, value): name = replace_variables(name)