NavisworksTransport/doc/working/2017/删除功能完全修复报告.md

130 lines
4.3 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.

# 删除物流属性功能完全修复报告
## 问题描述
用户反映删除物流属性功能存在问题删除操作提示成功但在Navisworks属性面板中仍然显示一个空的"物流属性"类别,没有实现真正的完全删除。
## 问题分析
### 原始实现问题
原始的删除方法使用了错误的COM API调用方式
```csharp
// 错误的方法:用空属性集合覆盖
ComApi.InwOaPropertyVec emptyVec = (ComApi.InwOaPropertyVec)state.ObjectFactory(
ComApi.nwEObjectType.eObjectType_nwOaPropertyVec, null, null);
propertyNode.SetUserDefined(1, LogisticsCategories.LOGISTICS,
LogisticsCategories.CATEGORY_INTERNAL_NAME, emptyVec);
```
这种方法只是清空了属性类别的内容,但没有删除类别容器本身,导致属性面板中显示空的"物流属性"类别。
### 根本原因
通过研究Navisworks COM API文档和Autodesk论坛讨论发现
1. `SetUserDefined`方法只能创建或覆盖属性,不能删除属性类别
2. 要完全删除用户定义的属性类别,必须使用`RemoveUserDefined`方法
3. 用户定义属性的索引从1开始而不是从0开始
## 解决方案
### 修复后的实现
```csharp
// 正确的方法使用RemoveUserDefined完全删除
int relativeIndex = GetLogisticsAttributeRelativeIndex(propertyNode);
if (relativeIndex >= 0)
{
// 用户定义属性索引从1开始所以需要+1
int userDefinedIndex = relativeIndex + 1;
// 使用RemoveUserDefined方法完全删除属性类别
propertyNode.RemoveUserDefined(userDefinedIndex);
}
```
### 关键改进点
1. **使用正确的API方法**
- 从`SetUserDefined`改为`RemoveUserDefined`
- 实现真正的属性类别删除
2. **正确的索引计算**
- 使用相对索引计算用户定义属性位置
- 索引从1开始而不是0开始
3. **完整的错误处理**
- 验证索引有效性
- 提供详细的日志记录
## 测试验证
### 修复前的行为
- 删除操作提示成功
- 属性面板中仍显示空的"物流属性"类别
- 属性内容被清空但类别容器保留
### 修复后的行为
- 删除操作提示成功
- 属性面板中完全不显示"物流属性"类别
- 整个属性类别被完全移除
## 技术细节
### COM API索引机制
根据Autodesk官方文档和论坛讨论
- `SetUserDefined(0, ...)` - 创建新的用户定义属性
- `SetUserDefined(n, ...)` - 覆盖索引为n的现有属性n>=1
- `RemoveUserDefined(n)` - 删除索引为n的用户定义属性n>=1
### 索引计算逻辑
```csharp
private static int GetLogisticsAttributeRelativeIndex(ComApi.InwGUIPropertyNode2 propertyNode)
{
int relativeIndex = 0;
foreach (ComApi.InwGUIAttribute2 attribute in propertyNode.GUIAttributes())
{
if (attribute.UserDefined)
{
if (attribute.ClassUserName == LogisticsCategories.LOGISTICS)
{
return relativeIndex;
}
relativeIndex++;
}
}
return -1;
}
```
## 影响范围
### 直接影响
- `RemoveLogisticsAttributes`方法完全重构
- 删除功能现在能真正移除属性类别
- 用户界面体验显著改善
### 间接影响
- 提高了用户对插件可靠性的信心
- 避免了属性面板中的冗余空类别
- 为后续功能开发提供了正确的COM API使用模式
## 兼容性
### 向后兼容性
- 修改不影响现有的添加和修改功能
- 不改变属性数据结构
- 保持与Navisworks 2017的完全兼容
### 未来兼容性
- 使用标准的COM API方法确保与新版本的兼容性
- 遵循Autodesk推荐的最佳实践
## 总结
此次修复彻底解决了删除物流属性功能的核心问题,从表面的"清空内容"升级为真正的"删除类别"。通过使用正确的COM API方法和索引计算实现了用户期望的完全删除功能。
这个修复不仅解决了当前问题还为团队提供了关于Navisworks COM API正确使用方式的宝贵经验有助于避免类似问题的再次出现。
## 参考资料
1. [Autodesk论坛 - 修改或删除用户定义属性](https://forums.autodesk.com/t5/navisworks-api/modifying-or-deleting-user-defined-properties/m-p/7906707)
2. [TwentyTwo博客 - Navisworks COM API和自定义属性](https://twentytwo.space/2020/07/18/navisworks-api-com-interface-and-adding-custom-property/)
3. Navisworks COM API官方文档