潘杰
摘 要:本文主要阐述了Dynamo可视化编程在BIM(建筑信息模型中的应用)。目前,针对快速且准确建模是设计、施工等企业的一个首要需求。随着Dynamo技术的引入,使得工程师能更为便捷地重新设计Revit软件的功能,以便能实现快速且准确建模的目标。
关键词:Dynamo;可视化编程; BIM; Revit; 预留孔洞
一、概述
(一)BIM建筑信息模型
BIM建筑信息模型是现今工程行业中的一个热点话题,《GB/T51212-2016建筑信息模型应用统一标准》对BIM的定义是[1]:在建设工程及设施全生命期内,对其物理和功能特性进行数字化表达,并依此设计、施工、运营的过程和结果的总称。
从BIM的定义中不难看出,BIM最重要的特征是数字化,这也是与传统CAD最明显的区别之一。这里的数字化,指的是模型应该包含数据信息,且这些数据信息在模型的不同阶段,会被继承和迭代更新,以此来支撑项目的设计、施工和运营。
由Autodesk公司出品的Revit系列软件是当下最广为人知的BIM建模软件之一,本文中的BIM管道模型,指的是用Revit软件创建的管道模型。后文中涉及到模型图元的概念、属性等都是基于Revit语境下产生的。
(二)Dynamo可视化编程
BIM引领建筑行业的变革,Dynamo便是那火车头[2]。自从2015年Dynamo横空出世后,便受到了业内的广泛关注,现在已成为BIM技术中的关键力量之一。
Dynamo产品的设计初衷就是为了简化开发过程。以往软件的二次开发(API)的缺点是高度复杂,周期长,灵活度不够,但是Dynamo的问世,提供了另一种软件开发的思路,通过组织连接节点,形成一个可视化的,可执行的程序,它使得软件开发变得不再高深莫测。
1、节点
节点是核心,每一个节点有各自的功能。节点有三部分构成:
(1)节点名称:描述的是该节点的基本功能,节点名称是可以自定义的。
(2)输入项:传入的参数,例如节点Point.ByCoodinates中,需要传入x/y/z三个数值。
(3)输出项:传出的参数,例如节点Point.ByCoodinates中,传出一个坐标。
由此不难看出,节点Point.ByCoodinates的功能是:传入三个数值,传出一个坐标。
2、节点连接
节点与节点之间是通过导线连接,从而形成逻辑关系。节点意味着功能,导线连接意味着逻辑关系,两者结合,构成一个完整的程序。
二、Dynamo管道预留孔洞的实现过程
(一)需求背景
机电管道综合协调是BIM设计、施工中的一个重要环节。管道协调的过程中,必然会涉及到预留孔洞的问题。在实际项目中,机电管道的模型往往是较为复杂的,管道布置纵横交错,这在一定程度上增加了管道协调的难度。
具体到预留孔洞问题,笔者总结了目前Revit使用上的两方面痛点。第一,Revit自带的开孔功能,需要人工绘制轮廓或者人工插入孔洞模型,在面对大批量的预留孔洞问题时,人工操作将会大大地降低工作效率。
第二个痛点是Revit开孔和放置套管模型是彼此分开的步骤,这意味着必须在结束开孔任务后,才能进行后续布置套管模型的任务。如果在开孔操作结束的同时,在相应位置自动生成套管模型,那么必定会显著地提高工作效率!
(二)核心思路
Dynamo可视化编程实现管道快速开孔及生成套管,大致可以分为以下三个过程:
1、读取模型数据
具体来说,首先需要读取管道的通径尺寸和外径尺寸。其次,需要读取楼板或者墙体等模型的结构厚度尺寸,以保证后续孔洞模型最终能完全贯穿楼板或者墙体。
2、求得管道与楼板、墙体等干涉位置
给定模型插入点的坐标,是放置孔洞模型和套管模型的一个必要条件。因此,需要求得管道的中心线与楼板或墙体表面发生干涉的位置坐标,此坐標即是孔洞模型和套管模型的插入点坐标。
3、生成套管模型及开孔
生成套管模型,并且需要对其尺寸参数进行赋值。根据上述两个过程,已经获取了楼板或墙体的结构厚度,即可以确定出套管模型的深度尺寸。对于套管的内外径尺寸,可以根据管道的外径尺寸来确定。最后,需要在楼板或墙体上实现开孔。
(三)Dynamo实现方法
1、选择模型
Dynamo有两种常用节点可以实现拾取Revit系统中的模型,分别是:SelectModelElement和SelectModelElements。两者的区别在于,前者只能选取单个模型,后者能批量选取多个模型。本文中,SelectModelElements更符合实际需要。
2、读取模型属性
首先,需要明确Revit属性是分成两类:实例属性与类型属性。Dynamo读取这两类属性所用的方法是不同的。
实例属性只能影响单个模型图元。例如,套管的标高属性,显然,每个单独套管模型,可以有各自不同的标高,修改一个套管模型的标高,不会影响到其他套管的标高。Dynamo读取Revit的实例属性,需要用到两个核心节点:Parameter.ParameterByName和Parameter.Value。
管道的通径尺寸、外径尺寸皆属于实例参数范畴,因此用上述两个节点即可读取参数。
类型属性与实例属性不同,类型属性是同一类型图元所共有的属性。例如,同一种类型的套管模型,其材质属性即为类型属性。更改任意一个套管的材质,其他同类别套管的材质会同步更改。Dynamo读取Revit的类型属性,需要多用两个节点:Family.ByName,Family.Types。
3、求得管道模型与楼板、墙体干涉的坐标
第一步,得到管道与楼板、墙体表面相交的几何图形。需要用到Dynamo的节点是Geometry.IntersectAll。它有两个输入项,分别为几何图形(geometry)和实体(solids),输出项为几何图形(geometry)。
第二步,将相交的几何图形(geometry)转换为轮廓线,進而求得轮廓线的中心坐标。在此用到的节点是Curve.StartPoint,该节点的输入项是轮廓(Curve),输出项为坐标(Point)。
4、生成模型的方法
本文中套管模型是族模型,这里重点探讨Dynamo生成族模型的方法。
第一步,在Revit中插入族,使用FamilyInstance.ByFace节点。该节点有四个输入项:
(1)族类型(Familytype)是套管的族类型;(2)放置平面(Face)是楼板或者墙体的表面;(3)放置点(Location)是管道截面与楼板表面或墙体表面相交的几何图形的中心坐标(Point);(4)参考向量(Referencedirection),在本文中,套管模型的放置方向应与楼板或墙体的平面垂直,通过两点坐标可确定方向向量。
第二步,族模型的属性赋值,使用Element.SetParameterByName节点。这里,根据管道模型的尺寸,自动对套管模型进行属性赋值。
第三步,在楼板或墙体上开孔。这里用到Dynamo中一个特殊节点:Python节点,它是通过代码来实现更为复杂的操作,这极大地丰富了Dynamo的适用性。笔者调用AddInstanceVoidCut方法,实现楼板或墙体开洞的功能。
以上是Dynamo管道预留孔洞实现的主要过程。在本次开发中,还有一些其他的功能,例如,用户可以决定是否需要在开孔的同时生成套管模型,由于受篇幅限制的影响,不做展开。三维测试的效果图以及源代码见下图。
三、结语
对于BIM管道模型预留孔洞,笔者尝试使用了Dynamo编程手段对其进行开发。相比于传统的软件API开发,Dynamo具有的最大特点是可视化,可视化指的是程序逻辑的可视,用户只需理清逻辑关系,找到合适的节点,就能实现开发目标。
Dynamo拥有丰富的节点库,涵盖了软件开发的基础功能。此外,它还支持使用Python语言来自定义节点,以此实现复杂功能。Dynamo的缺点是程序运行的速度较慢,尤其是在执行复杂程序的情况下,会出现严重卡顿的现象。笔者认为,Dynamo更适合用于小型轻量化的开发。
参考文献:
[1]GB/T51212-2016,建筑信息模型应用统一标准[s].北京:中国建筑工业出版社,2016.
[2]罗嘉祥,宋珊,田宏钧.AutodeskRevit炼金术-Dynamo基础实战教程[M].上海:同济大学出版社,2017.