NavisworksTransport/.agents/skills/project-tools/utils/ViewpointHelper.md
2026-02-25 02:01:38 +08:00

145 lines
4.0 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.

# ViewpointHelper 使用指南
## 文件位置
`src/Utils/ViewpointHelper.cs`
## 用途
提供 Navisworks 视角调整功能,用于自动调整摄像机位置和视角,支持路径居中显示、碰撞位置聚焦等。
## 核心方法
### 路径视角调整
```csharp
// 智能调整视角到路径中心
ViewpointHelper.AdjustViewpointSmart(path, collisions);
// 调整视角到路径中心,确保整个路径在视野内
ViewpointHelper.AdjustViewpointToPathCenter(path);
// 计算路径的包围盒
BoundingBox3D bounds = ViewpointHelper.CalculatePathBoundingBox(path);
```
### 碰撞视角调整
```csharp
// 计算碰撞位置的包围盒
BoundingBox3D bounds = ViewpointHelper.CalculateCollisionsBoundingBox(collisions);
// 聚焦到碰撞对象(两个对象)
ViewpointHelper.FocusOnCollision(item1, item2, viewAngleDegrees: 45, targetViewRatio: 0.25);
// 聚焦到指定位置
ViewpointHelper.FocusOnPosition(center, targetSize, viewAngleDegrees: 45, targetViewRatio: 0.25);
```
### 模型元素聚焦
```csharp
// 聚焦到单个模型元素
ViewpointHelper.FocusOnModelItem(modelItem, viewAngleDegrees: 45, targetViewRatio: 0.25);
// viewAngleDegrees: 视角角度(度)
// targetViewRatio: 目标占据视图比例0.25 = 1/4
```
### 视角保存与恢复
```csharp
// 保存当前视角
Viewpoint savedViewpoint = ViewpointHelper.SaveCurrentViewpoint();
// 恢复视角
ViewpointHelper.RestoreViewpoint(savedViewpoint);
```
## 使用示例
### 示例1生成碰撞报告前调整视角
```csharp
// 保存当前视角
Viewpoint originalViewpoint = ViewpointHelper.SaveCurrentViewpoint();
try
{
// 调整视角到路径中心
ViewpointHelper.AdjustViewpointToPathCenter(path);
// 生成截图
string screenshotPath = PathHelper.GenerateSceneScreenshot(
"collision_report", 1920, 1080, ImageFormat.Png
);
}
finally
{
// 恢复原始视角
ViewpointHelper.RestoreViewpoint(originalViewpoint);
}
```
### 示例2聚焦到碰撞位置
```csharp
// 检测到碰撞后,聚焦到碰撞对象
if (collision.Item1 != null && collision.Item2 != null)
{
ViewpointHelper.FocusOnCollision(
collision.Item1,
collision.Item2,
viewAngleDegrees: 45, // 45度视角
targetViewRatio: 0.3 // 占据视图30%
);
// 高亮碰撞对象
ModelHighlightHelper.HighlightItems("collision", new[] { collision.Item1, collision.Item2 });
}
```
### 示例3聚焦到特定模型元素
```csharp
// 用户选择了一个门对象
var doorItem = selectedItems.FirstOrDefault();
if (doorItem != null)
{
// 聚焦到该门45度斜上方视角
ViewpointHelper.FocusOnModelItem(doorItem, 45, 0.25);
LogManager.Info($"已聚焦到: {doorItem.DisplayName}");
}
```
### 示例4路径规划完成后调整视角
```csharp
// 路径规划完成
if (pathRoute.Points.Count > 0)
{
// 智能调整视角
ViewpointHelper.AdjustViewpointSmart(pathRoute, collisionResults);
// 高亮路径点
var pathItems = pathRoute.Points.Select(p => p.AssociatedModelItem).Where(i => i != null);
ModelHighlightHelper.HighlightItems("pathPreview", pathItems);
}
```
## 视角参数说明
| 参数 | 说明 | 推荐值 |
|------|------|--------|
| `viewAngleDegrees` | 相机视角角度(度) | 45°斜上方 |
| `targetViewRatio` | 目标占据视图比例 | 0.251/4视图 |
| `baseDimension` | 基准尺寸计算相机距离 | 路径长度或包围盒最大边 |
## 注意事项
1. **视角保存**:在进行视角调整前建议保存当前视角,便于后续恢复
2. **异常处理**:方法会抛出 `InvalidOperationException`(无活动文档)和 `ArgumentException`(参数错误),需要适当捕获
3. **单位转换**:内部自动使用 `UnitsConverter` 进行米和模型单位的转换
4. **标准视角**`FocusOnModelItem` 和 `FocusOnPosition` 使用模型的标准前右上视角(`FrontRightTopViewVector`
5. **性能考虑**:频繁调整视角可能影响性能,建议在关键操作后统一调整