我正在进行一个项目,需要生成一个IFC文件,除了几何体,我没有得到更多的信息(我可以访问材料的密度和导热率,以及对象的基本标签)。
到目前为止,我只能找到IFC可以存储的内容,而不能找到IFC需要来存储的内容。
我需要在IFC文件中包含哪些内容才能正常工作
除了基本几何图形之外,IFC文件还需要什么?
免责声明:我没有阅读(或购买)该标准。我的知识主要来自于使用IFC文件和尝试不同的东西。并阅读buildingmart文档。所以我不能给你一个硬性保证,但我很有信心我的信息是正确的/可用的。
作为购买官方标准文件的替代方案,您可以通过buildingsmart查看官方文档。(也可以在这里查看更多的一般信息和其他/更现代版本的可用性)。
现在,假设您熟悉基本的STEP文件布局(标头和数据段),让我们跳到IFC文件绝对必须包含哪些内容才能被认为是正确的(据我所知,可能有解析器/加载程序可以加载不正确/不完整的文件,但我们并不针对它们)。另外请注意,我正在为IFC 4.0构建此示例。这对于当前的IFC 4.1标准应该是正确的,但对于旧的IFC2X3标准可能不是正确的(IFC2X3对IFC4有一些放宽)。此外,我还跳过了名称和描述——您可以设置这些字段进行测试,以便在查看器中识别您的结构(这比比较GUID更容易)。
IfcProject
所有元素的根都是IfcProject。它还包含所有其他元素的最基本特性和定义。这个实体上每个文档所需的属性只是唯一的id。但对于一个工作示例,您通常还需要一个最小的单元分配和表示上下文。
#20= IFCPROJECT('344O7vICcwH8qAEnwJDjSU',$,$,$,$,$,$,(#19),#13);
在单位分配中,您可以定义所需的单位,从几何单位到货币、热量等。最小值是长度、面积和角度,以有意义地定义几何项目。因此,对于我们的例子,我们只包括这些:米作为长度,平方米作为面积,弧度作为角度。如果需要英尺、英寸或度数,可以将其定义为衍生单位。
#10= IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#11= IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#12= IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#13= IFCUNITASSIGNMENT((#10,#11,#12));
表示上下文为给定的一类表示(=几何/参数描述)定义了基本坐标系。因此,简单的情况是在零点的三维右手系统。IFC使用的z轴指向上-如果您使用的是源自3D/OpenGl应用程序的模型/文件,通常假设y轴指向上,则这一点可能很重要。你还需要一个精度值——我在这里使用的是1.0e-5,但你可能想测试一下你是可以用更少的还是需要更多的。在组合几何体时(在构造实体几何体步骤中),通常在比较点/边时应用精度。如果有错误,请尝试其他精度值。
表示上下文的第二个属性是上下文类型。这是一个字符串,用于标识应在哪些表示上应用此上下文。该文档指出,价值观基于"实施者协议",这意味着AFAIK"看看其他人在使用什么"。根据我使用"模型"的经验,它适用于三维几何。对二维平面图和草图使用"平面图"也应该有效。
#14= IFCDIRECTION((1.,0.,0.));
#15= IFCDIRECTION((0.,0.,1.));
#16= IFCCARTESIANPOINT((0.,0.,0.));
#17= IFCAXIS2PLACEMENT3D(#16,#15,#14);
#18= IFCDIRECTION((0.,1.));
#19= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.0E-5,#17,#18);
元素的空间容器
元素不能直接添加到IfcProject中,它们需要放置在项目中包含的空间元素中。有三种可能的选择:IfcSite、IfcBuilding和IfcSpatialZone(请参见IfcProject页面上的"空间分解"部分)。IfcSpatialZone被定义为非层次空间元素,其用法与其他两个略有不同(元素是使用不同的关系添加的)。
一个站点作为空间容器就足够了。向其中添加所有元素可能在语义上很模糊(大多数围栏都是直接添加的,其他元素通常在建筑内),但并不错误。(国际金融公司不在乎你的花园里是否有电器)。由于IfcSite的几乎所有属性都是可选的,我们可以跳过这些属性。但要注意:如果你给你的网站一个表示(=一些几何形状),你需要包括一个位置。该网站将被聚合到与它相关的项目中。
#30= IFCSITE('20FpTZCqJy2vhVJYtjuIce',$,$,$,$,$,$,$,.ELEMENT.,$,$,$,$,$);
#31= IFCRELAGGREGATES('0Du7$nzQXCktKlPUTLFSAT',$,$,$,#20,(#30));
元素
实际上,这就是作为绝对最小结构所需要的全部。现在,您可以添加元素——从IfcProduct派生的某种类型的实体。由于所有这些元素都有某种意义,你要么需要选择那些与你拥有的对象非常匹配的元素,要么你可能想使用IfcBuildingElementProxy,这是最"无意义"(或者更好:没有专门的语义)的对象类型。以下代码放置了一个不带几何图形的代理。该放置引用了用于创建坐标系的相同坐标系定义,因为它不变换或移动任何东西。您的几何图形将通过产品定义形状添加,该形状具有形状方面,最后还有一些几何图形项。建筑智能文档中有几个指定几何图形的示例。
#40= IFCLOCALPLACEMENT($,#17);
#41= IFCBUILDINGELEMENTPROXY('3W29Drc$H6CxK3FGIxjJNl',$,$,$,$,#40,$,$,.NOTDEFINED.);
#42= IFCRELCONTAINEDINSPATIALSTRUCTURE('04ldtj6cp2dME6CiP80Bzh',#12,$,$,(#41),#30);
结论
因此,不需要太多作为添加元素的最低限度:
- 一个项目
- 基本单位定义
- 一个空间容器
完整的示例文件是:
ISO-10303-21;
HEADER;FILE_DESCRIPTION(('IFC4'),'2;1');
FILE_NAME('example.ifc','2018-08-8',(''),(''),'','','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#10= IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#11= IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#12= IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#13= IFCUNITASSIGNMENT((#10,#11,#12));
#14= IFCDIRECTION((1.,0.,0.));
#15= IFCDIRECTION((0.,0.,1.));
#16= IFCCARTESIANPOINT((0.,0.,0.));
#17= IFCAXIS2PLACEMENT3D(#16,#15,#14);
#18= IFCDIRECTION((0.,1.));
#19= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.0E-5,#17,#18);
#20= IFCPROJECT('344O7vICcwH8qAEnwJDjSU',$,$,$,$,$,$,(#19),#13);
#30= IFCSITE('20FpTZCqJy2vhVJYtjuIce',$,$,$,$,$,$,$,.ELEMENT.,$,$,$,$,$);
#31= IFCRELAGGREGATES('0Du7$nzQXCktKlPUTLFSAT',$,$,$,#20,(#30));
#40= IFCLOCALPLACEMENT($,#17);
#41= IFCBUILDINGELEMENTPROXY('3W29Drc$H6CxK3FGIxjJNl',$,$,$,$,#40,$,$,.NOTDEFINED.);
#42= IFCRELCONTAINEDINSPATIALSTRUCTURE('04ldtj6cp2dME6CiP80Bzh',$,$,$,(#41),#30);
ENDSEC;
END-ISO-10303-21;
请注意,加载这个不会显示任何内容,因为它不包含任何几何体。此外,请注意,我还没有验证它是否没有错误-我目前手头没有我的IFC工具(如果你想验证你的文件,请查看stepcode,它可以检查你的文件是否语法正确-它不会检查建筑智能文档中提到的概念的语义或强制执行。)
同样值得注意的是,引用/ID的顺序(如#20)可以自由排列——您可以引用稍后在文件中添加的元素,并且引用只需要对这一个文件是唯一的。这意味着示例文件的行可以被打乱,并且它仍然是一个有效的文件——解析器通常使用两步近似来创建内存中的表示(1。解析为IFC类,2。解析引用)。