基于MicroStation的工程措施实体定义及管理方法
2022-01-21张协崇
张协崇
(中铁第四勘察设计集团有限公司 地质路基设计研究院,湖北 武汉 430063)
0 引言
随着BIM技术的迅速发展[1-5],各行业对正向设计提出了迫切需求,为此各大设计院投入大量人力、物力资源研发BIM软件[6-8]。MicroStation是一款优秀的图形软件,具备强大的几何绘图、建模功能[9],但是它本身仅有线、面、体等纯几何对象,没有铁路线路、路基边坡、路基支挡、地基处理、桥梁、隧道等工程及措施对象。在MicroStation上开发BIM设计软件,需开发出一系列具备铁路专业属性、行为特征和工程关系的措施实体对象,进行有机整合,形成一套具备BIM正向设计功能的系统。那么如何满足该需求,就需要探索出一种方法,能基于MicroStation定义工程措施实体并进行组织管理。
经研究提出一种基于MicroStation的工程措施实体定义及管理方法:设计数据版本兼容模式,通过字符流转换读写XAttribute与ECXAttribute(扩展属性与EC扩展属性),将工程措施的属性与关系,存储于Micro-Station元素,形成工程措施实体,结合分散存储与按需读取的方式,融入专业行为的算法,科学、灵活地管理工程措施实体,形成一套系统的具备工程属性和行为特征的BIM模型。
1 MicroStation的XAttribute技术
XAttribute是MicroStation中最底层的一项技术,称为扩展属性,可通过MDL方式开发[8]。其存储于元素(Element)之上、非元素之内。且XAttribute并非元素数据的一部分,而是关联于该元素。相对的,data linkage则是元素数据的一部分。XAttribute与ECXAttribute具备以下特点:
(1)通过SDK的函数:StatusInt EditElement Handle::ScheduleWriteXAttribute(XAttributeHandlerIdCR h,UInt32 xAttrId,size_t dataSize,void const*data)存储。
(2)每个XAttribute数据的大小不能超过100 000个字节,即(1)中的data不能超过100 000个字节,否则会导致程序崩溃。
(3)1个元素上可以存储任意多个XAttribute。
(4)XAttribute的身份码,通过XAttributeHandlerId与XAttributeID确定唯一性,XAttributeHandlerId又由MajorID、MinorID两个合成。常规运用方法是:1个软件对应1个XAttributeHandlerId,XAttributeID作为同一个软件内部区分不同用途的XAttribute。
(5)ECXAttribute作为一种公开的XAttribute,由MicroStation平台提供的一套较复杂的机制去定义与读写[10],可以被Bentley公司的各款软件识别。ECXAttribute会在MicroStation原生的属性界面中展示,比如元素或文件上的General、Geometry、Extended、Locks、Grid等属性均为ECXAttribute,其展示示例见图1。ECXAttribute的ID号固定为XAttributeHandlerId(22271,0),在读写其他XAttribute时,需注意不能占用该ID号。
图1 ECXAttribute示例
(6)其他XAttribute仅是一串二进制数据,二次开发中读写起来比ECXAttribute简易很多;但若无二次开发的源程序,则无法解析其数据结构。
基于以上特点,设定工程对象的存储方式如下:
(1)软件中所有需要存储的数据,包括一些过程数据,转换成void const*data存于XAttribute中,而要公开的属性数据,相对于前者要少很多,则写于ECXAttribute中。
(2)当某个数据特别大,超过100 000个字节的限制时,可分解成多个XAttribute,存储于一串连续的XAttributeID中。
(3)定义所有类共同的属性集TSYID,做成ECXAttribute,定义属性集ECClass TSYID代码如下:
其中,以关键字“Name”命名的属性值,附在Micro-Station元素时,该元素将显示成“Name”所赋予的名称,示例见图2,图中2个“Name”属性值分别赋值为“左侧沟平台”“路堑挡墙A”。
图2 自定义ECXAttribute示例
2 字符流读写数据
类对象的基础数据由int、double、wstring等类型组成,为方便读写,该方法采用了字符串流来读写数据,并转换成字符串,再将其以二进制数据形式存储于XAttribute,具体实施方法见图3。
图3 字符串流读写XAttribute的流程
在基类TSYLJRoot定义了4个虚函数:
virtual void write Out Stream(wostringstream&out);
virtual int read In Stream(wistringstream&in);
virtual wstring write WStr();
virtual int read WStr(wstring ws);
前2个函数是将类中的各种数据通过字符串流wostringstream、wistringstream进行读写,各派生类需要重载该函数:先调用基类的函数读写基类数据,再补充自身读写的数据。
后2个函数则是将字符串流wostringstream、wistringstream与字符串进行转换,一般不重载,只在某些读写精度有变化时需要重载。
3 数据版本兼容
软件在使用过程中需要不断地开发升级,必定涉及类的数据结构的调整变化。当软件版本持续升级时,也需要读写不同版本的数据,可采用以下方法:
(1)每个类,包括各层级的基类、派生类,都设定自身的版本号。
(2)writeOutStream中存储数据:调用基类write-OutStream>>存储自身最新的版本号>>存储自身数据。以CptSection为例,其代码如下:
(3)readInStream中读取数据:调用基类readIn-Stream>>读取该数据的版本号>>按版本号读取自身数据。以CptSection为例,其代码如下:
4 分散存储与按需读取
1个工程设计单元包含众多繁杂的工程措施对象,相互间有包含与被包含的关系,且层次结构复杂。若将1个设计单元的数据全部存储于一处,则数据量过于庞大,该软件以面向对象思想,将各工程措施的属性数据及其对象关系,分散存储于各自的措施对象。在进行设计时,再按不同的行为需求,从某个工程措施开始,溯源读取所使用到的各个关联措施的数据,组成一套有机整体,完成设计行为,步骤如下:
(1)1个dgn文件包含多个模型空间(dgnModel),1个模型空间又包含众多元素。所有工程措施对象都是1个元素,那么1个dgn文件中的1个工程措施对象的唯一身份码,由ModelId与ElementId组成,故定义ModelElementID作为工程措施对象在MicroStation中的唯一身份码,其代码如下:
(2)扩展属性中存储工程关系,也就是存储相关对象的ModelElementID,以边坡面对象为例,其包含关系见图4。
图4 边坡面包含关系
以边坡面与边坡防护为例,边坡面有父部件LjSlopeCpt和一系列边坡防护子对象2类关系,父部件ID定义于基类LJSideCpt的ModelElementID sideId,子对象ID定义于vector
边坡防护LjSlopeProtectCpt有父构件和一系列的子构件2类关系,父构件ID定义于ModelElementID parId,子构件定义于vector
(3)扩展属性中存储关系与自身数据,但是并不存储子对象的数据,到执行用户行为时,再根据需要读取分散的子对象数据。
仍以边坡面LjSlopeCpt为例说明,LjSlopeCpt类中定义了子对象边坡防护指针vector
在设计边坡面时,点击边坡面后,读取数据流程见图5:①先读取边坡面LjSlopeCpt扩展数据;②通过LjSlopeCpt.ChdSPCIdAr找到所含子对象边坡防护LjSlopeProtectCpt,再将分散在对子象中存储的数据读取出来;③在有需要时,通过LjSlopeProtectCpt中的ChdI-dAr,进一步读取边坡防护子构件(踏步、吊沟等)的数据;④通过sideId读取父部件数据,再根据需要读取父部件的其他子构件数据;⑤将这些读取的数据构成有机的整体开展设计行为。
图5 由边坡面读取数据
在设计边坡防护时,点击边坡防护后,读取数据流程见图6:①先读取边坡防护LjSlopeProtectCpt扩展数据;②通过LjSlopeProtectCpt.ChdIdAr读取边坡防护子构件(踏步、吊沟等)的数据;③通过LjSlopeProtectCpt.parId读取父构件边坡面的数据;④在有需要时,读取父构件边坡面的父部件数据,再根据需要读取父部件的其他子构件数据;⑤将这些读取的数据构成有机的整体开展设计行为。
图6 由边坡防护读取数据
5 结束语
MicroStation是款优秀的图形软件,但并不具备工程专业特性,因此,提出一种基于MicroStation的工程措施实体定义及管理方法,可开发出一系列具备铁路专业属性、行为特征和工程关系的措施实体对象,进行有机整合,形成一套具备BIM正向设计功能的系统,可让工程师只需专注于专业本身,降低BIM学习成本,提高BIM设计的质量与效率。