← 返回首页

在代码中启动一个 CAA V5 Batch

在 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 的完整流程如下:

  1. 构建输入参数 XML 文件
  2. 获取 Batch 监控接口 CATBatClientMonitorCAA
  3. 注册回调函数(用于监听执行结束)
  4. 启动 Batch 并获取唯一标识符(UUID)
  5. 等待回调通知,解析输出结果
  6. 清理临时文件和日志

下面我们逐一分解。


四、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.CATPart
  • BOBINE.CATPart
  • CUBE.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

评论