Implement inherited calendars in the sequencing task tree

This commit is contained in:
Dion Moult
2021-05-10 18:40:51 +10:00
parent 1b4b2a526d
commit d98ac8ce89
5 changed files with 50 additions and 11 deletions
@@ -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
@@ -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"}
@@ -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")
@@ -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
@@ -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