CATIA 对外格式互通走两条通道,混着用最容易踩坑:
| 通道 | API | 支持的格式 | 语义 |
|---|---|---|---|
| 原生 Export/Import | CATDocument::Export | STEP / IGES / STL / CGR / VRML | 把当前文档另存为外部格式 |
| Doc Service | CATDocumentServices::OpenDocument | STEP / IGES(自动转 CATPart) | 把外部格式作为新文档打开 |
另外还有 V5 自带或选购的转换器:DELMIA→JT、SolidWorks/Inventor 直读插件、3D PDF 发布器,调用方式各不相同。本文以工业最常用的 STEP / IGES / 3D PDF 为主,覆盖批量导入导出。
STEP(ISO 10303)有 AP203 / AP214 / AP242 三个常见 Application Protocol:AP203 只有几何 + 装配;AP214 加了汽车行业属性(颜色、属性、配置);AP242 是新一代,支持 PMI 语义。BIW 行业默认 AP214;含 PMI 的工艺图发新供应商用 AP242。
CATIA::SystemConfiguration::Settings::STEP 改 AP 级别、单位、写入精度。CAA 里通过 CATXMLDataServices 写到 setting 文件。CATDocumentServices::OpenDocument 加载 .CATPart / .CATProduct。pDoc->Export(outPath, "step"),第二参用小写格式标识。OpenDocument(stpPath, pDoc) 自动新建 CATPart 容器。导入完后必须 SaveAs 否则不保留。SetExportUnit("MM") 或在源 Part Settings 里固定。批量自动化里务必显式写。SetExportPMI(TRUE),否则只导几何。下游验厂时找不到工艺信息现场扯皮。Export 不会自动 close,必须 CATDocumentServices::Remove。批量 1000 个零件不释放就 OOM。// BatchStepConvert.cpp
// 模式 1:CATPart → STEP(递归遍历目录)
// 模式 2:STEP → CATPart
#include "CATDocumentServices.h"
#include "CATDocument.h"
#include "CATUnicodeString.h"
#include <filesystem>
namespace fs = std::filesystem;
HRESULT ExportPartToStep(
const CATUnicodeString& partPath,
const CATUnicodeString& stpPath)
{
HRESULT rc = S_OK;
CATDocument* pDoc = NULL;
rc = CATDocumentServices::OpenDocument(partPath, pDoc);
if (FAILED(rc) || !pDoc) return rc;
// 设置 STEP 选项(AP214 / mm / 不带 PMI)
SetExportSetting("STEP", "AP", "214");
SetExportSetting("STEP", "Unit", "MM");
SetExportSetting("STEP", "Tolerance", "0.001");
rc = pDoc->Export(stpPath, "step");
CATDocumentServices::Remove(*pDoc);
return rc;
}
HRESULT ImportStepToPart(
const CATUnicodeString& stpPath,
const CATUnicodeString& partPath)
{
HRESULT rc = S_OK;
CATDocument* pDoc = NULL;
rc = CATDocumentServices::OpenDocument(stpPath, pDoc);
if (FAILED(rc) || !pDoc) return rc;
rc = CATDocumentServices::SaveAs(*pDoc, partPath);
CATDocumentServices::Remove(*pDoc);
return rc;
}
HRESULT BatchDir(
const std::string& rootDir,
const std::string& outDir,
bool toStep)
{
fs::create_directories(outDir);
int ok=0, fail=0;
for (auto& e : fs::recursive_directory_iterator(rootDir)) {
if (!e.is_regular_file()) continue;
std::string ext = e.path().extension().string();
if (toStep && ext != ".CATPart") continue;
if (!toStep && ext != ".stp" && ext != ".step") continue;
fs::path outPath = fs::path(outDir) / e.path().stem();
outPath += toStep ? ".stp" : ".CATPart";
HRESULT rc = toStep
? ExportPartToStep(e.path().string().c_str(),
outPath.string().c_str())
: ImportStepToPart(e.path().string().c_str(),
outPath.string().c_str());
SUCCEEDED(rc) ? ++ok : ++fail;
// 每 100 个 GC 一次防内存胀
if ((ok+fail) % 100 == 0) {
CATDocumentServices::CloseAllDocuments();
}
}
cout << "OK=" << ok << " FAIL=" << fail << "\n";
return S_OK;
}
© 上海琛兴科技发展有限公司 · 转载请注明出处 · CATIA 是 Dassault Systèmes 注册商标