Repository navigation
IfcOpenShell v0.9.0
·
273 commits
to v0.9.0
since this release
Highlights
v0.9.0 is a new release with both low-level rearchitecturing for performance, safety and better web presence as well as new functionality such as a completely new desktop viewer Bonsai Viewer. This is the last major stepping stone before IfcOpenShell version 1.0
- A ground-up rewrite of the C++ IFC data model and parser (the "v1.0 data
model"): aweak_ptr-based instance model, a plug-in architecture for schemas,
geometry kernels and serializers, better testing of the RocksDB back-end, lazy/paged parsing - A large batch of low-level parser performance work:
- SWAR
- string pooling
- aggressive inlining and devirtualization
- more compile time work
- less pointer chasing and heap allocations
- more efficient maps
- Bonsai Viewer: A brand-new GPU web/desktop viewer with a high performance caching format called
.ifcview, streaming, federation and measurement/annotation tools. Also a WebAssembly/browser build. - A thorough build, packaging, CI and deployment modernisation (shared libraries, plug-ins, Pyodide/WASM, Rocky, macOS bundles, VS 2026, Python 3.15, ruff/ty tooling).
- Python bindings performance:
-fastproxy,-fastdispatch, elimination of the wrapped_data indirection, single call set_attribute() instead of back and forth on type negotiation - Geometry: Manifold and Passthrough geometry kernels. Iterator settings to match Bonsai behaviour in C++ (MaxVoidsPerElement, context priorities). Tree split in BVH / BREP.
Detail (AI generated)
1. Core IFC data model, parser & bindings (ifcparse, ifcwrap, IfcConvert) — 195 commits
Data model rewrite
- Reworked the instance model around an encapsulated
weak_ptras the basis for
instances —7098beb81. - Schema/entity classes unified under
ifcopenshell::;Base::data()made private and
file::add(..., id)reworked —f5b2358c2. - New identity/equality semantics (hashing solely on identity,
id_for instances vs
identity_for types) —fbbc92c5d,
14e9846e3,
490fa92dc,
38e0e0e29. - Type-declaration instances reworked (
declarationas a property) —
2dd002bcd,
8c2e1226c,
5c4046e05. - Hierarchical index for inverses; aggregate inverse vectors —
b2fc0c00c,
4c13e2424. - Integer attributes widened to
int64_tfor consistency / out-of-range timestamps —
d5076bded,
f23db9440.
Plug-in architecture
- First cut of the plug-in host architecture, then incremental isolation of slices,
trees, documents and serializers —
3824e7b44,
aa1078415,
d2cc66fdf,
b599ee104. - Serializer plug-ins wired up in Python;
svgfillconverted to a plug-in —
bfea57c61,
fde502daa. - Plug-in loading made to work inside and outside Pyodide; schema-scoped symbols to
avoid collisions —e893552f2,
b1899b1a8. - IfcConvert plug-in discovery / info print —
9e1973527.
RocksDB back-end & streaming
- RocksDB-backed files (
document_serializer_rdb), streaming serializer hooked into
IfcConvert,GlobalIdindex written on serialize —
18b79a436,
74b405a9f. - Skip flush/compact for read-only RocksDB on destruction —
0bb6df6a6. - Deleting/creating instances on RocksDB-backed files;
remove_deep2containment decided
in C++ —d94215360,
8003d43e6. - Serializer buffers can be passed in —
2eb2d6571.
Parser performance & correctness
- Variable-length token storage moved to a string pool (no re-reads) —
8e42f35db. - SWAR multi-character scanning for keywords/enums/strings; fewer allocations and a
parse-context pool —603cedc48. - Tokenizer compile-time decode policy;
scan(Consumer&)redesign,next()removed —
586054a39,
851886ac8,
b3e7067a8,
22919a4ca. - Lazy loading (
file::lazy_loading()/open(lazy=True)) and the paged file
reader —afb127cda,
311cff723,
afd400583. - Two heap allocations per instance instead of four;
GlobalIdindex in a hash map with
inline keys; pre-sized inverse index —
68deede10,
5d27bd7bb,
63c0a03ea. - Inverse records radix-sorted; avoid re-sorting the inverse index on every read after a
write —a6c8b7366,
ba9810f45. - Fix data races when parsing concurrently on threads —
19bff92a4. - Zero-copy scanning / pooling fixes —
36c64e5fa,
92ffbeb5c,
8860a7269. - Deleted instance inverse records unregistered via its attributes; stop scanning a type's
instance list when deleting —e1be43320,
2129e692a.
Bindings & toolchain
- SWIG 4.1 required; SWIG 4.5 support;
-fastproxy -fastdispatchwrapper build —
c9c7edd4d,
3bb8b0cb9,
98aa119da. - Visual Studio 2026 / v145 toolset support —
05ba93ab6. - Python 3.10 support dropped —
554b3ed5d. - Generated
wrappergen; many codegen/schema-regeneration commits throughout.
2. Geometry engine (ifcgeom) — 53 commits
- New manifold-based kernel experiments and a passthrough kernel —
a19d398c7,
1840e3d1a,
6dea7a511,
22384e136. - OCCT spatial tree split into per-backend
ub_tree/bvh_tree; HDF5 scaffolding
removed —49f17cdd0,
685b7dfe2,
f963eaa49. - Hybrid-kernel component resolution cached —
e713fdb17. - Duplicate faces/loops de-duplicated by identity —
1207338fa,
e4190a163. - Alignment / curve-segment fixes: honor
IfcAxis2PlacementLinearAxis/RefDirection in the
loft builder,IfcFaceSurface.SameSense, planar-face normal handling, reverse start cap
on sweeps, CGAL conic segment bounds —
4374c8198,
3a5107e6b,
0f6a7ba35,
095f4a656,
f72eb38d3. - New conversion settings;
MaxVoidsPerElement; named context priorities —
7864ae781,
ab38f4f7f,
241b276de,
4f69855dc.
3. Serializers (glTF, XML, SVG, CityJSON) — 21 commits
- Proper XML serializer specialization —
fe6e9d86a. svgfillisolated and packaged as a plug-in;std::optionalover Boost —
a2012ace2,
55374d78e.- RocksDB streaming serializer
skip_supertypes;GlobalIdindex written —
ca2e866c4,
74b405a9f. - glTF: PROJ code refactored into a separate call;
WITH_PROJcompile fix —
335d57185,
ae240e470. - JSON serializer fixed on property sets without a name —
4c1764bf1. - OCE remnants removed —
af6813ff4.
4. Python API (ifcopenshell) — 100 commits
- Adapted the whole package to the new data model (
file,declarationproperty,
rule/derived attributes,initialize()) —
07a01bcf5,
4ec643d4e,
f1e93581e. - Units rework:
IfcDerivedUnitsupport inutil.unit(scale, symbol, dimension),
dimensional-analysis fallback inget_project_unit(), per-property/quantity unit
overrides inedit_pset/edit_qto, and several crash fixes —
20a6c73fb,
d11c4411e,
d19c86c72,
2b7abcf2e,
0e8d0ee84,
2bfcf8ab8. - Selector syntax: unquoted decimals accepted, multi-value & regex documented —
41390dad9,
ff4ef510f. validate: SQLite audit output, colored output, error counts,Pathsupport —
1a6336bd2,
cb52013a5,
de4ad60df.remove_deep2correctly preserves references from kept subgraph and deletes under
batch()—b8a7b33f2,
f2b0546a5.- Build tooling ported to Python:
build-deps.py,install-/build-ifcopenshell.py,
run-cmake.py(deprecating the.bat/.cmdscripts) —
bfce5b941,
51a86cdd8,
d5fd959e6. ifcbimtesterremoved;dev_environment.pyretired in favour ofpoe dev-setup—
4fe08e2a9,
56ebc5c2e.- Split shared libraries shipped in the wheel; IfcConvert + wrapper shipped/documented
for every built platform —
c80569ecc,
a1361f5b6. - Python 3.15 propagation to publishing CI —
4c12ab795.
5. Bonsai (Blender add-on) — 118 commits
- Ported to the v0.9.0 data model (no
wrapped_data,declarationproperty,by_type
returns a tuple) —
b66b04b00,
007cdce98,
6bab0603e. - Unit override UI in the Pset/Qto editor, with live resolved unit symbols and
write-back —539066a58,
90d6d5f51,
d067cfd1b. - bSDD property pick-list with allowed values —
4cfe1f96f. - Snap tooling: GPU snap can now be disabled; crash prevention by moving the GPU readback
out of the mouse loop; stale cut-geometry fix —
a6d59bf61,
1da48061e. - Drawings/schedules: drawing-scale dropdown sorted by ratio; comma-separated stylesheet
paths fixed; hidden columns skipped in ODS schedules —
151aa2c45,
971cccc18,
b6bc951dd. - Alignment stationing: decreasing-value support and rollback of auto-stationing —
b5670c4fc. - Bonsai Viewer (renamed from IfcViewerFull) with recent projects, models panel,
Autodesk connector (Rust), bundled connectors, and its own docs —
59e5b2b1b,
4913b84af,
8734b419e,
9d9f4054f,
66f3593de. - Intel macOS builds dropped; Chocolatey packaging removed; ruff format adopted —
0faba0fdd,
f9e8ccac1,
90763c9c6.
6. Web / GPU viewer (ifcviewer, shipped as Bonsai Viewer) — 350 commits
New viewer introduced in v0.9.0.
- Started as a hello-world GL viewer and grew into a full GPU renderer: per-object
glMultiDrawElementsIndirect, GPU instancing, BVH frustum culling, contribution
culling, Hierarchical-Z occlusion culling, per-instance LOD —
06eca938d,
bfac12dbe,
1dace18d2,
07a5c5935,
f0e3056d0,
90366f823,
8596d53a4,
c78e16eaf. - Cursor / event-driven rendering — idle scenes cost zero CPU —
09ffdd202. - Custom
.ifcviewsidecar format (v4 → v17): instanced geometry, metadata,
per-chunk residency, zstd compression (~10× smaller over the wire) —
ababb49ae,
e1be2f208,
0b8c787ac. - Streaming with per-frame chunk-on-visible loading, LRU/distance eviction, spatial
(Morton) chunking, background-thread I/O —
5a3e5167d,
3d368e007,
dcc2bf1c0. - Federation: false origin, per-model transforms, coordinate operations, nested groups
with cascading visibility,.ifcfedsave/load —
540f3acf5,
b252cd25f,
095e4a167,
7bc64bef1. - Tools: section planes, box-select/multi-select, per-element visibility, X-ray, fly mode,
volume/area/length measurement, orthographic + standard views, edge/cavity shading —
51971dd49,
bba2f3081,
1c598a981,
b123ee69d,
81a7c5b50,
0a297babe,
5bc7e4b98,
6f0327d4b. - A second
wgpubackend was built and then merged back, replacing the GL backend and
the last Qt dependency; the viewport was split into reusableViewportCore/IfcViewerCore
libraries —19a39a041,
2981500b3,
8ab5c31e7,
fe6a0452b,
b3fbcd6a6. - Browser/WASM build (
ifcviewer-web): end-to-end rendering on Chrome/Firefox,
Blob.slice/HTTP-Range streaming, OPFS model cache, click-to-select, and a JavaScript
scripting API —
e8a6d2a92,
584504dcd,
e5072460c,
094575fc1,
89bb3074d. - GPU-memory budgeting: live geometry-cache budget, fallible allocations, VRAM-shortfall
UX —6201c4052,
ab9902430,
807454105.
7. Domain tools
IfcTester / IDS — 8 commits
- Strict XSD pattern semantics; chained facet filters accept tuple results; entity facets
with a restriction name no longer crash on IFC2X3; webapp wheel built in isolation —
f1c1ce919,
df3d07e95,
1bf3168ad,
577d1b011.
IfcPatch — 1 commit
FixArchiCADToRevitSpacescan run headlessly —
e678012c7.
IfcDiff — 1 commit
- Elements resolved by
GlobalIdviaby_guid—
040bebedf.
IfcClash — 1 commit
add_collision_objectsfixed —
c9118cfd9.
Ifc4D / Ifc5D — 4 commits
- MS Project importer rewritten onto
ScheduleIfcGenerator; P6 export fidelity —
beb0db89e,
17042f6f8,
6aeaba0e3.
BCF — 2 commits · bSDD — 2 commits
- Python-version bumps, licence metadata fix and bSDD boolean default —
321760cea,
4c9c45e14,
408897366.
Other add-ons, examples & fuzzing — 20 commits
- Opt-in libFuzzer harness for
IfcParse::IfcFile(+ follow-up fixes) —
92fc812a6,
aab79ccff,
244b9ad23. - Examples migrated to the new API; plug-in search-path fixes —
008ac8a35,
6d7aa3c48,
3d1e157ff.
8. Documentation — 11 commits
- New installation pages for
bonsaiviewerandifcviewer; viewport-architecture rewrite - Python 3.15 added to the zip table; C++ Doxygen docs publishing workflow —
58dd5d075,
83fc219a8.
9. Linting, typing & code quality — 41 commits
- Adopted ruff (lint + format) repo-wide, replacing black, with readable rule names and
unused-import checking across the codebase —
58dcaed89,
109bd5838,
4c809bbee,
5ea88858e. tytype-checking introduced and driven to green on CI; stub (*.pyi) regeneration —
983707cfe,
9a62bf3c1,
2b7f55c1a.- Whitespace-check script —
6318892a9.
10. Build, packaging & CI — 508 commits
- Shared-library build by default (
BUILD_SHARED_LIBS,--shared,--occt-shared),
with .so reordering, RPATH handling and bundled-wheel support —
e2905d6f0,
8bdaa8c7c,
2c7d25cff,
9d68e7b9c. - Pyodide/WASM pipeline reworked (uv, modules, wheel splitting/ordering, native SWIG,
Python 3.15) —beb5c1f7e,
19a3707f7,
d65df3665,
42dccbc74. - Rocky Linux build + packaging for the Rust Autodesk connector, Qt6 via
aqtinstall,
macOS.appbundles uploaded to S3 —
014baab70,
ecee648b4,
6fa55b7c2,
ddee88bed. package-zip-archivesunified and ported to Python —
13bc8308b,
12338714a,
2afbb46ec.- cmake/vs-cfg/win scripts modernised; ccache; VS 2026 toolset; Python versions unified —
3251c1b22,
995f98d5f,
1a03fd7df. - CI: GitHub-annotation summaries, colored pytest output, paths filters, standalone
ifcwrap job with ccache, daily Bonsai/IfcSverchok builds fromv0.9.0—
6b176e8b4,
7826e7d17,
e18d927b4,
b71b21781.