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