Pure managed .NET libraries and cross-platform CLI tools for BIM and CAD interoperability.
Read, inspect, and convert building models and drawings without the authoring software, its API, or native libraries installed.
IOExtend is a set of independent .NET engines, each reading one family of BIM or CAD formats, plus a neutral scene model and a standalone HTML viewer. Everything is managed code without native libraries, for use in CI/CD pipelines, web backends, and desktop engineering software.
| Project | Primary Formats | Key Capabilities | Documentation | NuGet | Release | Brand Palette |
|---|---|---|---|---|---|---|
| RvtIO | .rvt, .rfa (Revit 2020–2026 tested, 2027 partial) |
Elements, parameters, geometry, file metadata and project information, FilteredElementCollector queries, IFC2X3 and JSON export. Reads only; does not write Revit files |
Amber #F2A33A |
|||
| NwcIO | .nwc, .nwd, .nwf (Navisworks 2016–2026 tested) |
Scene hierarchy, meshes, materials, GUIDs and properties; viewpoints and redlines; JSON export; writes .nwc. Frozen, bug fixes only: IFC2X3/IFC4, glTF, OBJ and HTML export, clash detection, grouping and matrix, HTML clash report, BCF 2.1, measure, grids, revision diff, TimeLiner, selection and search sets, appearance profiler, mesh clipper, Navisworks XML |
Azure Blue #3B82F6 |
|||
| IfcIO | .ifc, .ifczip |
Reads and writes ISO 10303-21 STEP for buildingSMART IFC2x3 CV 2.0 and IFC4, spatial hierarchy, properties and meshes, IfcApi facade, 5D cost schedules, IDS 1.0 audit, JSON export. Frozen, bug fixes only: HTML viewer, glTF/OBJ export, clash, measure, grids, diff, BCF 2.1, 4D work-schedule logic |
Electric Violet #A855F7 |
|||
| DwgIO | .dwg (AutoCAD R2004, R2010, R2013, R2018) |
Version detection (R13–R2018), section container and decompression, drawing metadata, thumbnail and handle map, LINE/CIRCLE/ARC/POINT geometry, JSON export. R13–R2000 and R2007 are planned | Sky Blue #38BDF8 |
|||
| PlaIO | .pla, .pln (Archicad 27, 29, 30), .bimx cover |
File kind detection, container header, BL/DY block index, raw and zero-mask payload decoding, object directory search, BIMx PNG cover, text reports and directory JSON. Preview: elements, parameters and geometry are not read |
Pink #EC4899 |
| Project | Primary Formats | Key Capabilities | Documentation | NuGet | Release | Brand Palette |
|---|---|---|---|---|---|---|
| IOScene | Scene .json ("Kind": "ioscene") |
Neutral scene model for tessellated BIM and CAD data: elements, instanced geometry, materials, typed properties, models, levels, grids, viewpoints, 4D schedules, clash results. Metres, right-handed, Z up. SceneJson reader/writer and Validate(). No dependencies. Preview: names may change before 0.1.0 |
Emerald #10B981 |
|||
| IOViewer | .glb, .obj, JSON → .html |
One self-contained HTML file that works offline (three.js embedded): model tree and properties, view cube, up to six section planes or a section box, distance measurement, viewpoints and tour, clash results, 4D schedule player, Russian and English interface. Reads IOScene scene files from 0.3.0 (on main, not yet released) |
Cyan #06B6D4 |
- Engines are leaves. RvtIO, NwcIO, IfcIO, DwgIO, and PlaIO each read their own format, and some also write it. No engine references another IOExtend package or a scene type.
- IOScene is the neutral contract. A scene holds what a viewer or coordination tool shows, filters, measures, or tests. It is not an authoring model, and no source file is rebuilt from it.
- Adapters live with their engine.
<Engine>.Sceneturns an engine's model into an IOSceneSceneDocument. It ships on the engine's version and tag, depends on exactly that engine version, and uses only the engine's public API. - Consumers depend on IOScene only. From 0.3.0 the IOViewer library references IOScene and no engine. Only command line tools combine several adapters.
- Frozen extras. Viewer, export, and coordination features inside IfcIO and NwcIO get bug fixes only. They stay available and are removed no earlier than that engine's 1.0, and only after a published replacement exists.
flowchart LR
ifc[".ifc / .ifczip"] --> IfcIO
rvt[".rvt / .rfa"] --> RvtIO
nwc[".nwc / .nwd / .nwf"] --> NwcIO
dwg[".dwg"] --> DwgIO
IfcIO --> IfcIOScene["IfcIO.Scene"]
RvtIO --> RvtIOScene["RvtIO.Scene"]
NwcIO -.-> NwcIOScene["NwcIO.Scene (planned)"]
DwgIO -.-> DwgIOScene["DwgIO.Scene (planned)"]
IfcIOScene --> IOScene["IOScene<br/>scene model + JSON"]
RvtIOScene --> IOScene
NwcIOScene -.-> IOScene
DwgIOScene -.-> IOScene
IOScene --> IOViewer["IOViewer + ioviewer CLI"]
IOScene -.-> IOCoord["IOCoord (planned)"]
files[".glb / .obj / scene .json"] ---> IOViewer
IOViewer --> html[".html viewer"]
classDef rvt stroke:#F2A33A,stroke-width:3px
classDef nwc stroke:#3B82F6,stroke-width:3px
classDef ifcio stroke:#A855F7,stroke-width:3px
classDef dwgio stroke:#38BDF8,stroke-width:3px
classDef viewer stroke:#06B6D4,stroke-width:3px
classDef scene stroke:#10B981,stroke-width:3px
classDef planned stroke-dasharray: 5 5
class RvtIO rvt
class NwcIO nwc
class IfcIO ifcio
class DwgIO dwgio
class IOViewer viewer
class IOScene scene
class NwcIOScene,DwgIOScene,IOCoord planned
Solid arrows are code that exists; dashed arrows are planned. PlaIO has no scene adapter.
| Piece | Status |
|---|---|
| IOScene | 0.1.0-preview.2 on NuGet; 0.1.0 is not released yet |
| IfcIO.Scene, RvtIO.Scene | Merged (IfcIO#36, RvtIO#198); not on NuGet yet, the first release needs IOScene 0.1.0 |
| IOViewer on IOScene | Merged (IOViewer#27) as 0.3.0-preview.1, a breaking API change; not released, NuGet 0.2.0 still uses the older model |
ioviewer with .ifc, .ifczip, .rvt input |
Draft (IOViewer#28) |
| NwcIO.Scene, DwgIO.Scene | Planned |
| IOScene.Formats | Planned: GLB/OBJ readers and a GLB writer over IOScene |
| IOCoord | Planned: clash, measure, grids, diff, and BCF over IOScene |
Until the adapters ship, the released tools can be chained, using IfcIO's frozen GLB export: rvtio project.rvt project.ifc, then ifcio export project.ifc --glb scene.glb, then ioviewer scene.glb -o viewer.html.
Versioning. In 0.x a patch release is additive and a minor release may break. A dependent references one IOScene line as [0.N.0, 0.N+1.0-0) (during the preview [0.1.0-preview.2, 0.2.0-0)), and an adapter pins its engine as [X.Y.Z]. Releases go in order: IOScene, then the engines with their adapters, then IOViewer.
- Pure Managed .NET:
- No C/C++ native libraries (
.dll,.so,.dylib). - Targets .NET 8 and .NET 10; the engine and viewer READMEs list Windows, Linux, and macOS as supported.
- No C/C++ native libraries (
- No Proprietary SDK Dependencies:
- Works without Autodesk Revit, Autodesk Navisworks, AutoCAD, Archicad, or their APIs.
- Clean-Room Specification:
- Written independently from format analysis, ISO/buildingSMART standards, and documented specifications.
- No decompiled or leaked source, no vendor headers or SDKs. The few open-source components, such as OpenMcdf and SharpZipLib in RvtIO and three.js in IOViewer pages, are listed in that repository's
THIRD-PARTY-NOTICES.md.
- Stated Scope:
- Each README states the tested version range and what is not read or written; IfcIO and NwcIO also list their frozen features.
Install any of the libraries via the .NET CLI:
# Autodesk Revit engine
dotnet add package RvtIO
# Autodesk Navisworks engine
dotnet add package NwcIO
# buildingSMART IFC engine
dotnet add package IfcIO
# Autodesk DWG engine
dotnet add package DwgIO
# Archicad project container reader
dotnet add package PlaIO
# Neutral scene model (preview only so far)
dotnet add package IOScene --prerelease
# Standalone WebGL/HTML viewer generator
dotnet add package IOViewerEvery engine and the viewer ship a command line tool for CI/CD scripting; IOScene is a library only:
# Install the CLI tools globally
dotnet tool install --global RvtIO.Cli
dotnet tool install --global NwcIO.Cli
dotnet tool install --global IfcIO.Cli
dotnet tool install --global DwgIO.Cli
dotnet tool install --global PlaIO.Cli
dotnet tool install --global IOViewer.Cli
# Export a Revit project to IFC
rvtio project.rvt project.ifc
# Convert a Navisworks model to binary glTF
nwcio model.nwc model.glb
# Run clash detection over a folder of Navisworks models with BCF output
nwcio ./models --clash-bcf clashes.bcfzip --clash-tolerance 0.01
# Inspect an IFC model
ifcio info Building.ifc --report
# Inspect a DWG drawing
dwgio inspect drawing.dwg
# Inspect an Archicad project file
plaio info project.pln
# Generate a standalone HTML viewer from a GLB model
ioviewer model.glb -o viewer.htmlDirect .ifc, .ifczip, and .rvt input for ioviewer is coming with the scene adapters (IOViewer#28, draft).
- All repositories in the IOExtend organization follow a clean-room policy.
- Repositories contain no confidential customer models, vendor files, or proprietary binaries.
- Tests that need real model files (RvtIO, NwcIO, DwgIO, PlaIO) read them from a local folder named by a
*_TEST_FILESenvironment variable. CI does not set it, so those tests are skipped there. - Every public code repository has a
SECURITY.md. Report vulnerabilities through GitHub private vulnerability reporting (the repository's Security tab, Report a vulnerability), which is enabled in every public code repository. Please do not open a public issue for a security problem.