# 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); // 可能不同! ```