Implement adding, editing, and removing time lags to sequence relationships

This commit is contained in:
Dion Moult
2021-05-04 20:56:19 +10:00
parent f63479c823
commit a05d017341
8 changed files with 207 additions and 34 deletions
@@ -1,20 +1,23 @@
class Usecase:
def __init__(self, file, **settings):
self.file = file
self.settings = {"rel_sequence": None, "lag_value": None, "duration_type": "NOTEDEFINED"}
self.settings = {"rel_sequence": None, "lag_value": None, "duration_type": "NOTDEFINED"}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
lag_value = self.file.createIfcDuration(self.settings["lag_value"])
lag_time = self.file.create_entity("IfcLagTime",
lag_time = self.file.create_entity(
"IfcLagTime",
**{
"DurationType": self.settings["duration_type"],
"LagValue": lag_value,
"DurationType": self.settings["duration_type"],
"LagValue": lag_value,
}
)
#Can an IfcLagTime entity be used by multiple sequence relationships?
if self.settings["rel_sequence"].is_a("IfcRelSequence"):
if len(self.file.get_inverse(self.settings["rel_sequence"].TimeLag)) == 1:
if (
self.settings["rel_sequence"].TimeLag
and len(self.file.get_inverse(self.settings["rel_sequence"].TimeLag)) == 1
):
self.file.remove(self.settings["rel_sequence"].TimeLag)
self.settings["rel_sequence"].TimeLag = lag_time
@@ -11,6 +11,7 @@ class Data:
time_periods = {}
tasks = {}
task_times = {}
lag_times = {}
sequences = {}
@classmethod
@@ -24,6 +25,7 @@ class Data:
cls.time_periods = {}
cls.tasks = {}
cls.task_times = {}
cls.lag_times = {}
cls.sequences = {}
@classmethod
@@ -39,6 +41,7 @@ class Data:
cls.load_time_periods()
cls.load_tasks()
cls.load_task_times()
cls.load_lag_times()
cls.load_sequences()
cls.is_loaded = True
@@ -158,6 +161,18 @@ class Data:
data[key] = ifcopenshell.util.date.ifc2datetime(value)
cls.task_times[task_time.id()] = data
@classmethod
def load_lag_times(cls):
cls.lag_times = {}
for lag_time in cls._file.by_type("IfcLagTime"):
data = lag_time.get_info()
if data["LagValue"]:
if data["LagValue"].is_a("IfcDuration"):
data["LagValue"] = ifcopenshell.util.date.ifc2datetime(data["LagValue"].wrappedValue)
else:
data["LagValue"] = float(data["LagValue"].wrappedValue)
cls.lag_times[lag_time.id()] = data
@classmethod
def load_sequences(cls):
cls.sequences = {}
@@ -1,13 +1,18 @@
import ifcopenshell.util.date
class Usecase:
def __init__(self, file, **settings):
self.file = file
self.settings = {"rel_sequence": None, "attributes": {}}
self.settings = {"lag_time": None, "attributes": {}}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
for name, value in self.settings["attributes"].items():
if name == "LagValue" and value is not None:
# TODO: support RatioMeasure
value = self.file.createIfcDuration(value)
setattr(self.settings["rel_sequence"], name, value)
if isinstance(value, float):
value = self.file.createIfcRatioMeasure(value)
else:
value = self.file.createIfcDuration(ifcopenshell.util.date.datetime2ifc(value, "IfcDuration"))
setattr(self.settings["lag_time"], name, value)
@@ -8,6 +8,6 @@ class Usecase:
self.settings[key] = value
def execute(self):
if self.settings["rel_sequence"].TimeLag.LagValue:
self.file.remove(self.settings["rel_sequence"].TimeLag.LagValue)
self.file.remove(self.settings["rel_sequence"].TimeLag)
if len(self.file.get_inverse(self.settings["rel_sequence"].TimeLag)) == 1:
return self.file.remove(self.settings["rel_sequence"].TimeLag)
self.settings["rel_sequence"].TimeLag = None