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

118 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
**状态**:待解决
**优先级**:中等