APP下载

基于Revit二次开发的三维地质模型信息读取方法研究

2023-02-13田龙强

电力勘测设计 2023年1期
关键词:曲面投影网格

程 浩,李 志,陈 俊,田龙强

(中国电力工程顾问集团中南电力设计院有限公司,湖北 武汉 430071)

0 引言

当前,工程设计正快速从传统的二维设计向三维设计迈进,随着建筑信息模型(building information modeling,BIM)技术的普及,一些传统的设计方法也在不断地被新的信息化技术所替代。

岩土工程勘察报告是各类工程结构专业设计的重要输入条件和设计依据,设计专业需要从中获取地表高程、各地层厚度及分布、岩土物理力学指标等信息。采用传统方式从钻孔剖面图、地质剖面图以及勘察报告中获取以上信息的过程较为繁琐,效率低且容易出现差错。目前,国内外诸多科研机构和工程勘察企业已经能够借助BIM技术建立三维地质模型并应用于工程[1-4],由于其采用了特定的算法,理论上准确性将优于传统方法。但是,由于业务划分及技术层面的原因,建立三维地质模型所采用的平台(如CATIA、ItasCAD等)往往与设计平台不同,使接收地质勘察资料的下游设计专业难以直接利用三维地质模型及相关数据,专业间数字化的信息传递方式中断,三维设计的优势无法进一步得到发挥。

Revit具有开放的应用程序编程接口(application programming interface,API),便于进行二次开发,具有良好的扩展性,因而被广大设计企业用作三维设计的基础平台。由于三维地质模型在岩土工程专业软件中建立,其文件或数据格式并不能完全被Revit软件识别,因而难以直接被下游专业使用,协同设计的目标受阻,此时只能考虑开发相关的程序以实现地层信息的读取。饶嘉谊[5]等通过在Revit软件中编写插件,读取勘察报告的钻孔数据,以插值的方式生成三维地质模型。范光龙[6]等设计了相关地质模型创建程序,应用Dynamo创建地形地质实体模型并将其置入Revit。以上两种方式均通过勘察专业提供的钻孔资料在Revit软件中实现了三维地质模型的创建,但相对于专业的地质建模软件,其地层模拟算法的准确性有待考量。陈国良[7]等通过工业基础类(industry foundation classes,IFC)实体扩展及属性集扩展模式,建立了面向三维地质模型的扩展模型,实现了IFC文件中的地层信息与地质属性的扩展和集成,但该方法需要针对不同的地质建模软件开发数据转换插件,在接收IFC地质资料的软件端也需要安装相应的插件解析数据,从而保证地质模型的正确转换和解析,因此其适用性存在一定的限制。本文将从地质资料接收专业的角度出发,探讨一种基于Revit进行二次开发以读取地质信息的具体实现方法。

1 主要技术路线

IFC标准是由国际协同工作联盟(International Alliance for Interoperability,IAI)为建筑行业发布的建筑产品数据表达标准,用于在不同的软件平台之间共享工程数据,在全球已得到广泛应用。目前较多三维地质建模软件以及包含Revit在内的多数三维设计软件对IFC格式的文件具有较好的支持,因此可借助IFC文件实现地质信息的传递。

Revit虽然能够打开IFC格式的地层模型文件,但在未经特殊处理的情况下,从三维地质建模软件中导出的地层模型一般不包含工程地质属性信息,仅保留地层的几何模型及地层编号或名称等标识,因此只能用来模拟各地层的分界面,而工程地质属性信息则需要采用其它方式传递。鉴于接收地质资料的专业一般对地质信息的需求并不复杂,将地形模型和地质信息分开传递再进行关联输出也是一种简便可行的方式。工程地质属性与地层标识具有一一对应关系,可将各地层的地质属性信息导出为格式化的数据或制作成数据表,则从IFC地层几何模型中仅需要获取给定位置处地层的几何信息及其标识,然后再与对应地层的工程地质属性关联,即可得到给定位置处完整的地质信息,整体实现过程如图1所示。

图1 三维地质模型信息的转换与传递过程

各三维地质建模平台采用的数据结构和地质模拟算法一般不同,其导出的IFC文件的数据结构也不相同,地层模型可能被处理为地层分界面,也可能被处理为实体,但通过Revit解析之后,最终都将表现为几何基元类[8]或其组合,如Face、Edge、Mesh或Solid等,它们的几何信息都可以通过Revit API提供的相关属性或方法来获取,区别在于相关元素的查找和判断的过程有所不同。鉴于三维地质建模软件众多,本文以ItasCAD软件导出的模型为例介绍具体读取方法,对于其它软件导出的地层模型,可参考本文方法,根据具体情况编写读取地层几何模型的代码。

2 开发实现

图2为从ItasCAD软件导出的IFC格式的三维地层模型,地表及每个地层的底面被处理为多个三角网格(Mesh)组成的曲面,曲面之间为空,没有填充表示土体的实体模型。各层的地形曲面在Revit中的族类型为“场地”。

图2 IFC格式的三角化网格三维地层模型

如图3所示,由于各地层的底面为网格化的曲面,对于勘察区域平面内的给定点,其在各层三角网格面上投影点之间的区域即为该点处各地层的分布范围,投影点的标高即为地层底面标高,各地层的厚度即为相邻投影点标高的差值。地层属性信息在地质模型文件外部通过数据表保存,通过地层标识即可进行查询。程序可以分为以下过程来实现:

图3 地层的地形网格曲面及投影点

1)打开地质模型文件,获取地层网格曲面元素;

2)求解投影点坐标,获取地层分布;

3)查询并关联地层属性信息。

以下将分别讨论具体的实现方法。

2.1 获取地层网格曲面元素

若要获取各三维网格的几何信息,必须先获取模型中所有的三维网格曲面元素。

对IFC文件的读写操作需要在IExternalCommand接口的Execute方法中实现。打开IFC地质模型文件可采用Application.OpenIFCDocument方法,也可先将*.ifc文件另存为*.rvt文件,再采用Application.OpenDocumentFile方法打开,后者打开文件的速度更快。以上两种方法仅将模型文件加载到了内存当中,而并未在Revit的用户界面中显示。

对打开的文件应用过滤器,以获取各地层三维网格曲面的实例:

此处的过滤器使用了Revit内建族类别BuiltInCategory.OST_Site作为参数,对于不同三维地质软件,其导出的地层模型族类别可能不同,可在Revit中查看地层网格曲面所属具体的类别之后,再确定过滤方式。

2.2 获取三角网格

如图3所示,在IFC地层模型文件中,每个地层曲面被划分为多个三角网格,求解曲面上投影点的过程即转化为求解三角网格所在平面上的投影点的过程,因此需要先获取投影点所在的三角网格。

Revit API提供了MeshTriangle.get_Vertex方法获取三角网格在局部坐标系下的角点,可通过坐标变换之后获取其在世界坐标系中的坐标。在xoy平面,对于任一三角形网格,当给定点的坐标在其所有角点坐标的最大值与最小值所形成的区间之外时,给定点的投影明显在该网格之外,可快速排除;反之则需进行精确判断,可以采用如下方法:

判断给定点和三角网格在xoy平面中投影的相对关系,设有与三角形网格三边同法线的三个向量,其方向形成闭合面(即向量相互首尾相连),当给定点均在三个向量的同一侧时,则可判定该点在三角形内。

对于向量p、q有如下性质:

若p×q>0,则p在q的顺时针方向。

若p×q<0,则p在q的逆时针方向。

若p×q= 0 ,则p与q共线。

则对于给定点以及三角网格的三个顶点,可按以上方法判断其位置关系,从而获取投影点所在的三角网格。

本过程主要实现代码如下:

由于需要获取给定点处所有的地层信息,此处首先对模型中所有的地层族实例进行遍历,依次在每个地层曲面中进行查找和判断。

如图4所示,在一个地层模型文件中,同一个族的不同族类型,其名称(Name属性)具有唯一性,因此根据地形曲面元素所属的族及其Name属性即可确定其所对应的地层名称。地层元素的Name属性一般对应于岩土工程勘察报告中的地层编号,在此种情况下无需再根据地层元素所属的族进行区分。在本例中,不同的地层被导出为不同的族,且各族仅有唯一的族类型,因此可直接将地层元素的Name属性作为各地层的标识。

图4 地形曲面族实例及其属性

判断给定点的投影是否在三角网格投影范围内的过程主要是向量的构造及计算,在获取三角网格的角点坐标之后,此过程相对简单,上述代码从略。

以上过程中需注意以下问题:

1)单位换算。从Revit API中获取的三角网格角点坐标等的单位为英尺,而国内在工程中通常使用公制单位,因此需先统一单位之后再进行判断。

2)从地层族实例中获取三角网格面的过程。通过FamilyInstance的get_Geometry方法可从地层族实例中获取其包含的GeometryElement,其中可能包含多个GeometryElement或GeometryObject。而在其中的GeometryElement中,可能存在更深层次的包含关系,需要多次使用SymbolGeometry属性获取更深层的GeometryElement,直至获取三角网格面Mesh(继承于GeometryObject)。上述示例代码仅作参考,实际需根据地层模型的构成关系进行对应的查找和判断操作。

对于族实例的内部组成和嵌套关系不明确的情况,可提前在Revit中打开地层模型文件,使用其它辅助工具(如Revit Lookup等)进行查看,能够比较清晰地了解地层族实例的内部组成关系,在编写代码时将更有针对性,提高效率。

从地层族实例中获取三角网格面,除采用上述方法之外,也可在调用get_Geometry方法之后,直接使用获取到的GeometryElement调用GetInstanceGeometry方法,无需通过逐层查找,即可较快速地获取三角网格面Mesh。

3)三角网格面的坐标变换。通过GeometryInstance.GetSymbolGeometry方法以及GeometryElement.SymbolGeometry属性所获取的三角网格面使用的是局部坐标系,需要通过坐标变换才能得到在模型坐标系下的表达。坐标转换矩阵可通过GeometryElement.Transform属性获取,使用Transform.OfPoint方法可将转换矩阵应用于传入的点,获取转换后的坐标。通过GeometryInstance.GetInstanceGeometry方法所获取的三角网格面则直接是在模型坐标系下的表达,无需再进行坐标变换。根据Revit API的说明,此方法在执行过程中涉及较大量的计算操作,可能会影响程序的执行效率。

2.3 获取投影点坐标及地层分布

在获取投影点的所在的三角网格之后,即可根据直线与平面的空间几何关系求解投影点的坐标。以上过程均为向量运算过程,不再列出。

除地表之外,对于每个地形曲面,求解到的投影点与其上一层投影点Z坐标之差即为该层的厚度,此曲面的Name属性即为当前地层的名称,依次获取各层的厚度之后即可得出该点处地层的分布情况。

2.4 查询并关联地层属性信息

物理力学指标等工程地质属性信息是地质勘察报告中的重要内容,也是设计专业在工程设计过程中的重要输入条件之一。前述过程实现了从IFC地层模型文件中获取给定点处的地层分布情况,但各地层的工程地质信息尚需从IFC文件外部获取。

各地层的工程地质属性数据可保存为表1所列的数据表,其中各地层的标识需与地层几何模型中的标识保持一致,以建立关联,便于查询。表中的字段可根据工程需要进行设置,各字段的单位可另行设计其它数据表进行保存或在程序中统一约定。则当给定勘察区域任一点坐标时,即可通过地层几何模型获取该位置处的地层分布,根据地层标识查询地层的工程地质属性信息,达到地质信息读取的目的。

表1 工程地质属性数据表示例

在完成以上功能之后,既可以将本程序封装成为动态链接库文件(*.dll),供其它程序调用,也可开发成为查询工具,直接将获取到的数据进行输出。

3 应用案例

采用本文所介绍的方法,某设计软件在Revit中开发了地层查询工具,并添加相关菜单项,如图5所示。

图5 软件菜单

在设计前,岩土专业按照三维设计的要求,在提供勘察报告的同时,还提供了三维地质模型及地层属性表,结构专业接收之后,可以使用地层查询工具在Revit中选择任意位置进行查询,程序可以直接输出该点处的地层分布情况。在总平面布置图中选择任意一点查询,程序输出结果如图6所示,查阅与其对应的二维地质剖面图如图7所示,对比可见二者比较接近。在勘探点平面布置图中分别从钻孔、剖面线以及剖面以外的位置各任选3个点作为样本进行查询,以人工从二维地质剖面图中查询所得的结果为基准,程序查询结果的差值见表2所列。考虑到地质剖面图的绘制误差、人工查询过程中的误差以及地层分布本身的不确定性等众多因素,对于工程设计而言,该结果在可以接受的范围以内。在实际工程应用中,该功能可减轻结构专业在基础设计工作中地质信息查询的工作量。

图6 结果输出示例

表2 程序查询结果与剖面图查询误差对比

图7 地质剖面图(单位:m)

4 结语

本文提出了一种通过三维地质模型读取地质信息的方法,基于Revit进行二次开发,以ItasCAD软件导出的三维地质模型文件为例,从地层模型及地层数据文件中读取信息,从而快速获取勘察区域内任意位置处的地层分布情况,初步实现了地质勘察与工程设计专业间的数据贯通,可减少设计专业查询地质信息的工作量,提高工作效率。

限于作者自身水平和当前三维设计技术发展现状,本文介绍的方法虽然实现了地层信息的读取,但仍存在以下问题需要深入研究:

1)对于地下水或溶洞等复杂的地质情况,缺少相应的处理和读取方式。

2)本文偏重地质信息读取过程,可在此基础上向实际应用方面延伸:在结果的查询方式上可添加其它查询方法;在最终结果的表现方式上,可引入图形化的表达方式,如输出剖面图等,将更为直观易用。

3)从结果上看,三维查询方式与传统二维剖面图存在一定的误差,尤其是在距离钻孔和剖面线较远的地方差别较大,虽不能简单地判定其中某一种方式的准确性,但欲使三维查询方式更加容易被接受,仍需采取一定的措施减小二者的差异。

猜你喜欢

曲面投影网格
用全等三角形破解网格题
简单拓扑图及几乎交错链环补中的闭曲面
解变分不等式的一种二次投影算法
基于最大相关熵的簇稀疏仿射投影算法
反射的椭圆随机偏微分方程的网格逼近
找投影
找投影
相交移动超曲面的亚纯映射的唯一性
重叠网格装配中的一种改进ADT搜索方法
关于第二类曲面积分的几个阐述