在 CATIA 的 CAA(Component Application Architecture)二次开发体系中,Batch(批处理) 是一种无需图形界面、可在后台高效执行任务的强大机制。无论是文件格式转换、批量属性提取,还是自动化数据处理,Batch 都能大显身手。
今天我们就来深入讲解:如何从 CAA 客户端代码中主动启动并监控一个 CAA V5 Batch 的执行过程。本文基于官方示例 CAABatBatchLauncherSample,带你一步步掌握核心 API 的使用方法。
一、什么是 CAA V5 Batch?
CAA V5 Batch 是运行在 Batch Infrastructure 架构上的无界面程序,它:
-
不依赖 CATIA 图形会话(Session)
-
可通过命令行或代码触发
-
支持输入/输出参数通过 XML 文件传递
📌 注意:Batch ≠ Macro!Macro 必须在 CATIA 会话中运行,而 Batch 是独立进程。
二、典型应用场景
-
批量将
.model文件重命名为.CATPart -
自动化生成工程图或 BOM 表
-
在服务器上定时处理上传的模型文件
-
与 PLM 系统集成,执行预处理任务
💡 本文示例虽仅做“重命名”,但其架构适用于任何自定义 Batch 逻辑。
三、整体流程概览
启动一个 CAA V5 Batch 的完整流程如下:
- 构建输入参数 XML 文件
- 获取 Batch 监控接口
CATBatClientMonitorCAA - 注册回调函数(用于监听执行结束)
- 启动 Batch 并获取唯一标识符(UUID)
- 等待回调通知,解析输出结果
- 清理临时文件和日志
下面我们逐一分解。
四、Step 1:生成输入参数 XML
Batch 的所有输入(文件路径、操作类型、输出目录等)都通过一个 XML 参数文件 传递。我们使用 CATBatchParameters 类动态生成它:
CATBatchParameters input_param;
// 开始写入缓冲区:Batch 名称为 "BatchSample",参数文件名为 "ParamTest.xml"
input_param.BeginBuffer("BatchSample", "ParamTest.xml");// 输入部分input_param.BeginInput();
input_param.InsertFile("file1", "CAABatchInfrastructure.edu\\Data.d\\ATTRIBUTCXR1.model", "", COMM_FILE_BINARY);
input_param.InsertFile("file2", "CAABatchInfrastructure.edu\\Data.d\\BOBINE.model", "", COMM_FILE_BINARY);
input_param.InsertFile("file3", "CAABatchInfrastructure.edu\\Data.d\\CUBE.model", "", COMM_FILE_BINARY);
// 添加简单参数(如操作类型)
input_param.InsertSimpleArg("action", "1");
// 示例:1 表示重命名
input_param.EndInput();
// 输出部分
constchar* out_folder = "";
// 若为空,则使用 BATCH_HOME 环境变量
input_param.BeginOutput();
input_param.InsertFolder("out_dir", out_folder, "", COMM_FILE_BINARY, "CATPart");
input_param.EndOutput();
input_param.EndBuffer(); // 完成 XML 构建
🔍 关键点:
-
BeginBuffer()中的
"BatchSample"必须与你实现的 Batch 描述符名称一致。 -
输出目录若设为
"",系统将自动使用BATCH_HOME环境变量指定的路径。 -
XML 结构需符合
Parameters.dtd(由 Batch Infrastructure 提供)。
五、Step 2 & 3:初始化监控器与回调
为了知道 Batch 何时结束,我们需要监听事件。CAA 提供了 CATBatClientMonitorCAA 接口:
// 获取监控器单例
CATBatClientMonitorCAA* cliMonitor = CATBatClientMonitorCAA::GetTheClientMonitorCAA();
// 初始化监控能力
HRESULT hr = cliMonitor->InitializeV5Monitoring();
接着,创建一个事件监听器(通常封装为类):
// cond_for_exit 是一个同步对象(如 CATCondition),用于主线程等待
CATBatchEventWatcher evt(&cond_for_exit);
其中 CATBatchEventWatcher 是用户自定义类,内部通过 AddCallback 注册对 CATBatchEndNotif 事件的响应。当 Batch 结束时,该回调会被触发,并唤醒主线程继续执行。
六、Step 4:启动 Batch
现在,我们可以启动 Batch 了:
// 获取刚生成的 XML 文件全路径
CATUnicodeString path_param;
input_param.GetFullPath(path_param);
// 启动 Batch,uuid 为输出参数(唯一标识此运行实例)
CATUnicodeString uuid;
hr = cliMonitor->StartV5Batch(path_param, uuid);
// 将 UUID 告知事件监听器,以便识别是哪个 Batch 结束了
evt.SetUUID(uuid);
✅
uuid至关重要!它确保在多个 Batch 并行运行时,回调能准确匹配到对应的实例。
七、Step 5:等待完成并解析输出
主线程在此处等待回调信号(例如通过 cond_for_exit.Wait())。一旦 Batch 结束,即可解析其输出:
// 通过 UUID 获取输出 XML 文件接口
CATIBatchCAA* outputParamfile = nullptr;
hr = GetOutputXMLFile(outputParamfile, uuid);
// 遍历输出文件列表
CATIBatchElementCAA* outputParametersSection = nullptr;
hr = outputParamfile->get_OutputParametersCAA(outputParametersSection);
CATIBatchElementsCAA* fileList = nullptr;
hr = outputParametersSection->get_FileListCAA(fileList);
long fileCount = 0;
fileList->get_Count(fileCount);
for (int ii = 0; ii < fileCount; ++ii)
{
CATIBatchElementCAA* elem = nullptr;
fileList->ItemCAA(ii, elem);
CATUnicodeString path;
elem->get_Path(path);
printf("Found output <%s>\n", path.CastToCharPtr());
}
此时,你可以在 $BATCH_HOME 目录下看到生成的文件,例如:
ATTRIBUTCXR1.CATPartBOBINE.CATPartCUBE.CATPart
八、Step 6:清理资源
最后别忘了清理临时文件:
// 删除输入参数
XMLCATDeleteFile(path_param.CastToCharPtr());
// 清理 Batch 日志
CATBatchLogCAA::DeleteLogs(uuid);
九、环境变量配置(运行前必看)
在执行你的程序前,需设置两个关键环境变量:
| 变量名 | 作用 | 示例值(Windows) |
|---|---|---|
ADL_ODT_IN |
输入文件所在目录 | C:\Dassault\CAABatchInfrastructure.edu\Data.d\ |
BATCH_HOME |
输出文件和日志写入目录(必须可写) | C:\temp\batch_output\ |
⚠️ 若未设置 BATCH_HOME,Batch 可能因权限问题失败。
十、总结
| 步骤 | 核心 API / 操作 |
|---|---|
| 1. 构建输入 | CATBatchParameters→ 生成 XML |
| 2. 获取监控器 | CATBatClientMonitorCAA::GetTheClientMonitorCAA() |
| 3. 注册回调 | 自定义 CATBatchEventWatcher 监听 CATBatchEndNotif |
| 4. 启动 Batch | StartV5Batch(xmlPath, uuid) |
| 5. 解析输出 | GetOutputXMLFile(uuid)+ 遍历 CATIBatchElementsCAA |
| 6. 清理 | CATDeleteFile+ CATBatchLogCAA::DeleteLogs |
评论