基于达索平台CAA架构的桥墩BIM切割工具开发

2020-04-21 04:30齐成龙
结构工程师 2020年1期
关键词:二次开发桥墩命令

齐成龙

(中国铁路设计集团有限公司土建院,天津300308)

0 引 言

在桥墩BIM 设计中,设计单位交付的BIM 模型无法全面考虑施工过程的影响。对于高度大于某一范围的桥墩,实际施工时,无法一次浇筑,需要沿高度方向分节段浇筑或拼装,图1 所示为某桥墩节段拼装工程实例,这种情况下,施工阶段桥墩BIM模型必须能够反映出这种节段的划分。同时,由于每一个桥墩在现场施工环境和可用设备方面存在差异性,即使是相同高度的桥墩,其竖向节段的划分标准也不相同,而这种差异性是设计阶段BIM 模型无法预估的。因此,解决这种问题的最好办法是将桥墩分节段浇筑或拼装导致的模型变化交给施工阶段来完成。

图1 桥墩分节段拼装工程实例Fig.1 Project instance for segmental assembly of the pier

本文介绍一种桥墩BIM 模型切割工具,该工具使用达索/组件应用架构(CAA)二次开发语言实现,嵌入到达索软件装配设计模块内部[1]。由用户选择被切割体、切割面和切割结果的装配目标位置,程序运行结束后,自动将切割结果插入到装配目标位置。

1 程序交互界面及操作流程设计

根据前述应用需求,设计出如图2 所示的用户交互界面。该人机交互的桥墩切割工具采用达索/CAA 语言二次开发,直接嵌入到达索软件内部[2-3]。具备以下几个特点:①桥墩切割工具嵌入到达索装配设计(AssemblyDesign)模块中;②被切割体可由多个部分构成,各部分可分属于不同的物理产品(Physical Product),对物理产品的层次结构没有限制,同一个物理产品下还可包含多个3DShape;③属于同一物理产品的被切割体,在切割后,将被分解为多个物理产品,每个物理产品包含一个无法编辑、轻量化的Datum类型特征[4]。

以某桥墩的主墩切割过程为例,如图2 所示,主墩模型存储于“01Pier main”节点下,由三部分组成,由图中结构树可知这三部分所在物理产品节点的层次结构。如图3 所示,首先点击嵌入到达索装配设计模块下的操作按钮,打开用户交互窗口,在CutProduct 位置选择被切割体所在的节点“01Pier main”,在CutSurfaces 位置选择切割面所在的几何图形集“CutSurface”,在TargetProduct位置选择切割结果需要装配的目标位置。

图2 切割前的桥墩模型用户交互界面Fig.2 Pier model before segmentation and user interface

图3 嵌入到装配设计模块下的操作按钮Fig.3 Operation button embedded in assembly design module

点击“确定”按钮后,程序使用用户所选几何图形集内的三个切割平面执行切割操作。切割前,被切割拓扑体存储在3 个3DShape 下,对比图2 和图4 可以看出,切割前后,主墩由3 个部分变成12 个部分。切割后,目标装配总结点下包含由12个物理产品组成的子节点。

图4 切割后的桥墩模型Fig.4 Pier model after segmentation

2 二次开发策略和思路

为了实现上一节介绍的操作。需要使用如图5 所示的流程进行二次开发,具体分为以下三个重要步骤:

(1)获取切割面、被切割体、目标位置;

(2)遍历、存储被切割体;

(3)生成切割结果并组装至目标位置。

图5 程序二次开发流程Fig.5 Development process of this program

以下各节将依次通过对此三个步骤的介绍,阐述本程序的二次开发策略和思路。

3 获取切割面、被切割体、目标位置

切割面、被切割体、目标位置,这三种元素作为程序执行的先决条件,它们的获取是属于用户界面交互功能的职能范畴,用户界面交互功能分为创建工具按钮和创建用户交互窗口两部分。

3.1 创建工具按钮并与桥墩切割命令关联

工具条采用Add-in 的方式添加,为了将桥墩切割功能嵌入到装配设计(AssemblyDesign)模块,用于添加工具条的Add-in 类必须实现CATIAssyWorkBenchAddin 接 口 。 再 通 过CATAfrCommandHeader:

CATCreateCommandHeader()成员函数使添加的工具条与桥墩切割命令相关联。这样就实现了在已有装配设计模块下添加一个按钮,用户点击此按钮,激活桥墩切割命令[5]。

3.2 在桥墩切割命令中嵌入用户交互窗口

首先创建用户交互窗口Dialog 文件,该文件与切割命令所在文件相互独立。在桥墩切割命令文件中,通过对CATMmrPanelStateCmd 类的派生,重载GiveMyPanel 方法,使包含桥墩切割命令的派生类与用户交互对话窗口Dialog 文件关联。Dialog 文件仅用于窗口控件属性的获取和赋值,而对话流程操作是通过切割命令文件对BuildGraph()方法的重载实现的。

BuildGraph 方法通过命令状态(Command State)和代理(Agent)两个关键元素来实现用户与界面的交互响应[6]。

本程序使用了两种代理:CATDialogAgent 代理用于获取界面控件响应,命令当中定义了三个此类代理,分别表示对代表切割面、被切割体、目标位置的三种DialogList 控件的选择;CATPathElementAgent 继承自 CATDialogAgent,命令当中也定义了三个此类代理,此种代理用于获取从根节点开始,到鼠标下对象的完整路径,这个对象可以是位于模型显示空间的某几何体或者是位于结构树的某个节点,再通过对该代理施加对象类型和过滤条件的限制,使之分别用于获取鼠标下的切割面(几何图形集)、被切割体(物理产品)、目标位置(物理产品)。

对于前述两种代理,当用户成功选择了相应的 DialogList 控件时,CATDialogAgent 代理就被赋值;当用户成功选择了鼠标下的某个符合要求的对象时,CATPathElementAgent 代理就被赋值。每个命令状态都存储了若干个代理,在程序中,对于每个命令状态,预定义了其中的各个代理被赋值以后程序应该执行的具体操作,以及向其他命令状态转换的规则。图6以命令状态1为例,介绍了用户与界面交互的原理。在程序执行过程中,当某命令状态中的一个代理被成功赋值以后,CAA程序就会查阅前述转换规则,来决定此时应该向哪一个命令状态进行转换。

图6 通过命令状态和代理实现用户与程序交互Fig.6 Interaction between user and program through command state and agent

4 遍历、存储被切割体

4.1 被切割体的组织结构

从二次开发层面来说,达索系统有四种常用的核心成员对象(PLM Core Data),分别是参考(References)、实 例(Instances)、代 理 参 考(RepresentationReferences) 和 代 理 实 例(RepresentationInstances)。结构树的每一个节点可以是实例或代理实例,而实例或代理实例分别是由参考和代理参考实例化而来。从用户手动操作的层面来说,达索向用户开放的操作对象有两种,分别是物理产品(Physical Product)和三维形状(3DShape)。用户手动操作层面的两种对象与二次开发层面的四种对象有如下对应关系:物理产品对应于参考和实例,三维形状对应于代理参考和代理实例[7]。

CAA提供了四种接口CATIPLMNavReference,CATIPLMNavInstance,CATIPLMNavRepReference,CATIPLMNavRepInstance,它们分别与二次开发层面的四种常用核心成员对象相对应,用于对树形结构中各成员的遍历和检索。

在用户与界面的交互过程中,程序成功获取了一个用于存储被切割体的物理产品,由于具体建模方式和组织结构的多样性,从层次结构上讲,该物理产品可以再分解为多个子物理产品,每一个子物理产品还可以继续分解。在这种树型的被切割体组织结构中,3Dshape 是具体的特征存储位置,每一个3Dshape 都必须依附于某物理产品才能存在,而模型的几何形状体现在各种特征当中,因此,对被切割体的遍历和存储最终都是在3Dshape 中完成的。对于”程序界面及操作流程设计“一节所介绍的示例,其树型组织结构如图7所示,可以看出,它是四层树形结构,如果要获取承载被切割体的特征,需要在3 个3DShape 下进行遍历。

图7 示例中主墩被切割体模型树型组织结构Fig.7 Tree structure of main pier cut model in the example

4.2 RecursionGetCutBodys( )递归函数获取3DShape下的所有拓扑体

在达索系统当中,特征无法直接存储于3DShape 下,而是通过有两种特征存储集合(geometrical features set)实现存储功能:几何图形集(Geometrical Set)和零件几何体(Solid features set)[8],几何图形集无法存储与三维拓扑对应的特征,而零件几何体可用于存储任何拓扑类型的特征。这两种特征存储集合还可以继续嵌套几何图形集和零件几何体,也形成一种与前述被切割体类似的树型组织结构。本小节介绍如何从具备这样一种组织结构的3DShape 下,获取其中的拓扑体,并将其存储于一个CATLISTP(CATBody)类型的集合中,该集合中的拓扑体分别与3DShape 下的所有特征一一对应。

目前,在CAA可用的API中,CATIPartRequest接口的GetDirectBodies()方法,能够获取当前3DShape 下的第一级特征存储集合;CATIBodyRequest 接口的 GetDirectBodies()方法,能够获取当前特征存储集合的第一级子特征存储集合。因此,对于这种不确定具体层数的树型组织结构,可采用递归调用的方法获取某一3DShape 下的所有特征存储集合,继而获取其中的被切割体拓扑,当通过CATIBodyRequest 接口的GetDirectBodies()方法获取某一特征存储集合下的所有子特征集合,并且集合大小为0 时,说明当前集合没有子集合,递归调用满足终止条件。具体流程如图8所示。

图8 获取具备树型组织结构的3DShape下所有拓扑体的流程Fig.8 Topological body obtaining process of 3D Shape with a tree structure

通过CATIPartRequest 接口获取当前3DShape的所有特征存储集合后,循环操作,依次对每一个特征存储集合执行如下递归调用的过程:

(1)通过CATIMmiUseBodyContent 接口获取当前特征存储集合i 下的所有特征,对于其中的第j 个特征,通过CATIMmiUseGeometricalElement接口获取与之对应的拓扑体;

(2)把步骤(1)中生成的拓扑体追加到CATLISTP(CATBody)类型的集合中;

(3)在j的范围内循环,也就是在存储集合i下的所有特征范围内循环。循环结束时,通过CATIBodyRequest 接口,查看当前特征存储集合i下是否还有其他子存储集合;

(4)如果通过步骤(3)发现,特征存储集合i下还有其他子存储集合,返回步骤(1),对每一个子存储集合执行递归调用的过程。如果通过步骤(3)发现,特征存储集合i 下不再包含其他子存储集合,不再执行递归操作,执行下一个循环,返回步骤(1),继续对3DShape 下的第i+1 个特征存储集合执行获取拓扑体的操作。

5 生成切割结果并组装至目标位置

5.1 BrowseOccurrences()函数执行切割操作

该函数以被切割体总结点的物理产品(Physical Product)作为输入参数,输出一个用于存储CutBodyStruct类型结构体的集合。在作为输出结果的集合中,每一个CutBodyStruct 类型的结构体数据代表切割后的最小单元。

该类型结构体的声明如下:

从前述第4.1节可知,被切割体的拓扑形状存储在总结点树型组织结构下各离散的3DShape中。切割之前,作为输入参数的CutBodyStruct 结构体,其BodyList 成员代表总结点物理产品下某3DShape 中存储的拓扑体集合,切割之后,一个3DShape 中存储的拓扑形状会被分为若干个部分,与各部分相对应的多个CutBodyStruct 结构体会以集合的方式输出,其中每个CutBodyStruct 结构体的BodyList 成员代表切割后每个部分中存储的 拓 扑 体 子 集 ,每 个 结 构 体 的spOccOnCurrentNode 成员代表与该3DShape 直接相关的上一级物理产品节点。

切割操作的大致步骤是:对于一个指定的3DShape,首先在所有切割面的范围内循环,依次使用每一个切割面对当前被切割体进行切割,当完成一次循环也就是使用其中一个切割面完成切割后,CutBodyStruct 类型结构体的集合就会更新。在下一次循环使用新的切割面进行切割时,切割对象就是上一次循环产生的新的CutBodyStruct类型结构体集合,这样,循环结束后的结构体集合正是所需的输出结果。

本小节前面部分介绍了在一个3DShape 范围内的切割操作流程,为了对整个被切割体树型组织结构中的所有3DShape 成员执行切割操作,BrowseOccurrence()函数采用如图9 所示的流程,通过递归调用的方法完成切割任务,并最终返回一个存储CutBodyStruct类型结构体的集合作为切割结果。流程如下:

图9 BrowseOccurrence()函数执行流程Fig.9 Implementation process of Browse Occurrence()function

(1)使用CATIPLMNavOccurrence 接口,以被切割体根节点物理产品的实例(Instance)为输入参数,首先从该参数获取所有子节点Instance,及与根节点直接相关的3DShape。

(2) 使 用 上 一 节 介 绍 的RecursionGetCutBodys()函数,从 3DShape 中获取待切割拓扑体的集合,放入OriCutBodyList当中。

(3)分别在切割面数目和OriCutBodyList 集合数目范围内执行循环,循环体内,使用第i个切割面切割OriCutBodyList 集合中的第j个成员。切割结束后,更新OriCutBodyList 集合。在第i+1 次循环体当中,切割对象变成第i 次循环生成的最新OriCutBodyList集合。

(4)依次以当前根节点的所有子节点Instance 为输入参数,递归调用BrowseOccurrence()函数,当某个子节点instance 不再包含子节点时,递归调用满足终止条件。

5.2 CreateNewCutObjectProduct()函数生成代表切割结果的物理产品

对被切割体施加上一个小节介绍的BrowseOccurrence()函数,可以生成一个以CutBodyStruct 类型结构体集合代表的切割结果,但是集合中的每一个结构体仅存储了切割后的拓扑体,必须要将这些拓扑体转换为特征并存储在相应的物理产品下才能作为真正的BIM交付物。

本小节介绍的CreateNewCutObjectProduct()函数以集合中的一个CutBodyStruct类型结构体作为输入参数,处理方法是:

首先从输入参数结构体中抽取出spOccOnCurrentNode成员,使用CATAdpDuplicator接口的Duplicate()方法,复制出一个新的物理产品的参考(Reference),采用复制的方法,能够保证物理产品类型和属性的一致性。再使用CATIPLMProducts接口的AddProduct()方法,将复制结果添加到用户选择的目标装配体位置。

对于输入参数结构体中的BodyList 成员,使用 CATIMmiUseDatumFactory 接口的 Instanciate Datum()方法,将拓扑体变成轻量化、不可编辑的的Datum 类型特征,并插入到复制后生成的物理产品中。

在结构体集合范围内循环调用这个函数后,就能够在目标装配体下生成与切割结果数目相应的若干物理产品,并且每个物理产品中都包含相应的特征结果。

6 结 论

本文介绍了一种通过达索/CAA 二次开发实现桥墩BIM切割的工具。该切割工具的作用是将桥墩分节段浇筑导致BIM模型变化的主动权交给施工单位,由施工单位根据现场具体情况快速、方便地修改模型。

本文继而从“获取切割面、被切割体、目标位置”“遍历、存储被切割体”“生成切割结果并组装至目标位置”三个方面重点介绍了程序的开发策略和思路。

“获取切割面、被切割体、目标位置”,从本质上就是用户与程序界面的交互。在这个交互功能的实现中,借助Add-in 的方式添加工具条,并通过命令状态(Command State)和代理(Agent)两个关键元素来实现用户与界面的交互响应。

“遍历、存储被切割体”一节中,分析了被切割体所具有的一种复杂树型组成结构,RecursionGetCutBodys()作为一个递归调用函数,以一个3DShape 作为输入参数,获取其中的被切割拓扑体,输出并存储于一个CATLISTP(CATBody)类型的集合中。

为了实现“生成切割结果并组装至目标位置”的目的,首先使用BrowseOccurrence()函数,以被切割体根节点做为输入参数,输出一个用于存储CutBodyStruct 类型结构体的集合。本函数也是递归函数,当根节点物理产品下仍然存在物理产品子节点时,继续对子节点施加本函数。最后,通过CreateNewCutObjectProduct () 函 数 , 以CutBodyStruct 类型结构体为输入参数,生成可以代表切割结果的物理产品并插入目标装配位置。

猜你喜欢
二次开发桥墩命令
只听主人的命令
桥墩加固方案分析研究
基于ABAQUS自复位桥墩与现浇桥墩性能对比
西门子Operate高级编程的旋转坐标系二次开发
浅谈Mastercam后处理器的二次开发
移防命令下达后
西门子Easy Screen对倒棱机床界面二次开发
这是人民的命令
ANSYS Workbench二次开发在汽车稳定杆CAE分析中的应用
低周反复荷载下高速铁路桥墩损伤评估