使用C#解析GIM文件

基本原理


.gim压缩文件从数据格式角度可以分为两类,一类是键值对形式的普通数据格式,例如.cbm、.dev、.phm、.fam等,这些文件每一行总是“Key=Value”的形式。一类是XML文件类型的特殊数据格式,例如.mod等。无论是键值对形式还是XML文件形式,都依赖于一系列关键字,只要关键字可以对等转换,便可以实现GIM转IFC。因此,基于C#语言,设计GIM关键字到IFC关键字的动态链接库DLL,便于后续解析。GIM关键字包括颜色Color、局域坐标系TRANSFORMMATRIX、布尔运算Boolean、CBM文件、DEV文件、PHM文件、MOD文件、FAM文件、三维设计模型基本图元等。下面是GIM关键字在IFC中的映射。

(1)颜色Color:在IFC中需要由4个关键字来定义,首先是声明颜色IfcColourRgb,其中R、G、B的通道值和GIM定义不同,GIM定义在0-255之间,IFC定义在0-1之间,因此获取GIM颜色声明后,需要对R、G、B的值除以255以满足IFC的要求。接着声明曲面样式渲染IfcSurfaceStyleRendering,声明曲面样式IfcSurfaceStyle,最后进行样式指定IfcPresentationStyleAssignment。

(2)局域坐标系TRANSFORMMATRIX:在IFC中需要由3个关键字来定义,即“一点两轴”。首先是声明相对坐标原点IfcCartesianPoint,然后指定相对X轴的方向IfcDirection,指定相对Z轴的方向IfcDirection,最后进行相对坐标系的指定IfcAxis2Placement3D。由于GIM对于局域坐标系的指定,是左螺旋结构化矩阵(将三维变换矩阵按照左手螺旋的方式写成16个数字以逗号分隔的形式),因此,在转换前,首先需要对三维变换矩阵利用矩阵乘法进行处理。

(3)布尔运算Boolean:在IFC中需要由2个关键字来定义,即布尔运算类型IfcBooleanOperator ,在GIM中依次为交集Intersection、补集Difference、并集Common,在IFC中依次为交集INTERSECTION、补集DIFFERENCE、并集UNION,然后声明布尔运算结果IfcBooleanResult。

(4)CBM文件:CBM文件视为IFC文件装配树的节点,当父节点是CBM文件时,使用IfcElementAssembly进行声明。IfcElementAssembly表示从多个元素(如离散元素、建筑元素或其他元素)聚合的复杂元素程序集。CBM文件之间不含相对位置关系,因此,对IfcElementAssembly的局域坐标系可以不声明。

(5)DEV文件:DEV文件视为IFC文件装配树的节点,当父节点是DEV文件时,使用IfcLocalPlacement IfcElementAssembly进行声明。IfcLocalPlacement由两部分组成,一个是参考坐标系PlacementRelTo。例如柱子的参考坐标系是楼层IfcBuidlingStorey所在的坐标系。IfcBuidlingStorey以IfcBuilding所在的坐标系为参考,IfcBuilding以IfcSite所在的坐标系为参考,IfcSite定义的是整体坐标系,没有参考坐标系。一个是相对坐标系内的坐标转换RelativePlacement。
坐标系存在多层参考的情况,在明确各构件层次关系的前提下,进行逐级查询确定构件的绝对坐标。DEV文件之间包含相对位置关系,因此,对IfcElementAssembly的局域坐标系要进行声明。

(6)PHM文件:与DEV文件类似,使用IfcElementAssembly描述父节点,使用IfcLocalPlacement描述局域坐标系。

(7)MOD文件:与DEV文件、PHM文件等不同,MOD文件需要使用IfcBuildingElementProxy描述子节点(MOD文件属于最低阶别),使用IfcLocalPlacement描述局域坐标系。建筑元素类型用于定义应用于该类型的所有引用的特定类型建筑元素的公共属性。它用于定义建筑元素规范(即特定的产品信息,该产品类型的所有出现都是通用的)。可以交换建筑元素类型(或可实例化子类型),而不必将其指定给引用。IfcBuildingElementType是无法实例化的抽象类型。对于不能由IfcBuildingElementType的子类型表示的任意建筑元素类型,需要使用IfcBuildingElementProxyType。

(8)三维设计模型基本图元:通过总结《输变电工程三维设计模型数据交互规范》的附录B“三维设计模型基本图元及参数”,结合IFC4标准定义,将GIM基本图元分为以下5类:
拉伸体IfcExtrudedAreaSolid
旋转体IfcRevolvedAreaSolid
三角面模型IfcTriangulatedFaceSet
渐变拉伸体IfcExtrudedAreaSolidTapered
IfcBooleanResult布尔运算实体。

拉伸体IfcExtrudedAreaSolid包括长方体、圆柱体、圆形垫片、方形垫片、拉伸体、角钢、工字钢、槽钢、T型钢等;

旋转体IfcRevolvedAreaSolid包括球体、旋转椭球体、圆环等;三角面模型IfcTriangulatedFaceSet包括棱台(锥)、偏移矩形台等;

渐变拉伸体IfcExtrudedAreaSolidTapered包括圆台体、偏心圆台体等;

IfcBooleanResult布尔运算实体就是指GIM中定义的复杂图元,不能由旋转或拉伸一步完成的,包括台型垫片、旋转椭球体、瓷套、绝缘子、锥形瓷套、绝缘子串、V型绝缘子串、端子板等。

GIM三维基本图元的IFC描述


(1)球体Sphere:属于旋转体,首先定义二维圆形截面IfcCircleProfileDef,然后以原点为中心,绕X轴或Y轴旋转360度即可得到IfcRevolvedAreaSolid。
(2)旋转椭球体RotationalEllipsoid:属于布尔运算实体, 首先定义二维椭圆形截面IfcEllipseProfileDef,然后以原点为中心,绕X轴旋转360度即可得到IfcRevolvedAreaSolid,进而使用长方体作为布尔差集工具得到IfcBooleanResult。
(3)长方体Cuboid: 属于拉伸体,首先定义二维矩形截面IfcRectangleProfileDef,然后沿着Z轴正方向拉伸即可得到IfcExtrudedAreaSolid。
(4)棱台(锥)Table: 属于三角面模型,因为IFC4中还无法定义任意截面的渐变拉伸,因此暂时使用三角面模型代替。棱台有8个顶点,每3个顶点组成一个三角面即可得到IfcTriangulatedFaceSet。
(5)偏移矩形台OffsetRectangularTable: 属于三角面模型,定义过程与棱台(锥)类似。
(6)圆柱体Cylinder: 属于拉伸体,首先定义二维圆截面IfcCircleProfileDef,然后沿着Z轴正方向拉伸即可得到IfcExtrudedAreaSolid。
(7)圆台体TruncatedCone: 属于渐变拉伸体,首先定义两个二维圆截面IfcCircleProfileDef(底面),IfcCircleProfileDef(顶面),即可得到IfcExtrudedAreaSolidTapered。
(8)偏心圆台体EccentricTruncatedCone:属于渐变拉伸体,定义过程与圆台体类似,只是要注意顶面的二维圆截面要进行偏移。
(9)圆环Ring:属于旋转体,首先定义二维圆截面IfcCircleProfileDef(圆心位于X轴,法线方向是Y轴),以原点为中心,绕Z轴旋转即可得到IfcRevolvedAreaSolid。
(10)圆形垫片CircularGasket:属于拉伸体,首先定义二维环形截面IfcCircleHollowProfileDef,然后沿着Z轴正方向拉伸即可得到IfcExtrudedAreaSolid。
(11)台型垫片TableGasket:属于布尔运算实体,首先定义偏心圆台体,进而使用圆柱体作为布尔差集工具得到IfcBooleanResult。
(12)拉伸体StretchedBody:属于拉伸体,首先需要定义任意闭合截面IfcArbitraryClosedProfileDef,然后沿着指定方向拉伸得到IfcExtrudedAreaSolid。
(13)角钢AngleSteel:属于拉伸体,首先需要定义二维L形截面IfcLShapeProfileDef,然后沿着Z轴正方向进行拉伸得到IfcExtrudedAreaSolid。根据输变电工程三维设计模型数据交互规范》的附录B“三维设计模型基本图元及参数”,此时还需要进一步调整角钢位置,使用IfcAxis2Placement3D重新调整位置,直到符合电网规定。
(14)工字钢I-shapedsteel:与角钢定义类似,只是二维截面需要换成IfcIShapeProfileDef。
(15)槽钢ChannelSteel:与角钢定义类似,只是二维截面需要换成IfcCShapeProfileDef。
(16)T型钢T-Steels:与角钢定义类似,只是二维截面需要换成IfcTShapeProfileDef。
(17)瓷套\绝缘子PorcelainBushing:复杂图元,属于布尔运算实体,是1个圆柱体、多个圆台体的布尔并集运算。
(18)锥形瓷套ConePorcelainBushing:复杂图元,属于布尔运算实体,是多个圆台体的布尔并集运算。
(19)绝缘子串Insulator:复杂图元,属于布尔运算实体,是圆柱体、圆台体的布尔并集运算。
(20)V型绝缘子串VTypeInsulator:复杂图元,属于布尔运算实体,是圆柱体、圆台体的布尔并集运算。
(21)端子板TerminalBlock:复杂图元,属于布尔运算实体,首先需要定义包含倒角的任意二维截面IfcArbitraryClosedProfileDef,然后沿着Z轴正方向进行拉伸,然后用多个圆柱体作为布尔差集运算工具得到IfcBooleanResult。

GIM子文件的IFC描述


(1)CBM文件解析:从GIM入口文件project.cbm开始解析,当同级引用*.cbm文件时,转换为IfcElementAssembly;当下一级引用*.dev文件时,转换为IfcElementAssembly;当引用*.fam文件时,转换为IfcPropertySet。.fam文件中,每一行的键值对作为一个IfcPropertySingleValue。
(2)DEV文件解析:从上一级
.cbm文件或*.dev文件开始解析,当同级引用*.dev文件时,转换为IfcElementAssembly,并根据变换矩阵确定相对坐标系;当下一级引用*.phm文件时,转换为IfcElementAssembly,并根据变换矩阵确定相对坐标系;当引用*.fam文件时,转换为IfcPropertySet。.fam文件中,每一行的键值对作为一个IfcPropertySingleValue。
(3)PHM文件解析:与DEV文件解析类似。
(4)MOD文件:
.mod文件是XML格式文件,节点Entity里面用于描述基本图元或者布尔运算。按照从头到尾的顺序依次生成基本图元,并根据变换矩阵调整基本图元的位置,根据RGBA给基本图元添加颜色及透明度。把*.mod文件里面包含的基本图元集合作为IfcProductDefinitionShape(IfcProductDefinitionShape是构件所有描述的容器),进而将IfcProductDefinitionShape添加至IfcBuildingElementProxy。
在这里插入图片描述
(5)IFC文件生成:C#程序目前是边解析GIM,边生成IFC,将GIM转换后的全部信息都存放在DatabaseIfc中。DatabaseIfc是一个简单的数据库,里面存放了IfcProject、IfcSite、IfcBuilding、IfcElementAssembly、IfcBuildingElementProxy、IfcPropertySet、IfcColorRgb、IfcProductDefinitionShape、IfcPropertySingleValue等与GIM对应的全部信息。C#程序总是基于IFC2X3的标准进行转换。


解析效果

在这里插入图片描述

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hanssjtuer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值