# PathHelper 使用指南

## 文件位置

`src/Utils/PathHelper.cs`

## 用途

提供文件路径相关的通用方法，包括插件目录管理、文件名处理、截图生成等。

## 核心方法

### 目录操作

```csharp
// 获取插件目录路径
string pluginDir = PathHelper.GetPluginDirectory();
// 返回: C:\ProgramData\Autodesk\Navisworks Manage 2026\plugins\TransportPlugin

// 获取截图目录路径
string screenshotDir = PathHelper.GetScreenshotDirectory();

// 获取报告目录路径
string reportDir = PathHelper.GetReportDirectory();

// 确保目录存在（不存在则创建）
PathHelper.EnsureDirectoryExists("C:\\MyFolder\\SubFolder");
```

### 文件名处理

```csharp
// 清理文件名中的非法字符
string safeName = PathHelper.SanitizeFileName("文件<名称>:非法*字符?");
// 返回: "文件名称非法字符"

// 生成带时间戳的文件名
string fileName = PathHelper.GenerateTimestampedFileName("screenshot", "png");
// 返回: "screenshot_20240225_143052.png"
```

### 路径计算

```csharp
// 计算从HTML文件到目标文件的相对路径
string relativePath = PathHelper.GetRelativePath(
    @"C:\reports\index.html",
    @"C:\images\photo.png"
);
// 返回: "../images/photo.png"
```

### 图像格式转换

```csharp
// ImageFormat 转文件扩展名
string ext = PathHelper.ImageFormatToExtension(ImageFormat.Jpeg);  // "jpg"
string ext = PathHelper.ImageFormatToExtension(ImageFormat.Png);   // "png"

// 文件扩展名转 ImageFormat
ImageFormat format = PathHelper.ExtensionToImageFormat(".jpg");    // Jpeg
ImageFormat format = PathHelper.ExtensionToImageFormat(".png");    // Png
```

### 截图生成

```csharp
// 生成场景截图到默认目录
string path = PathHelper.GenerateSceneScreenshot(
    sceneName: "collision_view",
    width: 1920,
    height: 1080,
    format: ImageFormat.Png,
    prefix: "collision"
);
// 返回: 截图文件完整路径

// 生成场景截图到指定目录
string path = PathHelper.GenerateSceneScreenshotToDirectory(
    outputDirectory: @"C:\MyScreenshots",
    sceneName: "path_view",
    width: 1920,
    height: 1080,
    format: ImageFormat.Jpeg,
    prefix: "path"
);
```

## 使用示例

### 示例1：生成带时间戳的报告文件

```csharp
// 生成报告文件名
string reportDir = PathHelper.GetReportDirectory();
PathHelper.EnsureDirectoryExists(reportDir);

string safeRouteName = PathHelper.SanitizeFileName(route.Name);
string reportFile = PathHelper.GenerateTimestampedFileName(
    $"collision_report_{safeRouteName}", 
    "html"
);
string fullPath = Path.Combine(reportDir, reportFile);

// 保存报告...
```

### 示例2：批量处理文件名

```csharp
// 清理多个文件名
var fileNames = new[] { "文件:1", "名称*2", "测试?3" };
var safeNames = fileNames.Select(f => PathHelper.SanitizeFileName(f));
// 结果: "文件1", "名称2", "测试3"
```

### 示例3：生成碰撞报告截图

```csharp
// 在显示碰撞结果后生成截图
string screenshotPath = PathHelper.GenerateSceneScreenshot(
    sceneName: $"collision_{collisionId}",
    width: 1920,
    height: 1080,
    format: ImageFormat.Png,
    prefix: "collision"
);

if (!string.IsNullOrEmpty(screenshotPath))
{
    LogManager.Info($"截图已保存: {screenshotPath}");
}
```

## 注意事项

1. **目录自动创建**：`GenerateSceneScreenshot` 会自动创建必要的目录
2. **非法字符处理**：`SanitizeFileName` 会移除所有 Windows 文件系统不支持的字符
3. **时间戳格式**：使用 `yyyyMMdd_HHmmss` 格式，确保文件名唯一且可排序
4. **相对路径**：`GetRelativePath` 返回的路径使用正斜杠（/），适合在 HTML 中使用
