# 自定义分层功能方案

## 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. 预期效果

- **解决通用性问题**：用户可以为任何模型自定义分层
- **操作简便性**：利用现有界面，学习成本低
- **扩展性良好**：为后续添加更多自定义分组策略奠定基础
- **性能可控**：智能设置策略，适应大模型场景
