Skip to main content

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)

Table of built distributions (wheels) for openbim-ifcx 0.1.0
File
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 log

Release 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 log

Release 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 log

Release 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

Release history Release notifications | RSS feed

0.1.2

5 release files

0.1.1

5 release files

This release

0.1.0 This release

4 release 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