Revit三维模型中房间信息的自动标注方法①

2020-05-22 04:47齐保良蔺玉璞杨秀芝汪晴晴
计算机系统应用 2020年5期
关键词:中间件楼层视图

齐保良,蔺玉璞,杨秀芝,汪晴晴

(山东建筑大学 信息与电气工程学院,济南 250101)

近年来,建筑信息模型(Building Information Modeling,BIM)技术已广泛应用于建筑行业,Revit 是BIM 技术常用的建模软件之一[1].目前,钢筋BIM 模型三维视图中钢筋型号、直径等信息能够采用引线方式标注[2,3],CAD 图中的房间名称等信息可以自动转换到Revit 楼层平面图中[4,5],但是,Revit 三维视图无法显示房间名称及ID 信息,在仿真漫游或观察剖面视图时,需要由三维视图切换到二维楼层平面图查阅标注的房间名称及ID,降低了工作效率.

本文旨在设计一种在Revit 三维视图中自动标注房间名称及ID 信息的中间件,减少仿真漫游或观察剖面视图时Revit 二维与三维视图之间的多次切换,并自动准确定位房间位置,解决标注信息位置与模型重叠问题.

1 基于Revit 的中间件二次开发技术

中间件,作为Revit 楼层平面图与Revit 三维视图之间的数据中转站,在提取、存储二维楼层平面数息标注到三维视图模型房间方面做到了起承转合的作用.

Visual Studio 是微软基于.NET Framework 框架的一个集成开发环境.在本文中,Visual Studio 软件作为Revit 二次开发的平台.Revit 的应用程序接口(API)能够访问Revit 模型的图形数据、参数数据.

基于Revit API 接口设计中间件有两种方式:外部应用函数(IExternalApplication ())和外部命令函数(IExternalCommand ()).Revit 开发平台通过两者后缀为“.addin”的文件识别和加载外部插件,其中IExternalApplication ()需要调用两个接口命令函数(OnStartup ()和OnShutdown ())创建应用程序.该工作方式在运行的Revit 开发平台上即可进行编程和调试工作,调试完毕重新加载运行调试的程序实现功能扩展,节省编程调试时间.而IExternalCommand ()函数在程序调试时,需要关闭Revit 软件平台,返回到外部命令函数调用Execute ()函数调试程序,由于反复关闭和启动Revit 软件平台,会需要更多的调试时间.

本文选用IExternalApplication ()函数创建功能面板,通过加载Addin Manager 来识别外部工具.该方式利用Visual Studio 集成开发环境、C#编程语言,添加引用Revit API.dll 和Revit API UI.dll 接口,搭建Revit 软件应用平台,通过IExternalApplication ()函数来读取应用插件.基于Revit 的中间件二次开发技术的外部应用操作流程如图1所示.

2 中间件设计方案

在Revit 软件平台上,链接CAD 图纸,由二次开发的“CAD 文字转化”插件自动识别链接图纸的房间名称及ID 文字信息,并标注于Revit 楼层平面房间[6].自动标注Revit 三维视图房间信息的中间件在此基础上进行设计.具体设计可以分为三部分:中间件楼层房间信息获取方法、中间件数据存储及中间件模型房间信息标注方法.

2.1 中间件获取楼层房间信息方法

在以标准建筑规范为准的Revit 二维楼层平面中,各房间通过Revit 软件“标记房间”功能标识房间,并且它也是由建筑墙体、门窗等构件无缝连接组成的封闭轮廓.其中不同房间名称可能相同但是其ID 信息和坐标定位不同.通过Revit API 获取楼层房间信息需对建筑房间内的构件进行访问、类别过滤以及坐标定位.

2.1.1 建筑构件的访问

在建筑设计建模时,类别(Category)是一组图元,类名是该组图元的名称[6].根据构件标识特征,Revit API 对不同构件进行辨别和访问.该方法访问系统族实例仅需要判断构件的类名属性即可,访问可载入族实例需要共同判断构件的类名及类别.

由于门、窗、柱等构件没有专用的系统类来表示,都是FamilyInsurance 的载入族实例,无法通过类名辨别,故Revit 二次开发的中间件需要采用类别和类名判断载入族实例的构件.

图1 基于Revit 的中间件二次开发技术的外部应用流程图

2.1.2 建筑构件的类别过滤

Revit 开发平台中所有的对象构件遍历都要使用过滤收集器(FilteredElementCollector)收集被过滤的对象,在过滤操作时结合多个过滤器共同使用,过滤后,过滤收集器获得满足条件的对象构件集合[7,8].

Revit API 创建过滤收集器后,选择其中的构件过滤条件,过滤当前楼层平面图中的构件,指定视图中的可见对象或集合,例如房间(Room)、墙体(Wall)、门(Door)等.以Room 类为例:

FilteredElementCollector roomFilter=new Filtered ElementCollector(doc);//创建过滤集合

ElementCategoryFilter orCategory=new Element CategoryFilter(BuiltInCategory.OST_rooms);//创建类别过滤条件

roomFilter.WherePasses(roomCategory);//这个返回的是房间类别下的所有Element,包括了文件中的房间实例(对应type 为FamilyInstance),和用来创建房间实例的类型(type 对应FamilySymbol)

ElementClassFilter roomType=new Element Class Filter(typeof(FamilyInstance));//创建一个type 过滤器

roomFilter.WherePasses(doorType);

2.1.3 楼层房间信息获取

由于建筑模型内部是由多个房间和公共区域组成,所以判断房间是获取信息的主要依据,而楼层房间内的建筑构件应该由统一坐标系进行定位.Revit 楼层平面图中,房间名称及ID 信息标注于封闭房间墙体轮廓内部.

(1)坐标转化

在Revit 楼层平面图内,不同图元构件间的坐标基准值不同,图元构件通过图元间的相对位置进行定位.因此,图元构件首要进行坐标转换,转化为统一的模型坐标系.

Revit 软件提供了Transform 类来进行坐标转换,开发人员可以给Transform 对象进行赋值构造转换矩阵,使用该转换矩阵将给定的坐标点坐标转成模型坐标系.首先,初始化Transform,然后设置其目标坐标系的三个方向向量BasisX,BasisY,BasisZ 的值,使用Of Point 进行点坐标转换,用Of Vector 进行向量坐标转换,把目标点或向量坐标转换到模型坐标系的坐标.

Revit 开发平台内的GeometryInstance.Tr ansform函数访问族定义到模型中的位置矩阵,使用Transform转换矩阵计算出楼层平面图中的图元构件门、窗等族实例中的所有点在模型坐标系的位置(从族实例中获取其点、线、面的坐标也可以通过GeometryInstance对象的GeometryInstance.GetIns tanceGeomery()函数直接返回在模型坐标系下的坐标).

(2)坐标定位

Revit 图元构件的定位信息通过两种方式来获取:

1)使用Revit.Location 函数来获取定位简单族实例位置.包含两类对象:

①基于点的族实例:例如柱子、门窗和家具等.基于点的族实例的Location 属性返回Location Point IP 对象,通过IP Point 获得插入点的位置坐标以及IP Rotation 获得该点的旋转角度,其值为弧度值,逆时针旋转为正.

②基于线的族实例:例如梁、墙等.基于线的族实例的Location 属性返回Location Curve Ic 对象,通过Ic Curve 可返回基线,从而获得路径的起始点和终止点的位置信息.

2)使用Element Geometry 函数来获取复杂图元的点、面、线空间定位.例如:楼梯、屋顶、斜墙.

(3)确定房间边界

在Revit 楼层平面中,通过Revit API 获取标识房间的参数及封闭房间边界坐标.房间边界可以为几种图元构件:墙体、门、窗、柱等.

图元构件元素为房间边界的条件:

1)对于模型曲线的元素,它的类别是BuiltInCategory.OST_AreaSeparationLines.

2)对于其他元素,比如墙、柱,它们的房间边界(BuihInParameter.WALL_ATTR_ROOM_B OUNDING)参数必须设为True.

Revit API 获取所有房间边界信息可以用Room 里的

public IList>GetBo undarySegments

(

SpatialElementBoundaryOptions options

)

BoundarySegment 函数集合IList>包含了每一个房间边界的信息.房间边界类图如图2所示.

图2 房间边界类图

(4)获取房间信息

楼层房间经建筑构件的访问和过滤收集器过滤后,将指定的集合房间存入创建好的收集器中,接着,使用Transform 类转化为统一的模型坐标系,使用Revit.Location 获取建筑楼层房间边界的坐标定位信息;再通过Revit API 的内置参数BuiltInParameter.ELEM_ROOM_NAME 直接识别和提取房间名称、ID 字符串,为下一步数据存储做好准备.

利用各楼层房间边界的区域坐标数据范围来表示中间件获取的楼层房间名称及ID 信息.在Revit 楼层平面图中,定义图纸楼层房间的左下角为坐标系原点(0,0),分别利用直角坐标系表示各个封闭多边形的4 个节点,而4 个节点分别做4 条直线X=Xi,X=Xj,Y=Yi,Y=Yj,该四条直线所围成的封闭多边形为房间边界轮廓,利用Boundary Segment 函数来确定房间边界,取该封闭多边形区域的阴影部分任意一点表示该房间的名称及ID 信息.如图3所示.

图3 封闭多边形的定义信息图

以某幼儿园施工图的一层楼层平面为例(如图4所示),取施工图中某一特征点A(xi,yi),其中(x0≤xi≤x1,y0≤yi≤y1)内的点代表活动室101;(x1≤xi≤x2,y1≤yi≤y2)内的点代表办公室103 以此类推.

图4 以某幼儿园施工图的一层楼层平面

2.2 中间件的数据存储

数据库作为Revit 楼层平面图与Revit 三维视图之间的数据中转站,在数据储存、数据调用方面起到重要作用.

工程技术人员在进行模型房间标注时,需要鼠标移动选择待标注的模型房间位置发送到中间件,而中间件需要获取该位置的空间坐标系数据信息,才可以进行下一步的运算.所以,数据表存放着Revit 楼层平面图中的各楼层房间直角坐标系、楼层信息以及房间名称及ID 信息.

本方案中BIM 数据库(Epplus 库)的构件主要包含2 张数据表,分别为:1)房间名称及ID 的数据表,保存了BIM 模型中房间名称及ID 信息;2)房间边界的数据表,保存了BIM 模型中房间轮廓的坐标数据信息.

为清楚每条记录都能够被唯一识别,便于和其相关的语句相映射,需要定义房间名称及ID 来使数据库中每条记录可以被唯一识别,以便于在各个表之间建立主键和外键关系.表1所示为一个房间存储信息数据表,以房间的名称及ID 作为主键,其他的字段包括文件名名称、围成房间边界的墙体ID 及门窗等,清晰地反映房间的坐标数据信息.

表1 房间名称及ID 数据表

以上述幼儿园为例,其中一层活动室101,教室103,二层办公室201 等楼层分布,如图4所示.提取直线X、Y 坐标数据信息,经过E p p l us 库输出到Excel 表格,其中,表格抬头分为“楼层信息”、“房间边界坐标数据”、“房间名称”、“房间ID”,按组将坐标信息写入表2某幼儿园生成中间件的Excel 文件.

2.3 中间件房间信息标注

在Revit 三维视图下,结合Revit API 判断待标注的模型房间空间坐标系的位置,匹配中间件内存储坐标数据,并提取模型待标注信息,将需要标注的房间名称及ID 信息加载到模型房间中,完成标注.

表2 某幼儿园生成中间件的Excel 文件

2.3.1 Revit 坐标数据匹配算法

在Revit 三维视图中,获取模型标注信息,匹配中间件内坐标数据信息算法思路:确定需要标注的模型房间,取其模型房间内任意一点A,获取该点空间坐标系(xi,yi,zk),令zk代表楼层的高度,(xi,yj)代表楼层房间内的位置,如图5所示.

图5 获取空间坐标系

根据zk的大小,判断其所属楼层平面内的楼层范围,从而获得楼层ID;再将A点在XY 平面内分别作X 轴、Y 轴垂线,根据(xi,yj)能够通过与中间件文件内数据的匹配,准确判断获得楼层ID 的直角坐标系所属范围,从而获得整个模型房间的名称及ID.三维模型房间的数据信息匹配算法流程图,如图6所示.

具体的判断方法:在空间坐标系中,令Z 轴代表楼层的高度,X、Y 轴代表楼层房间内水平位置.以图5的A点为例,根据zk的大小,判断其楼层平面内的楼层ID,假如 0≤zk≤1,则代表楼层平面的一层;1≤zk≤2,则代表二层.而A点的(xi,yj)坐标代表楼层内的房间位置,判断该点的(xi,yj)是匹配中间件存储的直角坐标系数据组的范围,根据表2生成的.xls 文件,假如x0≤xi≤x1,y0≤yj≤y1,0≤zk≤1,则确定该房间是活动室101;x1≤xi≤x2,y0≤yj≤y1,1≤zk≤2,则确定该房间是教室102,以此类推.

图6 模型信息数据匹配算法流程图

访问中间件存储数据,需要C#语言在VS 中进行添加引用.dll 文件,以下为连接中间件的程序主要代码:

string strConnect="Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + excelFilePath + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'";

2.3.2 Revit 三维视图中模型信息提取标注

在Revit 三维视图中,对中间件内存储的楼层平面内坐标数据的访问、提取,利用遍历特征,获取房间名称和ID 的属性信息.提取数据信息的具体流程如图7所示.

在仿真漫游或是剖面视图下,采取鼠标触发事件技术,显示房间的名称和ID 信息,利用提示节点(Tooltip)函数功能,提取中间件信息实现标注.当鼠标移动其模型房间区域内任意一点时,模型房间信息将会通过提示节点出现在鼠标旁,适时显示模型房间的信息;当鼠标移开之后,信息消失.具体实现显示信息流程如图8所示.

图7 Revit 数据信息提取流程图

图8 模型房间显示方式

2.4 小结

经过上述中间件房间数据信息的描述,自动标注Revit 三维房间信息中间件框架设计流程图,如图9所示.

具体总结为几个步骤:

Step 1.在Revit 楼层平面图中,通过Revit API 接口对建筑构件访问,创建过滤收集器、过滤条件,将房间Room 存入到收集器中.

Step 2.各楼层房间图元构件利用Transform 函数坐标转化为统一的模型坐标系,RevitLocation 函数坐标定位获取房间区域边界轮廓的坐标数据,利用Revit API 内置参数BuiltInParameter.ELEM_ROOM_NAME获取房间名称及ID 字符串信息.

Step 3.结合SQL server,建立基于BIM 数据库(Epplus 库),并定义ID 使得数据库中每条记录可以被唯一识别,确立各个表之间主键和外键关系,接着,将Step 2 中提取的房间信息存储到数据库,并将数据库存储信息写入Excel 文件.

Step 4.在Revit 三维视图中,判断待标注的模型房间空间坐标系的位置,再次借助Revit API 接口,提取空间位置坐标数据.

Step 5.采用坐标数据匹配算法,将空间定位的位置坐标数据组与中间件存储的直角坐标数据信息进行匹配,提取待标注数据信息.

Step 6.利用鼠标触发事件,显示三维视图中模型房间名称及ID 信息,完成标注.

图9 自动标注Revit 三维房间信息中间件设计流程图

3 实例验证

根据分析以上所提出的三维视图房间标注方法,采用面向对象技术的C#语言,使用Visual Studio 2013 进行代码编写,在Autodesk Revit 2016 中进行测试.其中在Revit 中,利用外部命令Addin Manager 来加载运行编译完成的中间件名称“fangjian.dll”—点击“fangjian.Command”—“Run”运行加载模型房间的标注.图10为Revit 附加模块生成的中间件.

本测试是以某幼儿园实际工程为案例,一楼三维剖面视图上进行标注,其标注内容为房间名称及ID,完成效果如图11所示.

图10 在Revit 中运行的中间件

图11 某幼儿园1 楼活动室三维剖面视图模型房间标注

Revit 三维模型的标注,将房间的名称及ID 添加到三维模型中,能够让工程技术人员清晰的看到房间的名称和ID,相比较于之前需要查阅Revit 楼层平面上的标注来确定房间名称及ID,节省了部分时间,提高了阅图效率.

4 结束语

本文主要结合Revit 二次开发技术,重点研究模型房间在三维视图中自动标注房间名称和ID 信息的方法,具体得到以下结论:

1)本文借助Revit API 接口,研究了Revit 三维模型视图中自动标注楼层平面房间信息的方法,该方法能够将楼层平面房间坐标信息提取并存储到中间件中,而且调用中间件存储信息自动匹配坐标数据对模型房间标注名称和ID 信息.

2)以某幼儿园工程为例验证程序的可行性及稳定性.通过工程图纸房间测试,能够看到三维视图中的房间名称及ID 信息.给设计人员和审图人员节省了部分时间,提高了工作效率.

3)本文研究的三维标注模型房间自动标注方法有待更多的工程实例测试,此外,由于BIM 模型本身的复杂性,更多的丰富信息标注待进一步研究,这也为Revit在三维模型标注方面或其他程序开发提供一些经验.

猜你喜欢
中间件楼层视图
奶奶做的“楼层儿”
楼层
我国自主可控中间件发展研究
电梯的升与降
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图
《投影与视图》单元测试题
Django 框架中通用类视图的用法
以实力证明 用事实说话
中移动集采:东方通中间件脱颖而出