From a3802c25c0cf01cb1ced9d4770a08a343c011dcd Mon Sep 17 00:00:00 2001 From: "Sigma Dimensions (Yass)" <79010126+myoualid@users.noreply.github.com> Date: Wed, 20 Sep 2023 01:05:19 +0100 Subject: [PATCH] fix cascading schedule when parent tasks have sequence relationships #3772 --- .../api/sequence/cascade_schedule.py | 10 +++++++++- .../ifcopenshell/util/sequence.py | 20 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py index d8fc4f4384..b541a81670 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py @@ -135,7 +135,9 @@ class Usecase: finishes = [] starts = [] - for rel in task.IsSuccessorFrom: + for rel in ifcopenshell.util.sequence.get_sequence_assignment( + task, "predecessor" + ): predecessor = rel.RelatingProcess predecessor_duration = ( ifcopenshell.util.date.ifc2datetime( @@ -314,6 +316,12 @@ class Usecase: for rel in task.IsPredecessorTo: self.cascade_task(rel.RelatedProcess, task_sequence=task_sequence + [task]) + for rel in task.IsNestedBy: + [ + self.cascade_task(nested_task, task_sequence=task_sequence + [task]) + for nested_task in rel.RelatedObjects or [] + ] + def get_lag_time_days(self, lag_time): return ifcopenshell.util.date.ifc2datetime(lag_time.LagValue.wrappedValue).days diff --git a/src/ifcopenshell-python/ifcopenshell/util/sequence.py b/src/ifcopenshell-python/ifcopenshell/util/sequence.py index 02ec945a63..9389320120 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/util/sequence.py @@ -426,3 +426,23 @@ def get_tasks_for_product(product, schedule=None): ] return inputs, outputs + + +def get_sequence_assignment(task, sequence="successor"): + if sequence == "successor": + relationship_attr = "IsPredecessorTo" + elif sequence == "predecessor": + relationship_attr = "IsSuccessorFrom" + else: + return [] + + relationship = getattr(task, relationship_attr, None) + if relationship: + return relationship + + for rel in task.Nests or []: + result = get_sequence_assignment(rel.RelatingObject, sequence) + if result: + return result + + return []