From 749eb07cef892cba794f759551102a0778e13604 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Wed, 18 Feb 2026 09:46:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=BA=9B=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Core/Animation/PathAnimationManager.cs | 67 ++++--------------- src/Core/PathPlanningManager.cs | 7 ++ src/Core/PathPlanningModels.cs | 24 +++++++ src/UI/WPF/Converters/PathTypeConverter.cs | 12 +--- .../ViewModels/LayerManagementViewModel.cs | 4 +- .../WPF/ViewModels/ModelSettingsViewModel.cs | 4 +- src/UI/WPF/ViewModels/PathEditingViewModel.cs | 19 ++++-- 7 files changed, 62 insertions(+), 75 deletions(-) diff --git a/src/Core/Animation/PathAnimationManager.cs b/src/Core/Animation/PathAnimationManager.cs index a0a797d..6fd8142 100644 --- a/src/Core/Animation/PathAnimationManager.cs +++ b/src/Core/Animation/PathAnimationManager.cs @@ -567,6 +567,13 @@ namespace NavisworksTransport.Core.Animation /// 路径点(可选,如果不提供则使用当前的_pathPoints) public void MoveObjectToPathStart(ModelItem animatedObject = null, List pathPoints = null) { + // 前置检查:必须有路径 + if (_route == null) + { + LogManager.Error("[MoveObjectToPathStart] 路径为空,无法移动物体到路径起点"); + return; + } + try { // 🔥 重要:先恢复物体到原始状态(CAD位置和原始朝向),确保每次计算都从相同的状态开始 @@ -609,7 +616,7 @@ namespace NavisworksTransport.Core.Animation LogManager.Info($"[移动到起点] 路径方向yaw: {pathDirectionYaw * 180 / Math.PI:F2}度, 角度修正: {_objectRotationCorrection:F1}度"); // 根据路径类型调整朝向 - if (_route?.PathType == PathType.Hoisting) + if (_route.PathType == PathType.Hoisting) { // 吊装路径:使用水平吊运方向(与通行空间方向一致) // 从第2个路径点(提升点)到第3个路径点(平移终点)的水平方向 @@ -633,13 +640,13 @@ namespace NavisworksTransport.Core.Animation // 根据路径类型调整起点位置 Point3D startPosition = _pathPoints[0]; - if (_route?.PathType == PathType.Hoisting) + if (_route.PathType == PathType.Hoisting) { // 吊装路径:第一个路径点(起吊点)是地面位置,物体底面应该在这里 // 不需要向下移动物体高度 LogManager.Debug($"[移动到起点] 吊装路径:起吊点是地面位置,物体底面Z={startPosition.Z:F2}"); } - else if (_route?.PathType == PathType.Rail) + else if (_route.PathType == PathType.Rail) { // 空轨路径:路径点是悬挂点,物体悬挂在下方 double objectHeight = _animatedObject.BoundingBox().Max.Z - _animatedObject.BoundingBox().Min.Z; @@ -655,43 +662,8 @@ namespace NavisworksTransport.Core.Animation // 使用 UpdateObjectPosition 统一处理移动和旋转 UpdateObjectPosition(startPosition, yaw); - string pathTypeName; - if (_route?.PathType == PathType.Rail) - { - pathTypeName = "空轨"; - } - else if (_route?.PathType == PathType.Hoisting) - { - pathTypeName = "吊装"; - } - else - { - pathTypeName = "地面"; - } - + string pathTypeName = _route.PathType.GetDisplayName(); LogManager.Info($"物体已初始化到路径起点并对齐朝向: pos=({startPosition.X:F2},{startPosition.Y:F2},{startPosition.Z:F2}), yaw={yaw:F3}rad, 路径类型={pathTypeName}"); - - // 打印实际物体的位置和方向 - if (_animatedObject != null) - { - var bbox = _animatedObject.BoundingBox(); - var actualCenter = bbox.Center; - var actualYaw = ModelItemTransformHelper.GetYawFromTransform(_animatedObject.Transform); - LogManager.Info($"实际物体位置: X={actualCenter.X:F2}, Y={actualCenter.Y:F2}, Z={actualCenter.Z:F2}"); - LogManager.Info($"实际物体朝向: {actualYaw * 180 / Math.PI:F2}度"); - } - else if (_isVirtualObject) - { - var virtualObject = VirtualObjectManager.Instance.CurrentVirtualObject; - if (virtualObject != null) - { - var bbox = virtualObject.BoundingBox(); - var actualCenter = bbox.Center; - var actualYaw = ModelItemTransformHelper.GetYawFromTransform(virtualObject.Transform); - LogManager.Info($"虚拟物体位置: X={actualCenter.X:F2}, Y={actualCenter.Y:F2}, Z={actualCenter.Z:F2}"); - LogManager.Info($"虚拟物体朝向: {actualYaw * 180 / Math.PI:F2}度"); - } - } } catch (Exception ex) { @@ -766,20 +738,7 @@ namespace NavisworksTransport.Core.Animation double metersToModelUnits = UnitsConverter.GetMetersToUnitsConversionFactor(); double totalLengthInModelUnits = _route.TotalLength * metersToModelUnits; - string pathTypeName; - if (_route.PathType == PathType.Rail) - { - pathTypeName = "空轨"; - } - else if (_route.PathType == PathType.Hoisting) - { - pathTypeName = "吊装"; - } - else - { - pathTypeName = "地面"; - } - + string pathTypeName = _route.PathType.GetDisplayName(); LogManager.Info($"路径总长度: {totalLengthInModelUnits / metersToModelUnits:F2}米, 采样点数: {allSampledPoints.Count}, 路径类型: {pathTypeName}"); // 2. 按帧数采样生成动画帧 @@ -870,7 +829,7 @@ namespace NavisworksTransport.Core.Animation int segmentIndex = FindSegmentForDistance(targetDistance, segmentLengths); if (segmentIndex < 0 || segmentIndex >= segmentLengths.Count) { - string subTypeName = _route.PathType == PathType.Rail ? "空轨" : "吊装"; + string subTypeName = _route.PathType.GetDisplayName(); LogManager.Warning($"[{subTypeName}路径] 无法找到线段,目标距离:{targetDistance / metersToModelUnits:F2}米"); continue; } diff --git a/src/Core/PathPlanningManager.cs b/src/Core/PathPlanningManager.cs index 71e837e..487956f 100644 --- a/src/Core/PathPlanningManager.cs +++ b/src/Core/PathPlanningManager.cs @@ -1590,6 +1590,13 @@ namespace NavisworksTransport PathType = pathType }; _editingRoute = newRoute; + + // 立即添加到路径集合,确保UI能正确找到Core路径 + if (!_routes.Contains(newRoute)) + { + _routes.Add(newRoute); + } + SetCurrentRouteInternal(newRoute, triggerEvent: true); // 如果是吊装路径,清理吊装模式相关状态 diff --git a/src/Core/PathPlanningModels.cs b/src/Core/PathPlanningModels.cs index 74c701a..d31cac6 100644 --- a/src/Core/PathPlanningModels.cs +++ b/src/Core/PathPlanningModels.cs @@ -67,6 +67,30 @@ namespace NavisworksTransport Hoisting = 2 } + /// + /// PathType枚举扩展方法 + /// + public static class PathTypeExtensions + { + /// + /// 获取路径类型的中文名称 + /// + public static string GetDisplayName(this PathType pathType) + { + switch (pathType) + { + case PathType.Ground: + return "地面"; + case PathType.Rail: + return "空轨"; + case PathType.Hoisting: + return "吊装"; + default: + return "未知"; + } + } + } + /// /// 吊装路径点方向类型 /// 用于标识吊装路径中每个路径点的移动方向 diff --git a/src/UI/WPF/Converters/PathTypeConverter.cs b/src/UI/WPF/Converters/PathTypeConverter.cs index 2c20dc4..fcfa924 100644 --- a/src/UI/WPF/Converters/PathTypeConverter.cs +++ b/src/UI/WPF/Converters/PathTypeConverter.cs @@ -14,17 +14,7 @@ namespace NavisworksTransport.UI.WPF.Converters { if (value is NavisworksTransport.PathType pathType) { - switch (pathType) - { - case NavisworksTransport.PathType.Ground: - return "地面"; - case NavisworksTransport.PathType.Rail: - return "空轨"; - case NavisworksTransport.PathType.Hoisting: - return "吊装"; - default: - return "未知"; - } + return pathType.GetDisplayName(); } return "地面"; } diff --git a/src/UI/WPF/ViewModels/LayerManagementViewModel.cs b/src/UI/WPF/ViewModels/LayerManagementViewModel.cs index bfbcc01..0ced78d 100644 --- a/src/UI/WPF/ViewModels/LayerManagementViewModel.cs +++ b/src/UI/WPF/ViewModels/LayerManagementViewModel.cs @@ -2939,7 +2939,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels // 更新楼层属性相关的选择状态(使用新的选择结果) await UpdateFloorAttributeSelectionStateAsync(selectionResult); - LogManager.Info($"[LayerManagementViewModel] 选择状态已更新: {selectionResult.Count}个项目"); + LogManager.Debug($"[LayerManagementViewModel] 选择状态已更新: {selectionResult.Count}个项目"); } catch (Exception ex) { @@ -2979,7 +2979,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels OnPropertyChanged(nameof(CanSetFloorAttribute)); OnPropertyChanged(nameof(CanClearFloorAttribute)); - LogManager.Info($"[LayerManagementViewModel] 楼层属性选择状态已更新: 成功={selectionResult.Success}, 数量={selectionResult.Count}"); + LogManager.Debug($"[LayerManagementViewModel] 楼层属性选择状态已更新: 成功={selectionResult.Success}, 数量={selectionResult.Count}"); } catch (Exception ex) { diff --git a/src/UI/WPF/ViewModels/ModelSettingsViewModel.cs b/src/UI/WPF/ViewModels/ModelSettingsViewModel.cs index b88f414..add0a55 100644 --- a/src/UI/WPF/ViewModels/ModelSettingsViewModel.cs +++ b/src/UI/WPF/ViewModels/ModelSettingsViewModel.cs @@ -1224,7 +1224,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels // 更新物流属性相关的选择状态(使用新的选择结果) await UpdateModelSelectionStateAsync(selectionResult); - LogManager.Info($"[ModelSettingsViewModel] 选择状态已更新: {selectionResult.Count}个项目"); + LogManager.Debug($"[ModelSettingsViewModel] 选择状态已更新: {selectionResult.Count}个项目"); } catch (Exception ex) { @@ -1264,7 +1264,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels OnPropertyChanged(nameof(CanSetLogisticsAttribute)); OnPropertyChanged(nameof(CanClearLogisticsAttribute)); - LogManager.Info($"[ModelSettingsViewModel] 模型选择状态已更新: 成功={selectionResult.Success}, 数量={selectionResult.Count}"); + LogManager.Debug($"[ModelSettingsViewModel] 模型选择状态已更新: 成功={selectionResult.Success}, 数量={selectionResult.Count}"); } catch (Exception ex) { diff --git a/src/UI/WPF/ViewModels/PathEditingViewModel.cs b/src/UI/WPF/ViewModels/PathEditingViewModel.cs index 7d443b4..8dfb35c 100644 --- a/src/UI/WPF/ViewModels/PathEditingViewModel.cs +++ b/src/UI/WPF/ViewModels/PathEditingViewModel.cs @@ -135,15 +135,22 @@ namespace NavisworksTransport.UI.WPF.ViewModels _pathPlanningManager.SetCurrentRoute(coreRoute); LogManager.Info($"UI路径切换:已同步PathPlanningManager的CurrentRoute到 {value.Name}"); - // 自动调整视角到路径中心 - try + // 自动调整视角到路径中心(只有路径有点时才调整) + if (coreRoute.Points.Count > 0) { - ViewpointHelper.AdjustViewpointToPathCenter(coreRoute); - LogManager.Info($"UI路径切换:已自动调整视角到路径中心: {value.Name}"); + try + { + ViewpointHelper.AdjustViewpointToPathCenter(coreRoute); + LogManager.Info($"UI路径切换:已自动调整视角到路径中心: {value.Name}"); + } + catch (Exception ex) + { + LogManager.Error($"UI路径切换:调整视角失败: {ex.Message}"); + } } - catch (Exception ex) + else { - LogManager.Error($"UI路径切换:调整视角失败: {ex.Message}"); + LogManager.Info($"UI路径切换:路径还没有点,跳过视角调整: {value.Name}"); } } else