151 lines
4.3 KiB
Markdown
151 lines
4.3 KiB
Markdown
# 自定义分层功能方案
|
||
|
||
## 1. 背景
|
||
|
||
当前分层预览功能依赖模型的原生层属性,当模型缺少这些属性时无法有效分层。需要支持用户自定义的楼层分组逻辑,解决通用性问题。
|
||
|
||
## 2. 设计思路
|
||
|
||
- **保持现有功能**:不修改现有分层检测代码,保证向后兼容
|
||
- **新增分层策略**:在现有分层策略基础上添加"自定义分层"选项
|
||
- **属性分类独立**:创建专门的"分层信息"自定义属性类,与物流属性分离
|
||
- **利用现有框架**:复用LayerManagementView的预览和操作框架
|
||
|
||
## 3. 技术实现
|
||
|
||
### 3.1 FloorAttributeManager 核心类
|
||
|
||
```csharp
|
||
public class FloorAttributeManager
|
||
{
|
||
// 设置楼层属性
|
||
public void SetFloorAttribute(ModelItem item, string floorLevel);
|
||
|
||
// 查询楼层属性(支持继承查询)
|
||
public string GetFloorLevel(ModelItem item, bool searchParents = true);
|
||
|
||
// 批量设置楼层属性
|
||
public void SetFloorAttributeBatch(Dictionary<ModelItem, string> floorMappings);
|
||
|
||
// 获取所有楼层分组
|
||
public Dictionary<string, List<ModelItem>> GetFloorGroups();
|
||
}
|
||
```
|
||
|
||
**核心功能:**
|
||
|
||
- 基于COM API管理"分层信息"自定义属性
|
||
- 支持楼层继承查询(子节点向上查找父节点楼层信息)
|
||
- 智能设置策略:优先设置容器节点,减少属性冗余
|
||
|
||
### 3.2 自定义属性结构
|
||
|
||
**属性分类:** "分层信息"
|
||
|
||
```
|
||
- Floor_Level: "F1", "F2", "B1" 等楼层标识
|
||
- Zone: "North Wing", "South Wing" 等区域标识(可选)
|
||
- Building: "Main Building", "Annex" 等建筑标识(可选)
|
||
```
|
||
|
||
### 3.3 分层策略集成
|
||
|
||
**新增策略类:**
|
||
|
||
```csharp
|
||
public class CustomFloorLayerStrategy : ILayerStrategy
|
||
{
|
||
public string Name => "自定义分层";
|
||
|
||
public Dictionary<string, List<ModelItem>> GetLayers()
|
||
{
|
||
var floorManager = new FloorAttributeManager();
|
||
return floorManager.GetFloorGroups();
|
||
}
|
||
}
|
||
```
|
||
|
||
**集成到现有系统:**
|
||
|
||
- 在LayerManagementViewModel的策略列表中添加CustomFloorLayerStrategy
|
||
- 利用现有的预览列表显示分层结果
|
||
- 复用现有的分层保存和导出功能
|
||
|
||
### 3.4 UI集成点
|
||
|
||
**ModelSettingsView扩展:**
|
||
|
||
- 添加楼层属性设置面板
|
||
- 支持选中对象的楼层属性编辑
|
||
- 提供批量楼层设置功能
|
||
|
||
**LayerManagementView利用:**
|
||
|
||
- 在分层策略下拉框中显示"自定义分层"选项
|
||
- 当选择该策略时,预览列表显示基于楼层属性的分组
|
||
- 保持现有的可见性控制和导出功能
|
||
|
||
## 4. 实现方案
|
||
|
||
### 阶段1:核心属性系统
|
||
|
||
1. **创建FloorAttributeManager类**
|
||
- 实现基于COM API的自定义属性CRUD操作
|
||
- 提供楼层继承查询功能
|
||
- 支持线程安全的批量操作
|
||
|
||
2. **属性操作封装**
|
||
- 封装"分层信息"属性的标准操作
|
||
- 处理COM API的选择状态管理
|
||
- 实现错误处理和异常管理
|
||
|
||
### 阶段2:分层策略集成
|
||
|
||
3. **实现CustomFloorLayerStrategy**
|
||
- 创建新的分层策略类
|
||
- 实现基于Floor_Level属性的分组逻辑
|
||
- 处理未分层对象的归类
|
||
|
||
4. **集成到现有分层系统**
|
||
- 在LayerManagementViewModel中注册新策略
|
||
- 确保与现有预览框架的兼容性
|
||
- 测试分层结果的正确性
|
||
|
||
### 阶段3:UI功能完善
|
||
|
||
5. **楼层属性设置界面**
|
||
- 在ModelSettingsView中添加楼层设置面板
|
||
- 实现选中对象的楼层属性显示和编辑
|
||
- 提供楼层属性的清除功能
|
||
|
||
6. **批量操作支持**
|
||
- 实现多选对象的批量楼层设置
|
||
- 添加楼层设置的进度显示
|
||
- 提供楼层属性的导入/导出功能
|
||
|
||
## 5. 技术要点
|
||
|
||
### 线程安全
|
||
|
||
- 所有Navisworks API调用在主UI线程执行
|
||
- COM API操作使用Dispatcher.Invoke包装
|
||
|
||
### 属性继承策略
|
||
|
||
- 子节点优先使用自身楼层属性
|
||
- 自身无属性时向上查找父节点楼层属性
|
||
- 避免重复设置,减少存储开销
|
||
|
||
### 与现有功能集成
|
||
|
||
- 复用现有分层预览框架,无需重新开发UI
|
||
- 保持与分层导出功能的兼容性
|
||
- 支持与物流分类功能的协同工作
|
||
|
||
## 6. 预期效果
|
||
|
||
- **解决通用性问题**:用户可以为任何模型自定义分层
|
||
- **操作简便性**:利用现有界面,学习成本低
|
||
- **扩展性良好**:为后续添加更多自定义分组策略奠定基础
|
||
- **性能可控**:智能设置策略,适应大模型场景
|