# bim_reader **Repository Path**: xarray/bim_reader ## Basic Information - **Project Name**: bim_reader - **Description**: BIM data reader library, requiring only OpenSceneGraph. NO proprietary dependencies! Currently support .rvt (Autodesk Revit), .nwc/.nwd (Autodesk Navisworks) and .ifc formats. - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-11-11 - **Last Updated**: 2026-11-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # bim_reader 统一的 BIM 只读解析库:把 **IFC(STEP / ifczip)**、**Navisworks(NWC / NWD / NWF)**、**Revit(RVT / RFA)** 读成同一套基于 OpenSceneGraph 的场景结构,供渲染、校验和二次开发使用。 - 只读,不写回任何源文件。 - 三种格式共用一套 API(`bim::readFile` / `readIfc` / `readNwc` / `readNwf` / `readRvt`)。 - 场景主数据是 OSG 的 `Group` / `Geometry` / `MatrixTransform`;BIM 属性放在元素的 `UserData` 上。 - 解析失败**失败即跳过并计数**,绝不产出猜测值。 ## 目录 ``` bim_reader/ include/bim/ 对外头文件(BimTypes / BimScene / BimReader / BimValidate) src/core/ 场景构建、属性、校验 src/ifc/ STEP 解析、几何、IFC 读取器 src/nwc/ LcUStream 容器、流解析、NWC/NWD/NWF 读取器、分块解密 src/rvt/ CFB、paged gzip、分区框架、Formats/Latest 类表、ElemTable tools/ 合成夹具生成脚本 tests/ 自包含测试(C++,无测试框架依赖)+ 夹具 data/ r22_schemas.json(Revit 2022 类表) third_party/ rapidjson(submodule)、rapidxml CMakeLists.txt ``` ## 依赖 | 依赖 | 说明 | |---|---| | OpenSceneGraph ≥ 3.6 | 场景与几何载体。默认 `~/Public/osgverse/build/sdk`,可用 `-DOSG_ROOT=...` 覆盖 | | zlib | NWC/NWD 压缩块、Revit gzip、IFC ifczip | | rapidjson | Revit 类表 JSON、诊断报告(git submodule) | | rapidxml | 预留 XML 支持(本地副本) | 首次克隆后拉取子模块: ```bash git submodule update --init --recursive ``` ## 构建 ```bash cmake -S . -B build -DCMAKE_BUILD_TYPE=Release \ -DOSG_ROOT=$HOME/Public/osgverse/build/sdk cmake --build build -j 8 ``` 可选开关: - `-DBIM_BUILD_TESTS=OFF` 不构建测试 - `-DBIM_BUILD_VIEWER=OFF` 不构建 `bim_view` - `-DBIM_DATA_DIR=/path` 指定 `r22_schemas.json` 所在目录 ## 使用 ```bash ./build/bim_info model.ifc # 概要 + 诊断 + 校验 ./build/bim_info model.rvt --elements 20 # 列元素 ./build/bim_info model.nwd --json out.json # 结构化输出 ./build/bim_view model.nwc # 交互查看(OSG) ./build/bim_tests # 单元/回归测试 ``` API 最小示例: ```cpp #include #include bim::ReadResult result = bim::readFile("model.ifc"); if (result.ok) { const bim::Element* element = result.scene.findElement("ifc-42"); const bim::BBox box = result.scene.info().bbox; // 米 } ``` 所有长度最终以**米**表示(`ModelInfo::unitToMeter` 记录原单位换算)。 ## 支持矩阵 | 能力 | IFC | NWC / NWD / NWF | RVT / RFA | |---|---|---|---| | 容器与目录 | STEP / ZIP | LcUStream(lichunk-007/008) | CFB 复合文档 | | 层级/结构树 | ✔ 空间结构 + storey | ✔ 选择树 | ✔ Level → storey(名称与归属已验证) | | 元素与类名 | ✔ | ✔ | ✔ 2022–2027(文件自带类表) | | 属性 | ✔ 属性集 + 类型 | ✔(含环境/external) | ✔ 类名/ClassTag/Base Level/Type Name/Family;四类参数存储 + NamedParam 已解码 | | 几何网格 | ✔ Brep/Extrusion/Tessellation | ✔ block-index 三角带(NWC / NWD,raw / 打包布局) | ✔ GRep 平面面片(墙 / 板 / 屋顶,含孔洞) | | 单位 | ✔(含 `IFCCONVERSIONBASEDUNIT` 如英尺) | ✔(mm → m) | ✔ | | 压缩块解密 | – | ✔ Blowfish(NWD 记录布局/元数据块) | ✔ 截断 gzip、format 7/9 | 已知限制: - RVT 的紧凑参数四个存储(`ParamValueSetDouble/Int/AString/ElementId`)与 `NamedParam` 已能解码,但内置参数 id 到名称的对照表尚未随仓库提供,因此参数值暂不写入元素的属性集;名称、类型(`SymbolInfo.m_name`)、标高(`m_assocLevelId` + `DatumPlane.m_text`)已解出并与 IFC 交叉验证。 - RVT 的标高高程(`SpatialDraft::elevation`)尚未解出:`Level` 记录中的高程编码未确认,不做猜测。 - RVT GRep 几何目前只求值平面面片(`Plane`):墙 / 板 / 屋顶的 `Geometry → Face → EdgeLoop → Edge → EdgePnt` 图完整走查,含多环与孔洞桥接三角化;圆柱 / 圆锥 / 旋转 / 直纹 / Hermite 等曲面面片计数后跳过,族实例(门、窗、家具)的 `GInstance` 变换尚未展开。几何仍在元素自身坐标系(与 IFC 同名元素尺寸一致,但未落到项目坐标)。 - NWD/NWC 几何覆盖 `LcOpNwdGeometry` 的三角带记录(type 94);线(95)、点(96)与外部/参数化几何(181/103/104/105)目前只跳过不建网格。每个模型的记录编码由 `LcOpNwdGeometryCompress` 决定(坐标/法线/颜色/UV/长度/索引各自 raw 或打包),raw 与调色板两种布局都支持。 - NWF 的模型引用从 `LcOpNwfSceneSet` 解析(名称 + 原始路径),`LcOpNwfPathMap` 作为无 scene-set 时的回退;被引用的 NWC/NWD 会合并进同一场景。若 NWF 只引用 DWG/3DS/DWF 等本库不支持的原生格式,会以 `no referenced model could be loaded` 明确失败,不伪造几何。 - 未被识别的支撑记录(`*Attributes`、`*Elem`、`*Type`、`Family*`、`StairsPath*`、`RebarShape*` 等)统一归为 `Proxy`,不计入墙/板/门/窗。 ## 测试 ```bash ./build/bim_tests ctest --test-dir build --output-on-failure ``` 测试夹具在 `tests/data/`: - `sample.ifc` / `sample.ifczip` / `sample.nwc` / `sample.nwd` / `sample.nwf` / `sample.rvt`(format 9)/ `sample-format7.rvt`(旧分区框架) - `rvt-corpus/`:rvt-rs 生成的 tier1 夹具(Apache-2.0) 回归数据建议放在仓库外,用参数传入,例如: ```bash ./build/bim_info "/path/to/rvt-holdout-models-main/2024/rvt-holdout-2024.rvt" ``` RVT 几何的交叉验证方法:同名 IFC 里的 `Qto_*BaseQuantities`(`Width/Height/Length/Depth/ProjectedArea`)来自同一个 Revit 模型,可作为 oracle。当前 2022–2027 的 house/office 共 113 个墙/板/屋顶全部通过:墙厚度/高度误差 < 0.01 m、板三维尺寸误差 < 0.01 m、屋顶每层投影面积等于 IFC `ProjectedArea`;带孔楼板两个面的投影面积精确等于 2×(96−6.58) m²。元素标高名称也已写入场景,与 IFC `IfcRelContainedInSpatialStructure` 对照 0 分歧。 ## 路线图 1. RVT GRep 曲面求值(圆柱 / 圆锥 / 旋转 / 直纹 / Hermite)与族实例(`GInstance` / `GTarget`)变换; 2. RVT 标高高程; 3. NWD 其余几何:线(95)/点(96)已走查但不建网格;外部几何(181)/参数化与文字(103–105)待解码; 4. RVT 内置参数名表,把参数值写入属性集; 5. 空间树与楼层归属(RVT Level、NWD 层、IFC storey 统一)。 ## 许可证 MIT,见 [LICENSE](LICENSE)。