diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py index 42b57a364c..f753f04f97 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py @@ -19,6 +19,7 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.api.nest +import ifcopenshell.api.sequence import ifcopenshell.util.element @@ -63,8 +64,10 @@ def remove_task(file: ifcopenshell.file, task: ifcopenshell.entity_instance) -> definitions=[settings["task"]], relating_context=file.by_type("IfcContext")[0], ) - if settings["task"].TaskTime: - file.remove(settings["task"].TaskTime) + if task_time := settings["task"].TaskTime: + if task_time.is_a("IfcTaskTimeRecurring"): + ifcopenshell.api.sequence.unassign_recurrence_pattern(file, task_time.Recurrence) + file.remove(task_time) # Handle IfcRelNests. if rels := settings["task"].IsNestedBy: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py index 0ce5fae546..6a39c644ce 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py @@ -22,7 +22,10 @@ def unassign_recurrence_pattern(file: ifcopenshell.file, recurrence_pattern: ifc """Unassigns a recurrence pattern Note that a recurring task time must have a recurrence pattern, so if - you remove it, be sure to clean up after your + you remove it, be sure to clean up after this API call + (e.g. remove IfcTaskTimeRecurring entity + or assign a different recurrence patern to it + or replace IfcTaskTimeRecurring with IfcTaskTime). :param recurrence_pattern: The IfcRecurrencePattern to remove. :type recurrence_pattern: ifcopenshell.entity_instance diff --git a/src/ifcopenshell-python/test/api/sequence/test_remove_task.py b/src/ifcopenshell-python/test/api/sequence/test_remove_task.py index ed6c5822e3..a23cf9cb54 100644 --- a/src/ifcopenshell-python/test/api/sequence/test_remove_task.py +++ b/src/ifcopenshell-python/test/api/sequence/test_remove_task.py @@ -33,6 +33,23 @@ class TestRemoveTask(test.bootstrap.IFC4): ifcopenshell.api.sequence.remove_task(self.file, task) assert len(self.file.by_type("IfcTask")) == 0 + def test_remove_task_times(self): + self.file.create_entity("IfcProject") + + task = ifcopenshell.api.sequence.add_task(self.file) + task_time = ifcopenshell.api.sequence.add_task_time(self.file, task, is_recurring=True) + ifcopenshell.api.sequence.assign_recurrence_pattern(self.file, task_time, recurrence_type="DAILY") + + task2 = ifcopenshell.api.sequence.add_task(self.file) + task_time = ifcopenshell.api.sequence.add_task_time(self.file, task2, is_recurring=False) + + ifcopenshell.api.sequence.remove_task(self.file, task) + ifcopenshell.api.sequence.remove_task(self.file, task2) + + assert len(self.file.by_type("IfcTask")) == 0 + assert len(self.file.by_type("IfcTaskTime")) == 0 + assert len(self.file.by_type("IfcRecurrencePattern")) == 0 + def test_remove_task_with_subtasks(self): self.file.create_entity("IfcProject") work_schedule = ifcopenshell.api.sequence.add_work_schedule(self.file)