← 返回首页

PLM Product Reference删除操作的核心规则与实现技巧

我们上次深入探讨了PLM Product Reference的创建与本质区别。今天,我们将聚焦于另一个关键操作——删除。这个看似简单的操作背后隐藏着复杂的业务规则和系统约束。掌握这些规则,将帮助你在CAA二次开发中避免常见陷阱,构建更健壮的应用程序。

一、删除操作的四大核心规则

在PLM系统中,删除操作不是简单的"删除即消失",而是遵循严格的生命周期管理原则:

1. "短事务"操作规则

删除是直接在数据库上执行的"短事务"操作,因此PLM Reference只有在当前会话中未加载时才能被删除。

这意味着:当你尝试删除一个已在当前会话中加载的组件时,系统会拒绝该操作。这是数据一致性的基础保障。

2. 实例上下文完整性规则

PLM Reference/PLM Representation Reference只能在所有实例化它的产品上下文都在当前删除范围之内的情况下,才能被删除。

这条规则确保不会出现"悬挂引用"——即删除一个被其他未删除产品引用的组件。

3. Techno表示引用生命周期规则

Techno Representation Reference在其被实例化的产品上下文被删除时立即被删除,其生命周期与其在产品上下文中的单一实例同步。

Techno表示是特殊的单实例化引用,其生命周期完全依附于其实例。

4. 锁定状态保护规则

处于锁定状态的PLM Reference/PLM Representation Reference不能被删除。

这保护了正在被其他用户或进程使用的组件不被意外删除。

二、用例详解

为了更好地理解这些规则,Dassault Systèmes提供了用例,它位于InstallRootFolder\CAADoc\CAAProductStructure.edu\CAAPstDeleteRefProduct.m

1. 用例执行流程

这个用例清晰地展示了删除操作的完整流程:

  1. 获取输入PLM组件的标识符

  2. 尝试删除当前会话中已加载的组件(预期失败)

  3. 从会话中卸载所有输入PLM组件

  4. 删除刚从会话卸载的组件(预期成功)

2. 测试数据模型

用例使用以下数据模型进行测试(通过导入3dxml文件获得):

CAAPstDeleteRefProduct_Root (根产品)
├── Inst1: CAAPstDeleteRefProduct_ChildRef 实例
└── CAAPstDeleteRepTechno (Techno表示引用,聚合在根下)

CAAPstDeleteRefProduct_ChildRef (子产品)
└── CAAPstDeleteRepShape (表示引用,聚合在子产品下)

CAAPstDeleteRepShape1 (独立表示引用,未在任何产品上下文中实例化)

3. 多种删除场景验证

用例支持多种删除场景,帮助开发者理解不同情况下的行为:

输入组件 删除结果 原因分析
CAAPstDeleteRefProduct_Root 成功 根节点删除,连同其所有聚合的实例、表示实例、端口和连接一起删除
CAAPstDeleteRefProduct_ChildRef 失败 该组件在CAAPstDeleteRefProduct_Root上下文中实例化,而根节点未被删除
CAAPstDeleteRepShape 失败 该表示由产品CAAPstDeleteRefProduct_ChildRef实例化,而该产品未被删除
CAAPstDeleteRepShape1 成功 未在任何产品上下文中实例化的独立表示引用
CAAPstDeleteRepShape + CAAPstDeleteRefProduct_ChildRef + CAAPstDeleteRefProduct_Root 成功 所有依赖关系都在删除范围内,满足完整性规则

三、代码实现的四大关键步骤

1. 获取输入PLM组件的标识符

CATUnicodeString AttrValue1; 
CATUnicodeString AttrValue2; 
CATLISTP(CATIAdpPLMIdentificator) PrdReferencesToDelete; 
CATOmbLifeCycleRootsBag Bag;

CATIPLMComponent* pPLMCompOnInputComp = NULL;
CATIAdpPLMIdentificator* opiIDComp = NULL;
constchar* istrPLMType = iArgv[4];

// 尝试作为PLM产品引用加载
rc = ::CAARetrieveIDofUniquePLMObject(iListAttributeName, iListAttributeValue, 
                                     istrPLMType, opiIDComp);
if(FAILED(hr) || (opiIDComp == NULL)) {
// 失败时尝试作为PLM表示引用加载
constchar* istrPLMType_RepRef = iArgv[5];
    rc = ::CAARetrieveIDofUniquePLMObject(iListAttributeName, iListAttributeValue,
                                        istrPLMType_RepRef, opiIDComp);
}

// 使用Bag控制组件生命周期
CATAdpOpenParameters params(CATAdpExpandParameters::Navigation);
CATAdpOpener opener(Bag, params);
hr = opener.CompleteAndOpen(opiIDComp, IID_CATIPLMComponent, (void**)&pPLMCompOnInputComp);

关键点

  • 组件可以是PLM产品引用或PLM表示引用,需要分别尝试加载

  • 使用CATOmbLifeCycleRootsBag精确控制组件生命周期

  • 即使组件从会话卸载,其标识符依然有效

2. 尝试删除已加载的组件(预期失败)

hr = CATPLMPrdDeleteServices::DeleteProductStructures(PrdReferencesToDelete);
if(S_OK == hr) return1; // 预期失败,如果成功则退出

技术原理:由于删除是直接在数据库上执行的"短事务"操作,而组件已加载在当前会话,系统会拒绝此操作以保证数据一致性。

3. 从会话中卸载组件

hr = Bag.RemoveAll(); // 清空Bag中的所有组件

最佳实践CATOmbLifeCycleRootsBag::RemoveAll调用会清空Bag内容,从而从当前会话卸载所有通过此Bag控制的PLM组件。

4. 删除已卸载的组件

hr = CATPLMPrdDeleteServices::DeleteProductStructures(PrdReferencesToDelete);
if(E_FAIL == hr) return1; // 预期成功,如果失败则退出

核心优势:组件标识符在组件卸载后仍然有效,允许我们精确指定要删除的对象。

四、实战技巧与注意事项

1. 用例启动命令

mkrun -c "CAAPstDeleteRefProduct Repository Server LoginTicket PLMType PLMChildType IDAttribute1 IDAttribute2 AttrValue1 AttrValue2[AttrValue1# AttrValue2#...]"

参数说明

  • Repository: 仓库名称
  • Server: 服务器地址(格式: ServerName:ServerPort/rootURI)
  • LoginTicket: 登录凭证
  • PLMType: PLM类型字符串
  • PLMChildType: 子PLM类型字符串
  • IDAttribute1/2: 用于识别PLM引用的属性名
  • AttrValue1/2: 属性值

2. 数据恢复策略

如果删除场景返回SUCCESS,必须重新导入3dxml文件以恢复输入数据,才能执行下一个场景。

这是因为在成功删除后,原始数据结构已被修改,需要重新初始化测试环境。

3. 验证删除结果

要确认PLM组件确实被删除,可以通过CATIA交互式运行数据库查询,并确保这些组件不在输出列表中。

五、总结与最佳实践

  1. 会话状态管理

    :在执行删除操作前,确保目标组件未加载在当前会话中

  2. 依赖关系检查

    :删除前验证所有依赖该组件的产品上下文是否也在删除范围内

  3. 生命周期控制

    :使用CATOmbLifeCycleRootsBag精确控制组件生命周期,确保资源正确释放

  4. 标识符重用

    :理解组件标识符在组件卸载后依然有效,这是实现删除操作的关键

  5. 锁定状态处理

    :在删除前检查组件是否处于锁定状态,避免操作失败

  6. 测试策略

    :使用完整的测试场景验证删除逻辑,特别是多级依赖关系的处理

掌握这些规则和技巧,将使你在PLM产品结构管理中更加游刃有余。删除操作虽然简单,但其背后的业务逻辑和系统约束却相当复杂。只有深入理解这些规则,才能开发出既符合业务需求又高效稳定的CAA应用程序。

评论