Skip to main content

BIM/IFC models for QTO

Below is a concise, Python-first recipe that shows exactly how to plug an IFC model (provided with the QRF) into your Quantity-Take-Off (QTO) pipeline. It follows the external-mode pattern described in the BIM literature: the IFC file is only a data source; all logic runs in Python.

1. Install the core IFC library

pip install ifcopenshell pandas openpyxl

2. Load the IFC file and list every structural element

import ifcopenshell, ifcopenshell.util.element as util
from pathlib import Path

model = ifcopenshell.open(Path("rfx_structural.ifc"))

# Example: grab every IfcBeam, IfcColumn, IfcMember, etc.
elements = (model.by_type("IfcBeam") +
            model.by_type("IfcColumn") +
            model.by_type("IfcMember"))

3. Extract the quantities you need

rows = []
for e in elements:
    # 1. Identity
    name   = e.Name or e.GlobalId
    ifc_ent= e.is_a()

    # 2. Geometry quantities (IfcElementQuantity)
    qs = util.get_psets(e).get("Pset_ElementQuantity", {})
    length_m = float(qs.get("Length", 0))
    weight_kg= float(qs.get("Weight", 0))     # if the modeller exported it
    area_m2  = float(qs.get("SurfaceArea", 0))

    # 3. Material grade (IfcMaterial)
    mat = util.get_material(e)
    grade = mat.Name if mat else "Unknown"

    rows.append({
        "Item"      : name,
        "Type"      : ifc_ent,
        "Material"  : grade,
        "Length_m"  : length_m,
        "Weight_kg" : weight_kg,
        "Area_m2"   : area_m2
    })

4. Build a Pandas DataFrame → instant QTO table

import pandas as pd

df = pd.DataFrame(rows)
# Aggregate identical sections
qto = (df
       .groupby(["Type", "Material"], as_index=False)
       .agg({"Length_m":"sum",
             "Weight_kg":"sum",
             "Area_m2":"sum"}))

5. Export to Excel (ready for BOQ merge)

qto.to_excel("IFC_QTO.xlsx", index=False)

6. Optional: validate IFC quality first

Use BIMvision or Solibri Anywhere (free viewers) to visually inspect the model and confirm that all Pset_ElementQuantity properties are populated.

7. Handling federated models (multiple IFC files)

If the QRF supplies several partial IFC files, merge them once:
  • BIMvision → IFC Merge plugin (permanent merge), or
  • IfcOpenShell (memory merge) if you want to stay in Python.

8. When IFC lacks quantities

If the IFC only has geometry, compute volume/length/area yourself:
import ifcopenshell.geom as geom
settings = geom.settings()
shape = geom.create_shape(settings, e)
volume = shape.geometry.volume

9. Keep the workflow MVD-compliant

The NBIMS QTO guide recommends exporting with the CDB-2010 MVD view (or later). Ask the designer to tick that option in Revit/ArchiCAD so that Pset_ElementQuantity and IfcMaterial are automatically embedded.

Summary of the integration pattern

Step Tool / Library Purpose
IFC ingestion IfcOpenShell Parse geometry & properties
Quantity extraction IfcElementQuantity or auto-calc Length, area, volume, weight
Data shaping Pandas Group, sum, clean
Output openpyxl Excel BOQ ready for pricing
Visual QC BIMvision / Solibri Confirm model quality
This external-mode approach keeps your Python stack lightweight, avoids STAAD-Pro geometry duplication, and produces code-compliant QTO tables in minutes