# VisibilityHelper 使用指南

## 文件位置

`src/Utils/VisibilityHelper.cs`

## 用途

可见性管理器，负责 ModelItem 可见性控制的核心业务逻辑，包括显示全部、隔离显示、设置可见性等。

## 核心方法

### 显示所有项目

```csharp
// 显示所有模型项目（重置所有隐藏状态）
bool success = VisibilityHelper.ShowAllItems();
```

### 隔离显示

```csharp
// 仅显示指定的模型项集合，隐藏其他所有项
bool success = VisibilityHelper.IsolateSpecificItems(itemsToShow);

// 示例：隔离显示路径相关的对象
var pathItems = GetPathRelatedItems();
VisibilityHelper.IsolateSpecificItems(pathItems);
```

### 设置可见性

```csharp
// 设置指定模型项集合的可见性
bool success = VisibilityHelper.SetItemsVisibility(items, isHidden: true);   // 隐藏
bool success = VisibilityHelper.SetItemsVisibility(items, isHidden: false);  // 显示
```

## 使用示例

### 示例1：隔离显示碰撞对象

```csharp
// 收集所有碰撞涉及的对象
var collisionItems = new ModelItemCollection();
foreach (var collision in collisionResults)
{
    if (collision.Item1 != null) collisionItems.Add(collision.Item1);
    if (collision.Item2 != null) collisionItems.Add(collision.Item2);
}

// 只显示碰撞对象
VisibilityHelper.IsolateSpecificItems(collisionItems);

// 高亮碰撞对象
ModelHighlightHelper.HighlightItems("collisions", collisionItems);
```

### 示例2：分步显示/隐藏

```csharp
// 隐藏所有障碍物
var obstacles = GetObstacleItems();
VisibilityHelper.SetItemsVisibility(obstacles, isHidden: true);

// 后续操作...

// 重新显示障碍物
VisibilityHelper.SetItemsVisibility(obstacles, isHidden: false);
```

### 示例3：完整的显示重置流程

```csharp
// 清除所有高亮
ModelHighlightHelper.ClearAllHighlights();

// 显示所有项目
VisibilityHelper.ShowAllItems();

// 清除剖面盒
SectionClipHelper.ClearClipBox();

LogManager.Info("视图已重置");
```

### 示例4：通道可视化

```csharp
// 只显示通道相关的对象
var channelItems = GetChannelItems();
VisibilityHelper.IsolateSpecificItems(channelItems);

// 调整视角到通道
ViewpointHelper.AdjustViewpointToPathCenter(channelPath);

// 生成通道预览图
string screenshot = PathHelper.GenerateSceneScreenshot(
    "channel_view", 1920, 1080, ImageFormat.Png
);

// 恢复显示所有
VisibilityHelper.ShowAllItems();
```

## 注意事项

1. **隔离显示原理**：`IsolateSpecificItems` 会先显示所有，然后隐藏不需要的项目
2. **祖先节点处理**：隔离显示会自动包含选中项的所有祖先节点，确保路径完整
3. **性能考虑**：大量项目的可见性操作可能影响性能，建议批量处理
4. **与剖面盒配合**：可以与 `SectionClipHelper` 配合使用，进一步减少可见对象
5. **错误处理**：所有方法都返回 `bool` 表示成功/失败，内部已处理异常
