APP下载

基于Revit模型与清单映射的二次开发研究

2022-01-19张瑞强

北京建筑大学学报 2021年4期
关键词:数据结构工程量编码

李 洁,王 亮,张瑞强

(北京建筑大学 土木与交通工程学院, 北京 100044)

1 研究背景

建筑信息模型(Building Information Modeling,BIM)的概念最早由EASTMAN等在19世纪70年代提出[1],此后在土木建筑领域被大范围推广,推动着整个领域的信息化发展[2]。BIM作为一种新的理念和技术,是建筑物理和性能特征的信息表达,是一种可分享的信息资源,是一种可分享建筑信息的过程。Revit系列软件是BIM技术的核心建模工具,是实现BIM技术的主要工具。它克服了利用CAD软件设计不能实现模型设计联动变更、所见不为所得、全寿命周期参数不能实现数据交换等缺点[3]。通过Revit软件能在设计过程中实现对设计关联数据的动态实时共享,为各种专业的协同设计提供模型应用支撑[4]。建筑工程造价管理存在于工程概念设计到运维的项目全寿命周期,是建筑工程管理贯穿全过程的工作,而工程计量则是工程造价中最重要的环节,在项目建设的前期,因各专业结构碰撞、计划调整等因素,随时会发生设计变更,进而导致工程量发生变化,施工过程中项目阶段式工程量统计、工程造价动态管理都需要准确及时的工程计量。BIM是实现工程项目建设信息化和工程算量精细化管理的重要基础,将GB 50500—2019《建设工程工程量清单计价规范》规定的工程量清单属性信息和数据集成到工程项目BIM模型中,建立一个基于BIM的工程项目清单算量机制,可有效提高信息传递和分享的效率[5]。

图1 Revit模型结构图Fig.1 Revit model structure chart

Revit作为BIM软件系列最具代表性的一款建模软件,从国外引进到中国,用在统计工程量方面,势必会存在许多差异和问题。国外许多国家,在Revit平台内按照结构类型为依据,将BIM模型统计得到的体积、面积或长度数据直接作为项目建设的预算工程量[6]。目前我国各地清单定额规定的计算规则和标准已经很成熟,运用Revit软件直接统计的工程量显然不能满足我国的计算规则,若想适用于我国工程量清单计算,首要工作需要将Revit模型与工程量清单建立一对一映射关系。目前相关学者积极探索基于BIM模型清单映射的方法研究,林韩涵等[7]利用Revit平台进行插件开发的方式,实现模型参数与清单属性的数据匹配,为模型清单映射关系的建立提出了指导性方法;景凤等[8]运用模块化思想,提出了基于BIM的工程量清单与BIM标准可在EBS/WBS上达成协同。

本文在以往研究基础上,利用ODBC开放数据库互联原理,基于Revit软件建立工程量清单与BIM模型的映射关系,二次开发插件创建清单XML文件,并将清单属性写入模型共享参数,从而使Revit模型具备清单属性,建立了一个基于Revit模型的工程项目清单算量机制。

2 Revit模型与清单映射关系分析

Revit模型由族组成,承载着项目的各种信息,项目信息由族以参数的形式承载。无论是柱、梁、板,还是管道、阀门、设备机器,都是由不同的族组成,由此可以说,在Revit中,一个项目是由众多图形化族个体按照一定规则组成的数字信息集合体模型,族是项目数据信息的容器。项目中每个分部工程由许多类分项工程组成,即在Revit中每种构件按规格、尺寸和形状不同具有多种族类别。Revit是创建项目三维信息模型的工具,Revit模型结构组成应与项目本身专业层级结构划分相似,只是在平台中项目的各项分部分项工程以不同的族类别存在。由此可将模型构成划分为如图1所示的树状层级结构,模型可分为结构、建筑、机电、暖通等专业,与项目本身一致,各专业由不同分部分项工程组成。

工程量清单是建设工程的分部分项工程项目、措施项目、规费项目、税金项目和其他项目的名称和相应数量等的明细清单。根据GB 50500—2019《建设工程工程量清单计价规范》规定的分部分项工程工程量清单中各专业工程量清单具有5级层级结构,分别是工程分类、附录分类、分部工程、分项工程、清单子目,层级结构如图2所示。工程量清单层次分类依据项目中建筑功能化层级结构,以此依据对清单子目进行项目编码,类似工程量清单分类依据,在清单项目中进行项目编码。以矩形柱的项目编码“010502001001”为例,“01”表示房屋建筑与装饰工程分类顺序码,“05”表示混凝土及钢筋工程附录分类顺序码,“02”表示现浇混凝土柱分部工程分类顺序码,“001”表示矩形柱分项工程分类顺序码,“001”表示矩形柱清单子目项目顺序码[9]。

图2 工程量清单结构图Fig.2 Bill of quantities structure chart

分别对Revit模型和工程量清单层级结构进行分析之后,不难发现两者之间具有许多相似之处,因两者均是围绕项目展开,在同一个项目中所具备的层级结构种类和数量相同,只是分类方式和分类名称不尽相同,但两者层级结构均与项目本身一致,是树状结构,且个别相同层级之间结构组成元素相同,依据统一项目相同元素分类划分规则,结合两者层级结构相似之处,将相同结构对应层级进行映射匹配,可对Revit模型与工程量清单建立层级结构一对一映射关系,映射关系如图3所示。

3 Revit模型清单映射

3.1 Revit模型清单映射插件设计思路

通常情况下,Revit模型不含有清单属性(项目编码、项目特征参数值),通过手动添加共享参数的形式较烦琐,因此基于此问题研究二次开发插件,为模型批量创建清单属性参数,建立由Revit模型直接导出清单工程量数据表的桥梁。

在Revit模型和清单映射射过程中,以XML树数据结构为桥梁,依据模型与清单层级结构的映射关系,通过定义XML数据结构基类,创建清单节点内容,利用XML结构独立存储清单数据,实现清单数据与Revit模型的交互。Revit模型与清单数据映射插件设计思路如图4所示,创建XML格式清单文件后,通过定义读取XML文件工具对清单文件进行界面交互读取,定义数据转换工具实现输入清单子目数据转换为XML数据格式,定义XML清单导出工具将编译完成的XML清单文件进行XML格式文件的导出,最后将XML文件的清单信息写入模型的共享参数,完成Revit模型与清单的映射。

3.2 Revit模型清单映射插件设计

3.2.1 XML清单文件创建

基于XML文档模式尤其适用于与第三方交换信息的特点,以XML数据结构为桥梁完成模型与清单数据交互,将清单数据以XML数据结构形式存储,并形成XML清单文件,为清单数据传输进入Revit平台奠定基础。

3.2.1.1 定义XML清单树形数据结构

首先定义XML树形数据结构基类BaseModel,用于扩展数据内容,基类的使用有2个方面作用:一方面,减少代码的冗余量,通过对基类的继承重构相应功能,实现XML节点的创建,可以有效提高清单文件编码速度和质量;另一方面,利用关联数据库支持XML清单数据节点的编辑,实现对XML清单数据节点的插入、删除、修改功能。创建BaseModel基类并实现INotifyPropertyChanged接口方法,实现清单数据被修改后,与控件页面显示同步。

图3 Revit模型清单映射关系图Fig.3 Mapping relationships of Revit model and bill

图4 Revit模型与清单映射插件开发技术路线Fig.4 Technical route of Revit model and bill mapping plug-in development

XML数据结构基类定义完成后,结合模型与清单融合结构的特点,需要对XML数据结构进行定义,引用类ITreeNodeModel树形数据的接口,用来统一树形数据的基本结构,并依据清单模型映射关系定义XML清单文件根节点(root)、父节点(parent)、子节点(children)数据类型和数据名称。清单树结构如图5所示,所形成的XML清单数据结构如图6所示。定义公有根节点、父节点、子节点变量,并用{get;set;}方法对变量进行属性赋值。

图5 XML清单文档树Fig.5 XML bill document tree

图6 XML清单数据结构Fig.6 XML bill data structure

3.2.1.2 定义XML节点数据内容

通过XML为桥梁搭建好清单文件数据结构,需要为节点定义数据内容,依据清单规范规定,清单文件包括项目编码、项目名称、项目特征、计量单位、工程量5项数据列。为了满足Revit软件直接输出清单规范格式的清单工程量,Revit模型参数内容中可获取项目名称、计量单位、工程量3项数据内容,而项目编码和项目特征是相比两者之间清单中独有的数据属性。因此需要在创建XML清单文件时,使用XML树结构承载清单独有的数据内容。在定义好的XML清单文件数据结构的基础上,为节点增设项目编码和项目特征2项数据属性。为项目编码和项目特征分别定义一个私有变量,并定义公用属性,即定义为公有变量,在{get;set;}方法中进行取值和赋值。这样在对属性进行赋值时,会自动调用set方法,在对属性进行取值时,自动调用get方法。结合2项属性的基本特征,项目特征由描述性文字组成,无其他特殊要求;项目编码由数字组成且项目编码不可重复,需要编译程序对输入的项目编码进行检验,保证编码的唯一性。定义私有bool变量,通过对已经存在的项目编码与最近一次输入的项目编码进行比对,若新输入的代码与现存所有代码存在重复则返回“true”值,页面显示“您输入的代码已经存在”,反之则新输入代码没有重复项,程序返回“false”值,新的项目编码键入成功。判断新键入项目编码是否存在的逻辑路线如图7所示。

图7 保证项目编码唯一性逻辑路线Fig.7 Logical route of ensure the item code uniqueness

3.2.1.3 定义读取XML数据工具

清单文件结构及节点数据内容定义完成后,对清单文件数据结构进行读取,并对清单文件进行编辑,增加、修改、删除清单子目,输入清单属性信息。读取XML数据结构时用XML Reader方法,通过配置XML文件路径,选择需要读取的XML文件,获取XML所有节点集合,进而通过foreach语句遍历所有节点,分别获取XML文件根节点和所有清单的子节点,将清单子节点按照单个子节点数据结构追加在根节点下,并在读取每个节点时对应获取该节点的信息(节点的名称、属性),最后将XML节点数据按节点类型转换为实体数据完成XML清单的读取。通过XML文档对象模型(DOM)编辑和修改XML文件,DOM是一个非常直观的处理XML文件类的方法。XMLDocument类位于System.Xml名称空间中,使用DOM时,在代码开头using部分插入“using System.Xml;”语句即可。用户对清单文件增加、修改、删除清单信息操作在程序中相当于对XML节点的创建、插入、删除、选择节点编辑,进而输入清单文件数据内容。

基于XMLDocument类编辑的方法,展开对清单文件节点结构编辑的代码设计,编译对清单树利用AppendChild方法创建子节点,进行增加子节点时,为保证选择节点不为空(null),根据选择节点的类型,利用If-else结构判断分支语句决定操作对象的层级结构,即:若选择节点为父节点,则增加节点为选择节点的子节点;若选择节点为子节点,则更新选择节点类型为父节点,增加节点为选择节点的子节点。始终保证增加节点为选择节点的子节点,增加节点逻辑路线如图8所示。删除节点时,原理同增加节点类似,用户设置一个选择节点,使用if语句判定选择节点类型,决定删除节点数据:若选择节点为子节点,仅删除该节点数据;若选择节点为父节点,需删除该父节点及其所有子节点数据结构。

图8 清单树增加节点逻辑路线Fig.8 Logical route of bill tree added node

3.2.2 清单XML数据转换

3.2.2.1 清单数据构造XML结构树节点

清单文件层级结构创建完成后,根据项目结构类型,需要对清单文件进行针对性清单子目编辑,新编辑输入的数据需要为其构造XML结构树节点。在插件交互界面(图9)导入XML模板清单文件至插件,在交互界面进行输入清单项数据,在清单项数据输入过程中,交互界面输入的数据需要为其构造XML结构树节点,清单数据构造XML结构树节点的逻辑技术路线如图10所示。

图9 清单XML编辑器交互界面Fig.9 Interactive interface of bill XML editor

为输入的清单数据构建XML树结构节点,首先将清单项集合转为XML的节点,利用foreach语句循环遍历ITreeNodeModel集合(即输入的清单项),判断清单项是否为QcTreeNodeModel类型,确保清单项为QcTreeNodeModel类型后,把输入的清单项数据转换为XML节点,并将其下的所有子清单项一同转换为对应XML节点下的子节点,即可完成输入清单项集合转化为相同层级结构的树形数据结构。构造树形数据后,清单项具有了XML的层级结构,利用ConvertToXMLNode方法,将数据转换为XML结构数据。利用Switch语句分支选择所有需要保存的数据,根据树形结构节点类型,将清单项根节点、组节点、子节点类型分别转化为XML结构的根节点、组节点和子节点结构,使用SetAttribute方法为其保存节点属性(Attribute)包括清单项ID、项目编码、项目特征等。清单数据构造XML结构树节点的部分代码如图11所示。

图11 清单数据构造XML清单树节点部分代码Fig.11 Listing data constructs XML list tree nodes part code

3.2.2.2 XML数据结构转换为list列表结构

项目清单文件编辑完成后,为后续将清单数据写入Revit模型参数中奠定基础,需要再次将XML清单文件数据转换为Revit软件内部数据进行保存。由于Revit软件内不能将XML结构数据直接写入,需要将XML数据转换为列表结构数据进行写入。需要先将XML数据组转换为list数据结构组,将XML数据组中的子节点转换为list数据项,再根据XML数据结构映射为list数据结构,逻辑路线如图12所示。

图12 XML数据结构转换列表结构逻辑路线Fig.12 Logical route of XML data structure transformation list structure

XML数据组转换为list数据结构组需要定义新的数据组List,使用Covert方法进行数据转换,利用foreach语句循环遍历XML数据组的数据,为每个数据进行属性数据的转换,若数据组有子节点,利用AddRange方法将子节点数据转化为list数据项。数据组转换完成后,接下来需要将数据组中的子节点转换为list数据项,与XML数据组转换为list数据结构组的原理类似,使用Covert方法进行数据转换,利用foreach语句遍历XML的所有子节点,分别将子节点的节点ID、项目编码、项目特征等属性数据进行转换。数据转换完成后,为list数据结构根据XML数据组结构映射数据树,利用GenerateCosTree方法,为数据生成数据树,因数据转换前后ID相同,通过索引数据组的ID获取数据组项,对获取的数据组遍历所有子项,并为树形数据的父节点增加子节点,最后去掉已分类完成的子节点,确保节点的唯一性。XML组转换为list数据结构组的部分代码如图13所示。

3.2.3 导出XML清单文件

图13 XML组转换为list数据结构组部分代码Fig.13 XML group converted to list data structure group part code

清单XML基础结构、节点属性定义及清单内容编辑完成之后,清单文件已经编辑完成,需要构建清单文件(xml)导出工具,将清单文件(xml)进行保存。首先构建清单文件导出工具,主要进行定义清单文件(xml)保存路径(xmlpath)、根节点(RootNode)及节点数组(List)变量。然后创建清单文件(CreateXmlFile):标识XML版本以及编码方式,选用GB2312为编码方式(因其支持中文编码);创建清单文件根节点;在根节点中写入插件标识,以便表明该XML文件用于清单文件创建,便于后期管理;将清单XML树形基础结构的节点结构加载至文档中。创建清单文件部分代码如图14所示。最后按照文件路径对清单文件进行保存(SaveXmlFile)。

3.2.4 清单数据写入模型共享参数

Revit平台内除了有内建参数,还允许用户自定义参数,自定义参数类型有共享参数和项目参数(图15),由于项目参数不能通过API创建,清单数据写入模型通过新建共享参数的方式写入模型。利用“CreateRevitProperty”方法创建共享参数组,为模型创建共享参数并写入参数内容奠定基新建Revit共享参数,新建过程中,首先检索需要新建的共享参数是否包含在该共享参数组中,若存在则直接进行插入;若共享参数组中没有该共享参数,新建共享参数并进行载入模型族构件。Revit新建共享参数部分代码如图16所示。

Revit共享参数组创建完成后,用户操作过程中通过Revit平台交互选择模型构件,拾取所选定构件,通过“IsCosAssigmentElement”方法判断所选定构件是否可以写入参数,若选定族构件中包含注释文字、曲线等非清单子目元素,则不需要写入清单属性内容。筛选构件后,利用CheckCosLookupProperty方法判定构件是否有清单属性(如项目编码、项目特征)共享参数,使用CreateRevitProperty方法为构件创建共享参数。遍历要写入清单属性的所有模型元素,通过GetCosParameters方法获取模型参数,为模型写入清单属性,清单数据写入模型共享参数逻辑路线如图17所示,模型清单参数内容写入效果如图18所示。

图14 创建清单文件(.XML)部分代码Fig.14 Create bill file part code

图15 Revit平台参数管理Fig.15 Revit platform parameter management

图16 新建Revit共享参数部分代码Fig.16 Create Revit share parameter part code

将工程量清单参数通过插件写入Revit模型后,Revit模型以共享参数的形式包含了工程量清单的特殊属性(如项目编码、项目名称),此时的Revit模型具备的参数信息可满足工程清单算量的数据需求,利用该模型可通过二次开发插件或者Dynamo可视化编程方式,读取模型参数信息,定义输出清单数据格式,完成工程量清单数据的输出,为清单工程量统计奠定基础。

图17 清单数据写入模型共享参数逻辑路线Fig.17 Logical route of bill data writing model shared parameters

图18 模型清单参数内容写入效果Fig.18 Writing effect of model component bill parameter content

4 结论

本文通过分别对工程量清单和Revit模型各自层级结构展开分析,结合两者树形结构的相似性,建立清单与Revit模型的映射关系,以Visual Studio 2019为开发环境,基于C#语言开发Revit二次开发插件,实现Revit模型与清单的匹配,主要结论如下:

1) 工程量清单与Revit模型具有层级结构相似性,基于两者相似性可以建立映射关系,解决了Revit模型与工程量清单的不匹配问题。

2) XML数据格式可以充当Revit模型与工程量清单的数据传输“桥梁”,在技术上实现工程量清单数据写入Revit模型。

3) Revit模型与清单映射插件功能的实现,解决了Revit模型直接输出工程量清单过程中清单属性缺失的问题。

猜你喜欢

数据结构工程量编码
HEVC对偶编码单元划分优化算法
住院病案首页ICD编码质量在DRG付费中的应用
工程量清单计价模式下建筑工程预算审核技巧
工程量清单计价模式下的工程预结算审核
数据结构线上线下混合教学模式探讨
重典型应用,明结构关系
工程量清单计价在公路工程造价管理中的作用
论纪录片影像中的组合编码运用
浅谈工程量清单计价的合理性与必要性
不断修缮 建立完善的企业编码管理体系