BIM标准格式——IFC文件格式详解
本文梳理了IFC(Industry Foundation Classes)标准的核心架构、几何建模方法及实例解析,重点分析其基于EXPRESS语言的面向对象建模机制、四层架构体系,以及多种三维几何表示方法(CSG、扫描体、B-Rep等)。通过典型建筑构件案例,揭示IFC文件在BIM(建筑信息模型)中的数据表达逻辑。
1. IFC标准概述
IFC是由buildingSMART组织制定的开放BIM数据标准,采用STEP(产品模型数据交换标准)的EXPRESS语言定义,支持跨平台建筑全生命周期数据共享。其核心价值在于通过统一数据模型解决工程领域异构系统间的信息孤岛问题。
2. IFC文件总体架构
2.1 EXPRESS语言基础
- 定义
- EXPRESS是ISO 10303-11标准的面向对象信息建模语言,用于描述实体、属性、约束及关系。
- 功能特性
- 支持数据类型(如整型、实型、字符串)与复杂类型(如列表、数组)
- 通过 ENTITY 定义对象类, ATTRIBUTE 声明属性
- 基于 INVERSE 关键字实现双向关联(如反属性)
2.2 四层体系结构
层级 | 功能定位 | 典型实体示例 | 依赖关系 |
领域层 | 专业领域构件(如电气、结构) | IfcBeam 、 IfcCableSegment | 依赖共享层/核心层 |
共享层 | 跨领域通用构件 | IfcSlab 、 IfcWindow | 依赖核心层/资源层 |
核心层 | 基础拓扑关系与概念 | IfcRelationship | 依赖资源层 |
资源层 | 可复用基础数据单元 | IfcMaterial 、 IfcUnit | 无依赖(最底层) |
继承规则 :上层实体可引用下层资源,反之不可(如领域层→共享层→核心层→资源层)
2.3 核心概念与继承机制
- 实体分类
- IfcTypeObject
- (类型对象):定义构件类型参数(如墙体厚度)
- IfcPropertySet
- 属性集,通过 IfcRelDefinesByProperties 关联实体
- IfcQuantitySet
- 定量集,描述物理量(如体积、面积)
- 属性类型
- 直接属性
- 本地定义(如 GlobalId )
- 导出属性
- 引用其他实体(如 ObjectPlacement )
- 反属性
- 双向关联(如 HasAssociations ),需通过 INVERSE 声明
案例分析 :
IfcBeam 实体自身仅定义 PredefinedType 属性,其余32个属性通过多级继承获得(如从 IfcBuildingElement 继承材质关联属性)。
3. 几何建模方法分析
3.1 构造实体几何(CSG)
- 原理
- 通过布尔运算组合基本体素(立方体、圆柱等)
- IFC实现
- #1021=IFCCSGSOLID(#1022);
#1022=IFCBLOCK(#1023,1000.,1000.,2000.); ! 长方体定义 - 优劣分析
✅ 数据量小、操作简单
❌ 无法表达复杂拓扑,显示效率低
3.2 扫描表示(Swept Solid)
- 原理
- 2D轮廓沿路径拉伸生成3D体
- IFC实现
- #1021=IFCEXTRUDEDAREASOLID(#1022,$,#1034,2000.);
#1022=IFCRECTANGLEPROFILEDEF(.AREA.,'1m x 1m rectangle', $,1000.,1000.); - 优劣分析
✅ 直观易用,适合规则构件
❌ 难以处理非均匀变形
3.3 面模型(Surface Model)
- 原理
- 通过有序面片定义几何边界
- IFC实现
- #1021=IFCFACEBASEDSURFACEMODEL((#1022));
#1022=IFCCONNECTEDFACESET((#1110,#1120,...)); ! 6个IFC FACE定义 - 特点
- 显式存储顶点坐标(如 IFCCARTESIANPOINT )与面边关系。
3.4 边界表示(B-Rep)
- 原理
- 封闭壳(Closed Shell)定义实体边界
- IFC实现
- #1021=IFCFACETEDBREP(#1022);
#1022=IFCCLOSEDSHELL((#1110,#1120,...)); ! 同Surface Model的面定义
3.5 曲面细分(Tessellation)
- 原理
- 三角网格逼近复杂曲面
- IFC实现
- #1021=IFCTRIANGULATEDFACESET(#1022,...);
#1022=IFCCARTESIANPOINTLIST3D(((x,y,z),...)); ! 8个顶点坐标 - 应用场景
- 可视化优化与轻量化传输
所以,需要注意的是,即便是称为BIM标准格式的IFC也并非全部存的是参数化对象!此外,IFC并非只能表示建筑物!
4. IFC文件实例解析
4.1 项目层级语义结构
IfcProject > IfcSite > IfcBuilding > IfcBuildingStorey
└─ 构件层级:IfcWallStandardCase, IfcSlab, IfcWindow 等
特点 :上层实体(如 IfcProject )仅含元数据(单位、作者),几何信息下沉至构件级。
项目: 整个项目信息,如文件名、项目名、IFCEntity类型(IfcProject)、文件头等。其中文件头会保存IFC Schema Identifiers,即IFC版本号
场所: 包含项目位置信息, 经纬高 (非必须)、地址、IFCEntity类型(IfcSite )、名称等。 注意,IFC文件可以保存坐标系,但在实际用的过程中,很少用到坐标信息。
建筑: 包含IFCEntity类型(IfcBuilding)、名称等。
建筑楼层: IFCEntity类型(IfcBuildingStorey)、名称等。 每个层级或对象都可以自定义属性。 以以下文件为例:

项目,场所,建筑,建筑楼层四个层次都是语义上的,没有几何信息,具体到某一个特定的对象才可能会出现真正的几何信息。如上所示,建筑楼层由墙、基础、屋顶、楼梯、门及窗户组成,而这一级也没有几何信息,直到下一级才有几何信息。如,墙是由四面标准墙(IFCEntity:IfcWallStandardCase)组成,每面墙都有自己的几何信息。
北墙是由长10500mm、宽3630mm、高3000的box、两个孔口及材料层(可以理解为材质)组成,具体如下:

4.2 墙体构件几何表达案例(IfcWallStandardCase)
ifc中墙的几何表达:
#35=ifc_wall_standard_case('2MqZHWBoDDXOHFNH3B0uR9',#5,'South wall',$,$,#71,#49,$,.STANDARD.);
//South wall由71和49构成
#49=ifc_product_definition_shape(#63,#50)
//49由63和50构成
#63=ifc_shape_representation(#48,'Axis','Curve2D',(#66));
#66=ifc_polyline((#64,#65));
#64=ifc_cartesian_point((-5000.,0.));
#65=ifc_cartesian_point((5000.,0.));
//63实际上是一条(-5000.,0.)到(5000.,0.)的线
#50=ifc_shape_representation(#42,'Body','SweptSolid',(#62));
//50是一个SweptSolid的Body,由#42引用,62构成。
#42=ifc_geometric_representation_context($,'model',3,1.e-05,#41,#37);
//42是一个geometric_representation_context上下文,定义了一些坐标信息等
#41=ifc_axis2_placement3d(#40,#39,#38);
#38=ifc_direction((1.,0.,0.));
#39=ifc_direction((0.,0.,1.));
#40=ifc_cartesian_point((0.,0.,0.));
#37=ifc_direction((0.,1.));
//定义了一些坐标信息等
#62=ifc_extruded_area_solid(#61,#59,#55,3000.);
//62是一个拉伸体,横截面为61,位置为59,拉伸方向为55,拉伸长度为3000.
#61=ifc_arbitrary_closed_profiledef(.AREA.,$,#60);
//61闭合截面,由60构成
#60=ifc_polyline((#51,#52,#53,#54,#51));
//60多段线,由51、52、53、54、51构成,闭合
#51=ifc_cartesian_point((-5000.,-180.));
#52=ifc_cartesian_point((5000.,-180.));
#53=ifc_cartesian_point((5000.,180.));
#54=ifc_cartesian_point((-5000.,180.));
//51-54四个笛卡尔点
#59=ifc_axis2_placement3d(#58,#57,#56);
#56=ifc_direction((1.,0.,0.));
#57=ifc_direction((0.,0.,1.));
#58=ifc_cartesian_point((0.,0.,0.));
//轴信息
#55=ifc_direction((0.,0.,1.));
//方向
//71基本定义了一些位置信息
#71=ifc_local_placement(#32,#70);
#32=ifc_local_placement(#25,#31);
#25=ifc_local_placement(#18,#24);
#18=ifc_localp_lacement($,#17);
#17=ifc_axis2_placement3d(#16,#15,#14);
#14=ifc_direction((1.,0.,0.));
#15=ifc_direction((0.,0.,1.));
#16=ifc_cartesian_point((0.,0.,0.));
#24=ifc_axis2_placement3d(#23,#22,#21);
#21=ifc_direction((1.,0.,0.));
#22=ifc_direction((0.,0.,1.));
#23=ifc_cartesian_point((0.,0.,0.));
#31=ifc_axis2_placement3d(#30,#29,#28);
#28=ifc_direction((1.,0.,0.));
#29=ifc_direction((0.,0.,1.));
#30=ifc_cartesian_point((0.,0.,0.));
#70=ifc_axis2_placement3d(#69,#68,#67);
#67=ifc_cartesian_point((1.,0.,0.));
#68=ifc_cartesian_point((0.,0.,1.));
#69=ifc_cartesian_point((0.,0.,0.));
用以下示意图可以表示出整个墙的构造结构:

值得注意的是IFC建模方式并不唯一,比如至少有两种布尔运算方式用于几何,IfcBooleanResults和IfcOpeningElement,本例中门窗的位置需要用IfcOpeningElement从墙上裁剪出来。

5. IFC工具
- BIMBase浏览器,PKPM推出的viewer,免费的,可以查看多种三维模型。
- BIMVision,波兰公司DataComp开发的IFC查看器, 我给他们提了个bug,至少两年了还没改。我当时问他们内核要多少钱,他说如果想用的话他们可以定制库嵌入到我们的应用程序,但源码的话说要至少几百万,我邮件都不想回了 。
- IFCEngine,这是个c++库,提供了IFCViewer(viewer提供源码,IFCEngine也可以提供源码,官网: https://rdf.bg/product-list/ifc-engine/ ) , 有意思的是该公司开发了一个名叫Geometry Kernel的几何内核库,源码仅售€13500!
- IFCOpenShell,开源库,提供了IFC读写以及转OBJ的工具,用的OpenCasCade建模。
- ifc++,开源库,我以前用的时候感觉比较慢,不知道现在咋样。
- Assimp,开源库,用来导入各种模型的,包括IFC,FBX,OBJ,3DS,DAE,STL,BLEND等格式的模型。比较强大,但bug也挺多的。
- 其他,IFC算是比较成熟的格式,支持导入导出,查看和打开的开源、商业软件还是比较多的,不一一列举了。
6. 讨论与应用建议
- 几何表示选择 :
- 优先级排序: B-Rep > Swept Solid > CSG (兼顾信息完整与兼容性)
- 大规模场景推荐 Tessellation 以优化渲染性能。但实际上
- 数据互操作性挑战 :
- 不同BIM软件对EXPRESS Schema解析差异(如Revit与FreeCAD)
- 推荐使用IFC验证工具 buildingsmart提供的在线validate服务校验模型合规性: https://validate.buildingsmart.org/dashboard
7. 结论
IFC标准通过分层架构与多几何表达方式的结合,实现了建筑全生命周期数据建模需求。建议在复杂构件建模中优先采用B-Rep方法,并加强反属性关联的标准化设计,以提升模型协同效率。