
Tribon M3和Vitesse这两个词放在一起老造船人基本就明白了又要给那套上世纪九十年代出生、但到今天还在全球船厂心脏地带运转的三维设计系统做定制了。Tribon M3在国内船舶设计院和船厂设计部门的使用率一直很高哪怕AVEVA收购之后换了几次名字很多生产设计流程还是跑在M3的骨架上。Vitesse就是这套骨架的“神经接口”通过它你能写程序去驱动Tribon干活批量建板、自动套料、属性修改、模型检查凡是设计人员一天点几百遍的重复劳动几乎都可以用Vitesse脚本接管。这篇文章是给两类人准备的一类是刚接手船厂Tribon M3维护、需要写工具给设计人员用的工程师另一类是在设计部门干活、被重复操作折磨到想写脚本但不知道从哪里下手的船舶工程师。你不需要是编程高手VB6的底子就够用关键是先把Vitesse的运行逻辑理清楚。我下面会按照我自己折腾这套开发环境的顺序从环境搭建到第一个能用的工具把那些官方文档没写明白、实际干活一定会撞上的点都讲透。1. 为什么船厂和设计院至今离不开Tribon M3 Vitesse1.1 从Tribon到AVEVA Marine名字变了但代码没变先说清楚一个背景避免新人被各种资料搞晕。Tribon最早是瑞典Kockums公司开发的船舶设计系统后来被Tribon Solutions独立运作再后来被AVEVA收购产品更名为AVEVA Marine。但在国内船厂和设计院里大家口头叫的Tribon一般就是指M3版本甚至更老的M2。这个版本的三维模型核心不是现在流行的参数化特征树而是一种基于数据库记录和二维投影三维构件描述的结构化模型。模型里的板、骨材、开孔、焊缝都是数据库里的记录界面只是展示方式。Vitesse就是Tribon开放给二次开发的接口包它和Tribon自带的那套Tribon Basic不太一样。Tribon Basic更偏向于在Tribon内部跑宏脚本而Vitesse是独立的编程接口你可以把它理解成Tribon留给外部程序的API库。通过Vitesse库外部程序能直接打开Tribon工程、读取模型数据、创建新对象、修改属性、触发Tribon自己的功能函数。这也是为什么船厂的信息化团队能围绕Tribon做那么多自定义工具——不是Tribon本身好用而是Vitesse这扇门开得够大。1.2 Vitesse解决的痛点手工重复操作太多船舶生产设计环节重复性有多高没有经历过的人真的很难体会。一条散货船几千块板板厚、材质、余量、坡口信息要一条条录进去分段划分之后每块板都要按规则生成零件号套料图出了几百张每张图的图框信息要逐项填写设计变更来了板厚改了相邻的肘板、贯穿孔、焊缝坡口都要人工跟着复查。这些操作在Tribon M3里不是不能做但每一条都要靠人在界面里点选、输入、确认一天下来上千次重复点击眼睛和手腕都受不了。Vitesse适合干的就是这件事把设计规则固化到程序里让程序去遍历模型、判断条件、批量修改。比如“全船所有板厚超过20mm的板材材质从AH36改成DH36”这种活人手改一遍至少两三个小时写成Vitesse工具之后十分钟跑完全船。而且程序的好处是稳定人改容易漏、容易看串行程序不会。这也是为什么至今很多船厂还在花人力维护Vitesse工具库因为那套LIB就是几十年的设计经验沉淀重写一遍的成本和风险都太高了。1.3 谁适合学Vitesse开发就我的经验Vitesse开发学得快的往往是两种人一种是本身懂船舶设计、但不怎么懂编程的工程师另一种是程序员出身但愿意泡在船体图纸里的IT人员。前者学起来难点在编程思维后者难点在理解船舶结构树和Tribon的数据组织方式。如果你两边都不沾也没关系但你要做好心理准备Vitesse开发的前期投入主要不花在语法上而是花在理解Tribon的模型结构和选择逻辑上。所以这篇文章我会把重点放在“Tribon模型里有什么”“Vitesse通过什么机制操作这些数据”“写工具时的代码骨架长什么样”这三个问题上语法细节只会一带而过。框架搭对了VB语法你自己查查就能补框架不对代码写得再漂亮也跑不起来。2. 搭建Vitesse开发环境时最容易被忽略的几个前置条件2.1 版本对应别用新库去连老工程Vitesse开发环境最坑的就是版本匹配。Tribon M3的Vitesse版本和上层的AVEVA Marine版本是绑定的你的开发机上的Vitesse库版本必须和服务器上Tribon服务端的版本对得上否则程序一运行就报接口错误或者连不上工程。我见过有人把开发机上的Vitesse升了一个小版本结果项目组所有人的自定义菜单全部罢工最后花了一整个下午回滚。具体操作上你在安装Tribon M3客户端的时候安装包通常会附带Vitesse开发组件需要手动勾选。如果当时没装也不用重装整个客户端找到安装介质里的Vitesse组件单独装一遍就行。装好之后去Tribon安装目录下翻一下确认有没有Vitesse.dll不同版本名字略有差异有的叫TbsVitesse.ocx有的在SDK子目录里。这个文件存在说明接口库本体到了不存在后面开发根本走不下去。2.2 开发机上真正要配好的三样东西Tribon本身可以在瘦客户端模式下跑但做Vitesse开发建议你在开发机上把完整客户端和环境配齐。具体三样东西不要省Tribon M3完整客户端能打开Tribon Launcher、能看到工程列表和启动设计模块。因为Vitesse调试的时候经常需要现场查看模型光靠代码看不到画面。Vitesse开发组件包括类型库TLB和示例代码。示例代码在安装目录的Examples或者Samples文件夹里这个千万别删我写很多代码都是直接从示例里抄一半改一半。运维账号能连接Tribon数据库、有读写工程权限的账号。Vitesse程序连Tribon不像客户端登录那么友好权限不够的时候报错非常奇怪比如提示“Operation not permitted”或者干脆连接超时这时候先别查代码去查账号权限。2.3 在VB6环境里添加引用的具体流程Vitesse开发最常见的宿主是VB6虽然理论上也可以用VB.NET或者VC但船厂里流传的源码、LIB、教程大多是VB6写的你也别标新立异老老实实跟着大部队走。装好VB6之后新建一个标准EXE工程然后在“工程→引用”里勾选跟Tribon相关的类型库。不同机器上显示的名字会有差异常见的几项是Tribon Session Manager Type LibraryTribon Project ManagerTribon Production InterfaceTribon Storage Access你拿不准哪些引用是必需的就把名字里带Tribon的全勾上虽然会有冗余但不影响编译。真正的坑在勾完之后很多机器的VB6默认引用列表里根本没有Tribon的库这时候要点“浏览”到Tribon安装目录下手动选.tlb或者.dll文件加进来。VB6会把选中的文件注册到当前工程引用里后续开发就能用智能提示了。这里必须强调一点Vitesse的引用是强版本耦合的。你把某个.dll加进工程之后如果之后服务器端升级了Tribon、开发机的Vitesse组件也做了更新VB6工程里那条引用不要直接用旧路径的删掉重新添加一次。否则你会遇到编译正常、运行报“类型库不匹配”这种最让人抓狂的问题。3. Vitesse开发的核心运行机制从Session管理到数据库操作3.1 连接、选择、修改所有工具的同一套三步动作我第一次接触Vitesse的时候手里拿着一堆API文档翻来翻去觉得头大函数太多、类型太多、不知道从哪里入手。后来写了十几个工具慢慢总结出一个规律Vitesse程序无论简单还是复杂底层都是同一套三步走第一步建立会话也就是Session。Session是Vitesse和Tribon之间的连接通道打开一个Session就相当于你在Tribon Launcher里登录了一次它能看到哪些工程、能访问哪些模块都取决于这个Session的配置。第二步选择对象也就是Selection。Tribon模型里的板、骨材、型材、开孔、设备都封装成了对象你要操作哪个对象必须通过Selection机制把它“选中”。这个选中和我们平时鼠标点选不一样它是程序在模型数据库里按条件筛选比如“所有板材集合”“指定舷号段的全部纵向构件”。第三步修改、提交或者删除。选中对象之后通过对象的属性接口读写数据。改完之后提交保存Tribon模型数据库会更新界面上也能看到变化。每一步都有对应的Vitesse类型库来支持Session由SessionManager管理Selection由ProjectManager接口提供具体的模型操作在Production相关的类型库里。理解了这个三层结构你看文档就不会迷路先认清自己在哪一层再去搜对应的接口函数。3.2 理解Select的“条件—结果—处理”闭环Vitesse里面Selection是最有意思、也最容易翻车的一块。它不是一个简单的“返回对象数组”的函数而是更接近一种“查询游标”的机制。你提供筛选条件Vitesse在数据库里建立一套结果集然后你循环遍历这个结果集一个个处理。举个例子读取全船所有甲板板厚超过20mm的板逻辑大概是三段用ProjectManager相关的API打开当前工程获取船体模型对象集合设定筛选条件包括板类型为甲板、板厚20、状态为“激活”等不同版本API的字段名不同于普通数据库可能叫属性名而不是列名遍历返回的集合逐块读取板的属性或者做修改。这个机制里的一个关键是返回的结果集不是静态快照而是“活”的。如果你在遍历过程中对对象做了修改接下来的遍历结果可能会受影响。所以我的习惯是遍历的时候只做“读”和“标记”把要修改的对象先收集到一个数组或集合里遍历结束之后再统一做“写”操作。这样既安全又容易排查问题。另外Selection的筛选条件必须写到能从上亿级模型数据里圈出小集合的程度否则程序会非常卡。Tribon模型库动辄几万条记录你要是写一个不加任何筛选的“读取全部对象”的查询Standalone工具跑几分钟都不奇怪。调试的时候我会先加一个计数器看看返回结果集有多少条如果远远超出预期马上停下来优化条件而不是硬等着。3.3 属性和几何Vitesse操作的第二条线Selection解决的是“找到对象”的问题找到之后马上进入第二条线属性和几何。属性指的是板的板厚、材质、余量、规则编号、实际编号、状态等结构化信息几何则是指对象在三维空间里的形状和位置。在Vitesse编程里属性访问和几何访问是分开的两套API。属性API更常用因为它能解决生产设计的大部分痛点批量改属性、根据属性筛选、属性合法性检查。几何API做起来更复杂一点典型应用是剖面干涉检查、板缝自动优化、骨材端点切割。拿属性API举例Vitesse的套路是先拿到对象引用然后打开它的属性视图按属性名去Get或者Set 示意代码读取指定板对象的板厚 Dim pl As Object Set pl SelectObject(PLATE, plateId) Dim attr As Object Set attr pl.Attributes plateThickness attr.GetValue(THICKNESS)这只是示意精确的API名必须以你装的那个版本的类型库为准但逻辑就是上面说的这个“对象—属性—取值/赋值”的简单模型。没有想象中那么神秘只要矩阵打通了剩下都是体力活。我在实际开发里70%的代码都是在写“读属性、判断条件、写属性”真正的几何操作只占很小比例。所以入门阶段优先把属性操作练熟就对了。4. 从零编写第一个实用工具批量修改板厚并重新校验4.1 需求拆解把设计规则变成程序逻辑理论说得再热闹不如写一个能用的工具。我拿一个真实需求来演示某分段有一批结构板因为材料代用需要把原来板厚为16mm的某类型板材统一改成18mm同时在修改完成后校验该分段里所有“贯穿件”的开孔直径是否仍然满足与板厚相关的设计规则不满足的列出来。拿到需求之后先别急着敲代码把规则拆清楚范围控制只在本分段工程里处理只处理板类型为“HT”即船体结构板且当前板厚为16的板已锁定/已发布的板不处理。动作把满足范围的板厚改成18同时把板材属性里的“修改标记”置为“代用”并在备注里追加修改时间和原因方便追溯。校验修改完成后查询该分段所有过焊孔贯穿件重新计算孔径是否满足“孔径 ≥ 板厚 20mm”的规则规则数值依各船厂规范而定用你的实际标准替换。这样拆完之后程序的结构就出来了一个连接模块、两个处理模块板厚修改、开孔校验、一个结果输出模块。每个模块对应一个函数顺手在界面里加一个进度条让设计人员知道程序没有卡死。4.2 核心代码结构VB6写出来的实用骨架下面我给出一个简化但完整的骨架代码保留关键的流程控制逻辑Private Sub cmdRun_Click() Dim session As Object Set session CreateObject(...SessionManager...) 建立会话 session.Login user, password session.OpenProject projectName 打开工程 第一步收集满足条件的板 Dim plates As Collection Set plates CollectTargetPlates(session, 16) 第二步遍历修改 Dim p As Object, count As Integer For Each p In plates If p.IsLocked False Then p.SetAttr THICKNESS, 18 p.SetAttr MODIFY_MARK, SUBSTITUTE p.SetAttr NOTE, 代用修改- Now p.Update count count 1 End If Next lblStatus.Caption 完成修改 count 块板 第三步开孔校验 Dim holes As Collection Set holes GetAllHoles(session, projectName) ValidateHoleDiameter holes session.CloseProject session.Logout End Sub这段代码的主干非常清楚。CollectTargetPlates是一个函数内部封装了Selection逻辑返回符合条件的板对象集合ValidateHoleDiameter是校验函数输出不满足条件的开孔清单。注意在修改板厚的时候我先检查了IsLocked属性。这是在船厂环境里极其重要的一条保护凡是被设计人员手动锁定或者流程锁定的对象程序坚决不碰。否则设计人员辛苦定的状态被你一个脚本改了整个流程就得乱套。这是程序员的职业操守也是你要长期养成的习惯。4.3 编译和调试从第一行能跑的代码到稳定工具写完之后编译运行会发生一堆小问题这很正常。我在调试Vitesse程序时积累了一套自己的排查顺序先确认Session能不能建立。这是最基础的问题连不上Session后面全是浮云。Session建立失败优先查账号权限和Tribon服务端状态。再确认Selection有没有返回数据。在CollectTargetPlates函数里加一个Debug.Print打印返回条数。如果是0不要再往下走先去检查筛选条件是否写错比如属性名大小写、数据格式是不是数字等。确认对象能不能打开属性视图。有些对象受权限控制或者已经被其他进程排他锁定了这时候GetAttr和SetAttr都会报错。代码里要加On Error处理把具体对象ID和错误信息记录下来方便定位是哪一条数据出了问题。调试还有一个土办法非常有效跑一小段就打开Tribon的交互界面刷新一下看看模型里是不是真的变了。程序逻辑上通过了不代表模型数据是真的对有时候属性名搞错了程序没报错但写进去的字段没人读等于白写。所以我写完工具会给设计人员先试用盯着他们跑几轮确认输出结果和人工核对的完全一致才敢发布。5. Vitesse开发中的常见坑和排查思路5.1 对象释放不彻底内存像漏水的桶Vitesse程序跑一次性能差很多人第一反应是代码写得低效但实际情况经常是内存泄漏。这个问题的根源在于Vitesse对象模型的COM机制你创建了对象引用不使用后需要显式释放否则COM对象一直驻留在内存里。在循环遍历时尤其严重几万块板的循环如果每块板创建了对象但没释放跑一半内存就爆了。解决方法是循环体里用完对象马上置NothingDim p As Object For Each p In plates 处理... Set p Nothing Next另一个需要注意的地方是集合对象本身。CollectTargetPlates返回的plates集合用完之后也要释放以及集合里的对象引用。虽然VB6有垃圾回收的概念但COM对象不是完全依赖这个机制你按“谁创建、谁释放”的原则来写基本就不会出大问题。5.2 改了属性但模型不刷新设计人员都不买账还有一种极其常见的问题程序跑完数据库里属性已经更新了但设计人员打开Tribon界面看到的还是旧数值。这个不是程序没生效而是没触发Tribon的刷新机制。Vitesse对模型的修改很多版本不会自动广播给所有客户端。你在外部程序里改完数据设计人员必须重新加载模型、或者让你在程序里触发对应模块的重绘/缓存刷新函数。解决办法是在修改完所有对象之后调用当前模块的Refresh接口或者关闭工程再重新打开。如果是打开着Tribon交互界面的情况下跑Vitesse工具改完最好让设计人员手动点一下窗口的刷新按钮实测下来最省心。5.3 账号权限报错一万个源头就一个Vitesse开发中让人最无语的坑是程序代码完全正确、但运行时报接口错误。这个时候别急着怀疑代码先换一个有Tribon运维权限的账号跑一遍。很多船厂给一线设计人员开的是受限账号只能看到工程、不能改模型结构你的程序如果涉及创建对象或者删除对象就会撞上权限墙但报错信息往往是“接口调用失败”这种高度抽象的描述。另外还要提醒一点Vitesse程序以不同账号运行时能看到的工程列表差异很大。设计人员看到的工程和运维看到的工程不是一回事。所以发布工具的时候一定要写清楚“需要用哪个账号跑”或者干脆在程序里内置一个登录窗口让使用者自己输入有足够权限的账号和密码。5.4 用日志文件和“半小时原则”来治反复出现的怪问题Vitesse程序有一个特点它在某些环境下的行为不够稳定相同代码这周跑得好好的下周就因为工程数据状态不同而报错。这种情况下靠眼睛盯代码是盯不出来的要在程序关键步骤里加上日志输出。我习惯在每个工具的代码里把Session连接、打开工程、筛选结果条数、每步修改数量、校验结果、异常信息这些关键节点都写入一个文本日志文件。这样做有两个好处一是出问题的时候把日志发给别人别人不用复现现场看日志就能判断在哪一步出了岔子二是你自己排查的时候能快速排除“到底是没筛选到数据还是修改失败了”的干扰。同时给自己定一个“半小时原则”一个问题如果半小时内查不出原因不要继续死磕先去看官方示例代码、去查安装目录里的帮助文档或者问问船厂里管Tribon的同事。Vitesse生态很小网上能搜到的中文资料不多但安装包里自带的示例和文档其实很全面很多人遇到问题就上网搜反而忽略了最该看的第一手资料。6. Vitesse工程化的一点体会从写程序到真正落地开发工具不是写完代码、能跑就结束的落地才是关键一步。Tribon系工具的使用者大多是设计人员不是程序员他们对“工具”的容忍度很低——双击就开、点完就出结果、出问题要有明确提示。所以在交付工具之前我会额外做三件事把工具编译成exe、做一个简单的配置文件、写一份五条以内的使用说明。配置文件用来管理那些可能经常变的参数比如板厚规则、材质对照表、工程路径不要让设计人员改代码。使用说明也不要长设计人员不看长文档就写清楚“双击运行→输入账号和工程号→点开始→查看日志”这四步就够了。再有一点版本管理特别重要。Vitesse工具牵扯到Tribon版本、类型库版本、程序版本三方联动任何一个动了都会导致旧工具不能用。我会在程序启动的时候自动读取当前连接的Tribon版本号和自己编译时的版本号做对比不一致就弹窗提示“版本不匹配”省得设计人员拿旧工具去连新工程报一堆奇奇怪怪的错。我这些年折腾Tribon M3的Vitesse开发最大的体会是这套老系统底子厚、逻辑清晰但它的API风格和现在的Windows开发完全不是一个时代。不要指望靠一两个模板走天下每写一个工具都要先沉下心去翻一翻对应模块的对象模型。Tribon的文档虽然旧但框架完整把Session、Selection、属性修改这条主线吃透了后面再碰什么模块都只是换对象名和属性名的事。给新人的建议就是先拿全船板厚批量查询练手再做批量修改最后挑战一下几何操作循序渐进比上来就想写花活稳得多。