返回 BIM 与 IFC 博客
IFC 中有两种完全不同的 GUID 问题,而且经常被混为一谈。第一种是重复 GUID:同一个文件中两个构件共用一个 GlobalId。第二种就是本文要讲的 GUID 不稳定:每次重新导出模型时,同一个构件都会得到不同的 GlobalId。两者都会破坏协调工作,但第二种更隐蔽,因为单看每个文件都完全有效。
如果你要做碰撞协调、运行 BCF 工作流程,或者把模型移交给设施管理(FM),稳定的 GlobalId 就不是可有可无的。只有靠它,工具才能判断“第 4 版里的这面墙和第 2 版里的是同一面墙”。一旦 GlobalId 发生漂移,所有指向旧 ID 的引用都会悄无声息地失效。
- 22 — IFC GUID 的字符数
- 3 — 首字符的最大值
- 0 字节 — 验证时上传的数据
- 100% — 在浏览器中运行
稳定的 GlobalId 应该是什么样的
每个继承自 IfcRoot 的 IFC 实体都带有一个 GlobalId:一个 22 个字符的字符串,使用 IFC 自定义的 base-64 字母表(0–9、A–Z、a–z、_、$)。规范明确要求它全局唯一且持久不变:同一个逻辑构件在各个版本之间、在不同软件之间往返时,都应保持相同的 GlobalId。正是这种持久性,让变更追踪、BCF 和资产登记成为可能。
// Revision 2
#1402 = IFCWALL('3LYa_FRDj3zhLfyYoQv6Jr', $, 'Exterior Wall - 300mm', ...);
// Revision 3 — same wall, regenerated GlobalId. Every reference to the old ID now dangles.
#1402 = IFCWALL('2hQ8pZ_a1ABxKm9dELc0Ru', $, 'Exterior Wall - 300mm', ...);
Revit 为什么会重新生成 GUID
根本原因在于,Revit 构件与其导出的 IFC 实体之间并不总是存在干净的一对一映射。一个 Revit 构件可能拆分成多个 IFC 实体(一个栏杆扶手会拆成扶栏、栏杆柱和扶手),而当不存在稳定的 1:1 关系时,导出器就没有可靠的依据来推导出一致的 GlobalId,于是只能生成一个新的。
过去,Revit 中的 IFC GUID 参数是只读的,这意味着即使团队想把它固定下来也做不到。较新版本的导出器把它改成了可读写,这样就可以存储并重复使用该值。但你仍然需要打开正确的设置,因为在某些配置下,默认行为是重新生成。
- 子构件拆分:一个主体构件导出为多个 IFC 实体(栏杆扶手、楼梯、幕墙、带封檐板的屋顶),是 GUID 漂移的典型来源。
- 以“生成新 GUID”的方式重新导出:有些导出配置每次都会重新创建 GUID,而不是复用已存储的值。
- 在建模软件中复制/粘贴或编辑组,可能会重置用来推导 GUID 的内部 ID。
- 经过不保留 GlobalId 的工具往返(在查看器或转换器中打开后重新保存),会改写 GlobalId。
另一半问题:GUID 超出有效范围
还有一个相关的问题,手写的导出脚本经常踩中。有效 IFC GlobalId 的首字符在 6 位字母表中只能表示 0–3 这几个值,因为把 128 位的 UUID 压缩进 22 个 base-64 字符后,开头的那组 6 位只剩下 2 个有效位。如果脚本拿一个普通的、由 32 个十六进制字符组成的 UUID,直接截断或草率地重新编码,生成的首字符就会超出这个范围。
GUID 值超出了有效范围:如果首位是 0、1、2、3 以外的任何字符,它就不是符合规范的 IFC GlobalId。
buildingSMART 论坛:常见的 IFC 导出错误
超出范围的 GlobalId 会被宽松的解析器默默接受,却会被严格的解析器拒绝。于是同一个文件在一个工具里“能用”,在另一个工具里却验证失败。如果没有能明确标出范围问题的检查工具,排查起来会让人抓狂。
如何检测不稳定或无效的 GUID
只看单个文件是发现不了 GUID 漂移的:你需要比较两次导出,或者在一个文件内检查格式无效和重复的问题。在验证工具中打开两个版本,它会在 30 秒内标出超出有效范围、在文件内重复或格式错误的 GlobalId,全程在浏览器中完成,不上传任何内容。
在真实模型中检查 GlobalId
打开 buildingSMART 的 Duplex 示例模型,查看一份干净的 GlobalId 报告;然后拖入你自己模型的两次连续导出,找出哪些构件的 ID 被重新生成了。
IFC2x3 · 2.4 MB
打开交互式 IFC 查看器
如何保持 GUID 稳定
Revit
使用开源的 IFC 导出器,在 File → Export → IFC → Modify Setup → Advanced 中,把“Export IFC GUIDs”设为“Keep Existing”(切勿选“Generate New”)。这样会复用 Revit 为每个构件存储的稳定 GlobalId,而不是每次导出都生成新的。对于会拆分成多个 IFC 实体的构件,要接受其子实体可能无法做到完全稳定,把协调工作锚定在主体构件的 ID 上。
ArchiCAD
在 IFC Translator 设置中,启用“Write stable GlobalIDs (from AC internal IDs)”。如果不启用,ArchiCAD 推导 GlobalId 的方式可能导致它在不同导出之间发生变化。
修复已经漂移的 GUID
如果文件中已经存在无效或重复的 GlobalId,验证工具可以自动修复:它会使用正确的 base-64 字母表,生成新的、符合规范的 22 字符 GlobalId,且首字符在 0–3 之间。可以用它修复已交付文件的格式,但也要在上游修正导出设置,否则下一次重新导出又会把漂移带回来。
关于重复 GUID 的情况(两个构件共用一个 ID)以及完整的结构性检查,请参阅本博客的 IFC 中的重复 GUID 和 7 种最常见的 IFC 验证错误。
为什么每次导出 IFC 的 GUID 都会变?如何让它保持稳定