从IFC到glb,一键转换全流程详解
前面介绍了 IFC 相关知识, IFC基础 以及 Assimp解析IFC流程 。前面说了, Assimp 可以解析 IFC 但问题颇多,所以放弃了 Assimp 。今天把 IfcOpenShell 编译了然后基于 IfcOpenShell 做了个转换工具,其实就只是给 IfcConvert.exe 命令行工具加了个界面。
先说 IfcOpenShell 的编译过程。
IfcOpenShell 编译过程
强烈建议用它自带的脚本编译,因为它的脚本写得很完善。我之前用 cmake 编译的,比较麻烦,各种三方库需要自己编译,虽然可以用 vcpkg,但还是比较繁琐,但是用项目提供的脚本就非常简单了。
我是在 Windows 上编译的,其它系统就不谈了,这是编译参考链接:
https://github.com/IfcOpenShell/IfcOpenShell/tree/v0.8.0/win
建议按照这个来编译,比较麻烦的是某些库克隆可能会失败,我用 GitHub Desktop 手动克隆了好几次(话说这玩意还挺好用的)。
有点比较尴尬,我下午编译完,到我写这篇文章时发现官网也构建了 ifcConvert ,我编译之前可是去官网看了的,没找到才自己编译的 。

虽然基本是脚本编译,但我也说下我遇到的坑:
- 用 vs 自带的命令提示符,脚本会检测当前环境:

- 编译时需要先运行 build-deps.cmd 脚本下载并编译依赖库,下载过程一般情况会遇到下载失败,大家懂的,毕竟这个环境。这个最好解决,直接手动克隆即可;
- 编译时需要注意编译的平台以及类型,如下:
- build-deps.cmd Debug
build-deps.cmd - 我用的 vs2022,编译 64 位的,所以编译三方库这样运行脚本的:
- build-deps.cmd vs2022-x64 Release
- 默认是 RelWithDebInfo 的,一开始没注意,导致转换很慢,后面才注意到

- 有个 Python 设置,如果用本地的,需要按以下设置:
- set IFCOS_INSTALL_PYTHON=FALSE
echo PY_VER_MAJOR_MINOR=35>> BuildDepsCache-x64.txt
echo PYTHONHOME=C:\Python3>> BuildDepsCache-x64.txt - 我一直以为我用的是 conda 的 Python,这里我设置的就是 conda 的环境,结果环境变量里面 conda 的 Python 都没配置。或者就直接不管 IFCOS_INSTALL_PYTHON。
- 注意看运行时输出的配置参数,比如编译依赖时的参数对不对,是不是 64 位,是不是 Release等等参数:

- 三方库编译完成后脚本会把相应的库拷贝到项目目录下的 _deps-vs2022-x64-installed 文件夹下:

- 然后是编译 IfcOpenShell,运行脚本 build-all.cmd 就行了,编译过程出错也没关系,正常情况下能把解决方案生成,我编译过程没配置 Python.lib,导致编译 ifcopenshell_wrapper 失败,我没管,我不需要这个,所以直接打开解决方案编译项目了。
- 因为我要转 gltf,所以我在 Serializers 项目和 IfcConvert 项目的预处理器添加了 WITH_GLTF 宏,其他格式按需添加就行了。
- 最后一点,无关 IfcOpenShell,其实是和 vcpkg 有关的。因为我本地 vcpkg 安装了 OCCT,但 IfcOpenShell 安装依赖时也编译了 OCCT,vs 中的 IfcConvert 默认自动链接 vcpkg 的库,导致我最后编译出来的链接的是我 vcpkg 编译出来的动态库,但我想用前面编译出来的静态库,所以需要改下项目配置,把这个 autolink 改成否 :

- 以前内网编译也出现过这个问题, 这是个坑,得注意! 可以用 Dependencies (比那什么 Dependency Walker 好用得多)查看 dll 或 exe 依赖。
IfcConvert 转换工具
IfcConvert.exe 提供了转换功能,最简单的用法:
IfcConvert.exe inputfile.ifc outputfile.obj
支持的格式有:
- obj
- dae(编译时需要添加 WITH_OPENCOLLADA 宏)
- glb(gltf 2.0,编译时需要添加 WITH_GLTF 宏)
- usd(编译时需要添加 WITH_USD 宏)
- stp
- igs
- xml
- svg
- h5(编译时需要添加 WITH_HDF5 宏)
- cityjson(编译时需要添加 IFOPSH_WITH_CITYJSON 宏)
- ttl
- IFC-SPF
转换工具界面如下,就调用的 ifcconvert.exe,然后支持批量,没啥特别的:

转换效果
IFC 源数据

转换后数据 glb 模型(3D Viewer)

最后的最后
哦,IfcOpenShell 官方提供了在线的 viewer(基于 wasm),有点慢,但能看
