openbim-ifcx (Python)
Read, write, validate and compose IFC5 / IFCX files, and export them as
GLB, from Python. A thin
binding over the openbim-ifcx
Rust crate, from the openbim-ifcx-py crate in
openbimrs/ifcx: one abi3 wheel for
CPython 3.9 and later.
Targets the ifcx_alpha draft of buildingSMART's IFC5. IFCX is still a
moving draft; see the
capabilities.
pip install openbim-ifcx
Example
from pathlib import Path
from openbim_ifcx import IfcxFile, compose, export_glb
model = Path("model.ifcx").read_bytes()
file = IfcxFile.parse(model) # str or bytes
print(file.header["id"], file.node_count)
report = file.validate()
for f in report["failures"]:
print(f["node"], f["attribute"], f["pointer"], f["kind"], f["message"])
Path("copy.ifcx").write_text(file.write()) # unchanged from the input
# Layers weakest first: the last layer's opinions win.
tree = compose([model, Path("overlay.ifcx").read_bytes()])
print(list(tree["children"])) # the root nodes
# Any glTF viewer opens the result.
Path("model.glb").write_bytes(export_glb([model, Path("overlay.ifcx").read_bytes()]))
API
| Call | Returns |
|---|---|
IfcxFile.parse(data) |
an IfcxFile; data is JSON text or UTF-8 bytes |
file.write(pretty=False) |
the file as JSON text, lossless |
file.to_dict() |
the file as plain dicts and lists |
file.header |
the header dict |
file.node_count |
number of entries in data |
file.validate() |
a validation report against the file's own schemas |
compose(layers, imports=None) |
the composed tree as nested dicts |
validate(layers, imports=None) |
a validation report over all layers and resolved imports |
export_glb(layers, imports=None, *, y_up=True, origin_on_root=True) |
the composed model as binary glTF 2.0 bytes |
layers is one file or an iterable of files, weakest first. The package
ships type hints (py.typed).
Lossless round trip. write() keeps key order, fields the draft does
not define, null deletions and every number exactly as read.
Composed tree. compose returns the artificial root (path "") over
every root node. Each node is {"path", "attributes", "children"}, the
shape of upstream's PostCompositionNode, with children keyed by child
name. Nodes shared through inheritance appear once per place they are used.
Imports. Without imports, imports are not resolved: the layers'
schemas and data are concatenated in order, as upstream's Federate does.
With imports (a mapping from the exact import uri to a file, possibly
empty), the layers become the imports of a synthetic main layer, as
upstream's ifcx compose command builds it, and every import must be
supplied. integrity values are checked against the supplied bytes. In
upstream order an import overrides the layer that imports it, and a later
layer overrides both. Nothing is fetched from the network or the
filesystem.
GLB export. export_glb writes the render scene of the composed tree:
transformed, instanced meshes, lines and points with their materials, one
glTF node per instance named by its IFCX path. The root node turns IFCX's
Z-up into glTF's Y-up (y_up=False keeps Z-up) and carries the scene
origin, so georeferenced models keep their coordinates
(origin_on_root=False centres the model on the glTF origin instead).
Geometry values that do not decode are left out.
Validation report. {"valid": bool, "failures": [...]}, each failure
{"node", "attribute", "pointer", "kind", "message"}: the node path, the
attribute id, an RFC 6901 pointer into the value ("" for the value
itself), a stable kind such as missing-schema, type-mismatch,
not-an-integer, not-an-option, missing-key, too-few-elements or
too-many-elements, and a human message.
Errors
Every failure raises IfcxError with a stable code:
code |
Meaning |
|---|---|
read |
not an IFCX file: invalid JSON or the wrong shape; the message gives line and column |
write |
the file could not be written |
layer |
imports could not be resolved: a missing file, an import cycle, an integrity mismatch |
compose |
a reference cycle, or a reference to a node no layer defines |
invalid-argument |
an argument of the wrong type, or no layers |
glb |
the scene could not be written as GLB (over 4 GiB) |
The codes are shared with the JavaScript binding (@openbim/ifcx); a code
is never renamed or reused.
Threads
Parsing, composing, validating and GLB export release the GIL. An IfcxFile is
immutable and can be shared between threads.
Build from source
uv venv && . .venv/bin/activate
uv pip install maturin
maturin develop --release # or: scripts/check-python.sh to build + test
License
MIT, like the rest of openbimrs/ifcx.
Metadata
Release files for openbim-ifcx 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| openbim_ifcx-0.1.0-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| openbim_ifcx-0.1.0-cp39-abi3-manylinux_2_28_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| openbim_ifcx-0.1.0-cp39-abi3-manylinux_2_28_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| openbim_ifcx-0.1.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl | CPython 3.9 | abi3 | macOS 10.12+ x86-64, macOS 11.0+ ARM64, macOS 10.12+ universal2 (ARM64, x86-64) | Details |
Total release size: 2.7 MB
Release files / openbim_ifcx-0.1.0-cp39-abi3-win_amd64.whl
| Download URL | openbim_ifcx-0.1.0-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 515.4 kB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
deab03192f6f30e6af3cec3198ec53c551588cd786b96effe91479bb928313d0
|
|
BLAKE2b-256 checksum How to use checksums |
c980a76d73dae5f323b55ff6108d23ac84a8ab2828c6e3e37e41a114b3e1340d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency logRelease files / openbim_ifcx-0.1.0-cp39-abi3-manylinux_2_28_x86_64.whl
| Download URL | openbim_ifcx-0.1.0-cp39-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 597.7 kB |
| Tags | CPython 3.9 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
58d92c56ce2258b88610d020a4f956c4562ad1bc1f56b354e4aca956163f894b
|
|
BLAKE2b-256 checksum How to use checksums |
e978cf573e48897ff822a44c749618e41016620caef0f558a4c4bc0fe843c93c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency logRelease files / openbim_ifcx-0.1.0-cp39-abi3-manylinux_2_28_aarch64.whl
| Download URL | openbim_ifcx-0.1.0-cp39-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 557.0 kB |
| Tags | CPython 3.9 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
74c5e2934eb1faa7f5f6471ffafd9f84a4640ab78dc4e09c881609f569433ce4
|
|
BLAKE2b-256 checksum How to use checksums |
18f93bd137d41381dc4a4c8b731139423ea4254bf09da53f5ce75aed54ce2fe7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency logRelease files / openbim_ifcx-0.1.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
| Download URL | openbim_ifcx-0.1.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.9 abi3 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
737dc915fc0a9ce04179a6ce2e1bd090880424c210e781b00b20f262b194a02d
|
|
BLAKE2b-256 checksum How to use checksums |
f9d9f186b83d8bb14a50cd7b2ec91c0412cc52105f4df5940ce97e1beb2ee617
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency log