3.9 KiB
3.9 KiB
COM API缓存同步问题记录
问题描述
现象
在使用物流属性修改功能时,发现以下问题:
- 通过COM API成功修改模型属性后,物流模型列表没有显示最新的属性值
- 列表仍然显示修改前的旧属性值
- 在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:重新查询整个文档
- 修改后重新遍历整个文档树
- 而不是依赖缓存的属性值
临时解决方案
当前状态
- 属性修改功能正常工作
- 实际属性值已正确保存
- 事件机制和选择状态保持正常
- 唯一问题:列表显示的是旧值
用户使用建议
- 修改属性后,可以在Navisworks主界面属性窗口确认修改成功
- 重新打开控制面板会显示正确的属性值
- 功能本身是正确的,只是显示同步问题
技术细节
相关代码位置
CategoryAttributeManager.cs:GetLogisticsPropertyValueViaCom方法MainPlugin.cs:RefreshLogisticsModelListStatic方法- 事件处理:
OnLogisticsAttributeChanged方法
调试日志
已添加详细的COM API读取日志:
LogManager.WriteLog($"[COM API读取] 模型: {item.DisplayName}, 属性: {propertyName}, 值: {value}");
后续计划
- 优先级:中等(功能正确,但用户体验有影响)
- 调研方向:
- 研究Navisworks COM API缓存机制
- 查找更多Autodesk论坛解决方案
- 尝试延迟读取和强制刷新方案
- 替代方案:如果COM API问题无法解决,考虑改用.NET API进行读取
参考资料
- Autodesk论坛:User-defined sections "very slow creation"
- Navisworks API最佳实践:避免
GetGUIPropertyNode(path, true) - COM API和.NET API缓存同步问题讨论
创建时间:2025-06-22
最后更新:2025-06-22
状态:待解决
优先级:中等