NavisworksTransport/.agents/skills/project-tools/utils/UnitsConverter.md

127 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
/// <summary>
/// 生成网格地图
/// </summary>
/// <param name="cellSizeInMeters">网格单元大小(米)</param>
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); // 可能不同!
```