Feature to manipulate Work Calendars (#1420)

This commit is contained in:
Sigma Dimensions
2021-04-07 00:51:20 +01:00
committed by GitHub
parent becb375ec2
commit 13d4a99358
11 changed files with 376 additions and 10 deletions
@@ -0,0 +1,48 @@
import ifcopenshell.api
import ifcopenshell.util.date
from datetime import datetime, timedelta
class Usecase:
def __init__(self, file, **settings):
self.file = file
self.settings = {
"name": "Unnamed",
"predefined_type": "NOTDEFINED",
"working_times":[],
"exception_times":[]
}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
work_calendar = ifcopenshell.api.run(
"root.create_entity",
self.file,
ifc_class="IfcWorkCalendar",
predefined_type=self.settings["predefined_type"],
name=self.settings["name"],
)
working_time = self.file.create_entity("IfcWorkTime", **{"Name":"DefaultWorkingTime"})
self.settings["working_times"].append(working_time)
work_calendar.WorkingTimes = self.settings["working_times"]
exception_time = self.file.create_entity("IfcWorkTime", **{"Name":"DefaultExceptionTime"})
self.settings["exception_times"].append(exception_time)
work_calendar.ExceptionTimes = self.settings["exception_times"]
context = self.file.by_type("IfcContext")[0]
if context.Declares:
rel_declares = context.Declares[0]
ifcopenshell.api.run("owner.update_owner_history", self.file, element=rel_declares)
else:
rel_declares = self.file.create_entity("IfcRelDeclares", **{
"GlobalId": ifcopenshell.guid.new(),
"OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file),
"RelatingContext": context
})
related_definitions = list(rel_declares.RelatedDefinitions or [])
related_definitions.append(work_calendar)
rel_declares.RelatedDefinitions = related_definitions
return work_calendar
@@ -0,0 +1,37 @@
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.util.date
from datetime import datetime, timedelta
class Usecase:
def __init__(self, file, **settings):
self.file = file
self.settings = {
"object": None,
"name":None,
"recurrence_pattern": None,
"start": datetime.now(),
"finish": datetime.now() + timedelta(days=365)
}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
working_time = self.file.create_entity("IfcWorkTime", **{
"Name": self.settings["name"],
"Start": ifcopenshell.util.date.datetime2ifc(self.settings["start"], "IfcTime"),
"Finish": ifcopenshell.util.date.datetime2ifc(self.settings["finish"], "IfcTime")
})
#TODO Implement user settings for recurrence pattern
working_time.RecurrencePattern = ifcopenshell.api.run("time.add_recurrence_pattern", self.file)
if self.settings["object"].is_a('IfcWorkCalendar'):
if self.settings["object"].WorkingTimes:
working_times = list(self.settings["object"].WorkingTimes)
working_times.append(working_time)
self.settings["object"].WorkingTimes = working_times
else:
self.settings["object"].WorkingTimes = [working_time]
return working_time
@@ -1,15 +1,17 @@
import ifcopenshell.util.date
class Data:
is_loaded = False
work_plans = {}
work_schedules = {}
tasks = {}
@classmethod
def purge(cls):
cls.is_loaded = False
cls.work_plans = {}
cls.work_schedules = {}
cls.work_calendars = {}
cls.tasks = {}
@classmethod
@@ -19,6 +21,7 @@ class Data:
return
cls.load_work_plans()
cls.load_work_schedules()
cls.load_work_calendars()
cls.load_tasks()
cls.is_loaded=True
@@ -36,6 +39,45 @@ class Data:
data["FinishTime"] = ifcopenshell.util.date.ifc2datetime(data["FinishTime"]).isoformat()
cls.work_plans[work_plan.id()] = data
@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"]]
data["CreationDate"] = ifcopenshell.util.date.ifc2datetime(data["CreationDate"]).isoformat()
data["StartTime"] = ifcopenshell.util.date.ifc2datetime(data["StartTime"]).isoformat()
if data["FinishTime"]:
data["FinishTime"] = ifcopenshell.util.date.ifc2datetime(data["FinishTime"]).isoformat()
cls.work_schedules[work_schedule.id()] = data
@classmethod
def load_work_calendars(cls):
for work_calendar in cls._file.by_type("IfcWorkCalendar"):
data = work_calendar.get_info()
del data["OwnerHistory"]
##### HOW DO WE NEST ENTITIES SUCH AS WORKTIME? ####
##### HOW TO ALLOW DISPLAY OF TIME? AND DATES? ####
del data["WorkingTimes"]
del data["ExceptionTimes"]
# if data["WorkingTimes"]:
# for worktime in data["WorkingTimes"]:
# worktime_data = {}
# if worktime.Start:
# worktime_data["start"] = ifcopenshell.util.date.ifc2datetime(worktime.Start).isoformat()
# if worktime.Start:
# worktime_data["finish"] = ifcopenshell.util.date.ifc2datetime(worktime.Start).isoformat()
# worktime = worktime_data
# if data["ExceptionTimes"]:
# for exceptiontime in data["ExceptionTimes"]:
# exceptiontime_data = {}
# exceptiontime_data["start"] = ifcopenshell.util.date.ifc2datetime(exceptiontime.Finish).isoformat()
# exceptiontime_data["finish"] = ifcopenshell.util.date.ifc2datetime(exceptiontime.Finish).isoformat()
# exceptiontime = exceptiontime_data
cls.work_calendars[work_calendar.id()] = data
@classmethod
def load_tasks(cls):
cls.tasks = {}
@@ -0,0 +1,13 @@
class Usecase:
def __init__(self, file, **settings):
self.file = file
self.settings = {
"work_calendar": None,
"attributes": {}
}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
for name, value in self.settings["attributes"].items():
setattr(self.settings["work_calendar"], name, value)
@@ -0,0 +1,14 @@
class Usecase:
def __init__(self, file, **settings):
self.file = file
self.settings = {"work_calendar": None}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
# TODO: do a deep purge
if self.settings["work_calendar"].HasContext:
rel_declares = self.settings["work_calendar"].HasContext[0]
if len(rel_declares.RelatedDefinitions) == 1:
self.file.remove(rel_declares)
self.file.remove(self.settings["work_calendar"])