# 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:延迟读取 ```csharp // 属性修改后添加延迟 await Task.Delay(100); // 然后再读取属性 ``` ### 方案5:强制COM API状态刷新 ```csharp // 强制刷新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读取日志: ```csharp LogManager.WriteLog($"[COM API读取] 模型: {item.DisplayName}, 属性: {propertyName}, 值: {value}"); ``` ## 后续计划 1. **优先级**:中等(功能正确,但用户体验有影响) 2. **调研方向**: - 研究Navisworks COM API缓存机制 - 查找更多Autodesk论坛解决方案 - 尝试延迟读取和强制刷新方案 3. **替代方案**:如果COM API问题无法解决,考虑改用.NET API进行读取 ## 参考资料 - [Autodesk论坛:User-defined sections "very slow creation"](https://forums.autodesk.com/t5/navisworks-api-forum/api-user-defined-sections-quot-very-slow-creation-quot/td-p/5826185) - Navisworks API最佳实践:避免`GetGUIPropertyNode(path, true)` - COM API和.NET API缓存同步问题讨论 --- **创建时间**:2025-06-22 **最后更新**:2025-06-22 **状态**:待解决 **优先级**:中等