基于Revit 的木屋顶参数化设计与开发
2023-09-12王子茹于超
王子茹 于超
(大连理工大学 建设工程学部,大连 116024)
引言
随着经济与科技的发展,世界各个行业正在迅猛发展,自动化与工业化水平得到了显著提升,建筑工程行业也开始从传统构建时代,向装配式、工业化和自动化时代过渡,建筑产业会随着社会节奏加快而不断优化项目整个生命周期,节约设备与人力成本,提高工作效率成为了业内人员努力的方向[1]。与此同时,一类把参数信息与建筑结合在一起的理念便孕育而生:建筑信息模型(Building Information Modeling,BIM)。BIM 特征在于利用数字化技术,使建筑项目的设计、施工、运营、后期维护以及拆除的信息集成,贯穿了项目始终,受到行业内广泛认可[2-4]。
其中,Revit 作为实现BIM 技术理念的集成软件,拥有“所见即所得”的特点,且软件本身就为研究者提供了后台API 命令,为参数化生成模型等功能的开发打下了良好的基础[5]。
研究者基于Revit 软件,针对钢结构或钢筋混凝土建筑、桥体以及多面体等结构类型进行不同方式的参数化研究。其中文献[5]初步提供了点-线-面的参数化建模路线;文献[6]优化了表达模型的数据结构,设计出查重元素的算法,减少事务变更次数,提高了效率;文献[7]则提供了创建族库的新思路。
木结构作为我国传统建筑结构类型,在环境优美的度假村庄以及国家重点名胜古迹等地方都占据着结构种类中的领导地位[8]。随着新时代人们越来越倡导绿色环保、温暖舒适等居住要求,木结构深受建筑设计师的青睐。
在木屋结构方面,文献[9]初步利用API 接口设计了木屋模型分析系统,是以机械加工的角度对木结构孔槽加工相关数据的准确性进行了优化,方便用户提取木屋模型数据。文献[10-11]提供了利用RevitAPI 与Dynamo 插件结合来完成建模的方法,并高效解决了墙面切割处理等问题。
综上可以看出关于木屋表面与模型数据处理等细节方面已有许多建树,但较少提及木屋结构的参数化自动建模部分。
在木屋结构的建模过程中,繁杂的开孔、凹槽构造以及如何对应材质信息是其独有的特点,也是研究者们进行探究的重点。在Revit 中手动创建属于孔槽的空心族,再创建族实例生成对应的凹槽,这增加了用户的手动操作时间,效率较低,此过程并没有实现自动化建模。
本文将利用RevitAPI 命令与C#编程技术进行交互[5,6],以三角形木屋顶为例,精确到螺栓、圆钉等细小部件,根据操作者需要的参数,完成孔槽构造的自动生成工作,自动匹配模型材质信息。通过设计编写后台代码生成UI 窗口程序插件,令生成的模型分步演示,最终在软件中详细呈现三角形方木屋顶模型,真正实现参数化木屋顶自动建模功能。
1 开发流程设计
针对Revit 的参数化设计方法可以概括为三种:研究人员可以利用Revit 自带的内置开发模块,通过Module_Startup,Module_Shutdown 方法,进行各种软件建模操作的编译,运行宏脚本执行其命令。第二种便是用户通过第三方的Grasshopper 工具与Dynamo-Revit 功能相链接,对操作命令进行可视化编译。最后一种方法是基于Visual Studio 平台,利用编程语言进行更细致的参数化程序开发。
1.1 开发平台与框架
本文研究是以Visual Studio Community 2019 作为开发平台,通过选用.NET Framework4.6 作为目标框架,以自动生成绑定重定向替代程序集统一,进行模型参数化设计程序编译工作。
1.2 RevitAPI 与开发语言
Revit 建模软件面向用户提供了丰富的API 命令,开发者可以通过API 中集成的控制命令,直接创建、修改或删除模型元素,实现预期的功能[12]。
本文基于RevitAPI2018 版本以及C#语言进行开发,过程中主要以元素为单位进行展开。图1 列出了RevitAPI 中族与族类别、族实例的基本继承关系。
图1 元素继承关系
1.3 开发工具
(1)Revit Lookup Tables
Revit Lookup Tables 方便用户直接查看选定元素的各项属性,包括ID、原点、法向向量、族、族类别等隐藏信息。
(2)Revit 2018 SDK
SDK 文档中包含了每一部分API 代码,针对不同编程语言的程序案例与说明,方便开发人员进一步理解并合理使用API。本文运用Revit 2018.2 SDK 版本进行开发。
1.4 功能代码编写
通过设计UI 互动窗体使程序获取木屋模型自定义参数,针对一般形状模型以其关键点确定各个连接线段,并利用元素集合组成模型轮廓。根据特定的空间向量方向对模型构件进行拉伸生成工作。对于特殊形态的组成部分,便利用代码实现旋转、放样等手段来加以合成。
特殊凹槽、孔槽等部位利用空心与实体模型的剪切关系进行创造。材质纹理等模型信息通过收集元素、筛选过滤、赋予属性的方法予以实现。
1.5 包装程序插件
本文利用程序生成的addin 文件与Revit 外部应用接口相配合来进行插件功能的实现。
2 木屋顶Revit 参数化建模
木屋顶由屋面、木屋架、椽条与必要的水平横向支撑组成,其中椽条与水平横向支撑的构造相对简单,而木屋架的结构构造复杂多样,存在各种挖孔、锚固、连接和加固措施,下面将以三角形木屋架的参数化建模为主,详细阐述实现自动化建模过程。
2.1 尺寸数据控制
对木屋顶实现参数化自动建模,首先需要确定各项关键性数据。本文依据《木结构设计手册》、木结构设计标准: GB50005-2017的要求设计相关程序代码,对木结构屋顶尺寸与构造进行了有效计算与控制,其中包括屋面长度、屋架榀数、屋架高度等重要信息[13,14]。
在宏观结构尺寸设计方面,控制三角形木屋架跨度不超过18m、限制高跨比1/4、以及桁架间距不宜大于6m 等规范要求。从构件连接部位设计中,两两螺栓的最小间距根据木材的纹理方向进行设置,不可小于规定的数额,以防止其产生应力集中现象。假设螺栓直径为d,顺纹对齐排列与错行排列的最小间距分别为7d 与10d,端距7d。横纹时分别为3.5d 与2.5d,端距3d。
通过在Visual Studio 中设计Winform 窗体应用,并在程序中创建窗体对象,呈现窗体,使用户可以在之后的插件中直接输入这些参数,初始输入的参数属于string 类型,利用Convert.ToDouble 方法使程序接收用户输入,关闭窗口,如图2 所示。
图2 设计木屋参数UI 窗体界面
初始时,用户输入的参数与最终生成模型的尺寸存在偏差,本文经过测试,为了使参数与模型尺寸拥有整数倍的比例,在程序中将每一项数值换算一致,并考虑到模型生成后的比例太小,不足以直接观察模型细节,本文经过测试,将生成木屋顶的模型整体横纵方向比例增加到2 倍。
需要注意的是,窗体应用设计中拥有填写功能的textBox 控件,其Modifiers 属性需要设为Public,否则程序将接受不到用户输入的参数。
2.2 基本单元建模
木屋顶的结构构造相对复杂,细分为螺栓、暗销、长圆钉、棱条、附木、枕木、木夹板、垫板、垫块、上弦、下弦与屋面等部分,如图3 所示。
图3 木屋顶组成构件
为了优化模型生成后呈现的效果,对以上基本单元部分进行细节化控制,其中上下弦、附木和枕木等相对规则物体,首先建立每个关键点的坐标,之后利用line 中的CreateBound 方法进行两点间的连线工作,并把线段包裹在Curvearrarray 的序列中,利用NewExtrusion 方法,在由点到线,由线到体的同时,选定平面拉伸完成。
如图4 所示,垫块这类变截面模型生成过程需要使用FamilyCreate 中的NewBlend 方法,通过创建上下两端截面轮廓,沿特定的路径对其进行放样融合。此方法的具体设计架构如图5 所示。
图4 程序自动化生成的垫块模型
图5 变截面构件模型程序设计架构
对于暗销与长圆钉模型,由于其不规则的形状限制,建模时无法对其进行拉伸与融合操作.这里对这些构件使用NewRevolution 方法,编辑线段轮廓,通过与轮廓的旋转轴Axis 对其旋转一定角度生成。需要注意的是,旋转所需的轮廓与拉伸融合都要求必须闭合且旋转轴与轮廓线段必须在同一平面上。
为了方便操作,分别在项目文件中新建暗销与长圆钉的类,并在类中写入返回值为Revolution 类型的方法,最后在屋架类中声明变量进行接收,把轮廓关键点中的两点连线当作旋转轴,使线段轮廓围绕轴旋转360°生成模型。
2.3 孔槽自动化处理
木屋顶与其他材料的屋顶相比,突出的不同点在于其为了保证结构稳定性与构造要求,存在数量繁多的凹槽与孔洞。
以螺栓帽和腹杆两端凹槽为例,首先按照参数将原拉伸体生成出来,之后通过计算,在螺栓与螺栓帽、腹杆与上下弦的接触位置分别进行空心建模操作,把NewExtrusion 方法中的IsSolid 属性填为false,表示创建的模型属于剪切体,最后通过创建合并元素集合,把空心部分与螺栓帽、上下弦收集到集合里,进行实体与空心模型的连接,即生成凹槽与孔洞,下面为部分代码。图6 为具体程序设计流程,生成后的凹槽模型效果如图7~图9 所示。
图6 自动化生成凹槽孔洞程序设计流程
图7 自动化生成垫块凹槽模型图
图8 程序生成螺栓帽孔洞模型图
图9 程序生成上弦杆凹槽模型展示图
2.4 元素编辑
图10为此次参数化建模过程中涉及到的编辑命令汇总,由于木屋顶的对称性以及重复的构件种类繁多,于是涉及到了很多Revit.DB 命名空间下ElementTransformUtils 类中的编辑元素命令,每一种命令都需要提供元素的ID 才能实现预期的操作。其中移动、复制与镜像命令输入的坐标变量,是相对原实例id 的坐标,并且这些命令都有独自对应的批量操作方法,把需要编辑的元素ID 打包成集合,利用ICollection 收集器进行统一操作。
图10 编辑命令汇总
2.5 材质纹理
传统手动设置项目中的模型材质,需要对构件的每一族类别分别进行设置,且遇到特殊实例需要个别调整,使人工操作时间大大增加。
此次研究目标材质是固定的木材材料和螺栓、圆钉和暗销等其他金属构件。为了使木材模型与其他构件在可视化方面区别开来,本文设计出了完成自动设置模型材质的系列方法,下面为实现方法过程的关键代码。图11 为实现方法过程的设计流程与思路。
图11 自动匹配材质信息程序设计流程图
通过上述流程,用户可以通过winform 弹窗,在“木材材质”后面填写需要设置的材质类型,之后程序会自动通过材质浏览器搜索输入过的材质名称,完成模型材质设置。
2.6 误报信息处理
由于通过代码自动生成模型的过程中存在复杂的细节处理与精细坐标比对等工作,在调试代码运行成果时,Revit 会默认识别出距离极近的两个线段或模型边缘并没有重合,并误报“图元稍微偏离了轴”警告,严重影响程序代码的可执行性与用户界面观感。
为了解决这一问题,本文设计并编写了继承IFailuresPreprocessor 预处理程序接口的FailureSolution类, 遍历并接收错误信息并建立if 语句, 当GetDescriptionText 描述文字接收到“图元稍微偏离了轴……”的警告文字,即可禁止消息框的出现。同时,针对此程序继续编写与之对应的FailedHandler 方法,通过定义相应的处理器,并在代码中输入构筑体名称参数来实现此方法,最终消除误报弹窗。
2.7 制作插件
编辑后台API 代码文件成功后,在Revit 中利用外部应用接口进行插件功能的实现。本文通过重建一个项目,其中的类继承Autodesk.Revit.UI 命名空间IExternalApplication 的接口,利用OnStartup 函数进行插件模块的生成。接下来,需要把编辑好的addin 文件放入对应版本的文件目录中,指引Revit 通过Assembly路径识别GUID 识别码,寻找外部应用接口dll 项目文件,再重新打开Revit 应用程序。如插件没有设置签名,则点击“总是载入”,完成制作。
3 参数化设计实例
3.1 实例建模
本文选取某地方一座红松方木屋顶为建模实例。其屋顶24m 长,八榀屋架,每一屋架12m 宽、3m 高,其中输入的数据以毫米为单位。
在程序接口代码方面,建模时生成每一屋架的左半边,再通过程序代码中的MirrorElements 实例方法对其进行镜像,生成完整的单一屋架模型。需要注意的是,镜像后发现右半模型中的原空心剪切情况已不复存在,于是需要在程序中的空心模型进行镜像与连接的循环操作,巩固右半部分的模型凹槽效果,图13~图14 为程序生成的单一木屋架模型线框透析图与渲染图。
图13 木屋架线框透析图
图14 木屋架仿真渲染图
创建公制轮廓竖梃族,设计出瓦片轮廓,并将族载入项目中,利用拉伸屋顶命令初步建造屋顶顶板,并把其属性改为玻璃斜窗,利于后期铺垫瓦片。将玻璃斜窗属性中的网络1 内部类型以及边界1、2 类型设置为载入的瓦片竖梃族,并设计好间距距离与布局,模拟生成木屋顶瓦片效果图,如图15 所示。
图15 木屋顶瓦片模型图
在Revit 插件操作方面,新建族文件,打开“木屋顶”模块,点击插件,如图16 所示,根据用户输入的屋顶长度Distan 与榀数在程序中建立for 循环,实现对应数量的屋架排列、棱条以及椽条。在对应的榀数上添加横向支撑、与屋面,方木屋顶建模完成,如图17 为最终木屋顶3D 图。
图16 参数化木屋架部分构件模型
图17 生成木屋顶模型
3.2 实例分析
该实例建模时,以木屋顶为重点组成部位,宏观上呈现了包含木屋跨度、宽度、屋顶木屋架榀数与分布、上下弦杆和拉杆尺寸等结构,精确到上弦与下弦端部连接处、上下弦木夹板螺栓锚固排列数量与方式、垫块和暗销的固定、檩条与三角木的搭接等部分,如图18~图19 所示。
图18 暗销连接处
图19 弦杆连接处
生成后的整体模型呈现完整,且本身拥有衔接木屋墙体的檩条与螺栓,满足尺寸要求的下方主体结构可直接与模型连接,该模型并无缺件情况。由于部分静态方法的循环执行,使下弦中间垫板部分在原位置处重复生成,不可避免的产生了多件情况,但经过程序后期的材质自动匹配功能,赋予重复垫板模型同样的材质信息后,对模型外观的表现无影响。
4 结论
本文基于木屋顶的结构特点,通过winform 窗口收集UI 过程中输入的设计参数,利用RevitAPI 与C#编程技术设计程序,简化了木屋顶建模的设计思路,实现木屋顶参数化自动建模过程,研究结果表明:
(1)在设计并完成木结构房屋的控制参数窗口之后,需要更改textBox 控件信息中Modifiers 属性的公开性,以保证输入后的参数能够在程序项目的类中共享。木屋模型的控制参数众多,当设计接收数据的窗体较多时,可利用DialogResult 等方法使其先后连续自动出现;
(2)区别于Revit 软件手动绘制或剪切生成木屋凹槽孔洞结构的做法,通过C#编程技术与RevitAPI配合生成相应空心实体,根据接收的自定义参数数据,再运用元素连接的方式自动形成所需位置的凹槽构造模型,提升了坐标点位的精准度,也有效提高了木结构房屋的建模效率;
(3)根据设计者在窗体中输入的木材或金属材质名称,可以运用构件过滤器在材质浏览器中遍历材质类型,通过if 语句判别内部名称并匹配,自动将木材材质附着于对应的模型构件上,大幅度减少手动操作时的重复性工作;
(4)通过FailureSolution 类与FailedHandler 方法的搜索信息与数据处理等功能,可以设计程序代码辨识误报信息内容来自动阻止消息窗体的弹出,避免其影响自动建模时的连贯性与交互观感。
本文运用API 命令与外部编程语言编写了大量功能性程序方法,这有利于设计者摆脱人工绘制大量重复性工作,提高了木结构房屋设计的工作效率,希望在木结构建筑的建模与施工进度可视化研究方面,可以给予一定的参考与思路。