mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-13 02:47:48 +00:00
57 lines
2.2 KiB
Python
57 lines
2.2 KiB
Python
|
|
import math
|
||
|
|
import ifcopenshell.api
|
||
|
|
import ifcopenshell.util.date
|
||
|
|
import ifcopenshell.util.element
|
||
|
|
|
||
|
|
|
||
|
|
class Usecase:
|
||
|
|
def __init__(self, file, **settings):
|
||
|
|
self.file = file
|
||
|
|
self.settings = {"resource": None}
|
||
|
|
for key, value in settings.items():
|
||
|
|
self.settings[key] = value
|
||
|
|
|
||
|
|
def execute(self):
|
||
|
|
self.productivity = ifcopenshell.util.element.get_psets(self.settings["resource"]).get(
|
||
|
|
"EPset_Productivity", None
|
||
|
|
)
|
||
|
|
if not self.productivity:
|
||
|
|
return
|
||
|
|
unit_consumed = self.get_unit_consumed()
|
||
|
|
self.unit_produced_name = self.productivity.get("BaseQuantityProducedName", None)
|
||
|
|
unit_produced = self.productivity.get("BaseQuantityProducedValue", None)
|
||
|
|
total_produced = self.get_total_produced()
|
||
|
|
if not unit_consumed or not unit_produced or not total_produced:
|
||
|
|
return
|
||
|
|
seconds_worked = total_produced / unit_produced * unit_consumed
|
||
|
|
self.set_schedule_work(seconds_worked)
|
||
|
|
|
||
|
|
def get_unit_consumed(self):
|
||
|
|
duration = self.productivity.get("BaseQuantityConsumed", None)
|
||
|
|
if not duration:
|
||
|
|
return
|
||
|
|
return ifcopenshell.util.date.ifc2datetime(duration).seconds
|
||
|
|
|
||
|
|
def get_total_produced(self):
|
||
|
|
total = 0
|
||
|
|
for rel in self.settings["resource"].HasAssignments or []:
|
||
|
|
if not rel.is_a("IfcRelAssignsToProcess"):
|
||
|
|
continue
|
||
|
|
for rel2 in rel.RelatingProcess.HasAssignments or []:
|
||
|
|
if not rel2.is_a("IfcRelAssignsToProduct"):
|
||
|
|
continue
|
||
|
|
psets = ifcopenshell.util.element.get_psets(rel2.RelatingProduct)
|
||
|
|
for pset in psets.values():
|
||
|
|
for name, value in pset.items():
|
||
|
|
if name == self.unit_produced_name:
|
||
|
|
try:
|
||
|
|
total += float(value)
|
||
|
|
except:
|
||
|
|
pass
|
||
|
|
return total
|
||
|
|
|
||
|
|
def set_schedule_work(self, seconds):
|
||
|
|
if not self.settings["resource"].Usage:
|
||
|
|
ifcopenshell.api.run("resource.add_resource_time", self.file, resource=self.settings["resource"])
|
||
|
|
self.settings["resource"].Usage.ScheduleWork = f"PT{seconds / 60 / 60}H"
|