From d98ac8ce8938c72c7a1590803a4f1187fb649336 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 10 May 2021 18:40:51 +1000 Subject: [PATCH] Implement inherited calendars in the sequencing task tree --- .../blenderbim/bim/module/sequence/helper.py | 29 +++++++++++++++++-- .../bim/module/sequence/operator.py | 23 +++++++++++---- .../blenderbim/bim/module/sequence/prop.py | 3 +- .../blenderbim/bim/module/sequence/ui.py | 5 +++- .../ifcopenshell/api/sequence/data.py | 1 + 5 files changed, 50 insertions(+), 11 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/sequence/helper.py b/src/blenderbim/blenderbim/bim/module/sequence/helper.py index 1fd685fd57..0bb980d09a 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/helper.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/helper.py @@ -86,9 +86,32 @@ def derive_date(ifc_definition_id, attribute_name, date=None, is_earliest=False, if current_date: return current_date for subtask in task["RelatedObjects"]: - current_date = derive_date( - subtask, attribute_name, date=date, is_earliest=is_earliest, is_latest=is_latest - ) + current_date = derive_date(subtask, attribute_name, date=date, is_earliest=is_earliest, is_latest=is_latest) + if is_earliest: + if current_date and (date is None or current_date < date): + date = current_date + if is_latest: + if current_date and (date is None or current_date > date): + date = current_date + return date + + +def derive_calendar(ifc_definition_id): + task = Data.tasks[ifc_definition_id] + if task["HasAssignmentsWorkCalendar"]: + return Data.work_calendars[task["HasAssignmentsWorkCalendar"][0]] + if task["Nests"]: + return derive_calendar(task["Nests"][0]) + + +def derive_duration(ifc_definition_id, attribute_name): + task = Data.tasks[ifc_definition_id] + if task["TaskTime"]: + current_date = Data.task_times[task["TaskTime"]][attribute_name] + if current_date: + return current_date + for subtask in task["RelatedObjects"]: + current_date = derive_date(subtask, attribute_name, date=date, is_earliest=is_earliest, is_latest=is_latest) if is_earliest: if current_date and (date is None or current_date < date): date = current_date diff --git a/src/blenderbim/blenderbim/bim/module/sequence/operator.py b/src/blenderbim/blenderbim/bim/module/sequence/operator.py index 4d4c5314fb..d8b550d5e8 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/operator.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/operator.py @@ -291,6 +291,14 @@ class LoadTaskProperties(bpy.types.Operator): item.is_successor = self.props.active_task_id in [ Data.sequences[r]["RelatingProcess"] for r in task["IsSuccessorFrom"] ] + + calendar = helper.derive_calendar(item.ifc_definition_id) + if task["HasAssignmentsWorkCalendar"]: + item.calendar = calendar["Name"] or "Unnamed" + else: + item.calendar = "" + item.derived_calendar = calendar["Name"] or "Unnamed" if calendar else "" + if task["TaskTime"]: task_time = Data.task_times[task["TaskTime"]] item.start = self.canonicalise_time(task_time["ScheduleStart"]) @@ -309,10 +317,7 @@ class LoadTaskProperties(bpy.types.Operator): item.start = "-" item.finish = "-" item.duration = "-" - if task["HasAssignmentsWorkCalendar"]: - item.calendar = Data.work_calendars[task["HasAssignmentsWorkCalendar"][0]]["Name"] or "Unnamed" - else: - item.calendar = "" + self.props.is_task_update_enabled = True return {"FINISHED"} @@ -1069,7 +1074,10 @@ class EditTaskCalendar(bpy.types.Operator): }, ) Data.load(IfcStore.get_file()) - bpy.ops.bim.load_task_properties(task=self.task) + if Data.tasks[self.task]["RelatedObjects"]: + bpy.ops.bim.load_task_properties() + else: + bpy.ops.bim.load_task_properties(task=self.task) return {"FINISHED"} @@ -1090,7 +1098,10 @@ class RemoveTaskCalendar(bpy.types.Operator): }, ) Data.load(IfcStore.get_file()) - bpy.ops.bim.load_task_properties(task=self.task) + if Data.tasks[self.task]["RelatedObjects"]: + bpy.ops.bim.load_task_properties() + else: + bpy.ops.bim.load_task_properties(task=self.task) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/sequence/prop.py b/src/blenderbim/blenderbim/bim/module/sequence/prop.py index 4a5a750939..5671b4b212 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/prop.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/prop.py @@ -156,10 +156,11 @@ class Task(PropertyGroup): duration: StringProperty(name="Duration") start: StringProperty(name="Start", update=updateTaskTimeStart) finish: StringProperty(name="Finish", update=updateTaskTimeFinish) + calendar: StringProperty(name="Calendar") derived_start: StringProperty(name="Derived Start") derived_finish: StringProperty(name="Derived Finish") derived_duration: StringProperty(name="Derived Duration") - calendar: StringProperty(name="Calendar") + derived_calendar: StringProperty(name="Derived Calendar") is_predecessor: BoolProperty(name="Is Predecessor") is_successor: BoolProperty(name="Is Successor") diff --git a/src/blenderbim/blenderbim/bim/module/sequence/ui.py b/src/blenderbim/blenderbim/bim/module/sequence/ui.py index 0a60b91168..6cf9a948de 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/ui.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/ui.py @@ -338,7 +338,10 @@ class BIM_UL_tasks(UIList): row.prop(item, "duration", emboss=False, text="") if props.should_show_calendars: - row.label(text=item.calendar) + if item.derived_calendar: + row.label(text=item.derived_calendar + "*") + else: + row.label(text=item.calendar or "-") if context.active_object: oprops = context.active_object.BIMObjectProperties diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/data.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/data.py index a59b519e94..2a3c32c2fb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/data.py @@ -133,6 +133,7 @@ class Data: data["TaskTime"] = data["TaskTime"].id() for rel in task.IsNestedBy: [data["RelatedObjects"].append(o.id()) for o in rel.RelatedObjects if o.is_a("IfcTask")] + data["Nests"] = [r.RelatingObject.id() for r in task.Nests or []] [ data["RelatingProducts"].append(r.RelatingProduct.id()) for r in task.HasAssignments