mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 01:41:57 +00:00
You can now edit nested arithmetic cost values by using spreadsheet-like formulas
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
import ifcopenshell
|
||||
import ifcopenshell.util.cost
|
||||
import ifcopenshell.util.unit
|
||||
import ifcopenshell.util.element
|
||||
|
||||
|
||||
class Usecase:
|
||||
def __init__(self, file, **settings):
|
||||
self.file = file
|
||||
self.settings = {"cost_value": None, "formula": {}}
|
||||
for key, value in settings.items():
|
||||
self.settings[key] = value
|
||||
|
||||
def execute(self):
|
||||
try:
|
||||
data = ifcopenshell.util.cost.unserialise_cost_value(self.settings["formula"], self.settings["cost_value"])
|
||||
except:
|
||||
return
|
||||
self.edit_cost_value(data)
|
||||
|
||||
def edit_cost_value(self, data, parent=None):
|
||||
ifc = data.get("ifc", None)
|
||||
if not ifc:
|
||||
ifc = ifcopenshell.api.run("cost.add_cost_value", self.file, parent=parent)
|
||||
if "AppliedValue" in data:
|
||||
if data["AppliedValue"]:
|
||||
ifc.AppliedValue = self.file.createIfcMonetaryMeasure(data["AppliedValue"])
|
||||
else:
|
||||
ifc.AppliedValue = None
|
||||
ifc.Category = data["Category"] if "Category" in data else None
|
||||
ifc.ArithmeticOperator = data["ArithmeticOperator"] if "ArithmeticOperator" in data else None
|
||||
if "Components" in data:
|
||||
for component in data["Components"]:
|
||||
self.edit_cost_value(component, ifc)
|
||||
@@ -52,7 +52,7 @@ def unserialise_cost_value(formula, cost_value):
|
||||
result["ifc"] = element
|
||||
for i, component in enumerate(result.get("Components", [])):
|
||||
if element.Components and i < len(element.Components):
|
||||
map_element_to_formula(element.Components[i], result["Components"][i])
|
||||
map_element_to_result(element.Components[i], result["Components"][i])
|
||||
map_element_to_result(cost_value, result)
|
||||
return result
|
||||
|
||||
@@ -116,11 +116,14 @@ class CostValueUnserialiser:
|
||||
def get_operand(self, operand):
|
||||
child = operand.children[0]
|
||||
if child.data == "value":
|
||||
return {"AppliedValue": self.get_value(child)}
|
||||
value = self.get_value(child)
|
||||
return {"AppliedValue": float(value) if value else None}
|
||||
elif child.data == "category":
|
||||
data = {}
|
||||
category = self.get_category(child)
|
||||
if category:
|
||||
if category.lower() == "sum":
|
||||
category = "*"
|
||||
data["Category"] = category
|
||||
formula = self.get_formula(operand.children[1])
|
||||
if formula.get("Components"):
|
||||
|
||||
Reference in New Issue
Block a user