CATIA 钣金(Generative Sheet Metal Design, GSD-SM)和普通 Part Design 最大区别:钣金件保留制造工艺信息。每个 Wall(壁)、Flange(法兰)、Bend(折弯)特征不仅是几何,还带有材料厚度、内/外侧、折弯半径、K 因子(中性层位置)等工艺参数。这让钣金件可以一键展开为平面板料图,CAM 工序直接读用。
| 对象 | 接口 | 说明 |
|---|---|---|
| 钣金参数 | CATISmaParameters | 厚度、默认折弯半径、K 因子 |
| 主壁 | CATISmaWall | 第一个壁,决定整个零件的"中性面"基准 |
| 侧壁/法兰 | CATISmaFlange / CATISmaWallOnEdge | 从已有壁的边长出来 |
| 折弯 | CATISmaBend | 两个壁之间的圆弧过渡 |
| 展开切换 | CATISmaUnfoldedView | 3D 折弯态 ↔ 平展态 |
| 切割 | CATISmaCutout | 钣金专用切除(保持厚度方向贯穿) |
钣金内部维护一个折弯链(Bend Chain):所有 Wall + Bend 按拓扑序串成有向图,展开计算时按链顺序逐段把曲面摊平到 XY 平面。任意特征参数变更,整个链重新计算。
CATISmaParameters 设厚度(如 1.5mm)、默认折弯半径(如 2mm)、K 因子(如 0.4)。CATISmaFactory::CreateWall 传入草图(轮廓在 XY 平面)。这是后续所有特征的基准。CreateFlange 选择主壁的一条边、设置法兰角度(90°)、长度(20mm)。CATIA 自动在边上加折弯。CATISmaCutout 而不是 Part Design 的 Pocket,前者会保持折弯链不破坏。CATISmaUnfoldedView::SwitchToFlat(),导出 DXF 给激光切割。SetLength 默认是从主壁外表面量起。如果工艺设计图标的是"内侧高度"必须 SetLengthMode(CATSmaLengthFromInside),差一个厚度就开模返工。CATISmaCutout 或 CATISmaHole。CATIUpdate::Update,否则展开尺寸还是旧的。批量改材料的脚本要包含 Update。SetReverseDirection 翻转,UI 里是手动点小箭头。批量时根据法向量自动判方向。// 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 注册商标