# UnitsConverter 使用指南
## 文件位置
`src/Utils/UnitsConverter.cs`
## 用途
处理模型单位与米制单位之间的转换。Navisworks 文档可以使用不同的单位(米、毫米、英尺等),必须通过此工具类进行转换。
## 命名规范(极其重要)
| 单位类型 | 命名规则 | 示例 |
|---------|---------|------|
| **米单位** | 变量名必须以 `InMeters` 结尾 | `lengthInMeters`, `heightInMeters` |
| **模型单位** | 变量名**无后缀** | `length`, `height`, `cellSize` |
```csharp
// ✅ 正确
public void SetSize(double lengthInMeters)
{
double factor = UnitsConverter.GetMetersToUnitsConversionFactor(...);
double length = lengthInMeters * factor; // 模型单位,无后缀
boundingBox = new BoundingBox3D(0, 0, 0, length, width, height);
}
// ❌ 错误
public void SetSize(double length) // 无法区分是米还是模型单位!
{
double scale = length / baseSize; // 单位不明确!
}
```
## 核心方法
### 获取转换因子
```csharp
// 获取模型单位到米的转换因子(模型单位 × factor = 米)
double factor = UnitsConverter.GetUnitsToMetersConversionFactor();
// 获取米到模型单位的转换因子(米 × factor = 模型单位)
double factor = UnitsConverter.GetMetersToUnitsConversionFactor();
```
### 直接转换值
```csharp
// 模型单位 → 米
double meters = UnitsConverter.ConvertToMeters(distanceInModelUnits);
// 米 → 模型单位
double modelUnits = UnitsConverter.ConvertFromMeters(distanceInMeters);
```
### 带单位的转换(从文档)
```csharp
// 从当前文档获取单位信息
Units units = Application.ActiveDocument.Units;
// 使用特定单位进行转换
double meters = UnitsConverter.ConvertToMeters(distance, units);
double modelUnits = UnitsConverter.ConvertFromMeters(distanceInMeters, units);
```
## 使用示例
### 示例1:读取配置并转换为模型单位
```csharp
// 配置中存储的是米
double cellSizeInMeters = ConfigManager.Instance.Current.PathEditing.CellSizeMeters;
// 转换为模型单位用于计算
double cellSize = UnitsConverter.ConvertFromMeters(cellSizeInMeters);
```
### 示例2:显示长度给用户
```csharp
// 路径长度是模型单位
double totalLength = route.TotalLength;
// 转换为米显示
double lengthInMeters = UnitsConverter.ConvertToMeters(totalLength);
string displayText = $"总长度: {lengthInMeters:F2} 米";
```
### 示例3:完整的函数参数处理
```csharp
///
/// 生成网格地图
///
/// 网格单元大小(米)
public GridMap Generate(double cellSizeInMeters)
{
// 转换为模型单位
double cellSize = UnitsConverter.ConvertFromMeters(cellSizeInMeters);
// 后续计算使用 cellSize(模型单位)
int gridX = (int)(bounds.Width / cellSize);
int gridY = (int)(bounds.Height / cellSize);
// ...
}
```
## 常见错误
```csharp
// ❌ 错误1:硬编码转换因子
private const double MM_TO_METERS = 0.001; // 危险!不同文档单位不同
double meters = modelValue * MM_TO_METERS; // 只在毫米文档正确
// ❌ 错误2:混淆命名
double cellSize = 0.5; // 这是米还是模型单位?
if (height > cellSize) // 单位不匹配的严重bug!
// ❌ 错误3:混用不同文档的单位
Units doc1Units = doc1.Units;
Units doc2Units = doc2.Units;
double value1 = ConvertToMeters(modelValue, doc1Units);
double value2 = ConvertToMeters(modelValue, doc2Units); // 可能不同!
```