New feature to manipulate cost item quantities

This commit is contained in:
Dion Moult
2021-04-26 12:41:19 +10:00
parent f88ac5de62
commit bfcc067257
8 changed files with 286 additions and 3 deletions
@@ -0,0 +1,18 @@
import ifcopenshell.api
class Usecase:
def __init__(self, file, **settings):
self.file = file
self.settings = {"cost_item": None, "ifc_class": "IfcQuantityCount"}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
quantity = self.file.create_entity(self.settings["ifc_class"], Name="Unnamed")
quantity[3] = 0.0
cost_item = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcCostItem")
quantities = list(self.settings["cost_item"].CostQuantities or [])
quantities.append(quantity)
self.settings["cost_item"].CostQuantities = quantities
return quantity
@@ -5,17 +5,20 @@ class Data:
is_loaded = False
cost_schedules = {}
cost_items = {}
physical_quantities = {}
@classmethod
def purge(cls):
cls.is_loaded = False
cls.cost_schedules = {}
cls.cost_items = {}
cls.physical_quantities = {}
@classmethod
def load(cls, file):
cls.cost_schedules = {}
cls.cost_items = {}
cls.physical_quantities = {}
for cost_schedule in file.by_type("IfcCostSchedule"):
data = cost_schedule.get_info()
@@ -36,7 +39,6 @@ class Data:
data = cost_item.get_info()
del data["OwnerHistory"]
del data["CostValues"]
del data["CostQuantities"]
data["RelatedObjects"] = []
data["Controls"] = []
for rel in cost_item.IsNestedBy:
@@ -44,4 +46,16 @@ class Data:
for rel in cost_item.Controls:
[data["Controls"].append(o.id()) for o in rel.RelatedObjects or []]
cls.cost_items[cost_item.id()] = data
cls.load_cost_item_quantities(cost_item, data)
cls.is_loaded=True
@classmethod
def load_cost_item_quantities(cls, cost_item, data):
data["CostQuantities"] = []
data["TotalCostQuantities"] = 0.0
for quantity in cost_item.CostQuantities or []:
quantity_data = quantity.get_info()
del quantity_data["Unit"]
cls.physical_quantities[quantity.id()] = quantity_data
data["CostQuantities"].append(quantity.id())
data["TotalCostQuantities"] += quantity[3]
@@ -0,0 +1,10 @@
class Usecase:
def __init__(self, file, **settings):
self.file = file
self.settings = {"physical_quantity": 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["physical_quantity"], name, value)
@@ -0,0 +1,14 @@
class Usecase:
def __init__(self, file, **settings):
self.file = file
self.settings = {"cost_item": None, "physical_quantity": None}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
if len(self.file.get_inverse(self.settings["physical_quantity"])) == 1:
self.file.remove(self.settings["physical_quantity"])
return
quantities = list(self.settings["cost_item"].CostQuantities or [])
quantities.remove(self.settings["physical_quantity"])
self.settings["cost_item"].CostQuantities = quantities