4.3 KiB
4.3 KiB
删除物流属性功能完全修复报告
问题描述
用户反映删除物流属性功能存在问题:删除操作提示成功,但在Navisworks属性面板中仍然显示一个空的"物流属性"类别,没有实现真正的完全删除。
问题分析
原始实现问题
原始的删除方法使用了错误的COM API调用方式:
// 错误的方法:用空属性集合覆盖
ComApi.InwOaPropertyVec emptyVec = (ComApi.InwOaPropertyVec)state.ObjectFactory(
ComApi.nwEObjectType.eObjectType_nwOaPropertyVec, null, null);
propertyNode.SetUserDefined(1, LogisticsCategories.LOGISTICS,
LogisticsCategories.CATEGORY_INTERNAL_NAME, emptyVec);
这种方法只是清空了属性类别的内容,但没有删除类别容器本身,导致属性面板中显示空的"物流属性"类别。
根本原因
通过研究Navisworks COM API文档和Autodesk论坛讨论,发现:
SetUserDefined方法只能创建或覆盖属性,不能删除属性类别- 要完全删除用户定义的属性类别,必须使用
RemoveUserDefined方法 - 用户定义属性的索引从1开始,而不是从0开始
解决方案
修复后的实现
// 正确的方法:使用RemoveUserDefined完全删除
int relativeIndex = GetLogisticsAttributeRelativeIndex(propertyNode);
if (relativeIndex >= 0)
{
// 用户定义属性索引从1开始,所以需要+1
int userDefinedIndex = relativeIndex + 1;
// 使用RemoveUserDefined方法完全删除属性类别
propertyNode.RemoveUserDefined(userDefinedIndex);
}
关键改进点
-
使用正确的API方法
- 从
SetUserDefined改为RemoveUserDefined - 实现真正的属性类别删除
- 从
-
正确的索引计算
- 使用相对索引计算用户定义属性位置
- 索引从1开始而不是0开始
-
完整的错误处理
- 验证索引有效性
- 提供详细的日志记录
测试验证
修复前的行为
- 删除操作提示成功
- 属性面板中仍显示空的"物流属性"类别
- 属性内容被清空但类别容器保留
修复后的行为
- 删除操作提示成功
- 属性面板中完全不显示"物流属性"类别
- 整个属性类别被完全移除
技术细节
COM API索引机制
根据Autodesk官方文档和论坛讨论:
SetUserDefined(0, ...)- 创建新的用户定义属性SetUserDefined(n, ...)- 覆盖索引为n的现有属性(n>=1)RemoveUserDefined(n)- 删除索引为n的用户定义属性(n>=1)
索引计算逻辑
private static int GetLogisticsAttributeRelativeIndex(ComApi.InwGUIPropertyNode2 propertyNode)
{
int relativeIndex = 0;
foreach (ComApi.InwGUIAttribute2 attribute in propertyNode.GUIAttributes())
{
if (attribute.UserDefined)
{
if (attribute.ClassUserName == LogisticsCategories.LOGISTICS)
{
return relativeIndex;
}
relativeIndex++;
}
}
return -1;
}
影响范围
直接影响
RemoveLogisticsAttributes方法完全重构- 删除功能现在能真正移除属性类别
- 用户界面体验显著改善
间接影响
- 提高了用户对插件可靠性的信心
- 避免了属性面板中的冗余空类别
- 为后续功能开发提供了正确的COM API使用模式
兼容性
向后兼容性
- 修改不影响现有的添加和修改功能
- 不改变属性数据结构
- 保持与Navisworks 2017的完全兼容
未来兼容性
- 使用标准的COM API方法,确保与新版本的兼容性
- 遵循Autodesk推荐的最佳实践
总结
此次修复彻底解决了删除物流属性功能的核心问题,从表面的"清空内容"升级为真正的"删除类别"。通过使用正确的COM API方法和索引计算,实现了用户期望的完全删除功能。
这个修复不仅解决了当前问题,还为团队提供了关于Navisworks COM API正确使用方式的宝贵经验,有助于避免类似问题的再次出现。
参考资料
- Autodesk论坛 - 修改或删除用户定义属性
- TwentyTwo博客 - Navisworks COM API和自定义属性
- Navisworks COM API官方文档