2021-03-31 11:35:40 +11:00
|
|
|
import ifcopenshell.util.date
|
|
|
|
|
|
2021-04-07 13:15:16 +10:00
|
|
|
|
2021-02-17 22:54:11 +11:00
|
|
|
class Data:
|
|
|
|
|
is_loaded = False
|
2021-03-31 11:35:40 +11:00
|
|
|
work_plans = {}
|
2021-04-07 00:51:20 +01:00
|
|
|
work_schedules = {}
|
2021-04-29 13:16:47 +10:00
|
|
|
work_calendars = {}
|
|
|
|
|
work_times = {}
|
|
|
|
|
recurrence_patterns = {}
|
|
|
|
|
time_periods = {}
|
2021-02-17 22:54:11 +11:00
|
|
|
tasks = {}
|
2021-04-20 05:12:13 +00:00
|
|
|
task_times = {}
|
2021-02-17 22:54:11 +11:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def purge(cls):
|
|
|
|
|
cls.is_loaded = False
|
2021-03-31 11:35:40 +11:00
|
|
|
cls.work_plans = {}
|
2021-04-07 00:51:20 +01:00
|
|
|
cls.work_schedules = {}
|
|
|
|
|
cls.work_calendars = {}
|
2021-04-29 13:16:47 +10:00
|
|
|
cls.work_times = {}
|
|
|
|
|
cls.recurrence_patterns = {}
|
|
|
|
|
cls.time_periods = {}
|
2021-02-17 22:54:11 +11:00
|
|
|
cls.tasks = {}
|
2021-04-20 17:11:06 +10:00
|
|
|
cls.task_times = {}
|
2021-02-17 22:54:11 +11:00
|
|
|
|
|
|
|
|
@classmethod
|
2021-03-25 10:48:31 +11:00
|
|
|
def load(cls, file):
|
2021-04-07 00:04:57 +01:00
|
|
|
cls._file = file
|
|
|
|
|
if not cls._file:
|
|
|
|
|
return
|
|
|
|
|
cls.load_work_plans()
|
|
|
|
|
cls.load_work_schedules()
|
2021-04-07 00:51:20 +01:00
|
|
|
cls.load_work_calendars()
|
2021-04-29 13:16:47 +10:00
|
|
|
cls.load_work_times()
|
|
|
|
|
cls.load_recurrence_patterns()
|
|
|
|
|
cls.load_time_periods()
|
2021-04-07 00:04:57 +01:00
|
|
|
cls.load_tasks()
|
2021-04-20 05:12:13 +00:00
|
|
|
cls.load_task_times()
|
2021-04-07 13:15:16 +10:00
|
|
|
cls.is_loaded = True
|
2021-04-07 00:04:57 +01:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def load_work_plans(cls):
|
2021-03-31 11:35:40 +11:00
|
|
|
cls.work_plans = {}
|
2021-04-07 00:04:57 +01:00
|
|
|
for work_plan in cls._file.by_type("IfcWorkPlan"):
|
2021-03-31 11:35:40 +11:00
|
|
|
data = work_plan.get_info()
|
|
|
|
|
del data["OwnerHistory"]
|
|
|
|
|
if data["Creators"]:
|
|
|
|
|
data["Creators"] = [p.id() for p in data["Creators"]]
|
2021-04-07 13:15:16 +10:00
|
|
|
data["CreationDate"] = ifcopenshell.util.date.ifc2datetime(data["CreationDate"])
|
|
|
|
|
data["StartTime"] = ifcopenshell.util.date.ifc2datetime(data["StartTime"])
|
2021-03-31 11:35:40 +11:00
|
|
|
if data["FinishTime"]:
|
2021-04-07 13:15:16 +10:00
|
|
|
data["FinishTime"] = ifcopenshell.util.date.ifc2datetime(data["FinishTime"])
|
2021-04-28 17:59:57 +10:00
|
|
|
data["IsDecomposedBy"] = []
|
|
|
|
|
for rel in work_plan.IsDecomposedBy:
|
|
|
|
|
data["IsDecomposedBy"].extend([o.id() for o in rel.RelatedObjects])
|
2021-03-31 11:35:40 +11:00
|
|
|
cls.work_plans[work_plan.id()] = data
|
2021-04-07 00:04:57 +01:00
|
|
|
|
2021-04-07 00:51:20 +01:00
|
|
|
@classmethod
|
|
|
|
|
def load_work_schedules(cls):
|
|
|
|
|
cls.work_schedules = {}
|
|
|
|
|
for work_schedule in cls._file.by_type("IfcWorkSchedule"):
|
|
|
|
|
data = work_schedule.get_info()
|
|
|
|
|
del data["OwnerHistory"]
|
|
|
|
|
if data["Creators"]:
|
|
|
|
|
data["Creators"] = [p.id() for p in data["Creators"]]
|
2021-04-07 13:15:16 +10:00
|
|
|
data["CreationDate"] = ifcopenshell.util.date.ifc2datetime(data["CreationDate"])
|
|
|
|
|
data["StartTime"] = ifcopenshell.util.date.ifc2datetime(data["StartTime"])
|
2021-04-07 00:51:20 +01:00
|
|
|
if data["FinishTime"]:
|
2021-04-07 13:15:16 +10:00
|
|
|
data["FinishTime"] = ifcopenshell.util.date.ifc2datetime(data["FinishTime"])
|
2021-04-15 10:38:45 +10:00
|
|
|
data["RelatedObjects"] = []
|
|
|
|
|
for rel in work_schedule.Controls:
|
|
|
|
|
for obj in rel.RelatedObjects:
|
|
|
|
|
if obj.is_a("IfcTask"):
|
|
|
|
|
data["RelatedObjects"].append(obj.id())
|
2021-04-07 00:51:20 +01:00
|
|
|
cls.work_schedules[work_schedule.id()] = data
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def load_work_calendars(cls):
|
2021-04-18 00:49:43 +00:00
|
|
|
cls.work_calendars = {}
|
2021-04-07 00:51:20 +01:00
|
|
|
for work_calendar in cls._file.by_type("IfcWorkCalendar"):
|
|
|
|
|
data = work_calendar.get_info()
|
2021-04-07 13:15:16 +10:00
|
|
|
del data["OwnerHistory"]
|
2021-04-29 13:16:47 +10:00
|
|
|
data["WorkingTimes"] = [t.id() for t in work_calendar.WorkingTimes or []]
|
|
|
|
|
data["ExceptionTimes"] = [t.id() for t in work_calendar.ExceptionTimes or []]
|
2021-04-07 00:51:20 +01:00
|
|
|
cls.work_calendars[work_calendar.id()] = data
|
|
|
|
|
|
2021-04-29 13:16:47 +10:00
|
|
|
@classmethod
|
|
|
|
|
def load_work_times(cls):
|
|
|
|
|
cls.work_times = {}
|
|
|
|
|
for work_time in cls._file.by_type("IfcWorkTime"):
|
|
|
|
|
data = work_time.get_info()
|
|
|
|
|
data["Start"] = ifcopenshell.util.date.ifc2datetime(data["Start"]) if data["Start"] else None
|
|
|
|
|
data["Finish"] = ifcopenshell.util.date.ifc2datetime(data["Finish"]) if data["Finish"] else None
|
|
|
|
|
data["RecurrencePattern"] = work_time.RecurrencePattern.id() if work_time.RecurrencePattern else None
|
|
|
|
|
cls.work_times[work_time.id()] = data
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def load_recurrence_patterns(cls):
|
|
|
|
|
cls.recurrence_patterns = {}
|
|
|
|
|
for recurrence_pattern in cls._file.by_type("IfcRecurrencePattern"):
|
|
|
|
|
data = recurrence_pattern.get_info()
|
|
|
|
|
data["TimePeriods"] = [t.id() for t in recurrence_pattern.TimePeriods or []]
|
|
|
|
|
cls.recurrence_patterns[recurrence_pattern.id()] = data
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def load_time_periods(cls):
|
|
|
|
|
cls.time_periods = {}
|
|
|
|
|
for time_period in cls._file.by_type("IfcTimePeriod"):
|
|
|
|
|
cls.time_periods[time_period.id()] = {
|
|
|
|
|
"StartTime": ifcopenshell.util.date.ifc2datetime(time_period.StartTime),
|
|
|
|
|
"EndTime": ifcopenshell.util.date.ifc2datetime(time_period.EndTime),
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-07 00:04:57 +01:00
|
|
|
@classmethod
|
|
|
|
|
def load_tasks(cls):
|
|
|
|
|
cls.tasks = {}
|
|
|
|
|
for task in cls._file.by_type("IfcTask"):
|
2021-04-18 00:49:43 +00:00
|
|
|
data = task.get_info()
|
|
|
|
|
del data["OwnerHistory"]
|
|
|
|
|
data["RelatedObjects"] = []
|
2021-04-21 11:53:33 +10:00
|
|
|
data["RelatingProducts"] = []
|
2021-04-19 13:09:00 +10:00
|
|
|
data["IsPredecessorTo"] = []
|
|
|
|
|
data["IsSuccessorFrom"] = []
|
2021-04-20 05:12:13 +00:00
|
|
|
if task.TaskTime:
|
2021-04-20 17:11:06 +10:00
|
|
|
data["TaskTime"] = data["TaskTime"].id()
|
2021-04-18 00:49:43 +00:00
|
|
|
for rel in task.IsNestedBy:
|
|
|
|
|
[data["RelatedObjects"].append(o.id()) for o in rel.RelatedObjects if o.is_a("IfcTask")]
|
2021-04-21 11:53:33 +10:00
|
|
|
[
|
|
|
|
|
data["RelatingProducts"].append(r.RelatingProduct.id())
|
|
|
|
|
for r in task.HasAssignments
|
|
|
|
|
if r.is_a("IfcRelAssignsToProduct")
|
|
|
|
|
]
|
2021-04-19 13:09:00 +10:00
|
|
|
[data["IsPredecessorTo"].append(rel.RelatedProcess.id()) for rel in task.IsPredecessorTo or []]
|
|
|
|
|
[data["IsSuccessorFrom"].append(rel.RelatingProcess.id()) for rel in task.IsSuccessorFrom or []]
|
2021-04-18 00:49:43 +00:00
|
|
|
cls.tasks[task.id()] = data
|
2021-04-20 05:12:13 +00:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def load_task_times(cls):
|
|
|
|
|
cls.task_times = {}
|
|
|
|
|
for task_time in cls._file.by_type("IfcTaskTime"):
|
|
|
|
|
data = task_time.get_info()
|
2021-04-20 17:11:06 +10:00
|
|
|
for key, value in data.items():
|
|
|
|
|
if not value:
|
|
|
|
|
continue
|
|
|
|
|
if "Start" in key or "Finish" in key or key == "StatusTime":
|
|
|
|
|
data[key] = ifcopenshell.util.date.ifc2datetime(value)
|
|
|
|
|
# TODO parse duration
|
2021-04-20 05:12:13 +00:00
|
|
|
cls.task_times[task_time.id()] = data
|