CATIA 管路 Tubing/Piping API:Run / Member / Routing 完整指南

琛兴科技 · CATIA 二次开发系列 · 适用 V5R19~R32

一、原理:Run / Member / Spec 三件套

CATIA 把所有管线类对象(线束/液压管/气动管/上下水管)统一封装在 Routing 框架下,对外接口共享。Tubing Design 和 Piping Design 是 Routing 之上分别针对薄壁柔性管和厚壁刚性管的两个细分工作台。

对象接口语义
RunCATIRouRun一段管路的逻辑路径(不是几何)
MemberCATIRouMember挂在 Run 上的物理零件(管段、弯头、阀门)
RoutableCATIRouRoutable所有可路由对象的根接口
SpecCATIRouFlowSpec规格表(材料/壁厚/压力等级)
ConnectorCATIRouConnector端口(区分 IN/OUT/IN_OUT)

Run 和 Member 的关系类似数据库的"行 vs 行的内容":Run 决定路径走向,Member 是路径上具体放置的实物。一段管路可能由 1 个 Run 承载 N 个 Member(直管段 + 弯头 + 三通 + 法兰)。

二、流程:从两个设备口自动布管 7 步

  1. 建/打开 Product:管路必须在 CATProduct 上下文。
  2. 装入 Catalog:用 CATIRouCatalogServices 加载管段/弯头/法兰库。
  3. 放置两端设备:泵、阀、罐等设备零件 Place 进 Product,确保 Connector 朝向正确。
  4. 创建 Run:用 CATIRouRunFactory::CreateRun 传入起止 Connector。
  5. 设置 SpecSetFlowSpec 绑定规格表,决定后续自动选用的 Member 直径/材料。
  6. 路径 routing:调用 CATIRouRoutable::Route 自动避障 + 加引导点;或手动用 AddSupport 列点。
  7. Member 自动放置CATIRouRunServices::PopulateMembers 按 Spec 自动选直管段、弯头切换处自动放弯头、跨端口自动放法兰。

三、避坑:管路二开七大坑

坑 1:Spec 不绑定,PopulateMembers 全失败
SetFlowSpec 必须在 PopulateMembers 之前调用。否则 Catalog 查询失败,自动放置一个零件都放不上。
坑 2:Run 路径方向决定 IN/OUT 端口匹配
两端 Connector 一个 IN 一个 OUT,方向反了会报"flow direction mismatch"。把零件 Place 时调整 Z 轴朝向是最快的修法。
坑 3:弯头自动选型受最小弯曲半径限制
Spec 表里 MIN_BEND_RADIUS 字段如果设的过大,引导点之间距离不够时弯头放不下,整段失败。批量布管前要根据空间预算反推这个字段。
坑 4:跨 Sub-Product 的 Run 找不到端口
设备 Connector 在子产品里时,必须在父产品下用 CATIRouPathReservation 暴露才能 Run。否则 CATIRouRunFactory 报"connector not visible at this level"。
坑 5:Tubing 与 Piping 的 Catalog 不通用
两套工作台共用 Routing 接口但 Catalog 字段名不同(Tubing 用 OD,Piping 用 NS_NominalSize)。混用会让 Spec 查询返回空集。
坑 6:管路长度统计要等第二轮 Update
和线束一样,PopulateMembers 后第一轮 Update 只摆零件,第二轮才结算 RunTotalLength。
坑 7:批量后 Save 前必须 Synchronize
CATIRouSyncServices::Synchronize 把 Run 与 Member 的关联关系刷到磁盘,不调用直接 Save 会得到一个 Run 没了 Member 的损坏文档。
实战建议:管路自动布置最大的稳定性问题是引导点列表。推荐的做法是:先在 Product 里建一条 GSD 的 Polyline 当骨架(手画或从 Excel 导入坐标),然后用 CATIRouRoutable::AddSupportFromCurve 把 Polyline 顶点直接喂给 Run。比逐点 Add 稳定得多。

四、完整代码:自动布管 + 自动 Member 填充

// AutoTubing.cpp
// 输入:Product / 起止 Connector / Spec 名称 / 引导曲线
// 输出:一条带 Member 的 Run

#include "CATIRouRunFactory.h"
#include "CATIRouRun.h"
#include "CATIRouRunServices.h"
#include "CATIRouFlowSpec.h"
#include "CATIRouCatalogServices.h"
#include "CATIRouRoutable.h"
#include "CATIRouSyncServices.h"
#include "CATIProduct.h"
#include "CATIUpdate.h"

HRESULT CreateAutoTubing(
    CATIProduct_var spProduct,
    CATIProduct_var spStartDevice,   // 起点设备
    CATIProduct_var spEndDevice,     // 终点设备
    const CATUnicodeString& specName,
    CATBaseUnknown_var spGuideCurve)
{
    HRESULT rc = S_OK;
    if (spProduct == NULL_var) return E_FAIL;

    // 1. 拿 Run Factory
    CATIRouRunFactory_var spRunFac = spProduct;
    if (spRunFac == NULL_var) return E_FAIL;

    // 2. 拿两端 Connector(取设备的 OUT/IN)
    CATIRouConnector_var spStartConn, spEndConn;
    rc = GetDeviceConnector(spStartDevice, "OUT", spStartConn);
    if (FAILED(rc)) return rc;
    rc = GetDeviceConnector(spEndDevice,   "IN",  spEndConn);
    if (FAILED(rc)) return rc;

    // 3. 加载 Spec
    CATIRouCatalogServices_var spCatSvc = spProduct;
    CATIRouFlowSpec_var spSpec;
    rc = spCatSvc->LoadFlowSpec(specName, spSpec);
    if (FAILED(rc)) return rc;

    // 4. 创建 Run
    CATIRouRun_var spRun;
    rc = spRunFac->CreateRun(spStartConn, spEndConn, spRun);
    if (FAILED(rc) || spRun == NULL_var) return rc;
    spRun->SetFlowSpec(spSpec);

    // 5. 喂引导曲线
    CATIRouRoutable_var spRoutable = spRun;
    if (spRoutable != NULL_var && spGuideCurve != NULL_var) {
        spRoutable->AddSupportFromCurve(spGuideCurve);
    }

    // 6. 自动填 Member
    CATIRouRunServices_var spRunSvc = spProduct;
    rc = spRunSvc->PopulateMembers(spRun);
    if (FAILED(rc)) return rc;

    // 7. 两轮 Update
    CATIUpdate_var spUpd = spProduct;
    if (spUpd != NULL_var) { spUpd->Update(); spUpd->Update(); }

    // 8. Synchronize 后才能安全保存
    CATIRouSyncServices_var spSync = spProduct;
    if (spSync != NULL_var) spSync->Synchronize();

    // 9. 验证:读总长
    double total = 0.0;
    spRun->GetTotalLength(total);
    cout << "Run total = " << total << " mm" << endl;
    return rc;
}

© 上海琛兴科技发展有限公司 · 转载请注明出处 · CATIA 是 Dassault Systèmes 注册商标