Skip to content

IfcOpenShell v0.9.0

Choose a tag to compare

@aothms aothms released this 01 Oct 08:51
· 273 commits to v0.9.0 since this release
7ba7019

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

  1. A ground-up rewrite of the C++ IFC data model and parser (the "v1.0 data
    model"): a weak_ptr-based instance model, a plug-in architecture for schemas,
    geometry kernels and serializers, better testing of the RocksDB back-end, lazy/paged parsing
  2. 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
  3. 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.
  4. 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).
  5. Python bindings performance: -fastproxy, -fastdispatch, elimination of the wrapped_data indirection, single call set_attribute() instead of back and forth on type negotiation
  6. 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_ptr as 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 (declaration as a property) —
    2dd002bcd,
    8c2e1226c,
    5c4046e05.
  • Hierarchical index for inverses; aggregate inverse vectors —
    b2fc0c00c,
    4c13e2424.
  • Integer attributes widened to int64_t for 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; svgfill converted 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, GlobalId index written on serialize —
    18b79a436,
    74b405a9f.
  • Skip flush/compact for read-only RocksDB on destruction —
    0bb6df6a6.
  • Deleting/creating instances on RocksDB-backed files; remove_deep2 containment 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; GlobalId index 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 -fastdispatch wrapper 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


3. Serializers (glTF, XML, SVG, CityJSON) — 21 commits

  • Proper XML serializer specialization —
    fe6e9d86a.
  • svgfill isolated and packaged as a plug-in; std::optional over Boost —
    a2012ace2,
    55374d78e.
  • RocksDB streaming serializer skip_supertypes; GlobalId index written —
    ca2e866c4,
    74b405a9f.
  • glTF: PROJ code refactored into a separate call; WITH_PROJ compile 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, declaration property,
    rule/derived attributes, initialize()) —
    07a01bcf5,
    4ec643d4e,
    f1e93581e.
  • Units rework: IfcDerivedUnit support in util.unit (scale, symbol, dimension),
    dimensional-analysis fallback in get_project_unit(), per-property/quantity unit
    overrides in edit_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, Path support —
    1a6336bd2,
    cb52013a5,
    de4ad60df.
  • remove_deep2 correctly 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/.cmd scripts) —
    bfce5b941,
    51a86cdd8,
    d5fd959e6.
  • ifcbimtester removed; dev_environment.py retired in favour of poe 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, declaration property, 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.


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

  • FixArchiCADToRevitSpaces can run headlessly —
    e678012c7.

IfcDiff — 1 commit

  • Elements resolved by GlobalId via by_guid —
    040bebedf.

IfcClash — 1 commit

Ifc4D / Ifc5D — 4 commits

BCF — 2 commits · bSDD — 2 commits

Other add-ons, examples & fuzzing — 20 commits


8. Documentation — 11 commits

  • New installation pages for bonsaiviewer and ifcviewer; 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

10. Build, packaging & CI — 508 commits