CATIA 把所有管线类对象(线束/液压管/气动管/上下水管)统一封装在 Routing 框架下,对外接口共享。Tubing Design 和 Piping Design 是 Routing 之上分别针对薄壁柔性管和厚壁刚性管的两个细分工作台。
| 对象 | 接口 | 语义 |
|---|---|---|
| Run | CATIRouRun | 一段管路的逻辑路径(不是几何) |
| Member | CATIRouMember | 挂在 Run 上的物理零件(管段、弯头、阀门) |
| Routable | CATIRouRoutable | 所有可路由对象的根接口 |
| Spec | CATIRouFlowSpec | 规格表(材料/壁厚/压力等级) |
| Connector | CATIRouConnector | 端口(区分 IN/OUT/IN_OUT) |
Run 和 Member 的关系类似数据库的"行 vs 行的内容":Run 决定路径走向,Member 是路径上具体放置的实物。一段管路可能由 1 个 Run 承载 N 个 Member(直管段 + 弯头 + 三通 + 法兰)。
CATIRouCatalogServices 加载管段/弯头/法兰库。CATIRouRunFactory::CreateRun 传入起止 Connector。SetFlowSpec 绑定规格表,决定后续自动选用的 Member 直径/材料。CATIRouRoutable::Route 自动避障 + 加引导点;或手动用 AddSupport 列点。CATIRouRunServices::PopulateMembers 按 Spec 自动选直管段、弯头切换处自动放弯头、跨端口自动放法兰。SetFlowSpec 必须在 PopulateMembers 之前调用。否则 Catalog 查询失败,自动放置一个零件都放不上。MIN_BEND_RADIUS 字段如果设的过大,引导点之间距离不够时弯头放不下,整段失败。批量布管前要根据空间预算反推这个字段。CATIRouPathReservation 暴露才能 Run。否则 CATIRouRunFactory 报"connector not visible at this level"。CATIRouSyncServices::Synchronize 把 Run 与 Member 的关联关系刷到磁盘,不调用直接 Save 会得到一个 Run 没了 Member 的损坏文档。CATIRouRoutable::AddSupportFromCurve 把 Polyline 顶点直接喂给 Run。比逐点 Add 稳定得多。
// 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 注册商标