CATIA 钣金 Sheet Metal API:壁 / 法兰 / 折弯 / 展开自动化指南

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

一、原理:钣金的"参数 + 折弯链"模型

CATIA 钣金(Generative Sheet Metal Design, GSD-SM)和普通 Part Design 最大区别:钣金件保留制造工艺信息。每个 Wall(壁)、Flange(法兰)、Bend(折弯)特征不仅是几何,还带有材料厚度、内/外侧、折弯半径、K 因子(中性层位置)等工艺参数。这让钣金件可以一键展开为平面板料图,CAM 工序直接读用。

对象接口说明
钣金参数CATISmaParameters厚度、默认折弯半径、K 因子
主壁CATISmaWall第一个壁,决定整个零件的"中性面"基准
侧壁/法兰CATISmaFlange / CATISmaWallOnEdge从已有壁的边长出来
折弯CATISmaBend两个壁之间的圆弧过渡
展开切换CATISmaUnfoldedView3D 折弯态 ↔ 平展态
切割CATISmaCutout钣金专用切除(保持厚度方向贯穿)

钣金内部维护一个折弯链(Bend Chain):所有 Wall + Bend 按拓扑序串成有向图,展开计算时按链顺序逐段把曲面摊平到 XY 平面。任意特征参数变更,整个链重新计算。

二、流程:从草图到一键展开 6 步

  1. 设钣金参数:通过 CATISmaParameters 设厚度(如 1.5mm)、默认折弯半径(如 2mm)、K 因子(如 0.4)。
  2. 建主壁:用 CATISmaFactory::CreateWall 传入草图(轮廓在 XY 平面)。这是后续所有特征的基准。
  3. 建侧壁/法兰:用 CreateFlange 选择主壁的一条边、设置法兰角度(90°)、长度(20mm)。CATIA 自动在边上加折弯。
  4. 批量加法兰:循环遍历主壁所有外侧边,按规则(边长 > 阈值才加法兰)。
  5. 切孔/切口:用 CATISmaCutout 而不是 Part Design 的 Pocket,前者会保持折弯链不破坏。
  6. 展开输出:调用 CATISmaUnfoldedView::SwitchToFlat(),导出 DXF 给激光切割。

三、避坑:钣金 API 七大坑

坑 1:参数没设就建主壁,特征参数全用 default
SmaParameters 必须在 CreateWall 之前设置。否则厚度默认 1mm,K 因子默认 0.5,展开尺寸全错。
坑 2:法兰长度有"From outside / inside"两种语义
SetLength 默认是从主壁外表面量起。如果工艺设计图标的是"内侧高度"必须 SetLengthMode(CATSmaLengthFromInside),差一个厚度就开模返工。
坑 3:Pocket 切钣金不展开
用普通 Part Design 的 Pocket 切的孔,展开时会保留 3D 投影状态,DXF 出来是椭圆而不是圆。一律用 CATISmaCutoutCATISmaHole
坑 4:K 因子改了不重算就保存
SmaParameters::SetKFactor 后必须 CATIUpdate::Update,否则展开尺寸还是旧的。批量改材料的脚本要包含 Update。
坑 5:异形主壁的边方向决定法兰方向
建法兰时选边的"方向"决定法兰朝上还是朝下。CAA 里通过 SetReverseDirection 翻转,UI 里是手动点小箭头。批量时根据法向量自动判方向。
坑 6:展开和折叠状态切换会触发完整重算
SwitchToFlat 不是廉价操作,大零件可能耗时几秒。批量出 DXF 时尽量把切到 flat 后做完所有事再切回。
坑 7:钣金件转 Part Design 不可逆
CATISmaConvertToPartDesign 是单向操作,转过去就丢失所有工艺信息。批量数据迁移要先备份原 .CATPart。
实战建议(BIW 场景):白车身钣金件批量自动建模的关键是参数化模板 + 批量草图替换。建一份带主壁 + N 个法兰 + 标准切口的模板 CATPart,每个新零件只替换草图轮廓和参数表,比从零脚本建快 10 倍且稳定。

四、完整代码:建主壁 + 4 周法兰 + 展开导出 DXF

// AutoSheetMetal.cpp
// 输入:草图(矩形)+ 厚度 + 法兰高度
// 输出:.CATPart + 展开 DXF

#include "CATISmaFactory.h"
#include "CATISmaParameters.h"
#include "CATISmaWall.h"
#include "CATISmaFlange.h"
#include "CATISmaUnfoldedView.h"
#include "CATIPrtPart.h"
#include "CATISketch.h"
#include "CATIUpdate.h"

HRESULT BuildSheetMetal(
    CATIPartRequest_var spPart,
    CATISketch_var      spProfileSketch,
    double thicknessMM,
    double bendRadiusMM,
    double kFactor,
    double flangeLengthMM,
    const CATUnicodeString& dxfOut)
{
    HRESULT rc = S_OK;
    if (spPart == NULL_var || spProfileSketch == NULL_var) return E_FAIL;

    CATISmaFactory_var spFac = spPart;
    if (spFac == NULL_var) return E_FAIL;

    // 1. 设置全局钣金参数
    CATISmaParameters_var spParams;
    spFac->GetParameters(spParams);
    spParams->SetThickness(thicknessMM);
    spParams->SetDefaultBendRadius(bendRadiusMM);
    spParams->SetKFactor(kFactor);

    // 2. 建主壁
    CATISmaWall_var spWall;
    rc = spFac->CreateWall(spProfileSketch, spWall);
    if (FAILED(rc) || spWall == NULL_var) return rc;

    // 3. 取主壁的所有外侧边
    CATListOfCATBaseUnknownPtr edges;
    spWall->GetExternalEdges(edges);

    // 4. 每条边上建一个 90° 法兰
    for (int i = 1; i <= edges.Size(); ++i) {
        CATBaseUnknown_var spEdge = (CATBaseUnknown*)edges[i];
        CATISmaFlange_var spFlange;
        rc = spFac->CreateFlange(spWall, spEdge, spFlange);
        if (FAILED(rc)) continue;
        spFlange->SetAngle(90.0);                 // 度
        spFlange->SetLength(flangeLengthMM);      // mm
        spFlange->SetLengthMode(CATSmaLengthFromOutside);
        spFlange->SetReverseDirection(0);          // 朝上
    }

    // 5. Update
    CATIUpdate_var spUpd = spPart;
    spUpd->Update();

    // 6. 切到展开态
    CATISmaUnfoldedView_var spFlat;
    spFac->GetUnfoldedView(spFlat);
    spFlat->SwitchToFlat();

    // 7. 导出 DXF
    CATDocument* pDoc = NULL;
    spPart->GetDocument(pDoc);
    pDoc->Export(dxfOut, "dxf");

    // 8. 切回折叠态
    spFlat->SwitchToFolded();

    return rc;
}

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