Replace all ifcopenshell.api.run with ifcopenshell.api static functions.

This commit is contained in:
Dion Moult
2024-06-28 12:36:31 +10:00
parent b5d613989e
commit 07060fc769
432 changed files with 4633 additions and 4856 deletions
@@ -17,7 +17,7 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import test.bootstrap
import ifcopenshell.api
import ifcopenshell.api.sequence
class TestAssignProduct(test.bootstrap.IFC4):
@@ -25,16 +25,16 @@ class TestAssignProduct(test.bootstrap.IFC4):
wall = self.file.createIfcWall()
task = self.file.createIfcTask()
task2 = self.file.createIfcTask()
ifcopenshell.api.run("sequence.assign_product", self.file, relating_product=wall, related_object=task)
ifcopenshell.api.sequence.assign_product(self.file, relating_product=wall, related_object=task)
assert wall.ReferencedBy[0].RelatedObjects == (task,)
ifcopenshell.api.run("sequence.assign_product", self.file, relating_product=wall, related_object=task2)
ifcopenshell.api.sequence.assign_product(self.file, relating_product=wall, related_object=task2)
assert wall.ReferencedBy[0].RelatedObjects == (task, task2)
def test_not_assigning_twice(self):
wall = self.file.createIfcWall()
task = self.file.createIfcTask()
ifcopenshell.api.run("sequence.assign_product", self.file, relating_product=wall, related_object=task)
ifcopenshell.api.run("sequence.assign_product", self.file, relating_product=wall, related_object=task)
ifcopenshell.api.sequence.assign_product(self.file, relating_product=wall, related_object=task)
ifcopenshell.api.sequence.assign_product(self.file, relating_product=wall, related_object=task)
assert wall.ReferencedBy[0].RelatedObjects == (task,)
@@ -17,74 +17,77 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import test.bootstrap
import ifcopenshell.api
import ifcopenshell.api.root
import ifcopenshell.api.pset
import ifcopenshell.api.sequence
import ifcopenshell.api.resource
# NOTE: sequence module features relies on entities introduced in IFC4
# therefore no IFC2X3 tests
class TestCalculateTaskDuration(test.bootstrap.IFC4):
def test_calculating_the_duration_based_on_a_labour_resource_with_work_hours(self):
ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject")
schedule = ifcopenshell.api.run("sequence.add_work_schedule", self.file)
task = ifcopenshell.api.run("sequence.add_task", self.file, work_schedule=schedule)
resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcLaborResource")
resource_time = ifcopenshell.api.run("resource.add_resource_time", self.file, resource=resource)
ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject")
schedule = ifcopenshell.api.sequence.add_work_schedule(self.file)
task = ifcopenshell.api.sequence.add_task(self.file, work_schedule=schedule)
resource = ifcopenshell.api.resource.add_resource(self.file, ifc_class="IfcLaborResource")
resource_time = ifcopenshell.api.resource.add_resource_time(self.file, resource=resource)
resource_time.ScheduleWork = "PT48H"
ifcopenshell.api.run("sequence.assign_process", self.file, relating_process=task, related_object=resource)
ifcopenshell.api.run("sequence.calculate_task_duration", self.file, task=task)
ifcopenshell.api.sequence.assign_process(self.file, relating_process=task, related_object=resource)
ifcopenshell.api.sequence.calculate_task_duration(self.file, task=task)
assert task.TaskTime.ScheduleDuration == "P6D"
def test_calculating_the_duration_based_on_a_labour_resource_with_work_days(self):
ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject")
schedule = ifcopenshell.api.run("sequence.add_work_schedule", self.file)
task = ifcopenshell.api.run("sequence.add_task", self.file, work_schedule=schedule)
resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcLaborResource")
resource_time = ifcopenshell.api.run("resource.add_resource_time", self.file, resource=resource)
ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject")
schedule = ifcopenshell.api.sequence.add_work_schedule(self.file)
task = ifcopenshell.api.sequence.add_task(self.file, work_schedule=schedule)
resource = ifcopenshell.api.resource.add_resource(self.file, ifc_class="IfcLaborResource")
resource_time = ifcopenshell.api.resource.add_resource_time(self.file, resource=resource)
resource_time.ScheduleWork = "P3.5D"
ifcopenshell.api.run("sequence.assign_process", self.file, relating_process=task, related_object=resource)
ifcopenshell.api.run("sequence.calculate_task_duration", self.file, task=task)
ifcopenshell.api.sequence.assign_process(self.file, relating_process=task, related_object=resource)
ifcopenshell.api.sequence.calculate_task_duration(self.file, task=task)
assert task.TaskTime.ScheduleDuration == "P4D"
def test_calculating_a_task_duration_without_a_work_schedule_defining_workday_duration(self):
ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject")
task = ifcopenshell.api.run("sequence.add_task", self.file)
resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcLaborResource")
resource_time = ifcopenshell.api.run("resource.add_resource_time", self.file, resource=resource)
ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject")
task = ifcopenshell.api.sequence.add_task(self.file)
resource = ifcopenshell.api.resource.add_resource(self.file, ifc_class="IfcLaborResource")
resource_time = ifcopenshell.api.resource.add_resource_time(self.file, resource=resource)
resource_time.ScheduleWork = "P2D"
ifcopenshell.api.run("sequence.assign_process", self.file, relating_process=task, related_object=resource)
ifcopenshell.api.run("sequence.calculate_task_duration", self.file, task=task)
ifcopenshell.api.sequence.assign_process(self.file, relating_process=task, related_object=resource)
ifcopenshell.api.sequence.calculate_task_duration(self.file, task=task)
assert task.TaskTime.ScheduleDuration == "P2D"
def test_calculating_a_task_duration_with_a_custom_workday_duration(self):
ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject")
schedule = ifcopenshell.api.run("sequence.add_work_schedule", self.file)
pset = ifcopenshell.api.run("pset.add_pset", self.file, product=schedule, name="Pset_WorkControlCommon")
ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"WorkDayDuration": "PT2H"})
task = ifcopenshell.api.run("sequence.add_task", self.file, work_schedule=schedule)
resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcLaborResource")
resource_time = ifcopenshell.api.run("resource.add_resource_time", self.file, resource=resource)
ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject")
schedule = ifcopenshell.api.sequence.add_work_schedule(self.file)
pset = ifcopenshell.api.pset.add_pset(self.file, product=schedule, name="Pset_WorkControlCommon")
ifcopenshell.api.pset.edit_pset(self.file, pset=pset, properties={"WorkDayDuration": "PT2H"})
task = ifcopenshell.api.sequence.add_task(self.file, work_schedule=schedule)
resource = ifcopenshell.api.resource.add_resource(self.file, ifc_class="IfcLaborResource")
resource_time = ifcopenshell.api.resource.add_resource_time(self.file, resource=resource)
resource_time.ScheduleWork = "PT48H"
ifcopenshell.api.run("sequence.assign_process", self.file, relating_process=task, related_object=resource)
ifcopenshell.api.run("sequence.calculate_task_duration", self.file, task=task)
ifcopenshell.api.sequence.assign_process(self.file, relating_process=task, related_object=resource)
ifcopenshell.api.sequence.calculate_task_duration(self.file, task=task)
assert task.TaskTime.ScheduleDuration == "P24D"
def test_failing_to_calculate_if_no_schedule_work_usage(self):
ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject")
schedule = ifcopenshell.api.run("sequence.add_work_schedule", self.file)
task = ifcopenshell.api.run("sequence.add_task", self.file, work_schedule=schedule)
resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcLaborResource")
ifcopenshell.api.run("sequence.assign_process", self.file, relating_process=task, related_object=resource)
ifcopenshell.api.run("sequence.calculate_task_duration", self.file, task=task)
ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject")
schedule = ifcopenshell.api.sequence.add_work_schedule(self.file)
task = ifcopenshell.api.sequence.add_task(self.file, work_schedule=schedule)
resource = ifcopenshell.api.resource.add_resource(self.file, ifc_class="IfcLaborResource")
ifcopenshell.api.sequence.assign_process(self.file, relating_process=task, related_object=resource)
ifcopenshell.api.sequence.calculate_task_duration(self.file, task=task)
assert task.TaskTime is None
def test_calculating_a_nested_task_duration_based_on_a_labour_resource_with_work_hours(self):
ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject")
schedule = ifcopenshell.api.run("sequence.add_work_schedule", self.file)
task = ifcopenshell.api.run("sequence.add_task", self.file, work_schedule=schedule)
subtask = ifcopenshell.api.run("sequence.add_task", self.file, parent_task=task)
resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcLaborResource")
resource_time = ifcopenshell.api.run("resource.add_resource_time", self.file, resource=resource)
ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject")
schedule = ifcopenshell.api.sequence.add_work_schedule(self.file)
task = ifcopenshell.api.sequence.add_task(self.file, work_schedule=schedule)
subtask = ifcopenshell.api.sequence.add_task(self.file, parent_task=task)
resource = ifcopenshell.api.resource.add_resource(self.file, ifc_class="IfcLaborResource")
resource_time = ifcopenshell.api.resource.add_resource_time(self.file, resource=resource)
resource_time.ScheduleWork = "PT48H"
ifcopenshell.api.run("sequence.assign_process", self.file, relating_process=subtask, related_object=resource)
ifcopenshell.api.run("sequence.calculate_task_duration", self.file, task=subtask)
ifcopenshell.api.sequence.assign_process(self.file, relating_process=subtask, related_object=resource)
ifcopenshell.api.sequence.calculate_task_duration(self.file, task=subtask)
assert subtask.TaskTime.ScheduleDuration == "P6D"
@@ -19,22 +19,22 @@
import pytest
import datetime
import test.bootstrap
import ifcopenshell.api
import ifcopenshell.api.sequence
# NOTE: sequence module features relies on entities introduced in IFC4
# therefore no IFC2X3 tests
class TestCascadeSchedule(test.bootstrap.IFC4):
def test_doing_nothing_if_the_task_has_no_successors(self):
task = ifcopenshell.api.run("sequence.add_task", self.file)
ifcopenshell.api.run("sequence.cascade_schedule", self.file, task=task)
task = ifcopenshell.api.sequence.add_task(self.file)
ifcopenshell.api.sequence.cascade_schedule(self.file, task=task)
assert task.TaskTime is None
def test_not_affecting_tasks_that_are_not_related(self):
task = self._create_task("P1D")
task2 = self._create_task("P1D")
ifcopenshell.api.run("sequence.cascade_schedule", self.file, task=task)
ifcopenshell.api.sequence.cascade_schedule(self.file, task=task)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
assert task2.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
@@ -47,7 +47,7 @@ class TestCascadeSchedule(test.bootstrap.IFC4):
self._create_sequence(task, task2, "FINISH_START")
self._create_sequence(task, task3, "FINISH_START", lag="P1D")
ifcopenshell.api.run("sequence.cascade_schedule", self.file, task=task2)
ifcopenshell.api.sequence.cascade_schedule(self.file, task=task2)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
assert task2.TaskTime.ScheduleStart == "2000-01-02T09:00:00"
@@ -62,7 +62,7 @@ class TestCascadeSchedule(test.bootstrap.IFC4):
self._create_sequence(task, task2, "FINISH_START")
with pytest.raises(RecursionError):
self._create_sequence(task2, task, "FINISH_START")
ifcopenshell.api.run("sequence.cascade_schedule", self.file, task=task)
ifcopenshell.api.sequence.cascade_schedule(self.file, task=task)
def test_cascading_finish_to_start(self):
task = self._create_task("P1D")
@@ -71,7 +71,7 @@ class TestCascadeSchedule(test.bootstrap.IFC4):
self._create_sequence(task, task2, "FINISH_START")
self._create_sequence(task, task3, "FINISH_START", lag="P1D")
ifcopenshell.api.run("sequence.cascade_schedule", self.file, task=task)
ifcopenshell.api.sequence.cascade_schedule(self.file, task=task)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
assert task2.TaskTime.ScheduleStart == "2000-01-02T09:00:00"
@@ -86,7 +86,7 @@ class TestCascadeSchedule(test.bootstrap.IFC4):
self._create_sequence(task, task2, "FINISH_START")
self._create_sequence(task, task3, "FINISH_START", lag="P1D")
ifcopenshell.api.run("sequence.cascade_schedule", self.file, task=task)
ifcopenshell.api.sequence.cascade_schedule(self.file, task=task)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T09:00:00"
assert task2.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
@@ -101,7 +101,7 @@ class TestCascadeSchedule(test.bootstrap.IFC4):
self._create_sequence(task, task2, "FINISH_FINISH")
self._create_sequence(task, task3, "FINISH_FINISH", lag="P1D")
ifcopenshell.api.run("sequence.cascade_schedule", self.file, task=task)
ifcopenshell.api.sequence.cascade_schedule(self.file, task=task)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
assert task2.TaskTime.ScheduleStart == "1999-12-31T09:00:00"
@@ -116,7 +116,7 @@ class TestCascadeSchedule(test.bootstrap.IFC4):
self._create_sequence(task, task2, "START_START")
self._create_sequence(task, task3, "START_START", lag="P1D")
ifcopenshell.api.run("sequence.cascade_schedule", self.file, task=task)
ifcopenshell.api.sequence.cascade_schedule(self.file, task=task)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
assert task2.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
@@ -131,7 +131,7 @@ class TestCascadeSchedule(test.bootstrap.IFC4):
self._create_sequence(task, task2, "START_FINISH")
self._create_sequence(task, task3, "START_FINISH", lag="P1D")
ifcopenshell.api.run("sequence.cascade_schedule", self.file, task=task)
ifcopenshell.api.sequence.cascade_schedule(self.file, task=task)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
assert task2.TaskTime.ScheduleStart == "1999-12-30T09:00:00"
@@ -146,7 +146,7 @@ class TestCascadeSchedule(test.bootstrap.IFC4):
self._create_sequence(task, task2, "START_FINISH")
self._create_sequence(task, task3, "START_FINISH", lag="P1D")
ifcopenshell.api.run("sequence.cascade_schedule", self.file, task=task)
ifcopenshell.api.sequence.cascade_schedule(self.file, task=task)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T09:00:00"
assert task2.TaskTime.ScheduleStart == "1999-12-30T09:00:00"
@@ -155,12 +155,11 @@ class TestCascadeSchedule(test.bootstrap.IFC4):
assert task3.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
def _create_task(self, duration):
task = ifcopenshell.api.run("sequence.add_task", self.file)
task = ifcopenshell.api.sequence.add_task(self.file)
if duration == "P0D":
task.IsMilestone = True
task_time = ifcopenshell.api.run("sequence.add_task_time", self.file, task=task)
ifcopenshell.api.run(
"sequence.edit_task_time",
task_time = ifcopenshell.api.sequence.add_task_time(self.file, task=task)
ifcopenshell.api.sequence.edit_task_time(
self.file,
task_time=task_time,
attributes={"ScheduleStart": datetime.date(2000, 1, 1), "ScheduleDuration": duration},
@@ -168,13 +167,11 @@ class TestCascadeSchedule(test.bootstrap.IFC4):
return task
def _create_sequence(self, predecessor, successor, relationship, lag=None):
rel = ifcopenshell.api.run(
"sequence.assign_sequence", self.file, relating_process=predecessor, related_process=successor
)
ifcopenshell.api.run(
"sequence.edit_sequence", self.file, rel_sequence=rel, attributes={"SequenceType": relationship}
rel = ifcopenshell.api.sequence.assign_sequence(
self.file, relating_process=predecessor, related_process=successor
)
ifcopenshell.api.sequence.edit_sequence(self.file, rel_sequence=rel, attributes={"SequenceType": relationship})
if lag:
ifcopenshell.api.run(
"sequence.assign_lag_time", self.file, rel_sequence=rel, lag_value=lag, duration_type="WORKTIME"
ifcopenshell.api.sequence.assign_lag_time(
self.file, rel_sequence=rel, lag_value=lag, duration_type="WORKTIME"
)
@@ -18,7 +18,9 @@
import datetime
import test.bootstrap
import ifcopenshell.api
import ifcopenshell.api.root
import ifcopenshell.api.control
import ifcopenshell.api.sequence
# NOTE: IfcTaskTime was introduced in IFC4
@@ -26,9 +28,8 @@ import ifcopenshell.api
class TestEditTaskTime(test.bootstrap.IFC4):
def test_editing_all_attributes(self):
task_time = ifcopenshell.api.run("sequence.add_task_time", self.file, task=self.file.createIfcTask())
ifcopenshell.api.run(
"sequence.edit_task_time",
task_time = ifcopenshell.api.sequence.add_task_time(self.file, task=self.file.createIfcTask())
ifcopenshell.api.sequence.edit_task_time(
self.file,
task_time=task_time,
attributes={
@@ -76,9 +77,8 @@ class TestEditTaskTime(test.bootstrap.IFC4):
assert task_time.Completion == 0.5
def test_editing_just_a_start_date_with_no_duration_or_finish(self):
task_time = ifcopenshell.api.run("sequence.add_task_time", self.file, task=self.file.createIfcTask())
ifcopenshell.api.run(
"sequence.edit_task_time",
task_time = ifcopenshell.api.sequence.add_task_time(self.file, task=self.file.createIfcTask())
ifcopenshell.api.sequence.edit_task_time(
self.file,
task_time=task_time,
attributes={
@@ -92,13 +92,12 @@ class TestEditTaskTime(test.bootstrap.IFC4):
assert task_time.ScheduleDuration is None
def test_editing_just_a_start_date_with_no_duration_or_finish_but_with_a_calendar(self):
ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject")
calendar = ifcopenshell.api.run("sequence.add_work_calendar", self.file)
ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject")
calendar = ifcopenshell.api.sequence.add_work_calendar(self.file)
task = self.file.createIfcTask()
ifcopenshell.api.run("control.assign_control", self.file, relating_control=calendar, related_object=task)
task_time = ifcopenshell.api.run("sequence.add_task_time", self.file, task=task)
ifcopenshell.api.run(
"sequence.edit_task_time",
ifcopenshell.api.control.assign_control(self.file, relating_control=calendar, related_object=task)
task_time = ifcopenshell.api.sequence.add_task_time(self.file, task=task)
ifcopenshell.api.sequence.edit_task_time(
self.file,
task_time=task_time,
attributes={
@@ -112,9 +111,8 @@ class TestEditTaskTime(test.bootstrap.IFC4):
assert task_time.ScheduleDuration is None
def test_schedule_finish_dates_are_auto_calculated_if_possible(self):
task_time = ifcopenshell.api.run("sequence.add_task_time", self.file, task=self.file.createIfcTask())
ifcopenshell.api.run(
"sequence.edit_task_time",
task_time = ifcopenshell.api.sequence.add_task_time(self.file, task=self.file.createIfcTask())
ifcopenshell.api.sequence.edit_task_time(
self.file,
task_time=task_time,
attributes={
@@ -129,9 +127,8 @@ class TestEditTaskTime(test.bootstrap.IFC4):
assert task_time.ScheduleFinish == "2000-01-01T17:00:00"
def test_schedule_durations_are_auto_calculated_if_possible(self):
task_time = ifcopenshell.api.run("sequence.add_task_time", self.file, task=self.file.createIfcTask())
ifcopenshell.api.run(
"sequence.edit_task_time",
task_time = ifcopenshell.api.sequence.add_task_time(self.file, task=self.file.createIfcTask())
ifcopenshell.api.sequence.edit_task_time(
self.file,
task_time=task_time,
attributes={
@@ -146,9 +143,8 @@ class TestEditTaskTime(test.bootstrap.IFC4):
assert task_time.ScheduleFinish == "2000-01-01T17:00:00"
def test_a_duration_takes_priority_over_start_and_finish_dates(self):
task_time = ifcopenshell.api.run("sequence.add_task_time", self.file, task=self.file.createIfcTask())
ifcopenshell.api.run(
"sequence.edit_task_time",
task_time = ifcopenshell.api.sequence.add_task_time(self.file, task=self.file.createIfcTask())
ifcopenshell.api.sequence.edit_task_time(
self.file,
task_time=task_time,
attributes={
@@ -164,9 +160,8 @@ class TestEditTaskTime(test.bootstrap.IFC4):
assert task_time.ScheduleFinish == "2000-01-01T17:00:00"
def test_durations_can_be_specified_in_datetime_objects(self):
task_time = ifcopenshell.api.run("sequence.add_task_time", self.file, task=self.file.createIfcTask())
ifcopenshell.api.run(
"sequence.edit_task_time",
task_time = ifcopenshell.api.sequence.add_task_time(self.file, task=self.file.createIfcTask())
ifcopenshell.api.sequence.edit_task_time(
self.file,
task_time=task_time,
attributes={
@@ -181,9 +176,8 @@ class TestEditTaskTime(test.bootstrap.IFC4):
assert task_time.ScheduleFinish == "2000-01-01T17:00:00"
def test_zero_durations_are_allowed(self):
task_time = ifcopenshell.api.run("sequence.add_task_time", self.file, task=self.file.createIfcTask())
ifcopenshell.api.run(
"sequence.edit_task_time",
task_time = ifcopenshell.api.sequence.add_task_time(self.file, task=self.file.createIfcTask())
ifcopenshell.api.sequence.edit_task_time(
self.file,
task_time=task_time,
attributes={
@@ -198,13 +192,12 @@ class TestEditTaskTime(test.bootstrap.IFC4):
assert task_time.ScheduleFinish == "2000-01-01T09:00:00"
def test_editing_a_start_date_and_duration_with_a_calendar(self):
ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject")
calendar = ifcopenshell.api.run("sequence.add_work_calendar", self.file)
ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject")
calendar = ifcopenshell.api.sequence.add_work_calendar(self.file)
task = self.file.createIfcTask()
ifcopenshell.api.run("control.assign_control", self.file, relating_control=calendar, related_object=task)
task_time = ifcopenshell.api.run("sequence.add_task_time", self.file, task=task)
ifcopenshell.api.run(
"sequence.edit_task_time",
ifcopenshell.api.control.assign_control(self.file, relating_control=calendar, related_object=task)
task_time = ifcopenshell.api.sequence.add_task_time(self.file, task=task)
ifcopenshell.api.sequence.edit_task_time(
self.file,
task_time=task_time,
attributes={
@@ -217,23 +210,19 @@ class TestEditTaskTime(test.bootstrap.IFC4):
assert task_time.ScheduleFinish == "2020-01-07T17:00:00"
assert task_time.ScheduleDuration == "P7D"
work_time = ifcopenshell.api.run(
"sequence.add_work_time", self.file, work_calendar=calendar, time_type="WorkingTimes"
work_time = ifcopenshell.api.sequence.add_work_time(self.file, work_calendar=calendar, time_type="WorkingTimes")
pattern = ifcopenshell.api.sequence.assign_recurrence_pattern(
self.file, parent=work_time, recurrence_type="WEEKLY"
)
pattern = ifcopenshell.api.run(
"sequence.assign_recurrence_pattern", self.file, parent=work_time, recurrence_type="WEEKLY"
)
ifcopenshell.api.run(
"sequence.edit_recurrence_pattern",
ifcopenshell.api.sequence.edit_recurrence_pattern(
self.file,
recurrence_pattern=pattern,
attributes={"WeekdayComponent": [1, 2, 3, 4, 5]},
)
ifcopenshell.api.run(
"sequence.add_time_period", self.file, recurrence_pattern=pattern, start_time="09:00", end_time="17:00"
ifcopenshell.api.sequence.add_time_period(
self.file, recurrence_pattern=pattern, start_time="09:00", end_time="17:00"
)
ifcopenshell.api.run(
"sequence.edit_task_time",
ifcopenshell.api.sequence.edit_task_time(
self.file,
task_time=task_time,
attributes={
@@ -18,7 +18,7 @@
import datetime
import test.bootstrap
import ifcopenshell.api
import ifcopenshell.api.sequence
# NOTE: IfcWorkTime was introduced in IFC4
@@ -34,7 +34,7 @@ class TestEditWorkTime(test.bootstrap.IFC4):
"Start": datetime.datetime(2020, 1, 1),
"Finish": datetime.datetime(2020, 2, 1),
}
ifcopenshell.api.run("sequence.edit_work_time", self.file, work_time=work_time, attributes=attributes)
ifcopenshell.api.sequence.edit_work_time(self.file, work_time=work_time, attributes=attributes)
assert work_time.Name == attributes["Name"]
assert work_time.DataOrigin == attributes["DataOrigin"]
assert work_time.UserDefinedDataOrigin == attributes["UserDefinedDataOrigin"]
@@ -55,7 +55,7 @@ class TestEditWorkTimeIFC4X3(test.bootstrap.IFC4X3):
"StartDate": datetime.datetime(2020, 1, 1),
"FinishDate": datetime.datetime(2020, 2, 1),
}
ifcopenshell.api.run("sequence.edit_work_time", self.file, work_time=work_time, attributes=attributes)
ifcopenshell.api.sequence.edit_work_time(self.file, work_time=work_time, attributes=attributes)
assert work_time.Name == attributes["Name"]
assert work_time.DataOrigin == attributes["DataOrigin"]
assert work_time.UserDefinedDataOrigin == attributes["UserDefinedDataOrigin"]
@@ -19,7 +19,8 @@
import pytest
import datetime
import test.bootstrap
import ifcopenshell.api
import ifcopenshell.api.root
import ifcopenshell.api.sequence
# NOTE: sequence module features relies on entities introduced in IFC4
@@ -28,8 +29,8 @@ import ifcopenshell.api
class TestRecalculateSchedule(test.bootstrap.IFC4):
def test_doing_nothing_if_the_task_has_no_time(self):
self._add_work_schedule()
task = ifcopenshell.api.run("sequence.add_task", self.file)
ifcopenshell.api.run("sequence.recalculate_schedule", self.file, work_schedule=self.work_schedule)
task = ifcopenshell.api.sequence.add_task(self.file)
ifcopenshell.api.sequence.recalculate_schedule(self.file, work_schedule=self.work_schedule)
assert task.TaskTime is None
def test_catching_cyclic_relationships(self):
@@ -44,12 +45,12 @@ class TestRecalculateSchedule(test.bootstrap.IFC4):
with pytest.raises(RecursionError):
self._create_sequence(task3, task2, "FINISH_START")
with pytest.raises(RecursionError):
ifcopenshell.api.run("sequence.recalculate_schedule", self.file, work_schedule=self.work_schedule)
ifcopenshell.api.sequence.recalculate_schedule(self.file, work_schedule=self.work_schedule)
def test_recalculating_for_a_single_task(self):
self._add_work_schedule()
task = self._create_task("P1D")
ifcopenshell.api.run("sequence.recalculate_schedule", self.file, work_schedule=self.work_schedule)
ifcopenshell.api.sequence.recalculate_schedule(self.file, work_schedule=self.work_schedule)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
assert task.TaskTime.EarlyStart == "2000-01-01T09:00:00"
@@ -65,7 +66,7 @@ class TestRecalculateSchedule(test.bootstrap.IFC4):
task = self._create_task("P1D")
task2 = self._create_task("P2D")
self._create_sequence(task, task2, "FINISH_START")
ifcopenshell.api.run("sequence.recalculate_schedule", self.file, work_schedule=self.work_schedule)
ifcopenshell.api.sequence.recalculate_schedule(self.file, work_schedule=self.work_schedule)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
assert task.TaskTime.EarlyStart == "2000-01-01T09:00:00"
@@ -92,8 +93,8 @@ class TestRecalculateSchedule(test.bootstrap.IFC4):
task3 = self._create_task("P3D")
self._create_sequence(task, task2, "FINISH_START")
self._create_sequence(task, task3, "FINISH_START", lag="P1D")
ifcopenshell.api.run("sequence.cascade_schedule", self.file, task=task)
ifcopenshell.api.run("sequence.recalculate_schedule", self.file, work_schedule=self.work_schedule)
ifcopenshell.api.sequence.cascade_schedule(self.file, task=task)
ifcopenshell.api.sequence.recalculate_schedule(self.file, work_schedule=self.work_schedule)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
assert task.TaskTime.EarlyStart == "2000-01-01T09:00:00"
@@ -129,8 +130,8 @@ class TestRecalculateSchedule(test.bootstrap.IFC4):
task3 = self._create_task("P0D")
self._create_sequence(task, task2, "FINISH_START")
self._create_sequence(task, task3, "FINISH_START", lag="P1D")
ifcopenshell.api.run("sequence.cascade_schedule", self.file, task=task)
ifcopenshell.api.run("sequence.recalculate_schedule", self.file, work_schedule=self.work_schedule)
ifcopenshell.api.sequence.cascade_schedule(self.file, task=task)
ifcopenshell.api.sequence.recalculate_schedule(self.file, work_schedule=self.work_schedule)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
assert task.TaskTime.EarlyStart == "2000-01-01T09:00:00"
@@ -166,8 +167,8 @@ class TestRecalculateSchedule(test.bootstrap.IFC4):
task3 = self._create_task("P0D")
self._create_sequence(task, task2, "FINISH_START")
self._create_sequence(task2, task3, "FINISH_START")
ifcopenshell.api.run("sequence.cascade_schedule", self.file, task=task)
ifcopenshell.api.run("sequence.recalculate_schedule", self.file, work_schedule=self.work_schedule)
ifcopenshell.api.sequence.cascade_schedule(self.file, task=task)
ifcopenshell.api.sequence.recalculate_schedule(self.file, work_schedule=self.work_schedule)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
assert task.TaskTime.EarlyStart == "2000-01-01T09:00:00"
@@ -201,7 +202,7 @@ class TestRecalculateSchedule(test.bootstrap.IFC4):
task = self._create_task("P1D")
task2 = self._create_task("P2D")
self._create_sequence(task, task2, "FINISH_FINISH")
ifcopenshell.api.run("sequence.recalculate_schedule", self.file, work_schedule=self.work_schedule)
ifcopenshell.api.sequence.recalculate_schedule(self.file, work_schedule=self.work_schedule)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
assert task.TaskTime.EarlyStart == "2000-01-01T09:00:00"
@@ -226,7 +227,7 @@ class TestRecalculateSchedule(test.bootstrap.IFC4):
task = self._create_task("P1D")
task2 = self._create_task("P2D")
self._create_sequence(task, task2, "START_START")
ifcopenshell.api.run("sequence.recalculate_schedule", self.file, work_schedule=self.work_schedule)
ifcopenshell.api.sequence.recalculate_schedule(self.file, work_schedule=self.work_schedule)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
assert task.TaskTime.EarlyStart == "2000-01-01T09:00:00"
@@ -251,7 +252,7 @@ class TestRecalculateSchedule(test.bootstrap.IFC4):
task = self._create_task("P1D")
task2 = self._create_task("P2D")
self._create_sequence(task, task2, "START_FINISH")
ifcopenshell.api.run("sequence.recalculate_schedule", self.file, work_schedule=self.work_schedule)
ifcopenshell.api.sequence.recalculate_schedule(self.file, work_schedule=self.work_schedule)
assert task.TaskTime.ScheduleStart == "2000-01-01T09:00:00"
assert task.TaskTime.ScheduleFinish == "2000-01-01T17:00:00"
assert task.TaskTime.EarlyStart == "2000-01-01T09:00:00"
@@ -272,16 +273,15 @@ class TestRecalculateSchedule(test.bootstrap.IFC4):
assert task2.TaskTime.IsCritical is True
def _add_work_schedule(self):
ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject")
self.work_schedule = ifcopenshell.api.run("sequence.add_work_schedule", self.file)
ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject")
self.work_schedule = ifcopenshell.api.sequence.add_work_schedule(self.file)
def _create_task(self, duration):
task = ifcopenshell.api.run("sequence.add_task", self.file, work_schedule=self.work_schedule)
task = ifcopenshell.api.sequence.add_task(self.file, work_schedule=self.work_schedule)
if duration == "P0D":
task.IsMilestone = True
task_time = ifcopenshell.api.run("sequence.add_task_time", self.file, task=task)
ifcopenshell.api.run(
"sequence.edit_task_time",
task_time = ifcopenshell.api.sequence.add_task_time(self.file, task=task)
ifcopenshell.api.sequence.edit_task_time(
self.file,
task_time=task_time,
attributes={"ScheduleStart": datetime.date(2000, 1, 1), "ScheduleDuration": duration},
@@ -289,13 +289,11 @@ class TestRecalculateSchedule(test.bootstrap.IFC4):
return task
def _create_sequence(self, predecessor, successor, relationship, lag=None):
rel = ifcopenshell.api.run(
"sequence.assign_sequence", self.file, relating_process=predecessor, related_process=successor
)
ifcopenshell.api.run(
"sequence.edit_sequence", self.file, rel_sequence=rel, attributes={"SequenceType": relationship}
rel = ifcopenshell.api.sequence.assign_sequence(
self.file, relating_process=predecessor, related_process=successor
)
ifcopenshell.api.sequence.edit_sequence(self.file, rel_sequence=rel, attributes={"SequenceType": relationship})
if lag:
ifcopenshell.api.run(
"sequence.assign_lag_time", self.file, rel_sequence=rel, lag_value=lag, duration_type="WORKTIME"
ifcopenshell.api.sequence.assign_lag_time(
self.file, rel_sequence=rel, lag_value=lag, duration_type="WORKTIME"
)
@@ -17,15 +17,15 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import test.bootstrap
import ifcopenshell.api
import ifcopenshell.api.sequence
class TestUnassignProduct(test.bootstrap.IFC4):
def test_unassigning_a_product(self):
wall = self.file.createIfcWall()
task = self.file.createIfcTask()
ifcopenshell.api.run("sequence.assign_product", self.file, relating_product=wall, related_object=task)
ifcopenshell.api.run("sequence.unassign_product", self.file, relating_product=wall, related_object=task)
ifcopenshell.api.sequence.assign_product(self.file, relating_product=wall, related_object=task)
ifcopenshell.api.sequence.unassign_product(self.file, relating_product=wall, related_object=task)
assert len(self.file.by_type("IfcRelAssignsToProduct")) == 0