X
返回顶部
当前位置: 首页> BIM资讯> BIM技术

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

发布:中文网小编3号 浏览:1216人 分享
发布于:2020-10-19 15:52

image.png

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

image.png

    桥墩分节段拼装工程实例

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

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

    根据前述应用需求,设计出如下图所示的用户交互界面。

image.png

    该人机交互的桥墩切割工具采用达索/CAA语言二次开发,直接嵌入到达索软件内部。具备以下几个特点:

    桥墩切割工具嵌入到达索装配设计(AssemblyDesign)模块中

    被切割体可由多个部分构成,各部分可分属于不同的物理产品(PhysicalProduct),对物理产品的层次结构没有限制,同一个物理产品下还可包含多个3DShape

    属于同一物理产品的被切割体,在切割后,将被分解为多个物理产品,每个物理产品包含一个无法编辑、轻量化的Datum类型特征

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

image.png

    嵌入到装配设计模块下的操作按钮

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

image.png

    切割后的桥墩模型

    二次开发策略和思路

    为了实现上一节介绍的操作。需要使用如下图所示的流程进行二次开发。

image.png

    程序二次开发流程

    具体分为以下三个重要步骤:

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

        遍历、存储被切割体

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

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

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

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

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

    工具条采用Add-in的方式添加,为了将桥墩切割功能嵌入到装配设计(AssemblyDesign)模块,用于添加工具条的Add-i类必须实现CATIAssyWorkBenchAddin接口。再通过CATAfrCommandHeader:CATCommandHeader()成员函数使添加的工具条与桥墩切割命令相关联。这样就实现了在已有装配设计模块下添加一个按钮,用户点击此按钮,激活桥墩切割命令。

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

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

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

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

    对于前述两种代理,当用户成功选择了相应的DialogList控件时,CATDialogAgent代理就被赋值;当用户成功选择了鼠标下的某个符合要求的对象时,CATPathElementAgent代理就被赋值。每个命令状态都存储了若干个代理,在程序中,对于每个命令状态,预定义了其中的各个代理被赋值以后程序应该执行的具体操作,以及向其他命令状态转换的规则。

    下图以命令状态1为例,介绍了用户与界面交互的原理。在程序执行过程中,当某命令状态中的一个代理被成功赋值以后,CAA程序就会查阅前述转换规则,来决定此时应该向哪一个命令状态进行转换。

image.png

    遍历、存储被切割体

    被切割体的组织结构

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

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

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

image.png

    可以看出,它是四层树形结构,如果要获取承载被切割体的特征,需要在3个3DShape下进行遍历。

    RecursionGetCutBodys()递归函数获取

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

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

image.png

    获取具备树型组织结构的3DShape下所有拓扑体的流程

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

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

    b)把步骤a)中生成的拓扑体追加到LISTP(CATBody)类型的集合中;

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

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

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

    BrowseOccurrences()函数执行切割操作

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

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

    typedefstruct

    {

    CATLISTP(CATBody)BodyList;

    CATIPLMNavOccurrence_varspOccOnCurrentNode;

    }

    CutBodyStruct;

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

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

    本小节前面部分介绍了在一个3DShape范围内的切割操作流程,为了对整个被切割体树型组织结构中的所有3DShape成员执行切割操作,BrowseOccurrence()函数采用如下图所示的流程。

image.png

    通过递归调用的方法完成切割任务,并最终返回一个存储CutBodyStruct类型结构体的集合作为切割结果。流程如下:

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

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

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

    d)依次以当前根节点的所有子节点Instance为输入参数,递归调用BrowseOccurrence()函数,当某个子节点instance不再包含子节点时,递归

    调用满足终止条件。

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

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

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

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

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

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

    结束语

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

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

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

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

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

    内容来源:

    铁路BIM联盟成员单位——中国铁设

    作者:齐成龙,男,国家一级注册结构工程师,高级工程师,工学硕士

    E-mail:qichenglong@live.cn

    (铁路BIM联盟文章,转发请注明出处)

    Revit中文网作为国内知名BIM软件培训交流平台,几十万Revit软件爱好者和你一起学习Revit,不仅仅为广大用户提供相关BIM软件下载与相关行业资讯,同时也有部分网络培训与在线培训,欢迎广大用户咨询。

    网校包含各类BIM课程320余套,各类学习资源270余种,是目前国内BIM类网校中课程最有深度、涵盖性最广、资源最为齐全的网校。网校课程包含Revit、Dynamo、Lumion、Navisworks、Civil 3D等几十种BIM相关软件的教学课程,专业涵盖土建、机电、装饰、市政、后期、开发等多个领域。

    需要更多BIM考试教程或BIM视频教程,可以咨询客服获得更多免费Revit教学视频

l  BIM培训网校课程目录

l  Revit零基础培训教程

l  BIM项目实战训练营



BIM技术是未来的趋势,学习、了解掌握更多BIM前言技术是大势所趋,欢迎更多BIMer加入BIM中文网大家庭(http://www.wanbim.com),一起共同探讨学习BIM技术,了解BIM应用!