NavisworksTransport/doc/working/2017/COM API缓存同步问题记录.md

3.9 KiB
Raw Blame History

COM API缓存同步问题记录

问题描述

现象

在使用物流属性修改功能时,发现以下问题:

  1. 通过COM API成功修改模型属性后物流模型列表没有显示最新的属性值
  2. 列表仍然显示修改前的旧属性值
  3. 在Navisworks主界面的属性窗口中能看到正确的新属性值

日志证据

[2025-06-22 11:52:06.164] [INFO] 已成功修改模型 ASPHALT.02 的物流属性为 障碍物
[2025-06-22 11:52:08.527] [COM API读取] 模型: ASPHALT.02, 属性: 类型, 值: 通道

关键发现COM API写入"障碍物"成功,但读取时仍然返回旧值"通道"

问题分析

根本原因

Navisworks的COM API内部存在写入和读取之间的缓存同步延迟问题:

  • COM API写入属性成功
  • 但COM API读取时仍然使用缓存的旧数据
  • .NET API可能使用不同的缓存机制所以主界面属性窗口显示正确

影响范围

  • 物流属性修改后,列表刷新显示旧值
  • 用户体验:修改成功但界面显示不正确
  • 功能正确性:实际属性已正确修改,只是显示问题

尝试的解决方案

方案1创建COM API专用读取方法

实施:创建GetLogisticsPropertyValueViaCom方法使用COM API直接读取属性 结果仍然读取到旧值证明问题在COM API内部缓存

方案2修改GetGUIPropertyNode参数

实施:将GetGUIPropertyNode(path, true)改为GetGUIPropertyNode(path, false) 依据Autodesk论坛最佳实践避免加载内部属性 结果:问题依然存在

方案3事件机制和文档刷新 部分有效

实施

  • 属性修改后触发事件
  • 强制刷新文档状态
  • 自动刷新物流模型列表 结果:事件机制工作正常,但读取的仍是旧值

待尝试的解决方案

方案4延迟读取

// 属性修改后添加延迟
await Task.Delay(100);
// 然后再读取属性

方案5强制COM API状态刷新

// 强制刷新COM API状态
ComApi.InwOpState10 state = ComApiBridge.State;
// 可能需要调用特定的刷新方法

方案6混合API方案

  • 写入使用COM API
  • 读取:使用.NET API + 强制缓存清理

方案7重新查询整个文档

  • 修改后重新遍历整个文档树
  • 而不是依赖缓存的属性值

临时解决方案

当前状态

  • 属性修改功能正常工作
  • 实际属性值已正确保存
  • 事件机制和选择状态保持正常
  • 唯一问题:列表显示的是旧值

用户使用建议

  1. 修改属性后可以在Navisworks主界面属性窗口确认修改成功
  2. 重新打开控制面板会显示正确的属性值
  3. 功能本身是正确的,只是显示同步问题

技术细节

相关代码位置

  • CategoryAttributeManager.cs: GetLogisticsPropertyValueViaCom方法
  • MainPlugin.cs: RefreshLogisticsModelListStatic方法
  • 事件处理:OnLogisticsAttributeChanged方法

调试日志

已添加详细的COM API读取日志

LogManager.WriteLog($"[COM API读取] 模型: {item.DisplayName}, 属性: {propertyName}, 值: {value}");

后续计划

  1. 优先级:中等(功能正确,但用户体验有影响)
  2. 调研方向
    • 研究Navisworks COM API缓存机制
    • 查找更多Autodesk论坛解决方案
    • 尝试延迟读取和强制刷新方案
  3. 替代方案如果COM API问题无法解决考虑改用.NET API进行读取

参考资料


创建时间2025-06-22
最后更新2025-06-22
状态:待解决
优先级:中等