# 坐标系检测结果分析

## 测试模型对比

### 模型1：标准 Z-Up 模型 (Floor2_mobile.nwd)

| 指标 | 值 |
|------|-----|
| WorldUpVector | (0, 0, 1) |
| Transform.Rotation | 0° (无旋转) |
| 包围盒 Min | Z=-33.51 |
| 包围盒 Max | Z=88.00 |
| **判定** | ✅ **Z-Up 坐标系** |

### 模型2：Y-Up 模型 (Floor2_mobile_yup.nwf)

| 指标 | 值 |
|------|-----|
| WorldUpVector | **(0, 1, 0)** |
| Transform.Rotation | **270° 绕 X 轴** |
| 包围盒 Min | Y=-33.51 |
| 包围盒 Max | Y=100.56 |
| **判定** | ✅ **Y-Up 坐标系** |

---

## 关键发现

### 1. WorldUpVector 是最可靠的判断依据

```
Z-Up 模型: WorldUpVector = (0.0000, 0.0000, 1.0000)
Y-Up 模型: WorldUpVector = (0.0000, 1.0000, 0.0000)
```

**结论**：`Viewpoint.WorldUpVector` 直接反映了模型的原始坐标系，无需分析包围盒。

### 2. Navisworks 的自动转换机制

当导入 Y-Up 模型时，Navisworks 会：
1. **自动旋转模型**：绕 X 轴旋转 270°，将 Y-Up 转为 Z-Up 显示
2. **保留原始信息**：通过 `WorldUpVector` 记录原始坐标系

这使得：
- 视觉上所有模型都是 Z-Up
- 但 `WorldUpVector` 保持原始坐标系
- 插件需要据此适配内部计算

### 3. 包围盒分析的局限性

Y-Up 模型经过旋转后：
- 原始 Y 轴（高度）变成了 Z 轴
- 所以包围盒跨度分析会显示 Z 跨度大
- 容易产生误判

---

## 正确的检测方法（已实施）

```csharp
// 方法1：使用 WorldUpVector（推荐）
var worldUp = doc.CurrentViewpoint.Value.WorldUpVector;

if (Math.Abs(worldUp.Z) > 0.9)
    return CoordinateSystemType.ZUp;  // (0, 0, 1)
else if (Math.Abs(worldUp.Y) > 0.9)
    return CoordinateSystemType.YUp;  // (0, 1, 0)
else if (Math.Abs(worldUp.X) > 0.9)
    return CoordinateSystemType.XUp;  // (1, 0, 0) 罕见

// 方法2：辅助检查 Transform 旋转
var rotation = model.RootItem.Transform.Factor().Rotation.ToAxisAndAngle();
if (Math.Abs(rotation.Axis.X) > 0.9 && 
    (Math.Abs(rotation.Angle - Math.PI/2) < 0.1 || Math.Abs(rotation.Angle - 3*Math.PI/2) < 0.1))
{
    // 90° 或 270° 绕 X 轴旋转 → Y-Up 模型
}
```

---

## 实施建议

### 1. 更新 CoordinateSystemManager

使用 `WorldUpVector` 作为主要检测依据：

```csharp
private ICoordinateSystem AutoDetectCoordinateSystem()
{
    var doc = Application.ActiveDocument;
    var worldUp = doc.CurrentViewpoint.Value.WorldUpVector;
    
    if (Math.Abs(worldUp.Y) > 0.9)
    {
        LogManager.Info("[坐标系检测] WorldUpVector 表明 Y-Up 坐标系");
        return new YUpCoordinateSystem();
    }
    
    // 默认为 Z-Up
    return new ZUpCoordinateSystem();
}
```

### 2. 用户确认机制

检测后提示用户确认：
```
检测到模型使用 Y-Up 坐标系（来自 Revit 等软件）
是否启用坐标系适配？
[是] [否] [保持默认]
```

### 3. 配置文件预设置

在 `default_config.toml` 中：
```toml
[coordinate_system]
# 可选值: "AutoDetect"（推荐）, "ZUp", "YUp"
type = "AutoDetect"
```

---

## 下一步行动

1. ✅ **已完成**：坐标系检测按钮
2. ✅ **已完成**：可靠的检测方法（WorldUpVector）
3. ⏳ **待实施**：更新 `CoordinateSystemManager` 使用新方法
4. ⏳ **待实施**：实现坐标系抽象层适配
5. ⏳ **待实施**：修改 GridMap 等核心模块

---

*文档更新时间: 2026-01-30*
*状态: 检测方法已验证，等待实施适配*
