← 返回首页

在3DEXPERIENCE中打通EKL与CAA,实现双向调用的完整指南(r2025x)

在达索系统的 3DEXPERIENCE 平台中,CAA(Component Application Architecture) 和 EKL(Enterprise Knowledge Language) 是两类核心的扩展机制:

  • CAA

    :基于 C++ 的底层框架,擅长 UI 定制、命令开发、性能敏感逻辑;

  • EKL

    :基于规则的脚本语言,适合快速构建业务规则、自动化检查、参数化逻辑。

但很多开发者面临一个现实问题:EKL 功能有限,而 CAA 开发周期长;能否让两者“强强联合”?

答案是:完全可以! 而且官方在 R2025x 版本中提供了清晰的互操作路径。

本文将手把手带你掌握 EKL 与 CAA 双向调用 的完整流程,并附上典型应用场景,助你打造更灵活、高效的 3DEXPERIENCE 定制方案。


🔁 为什么需要 EKL 与 CAA 互操作?

场景 仅用 EKL 的局限 引入 CAA 的优势
获取当前会话的 Authoring Context ❌ 无内置 API ✅ 可通过 CAA 直接读取
调用 Web Service 或外部系统 ⚠️ 需依赖 Python/Java 层,复杂 ✅ CAA 可直接封装 HTTP 请求
执行高性能几何计算 ⚠️ EKL 性能弱,不支持底层几何库 ✅ CAA 可调用 CGM、GeometricObjects 等
在 CAA 命令中复用已有 EKL 规则 ❌ 无法直接调用 ✅ 可反向触发 EKL Action

💡 核心思想用 CAA 补足 EKL 的“能力短板”,用 EKL 简化 CAA 的“业务逻辑”


📌 第一部分:从 EKL 调用 CAA(最常用场景)

这是最常见的需求——在 EKL 规则或 Action 中调用你用 CAA 编写的自定义函数。

步骤概览

  1. 创建 CAA 用户函数(User Function)
  2. 注册到 Knowledgeware 字典
  3. 生成 Knowledge Index 文件(.CATKweIdx)
  4. 在 EKL 中直接调用

Step 1:实现 CATIAddLibrary 接口

你需要创建一个类(如 TestCAAAddLibrary),实现 CATIAddLibrary::Add() 方法,在其中:

  • 调用 CATCkeGlobalFunctions::GetFunctionFactory()

  • 使用 CreateFunction("MyFunc", returnType, evaluator)

  • 通过 AddArgument() 添加输入参数

// 示例:创建一个计算直角三角形斜边的函数auto pFactory = CATCkeGlobalFunctions::GetFunctionFactory();auto pHypotFunc = pFactory->CreateFunction("MyCAAHypotenuseFunction",    pDict->GetType("Real"), // 返回类型    MyHypotenuseEvaluator     // 自定义求值函数);pHypotFunc->AddArgument(pFactory->CreateArg("iX", pDict->GetType("LENGTH")));pHypotFunc->AddArgument(pFactory->CreateArg("iY", pDict->GetType("LENGTH")));

Step 2:实现 CATICreateInstance

为了让 3DEXPERIENCE 加载你的函数库,还需创建一个扩展类(如 TestCAAInstance),实现 CATICreateInstance::CreateInstance(),返回 new TestCAAAddLibrary()

⚠️ 注意:必须在 .dictionary 文件中声明接口与实现的映射关系

Step 3:配置资源文件

  • CATNls 文件

    CATPackageUserDefined.CATNls → 定义包的显示名称

  • CATRsc 文件

    CATPackageMethodUserDefined.CATRsc → 关联包名与实现类

  • 位置

    ${Framework}/CNext/resources/msgcatalog/

Step 4:生成 Knowledge Index

打开 Visual Studio → 3DS Runtime Prompt,执行:

CATCkeGenerateIdx.exe -tk <provider> <server:port> <ticket> myindex C:\YourWorkspace

将生成的 myindex.CATKweIdx 重命名为 CATPackageUserDefined.CATKweIdx,放入:

...\resources\knowledge\

Step 5:在 EKL 中调用

现在你可以在 Engineering Rules Capture 中直接使用:

Let hypot (Real)hypot = MyCAAHypotenuseFunction(10mm, 20mm)Message("斜边长度 = " + hypot + " mm")

✅ 效果:EKL 脚本无缝调用 CAA 函数,返回计算结果!


🔙 第二部分:从 CAA 调用 EKL(高级场景)

有时你希望在 CAA 命令中触发一段 EKL 逻辑(比如复用已有的业务规则)。

方案一:调用 EKL Business Rule(.CATRule 文件)

  1. 编写 XML 配置文件
    创建 CAAMyAppBusinessRules.xml,定义 OpeningID 和参数:

    <rsc:ResourceSetId="CAAMyAppBusinessRules"ExecutionMode="Computation"><rsc:ParameterName="InputString"Type="String"Mode="IN"/><rsc:ParameterName="Result"Type="String"Mode="OUT"/></rsc:ResourceSet>
    
  2. 在 CAA 中调用

    // 获取执行管理器CATBaseUnknown_var spBRMgr = ::CATPLMGetBusinessRuleExecutionManager();// 创建上下文参数CATListValuable_var args;args.Append(pVolatileFactory->CreateString("InputString", "Hello from CAA"));// 生成上下文CATBaseUnknown_var spContext;brMgr->ProduceBusinessRuleContext("MyAppBusinessRules", args, spContext);// 执行计算型规则HRESULT hr = brMgr->PerformComputation("MyAppBusinessRules", spFact, spContext);
    
  3. 从上下文提取输出参数
    通过 spContext->GetValue("Result") 获取 EKL 返回值。


方案二:调用 EKL Action(推荐!更灵活)

EKL Action 可作为 Knowledge Resource 存储在 Data Setup App 中,支持动态部署。

操作流程:

  1. 在 Engineering Rules Capture 中创建 EKL Action(如 GetUserGroup

  2. 进入 Data Setup App → 创建 Resource Set → 添加 Action 类型资源

  3. 绑定该 Action 到协作空间(Collaborative Space)

  4. 在 CAA 中通过 PLMISetupDataFinder 查找并执行:

// 查找资源CATBaseUnknown_var spRsc = pFinder->FindPointedResource("UserGroup");// 转为 EKL 函数CATICkeFunction_var spAction = spRsc;// 创建参数CATICkeVolatileFactory_var pVF = ...;auto spInput = pVF->CreateString("userId", "U12345");auto spOutput = pVF->CreateString("jsonResponse", "");// 执行spAction->Run(spInput, spOutput);

✅ 优势:无需重启客户端,支持热更新,适合云环境部署!


⚠️ 注意事项与限制

  • 权限要求

    :操作 Data Setup 需 Owner 或 Admin 角色

  • 许可证

    :需 TER(Templates & Rules Designer)License

  • 调试建议

    :开启 CAA 日志 + EKL 脚本断点

  • 性能提示

    :频繁调用 CAA 函数时,避免在 EKL 循环中反复调用


🎯 典型应用案例

场景 实现方式
创建对象前校验 Authoring Context EKL 调用 CAA 函数检查会话状态
从 PLM 外部系统获取用户组信息 CAA 调用 EKL Action → Action 内调 Web Service
动态生成 BOM 表格 CAA 命令触发 EKL Computation Rule 计算结构
自定义测量工具 CAA 封装几何算法,EKL 提供交互界面

🔚 结语

EKL 与 CAA 的互操作,不是“能不能”,而是“怎么用得巧”。

  • EKL → CAA

    :扩展 EKL 能力边界,接入底层 API

  • CAA → EKL

    :复用知识资产,提升开发效率

掌握这套方法,你就能在 3DEXPERIENCE Native App 定制 中游刃有余,既享受 EKL 的敏捷,又拥有 CAA 的强大。

评论