ifckit
Framework-agnostic IFC builder library for architecture and infrastructure.
Build valid IFC files in pure Python — no CAD host required. Works standalone, from Grasshopper, or via the JSON/CLI interface.
Files created can be viewed in its companion IfcViewer
Live: maucworks.github.io/web-ifc-viewer
Install
pip install ifckit[ifc] # with ifcopenshell (full functionality)
pip install ifckit # without ifcopenshell (JSON/schema tools only)
Requires Python 3.9+ (Rhino 8 ships CPython 3.9; needs ifcopenshell==0.8.4.post1, see below).
Quick start: building
from ifckit import IfcModel, IfcSchema, PendingWall, Vec, Plane
model = IfcModel(name="My Project", schema=IfcSchema.IFC4, author="you")
floor = model.add_site("Site A").add_building("Building 1").add_storey("Ground Floor", elevation=0.0)
wall = PendingWall(
footprint=[Vec(0, 0, 0), Vec(10, 0, 0), Vec(10, 0.3, 0), Vec(0, 0.3, 0)],
plane=Plane.world_xy(),
height=3.0,
name="North Facade",
)
floor.add(wall)
model.save("project.ifc")
See examples/quickstart.py and examples/simple_building.py for fuller examples.
Quick start: bridge
from ifckit import IfcModel, IfcSchema, LengthUnit, PendingBeam, Vec, Line, BridgePartType, IBeamProfile
model = IfcModel(name="Bridge", schema=IfcSchema.IFC4X3, author="you", unit=LengthUnit.MILLIMETRE)
deck = model.add_site("Site A").add_bridge("Main Bridge").add_bridge_part("Deck", BridgePartType.DECK.value)
profile = IBeamProfile(height=600, width=300, web_thickness=10, flange_thickness=10)
beam = PendingBeam(axis=Line(Vec(0, 0, 0), Vec(3000, 0, 0)), profile=profile, name="Main Girder")
deck.add(beam)
model.save("bridge.ifc")
See examples/quickstart_bridge.py and examples/simple_bridge.py for fuller examples including alignments.
Supported schemas and element types
| Element | Class | IFC4 | IFC4X3 |
|---|---|---|---|
| Wall | PendingWall |
✓ | |
| Slab | PendingSlab |
✓ | |
| Column | PendingColumn |
✓ | |
| Beam | PendingBeam |
✓ | ✓ |
| Space | PendingSpace |
✓ | |
| Alignment | PendingAlignment |
✓ |
Profiles: IBeamProfile, LBeamProfile, SteelProfile, and arbitrary polygon profiles.
JSON build
Build an IFC file from a JSON description — useful for CLI pipelines and REST APIs:
from ifckit.json_build import build
build("model.json", "output.ifc")
Or from the command line:
python -m ifckit model.json output.ifc
The JSON schema mirrors the Python API. See examples/example_building.json for a full example.
Grasshopper
Grasshopper Script components are in grasshopper/src/. Each component is a
standalone Python file with @component / @input / @output annotations.
To regenerate the .gh file from source, run grasshopper/script/build_gh.py
inside the Rhino ScriptEditor with Grasshopper open.
Installing ifckit in Rhino 8
Rhino 8 ships with its own CPython 3.9 environment. That pins the
ifcopenshell line: 0.8.4.post1 is the last release with Python 3.9
wheels, so install it explicitly — the [ifc] extra would pull 0.9.0,
which requires Python 3.10+. From the Rhino ScriptEditor
(EditPythonScript) or a Script component:
import subprocess, sys
subprocess.run(
[sys.executable, "-m", "pip", "install",
"ifckit", "ifcopenshell==0.8.4.post1"],
check=True,
)
ifckit detects the 0.8 serializer API automatically (see
ifckit.geom_backend); all build/save/export paths work on both lines.
To install a local development checkout instead:
import subprocess, sys
subprocess.run(
[sys.executable, "-m", "pip", "install", "-e", r"C:\path\to\ifckit"],
check=True,
)
After installing, restart Rhino once to make the package available in all Script components.
Development
pip install -e ".[dev]"
pytest tests/ # run tests
ruff check ifckit/ # lint
Metadata
Release files for ifckit 0.3.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ifckit-0.3.2.tar.gz | 346.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ifckit-0.3.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 721.2 kB
Release files / ifckit-0.3.2.tar.gz
| Download URL | ifckit-0.3.2.tar.gz |
|---|---|
| Size | 346.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
214400bcd8be102ceb4ca0f265a99c097e4a041b4211071d0879c80b5d8c1a32
|
|
BLAKE2b-256 checksum How to use checksums |
76db32230bda7c6209559d2266b05f8106502f902f3987869e1449e10a2a3ab0
|
| 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 8, 2026.
Transparency logRelease files / ifckit-0.3.2-py3-none-any.whl
| Download URL | ifckit-0.3.2-py3-none-any.whl |
|---|---|
| Size | 374.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cd246cc81de1d053a04dd97a9d984e066f3972dbea510ed985a6d1661c5e8336
|
|
BLAKE2b-256 checksum How to use checksums |
a72e4ede9f52a0785f55dfe6c64117e04e2c7277bc49e0d1dba1b898cd768556
|
| 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 8, 2026.
Transparency log