Skip to main content

ifc-spf

Read IFC files with the standard library. Instances, property sets, quantities, units and the spatial chain — no geometry kernel, no compiled dependency, no schema download.

from ifcspf import Model, Index

model = Model.open("building.ifc")
index = Index(model)

for door in model.of_type("IfcDoor"):            # subtypes included
    print(model.attr(door, "Name"),              # attributes by name, not position
          index.flat(door),                      # {"Pset_DoorCommon.FireExit": True, …}
          index.spatial(door)["storey"])         # where it is

Extracted from two tools that had each written it once already — a quantity takeoff and a building-code checker — because the interesting part of both was never the parser.

What it does

layer what you get
spf ISO 10303-21 tokeniser and parser: strings and their \X2\ escapes, references, enumerations, typed values, complex instances, comments, gzip, the header
schema attributes addressed by name (attr(door, "OverallWidth")), subtype expansion (IfcWall finds IfcWallStandardCase), IFC4 / IFC2X3 differences — all as data tables
units the project unit assignment resolved to SI factors, including conversion-based units (feet, inches), plus output conversion to mm, ft2, cy, …
psets property sets, quantity sets and the spatial chain, converted to SI, with type-object inheritance and per-property unit overrides

The three things it gets right that hand-rolled readers usually don't

Type-level property sets are inherited. A door's fire rating often lives on its IfcDoorType, not the occurrence. Index collects type sets first and lets instance sets override them — the inheritance IFC intends — and marks which is which (Value.from_type).

Per-property units override the project unit. IfcPropertySingleValue and every IfcQuantity* may carry their own Unit. A file with millimetre lengths and one property in metres is not exotic; it is a Tuesday.

Every measure comes out in SI, and says what it was. Value carries the converted number, the raw number, the measure type (IFCLENGTHMEASURE) and the kind (length), so a consumer converts once, deliberately, at its own edge.

value = index.get(door, "Pset_PlancheckDoor", "ClearWidth")
value.value      # 0.88          — metres, whatever the file used
value.raw        # 880.0         — as written
value.measure    # 'IFCLENGTHMEASURE'
value.kind       # 'length'
value.from_type  # False

Install

pip install ifc-spf

Python 3.11+. No dependencies.

API

Model.open(path)  /  Model.from_text(text)      # .ifc and .ifc.gz
model.of_type("IfcWall", subtypes=True) -> [Entity]
model.attr(entity, "Name") / model.ref_attr(entity, "RelatingStructure")
model.get(ref) / model.resolve_all(refs) / model.referencing(entity, of_type=None)
model.schema        # 'IFC4' | 'IFC2X3' | …
model.scale         # UnitScale(length=0.001, area=1.0, …)
model.type_counts()

index = Index(model, inherit_type=True)
index.values(entity)   # {set name: {property name: Value}}
index.flat(entity)     # {"Pset.Name": value}
index.get(entity, "Pset_DoorCommon", "FireExit")   # one Value, case-insensitive
index.find(entity, "FireExit")                     # by name, any set
index.spatial(entity)  # {"space": …, "storey": …, "building": …, "site": …}
index.storey_elevation(entity)                     # metres

from ifcspf import loads, load, unwrap, convert, expand_types
convert(0.88, "mm")    # 880.0   — SI base out to a declared unit

What it deliberately does not do

  • No geometry. No swept solids, no BRep, no placement maths, no clash detection. Property-level tooling — takeoffs, code checks, audits, exports — does not need it, and pretending otherwise is how a reader becomes a kernel.
  • No writing. Read-only, on purpose.
  • No schema validation. It reads what the file states about itself. A file that lies about its own schema will be read as it is written, not as it should have been.

If you need geometry or validation, use ifcopenshell — it is excellent, and this package is not trying to replace it. This is for the large class of jobs where pulling in a compiled IFC toolkit is the heaviest thing in the project.

Used by

  • qto — quantity takeoff with pluggable cost classification
  • plancheck — building code as machine-readable rules

MIT licensed.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ifc_spf-0.1.0.tar.gz (30.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ifc_spf-0.1.0-py3-none-any.whl (21.7 kB view details)

Uploaded Python 3

File details

Details for the file ifc_spf-0.1.0.tar.gz.

File metadata

  • Download URL: ifc_spf-0.1.0.tar.gz
  • Upload date:
  • Size: 30.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for ifc_spf-0.1.0.tar.gz
Algorithm Hash digest
SHA256 89ec057d7501cfd69a149210ee3fd4423323793d7596231807bd4d04e734525d
MD5 dbf2d462e6b0aa8aaef478700f2c25af
BLAKE2b-256 8c56039b6512df328f0c07d0e96b7a848cef16da0f0b7ca34f31b4afa8a0adc4

See more details on using hashes here.

Provenance

The following attestation bundles were made for ifc_spf-0.1.0.tar.gz:

Publisher: release.yml on sophie-nguyenthuthuy/ifc-spf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ifc_spf-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: ifc_spf-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 21.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for ifc_spf-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bad5ea36f23e5abeae2d21e361e8015322b445c59f38ebd1639e08ff10e02259
MD5 74d402f58055b0178fc28bc9fcd532d1
BLAKE2b-256 19482e6cfc9a0021339ade26b5d585aa184540335bfe2a9fe32ba01c7515ed39

See more details on using hashes here.

Provenance

The following attestation bundles were made for ifc_spf-0.1.0-py3-none-any.whl:

Publisher: release.yml on sophie-nguyenthuthuy/ifc-spf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.2.0

2 files

This release

0.1.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page