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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
89ec057d7501cfd69a149210ee3fd4423323793d7596231807bd4d04e734525d
|
|
| MD5 |
dbf2d462e6b0aa8aaef478700f2c25af
|
|
| BLAKE2b-256 |
8c56039b6512df328f0c07d0e96b7a848cef16da0f0b7ca34f31b4afa8a0adc4
|
Provenance
The following attestation bundles were made for ifc_spf-0.1.0.tar.gz:
Publisher:
release.yml on sophie-nguyenthuthuy/ifc-spf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ifc_spf-0.1.0.tar.gz -
Subject digest:
89ec057d7501cfd69a149210ee3fd4423323793d7596231807bd4d04e734525d - Sigstore transparency entry: 2391611659
- Sigstore integration time:
-
Permalink:
sophie-nguyenthuthuy/ifc-spf@9c6578a46f4dc1823950b43d81efd63857b0e06d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/sophie-nguyenthuthuy
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9c6578a46f4dc1823950b43d81efd63857b0e06d -
Trigger Event:
workflow_dispatch
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bad5ea36f23e5abeae2d21e361e8015322b445c59f38ebd1639e08ff10e02259
|
|
| MD5 |
74d402f58055b0178fc28bc9fcd532d1
|
|
| BLAKE2b-256 |
19482e6cfc9a0021339ade26b5d585aa184540335bfe2a9fe32ba01c7515ed39
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ifc_spf-0.1.0-py3-none-any.whl -
Subject digest:
bad5ea36f23e5abeae2d21e361e8015322b445c59f38ebd1639e08ff10e02259 - Sigstore transparency entry: 2391612884
- Sigstore integration time:
-
Permalink:
sophie-nguyenthuthuy/ifc-spf@9c6578a46f4dc1823950b43d81efd63857b0e06d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/sophie-nguyenthuthuy
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9c6578a46f4dc1823950b43d81efd63857b0e06d -
Trigger Event:
workflow_dispatch
-
Statement type: