NavisworksTransport/doc/working/2017/删除功能完全修复报告.md

4.3 KiB
Raw Blame History

删除物流属性功能完全修复报告

问题描述

用户反映删除物流属性功能存在问题删除操作提示成功但在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论坛讨论发现

  1. SetUserDefined方法只能创建或覆盖属性,不能删除属性类别
  2. 要完全删除用户定义的属性类别,必须使用RemoveUserDefined方法
  3. 用户定义属性的索引从1开始而不是从0开始

解决方案

修复后的实现

// 正确的方法使用RemoveUserDefined完全删除
int relativeIndex = GetLogisticsAttributeRelativeIndex(propertyNode);
if (relativeIndex >= 0)
{
    // 用户定义属性索引从1开始所以需要+1
    int userDefinedIndex = relativeIndex + 1;
    
    // 使用RemoveUserDefined方法完全删除属性类别
    propertyNode.RemoveUserDefined(userDefinedIndex);
}

关键改进点

  1. 使用正确的API方法

    • SetUserDefined改为RemoveUserDefined
    • 实现真正的属性类别删除
  2. 正确的索引计算

    • 使用相对索引计算用户定义属性位置
    • 索引从1开始而不是0开始
  3. 完整的错误处理

    • 验证索引有效性
    • 提供详细的日志记录

测试验证

修复前的行为

  • 删除操作提示成功
  • 属性面板中仍显示空的"物流属性"类别
  • 属性内容被清空但类别容器保留

修复后的行为

  • 删除操作提示成功
  • 属性面板中完全不显示"物流属性"类别
  • 整个属性类别被完全移除

技术细节

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正确使用方式的宝贵经验有助于避免类似问题的再次出现。

参考资料

  1. Autodesk论坛 - 修改或删除用户定义属性
  2. TwentyTwo博客 - Navisworks COM API和自定义属性
  3. Navisworks COM API官方文档