Run quantity take-off on the model using the named rule. Modifies the model in-place by adding/updating IfcElementQuantity psets. Returns a summary dict with ok, rule, and elements_quantified.
(model: ifcopenshell.file, rule: str, selector: str | None = None)
| 14 | |
| 15 | |
| 16 | def run_quantify(model: ifcopenshell.file, rule: str, selector: str | None = None) -> dict[str, Any]: |
| 17 | """Run quantity take-off on the model using the named rule. |
| 18 | |
| 19 | Modifies the model in-place by adding/updating IfcElementQuantity psets. |
| 20 | Returns a summary dict with ok, rule, and elements_quantified. |
| 21 | """ |
| 22 | from ifc5d.qto import edit_qtos, quantify |
| 23 | from ifc5d.qto import rules as rule_sets |
| 24 | |
| 25 | if rule not in rule_sets: |
| 26 | return {"ok": False, "error": f"Unknown rule: {rule}. Available: {list(rule_sets.keys())}"} |
| 27 | |
| 28 | import ifcopenshell.util.selector |
| 29 | |
| 30 | if selector: |
| 31 | elements = set(ifcopenshell.util.selector.filter_elements(model, selector)) |
| 32 | else: |
| 33 | elements = set(model.by_type("IfcElement")) |
| 34 | |
| 35 | results = quantify(model, elements, rule_sets[rule]) |
| 36 | edit_qtos(model, results) |
| 37 | return {"ok": True, "rule": rule, "elements_quantified": len(results)} |