# 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.25(1/4视图) | | `baseDimension` | 基准尺寸计算相机距离 | 路径长度或包围盒最大边 | ## 注意事项 1. **视角保存**:在进行视角调整前建议保存当前视角,便于后续恢复 2. **异常处理**:方法会抛出 `InvalidOperationException`(无活动文档)和 `ArgumentException`(参数错误),需要适当捕获 3. **单位转换**:内部自动使用 `UnitsConverter` 进行米和模型单位的转换 4. **标准视角**:`FocusOnModelItem` 和 `FocusOnPosition` 使用模型的标准前右上视角(`FrontRightTopViewVector`) 5. **性能考虑**:频繁调整视角可能影响性能,建议在关键操作后统一调整