From 2d2e60c58bf15ff36652ea7e64d93d7a9e3dce51 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Tue, 6 Jan 2026 10:30:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E8=BD=BD=E5=85=A5=E4=BA=8B=E4=BB=B6=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E4=BA=8B=E4=BB=B6=E8=81=8C=E8=B4=A3=E6=B7=B7?= =?UTF-8?q?=E4=B9=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Core/IPathPlanningManagerEvents.cs | 6 ++ src/Core/PathCurveEngine.cs | 32 +++++----- src/Core/PathPlanningManager.cs | 37 ++++++++--- src/Core/PathPlanningManagerEventArgs.cs | 30 +++++++++ src/UI/WPF/ViewModels/PathEditingViewModel.cs | 63 +++++++++++++++---- 5 files changed, 134 insertions(+), 34 deletions(-) diff --git a/src/Core/IPathPlanningManagerEvents.cs b/src/Core/IPathPlanningManagerEvents.cs index 1cc543e..40c4b58 100644 --- a/src/Core/IPathPlanningManagerEvents.cs +++ b/src/Core/IPathPlanningManagerEvents.cs @@ -44,6 +44,12 @@ namespace NavisworksTransport.Core /// event EventHandler RouteGenerated; + /// + /// 路径加载完成事件 + /// 当从数据库加载路径完成时触发 + /// + event EventHandler RoutesLoaded; + /// /// 当前路径变更事件 /// 当当前活动路径发生变化时触发 diff --git a/src/Core/PathCurveEngine.cs b/src/Core/PathCurveEngine.cs index 146fb44..4c98dc0 100644 --- a/src/Core/PathCurveEngine.cs +++ b/src/Core/PathCurveEngine.cs @@ -60,7 +60,7 @@ namespace NavisworksTransport double clampedCosAlpha = Math.Max(-1.0, Math.Min(1.0, cosAlpha)); double angleRad = Math.Acos(clampedCosAlpha); - LogManager.Info($"[CalculateFillet] 角度计算: cosAlpha={cosAlpha:F4}, clampedCosAlpha={clampedCosAlpha:F4}, angleRad={angleRad:F4}rad ({angleRad * 180.0 / Math.PI:F2}度)"); + LogManager.Debug($"[CalculateFillet] 角度计算: cosAlpha={cosAlpha:F4}, clampedCosAlpha={clampedCosAlpha:F4}, angleRad={angleRad:F4}rad ({angleRad * 180.0 / Math.PI:F2}度)"); // 如果几乎共线,返回无效轨迹 if (angleRad < 0.01 || angleRad > Math.PI - 0.01) @@ -127,14 +127,14 @@ namespace NavisworksTransport dotTsTe = Math.Max(-1.0, Math.Min(1.0, dotTsTe)); double actualDeflectionAngle = Math.Acos(dotTsTe); - LogManager.Info($"[CalculateFillet] 计算实际偏转角度:"); - LogManager.Info($" Ts=({ts.X:F3},{ts.Y:F3},{ts.Z:F3}), Te=({te.X:F3},{te.Y:F3},{te.Z:F3})"); - LogManager.Info($" ArcCenter=({arcCenter.X:F3},{arcCenter.Y:F3},{arcCenter.Z:F3})"); - LogManager.Info($" Ts到圆心向量: ({tsToCenter.X:F3},{tsToCenter.Y:F3},{tsToCenter.Z:F3})"); - LogManager.Info($" Te到圆心向量: ({teToCenter.X:F3},{teToCenter.Y:F3},{teToCenter.Z:F3})"); - LogManager.Info($" 点积: {dotTsTe:F4}"); - LogManager.Info($" 实际偏转角度: {actualDeflectionAngle * 180.0 / Math.PI:F2}度"); - LogManager.Info($" 半径截断: {radiusTruncated}, 请求半径: {turnRadius:F2}米, 实际半径: {actualRadius:F2}米"); + LogManager.Debug($"[CalculateFillet] 计算实际偏转角度:"); + LogManager.Debug($" Ts=({ts.X:F3},{ts.Y:F3},{ts.Z:F3}), Te=({te.X:F3},{te.Y:F3},{te.Z:F3})"); + LogManager.Debug($" ArcCenter=({arcCenter.X:F3},{arcCenter.Y:F3},{arcCenter.Z:F3})"); + LogManager.Debug($" Ts到圆心向量: ({tsToCenter.X:F3},{tsToCenter.Y:F3},{tsToCenter.Z:F3})"); + LogManager.Debug($" Te到圆心向量: ({teToCenter.X:F3},{teToCenter.Y:F3},{teToCenter.Z:F3})"); + LogManager.Debug($" 点积: {dotTsTe:F4}"); + LogManager.Debug($" 实际偏转角度: {actualDeflectionAngle * 180.0 / Math.PI:F2}度"); + LogManager.Debug($" 半径截断: {radiusTruncated}, 请求半径: {turnRadius:F2}米, 实际半径: {actualRadius:F2}米"); double arcLength = actualRadius * actualDeflectionAngle; @@ -182,8 +182,8 @@ namespace NavisworksTransport // 打印角度信息 double angleDegrees = trajectory.DeflectionAngle * 180.0 / Math.PI; - LogManager.Info($"圆弧采样: 角度={angleDegrees:F2}度, 弧度={trajectory.DeflectionAngle:F4}, 半径={trajectory.ActualRadius:F2}m, 长度={trajectory.ArcLength:F2}m"); - LogManager.Info($" Ts=({trajectory.Ts.X:F3},{trajectory.Ts.Y:F3},{trajectory.Ts.Z:F3}), Te=({trajectory.Te.X:F3},{trajectory.Te.Y:F3},{trajectory.Te.Z:F3})"); + LogManager.Debug($"圆弧采样: 角度={angleDegrees:F2}度, 弧度={trajectory.DeflectionAngle:F4}, 半径={trajectory.ActualRadius:F2}m, 长度={trajectory.ArcLength:F2}m"); + LogManager.Debug($" Ts=({trajectory.Ts.X:F3},{trajectory.Ts.Y:F3},{trajectory.Ts.Z:F3}), Te=({trajectory.Te.X:F3},{trajectory.Te.Y:F3},{trajectory.Te.Z:F3})"); // 根据采样步长计算采样点数量 int sampleCount = Math.Max(2, (int)Math.Ceiling(trajectory.ArcLength / samplingStep)); @@ -198,7 +198,7 @@ namespace NavisworksTransport new Point3D(endVec.X, endVec.Y, endVec.Z)); Vector3D rotationAxis = new Vector3D(cross.X, cross.Y, cross.Z).Normalize(); - LogManager.Info($" 旋转轴=({rotationAxis.X:F6},{rotationAxis.Y:F6},{rotationAxis.Z:F6})"); + LogManager.Debug($" 旋转轴=({rotationAxis.X:F6},{rotationAxis.Y:F6},{rotationAxis.Z:F6})"); // 计算有向旋转角度(使用 Atan2 而不是 Acos,以保留方向信息) double dot = GeometryHelper.DotProduct( @@ -208,8 +208,8 @@ namespace NavisworksTransport // 使用 Atan2 计算有向角度,确保旋转方向正确 double signedAngle = Math.Atan2(crossMag, dot); - LogManager.Info($" 重新计算的有向角度: {signedAngle:F4}rad ({signedAngle * 180.0 / Math.PI:F2}度)"); - LogManager.Info($" 使用DeflectionAngle: {trajectory.DeflectionAngle:F4}rad ({trajectory.DeflectionAngle * 180.0 / Math.PI:F2}度)"); + LogManager.Debug($" 重新计算的有向角度: {signedAngle:F4}rad ({signedAngle * 180.0 / Math.PI:F2}度)"); + LogManager.Debug($" 使用DeflectionAngle: {trajectory.DeflectionAngle:F4}rad ({trajectory.DeflectionAngle * 180.0 / Math.PI:F2}度)"); // 使用trajectory.DeflectionAngle而不是重新计算的角度 signedAngle = trajectory.DeflectionAngle; @@ -230,7 +230,7 @@ namespace NavisworksTransport if (i == 0 || i == sampleCount) { - LogManager.Info($" 采样点[{i}/{sampleCount}]: t={t:F4}, theta={theta:F4}rad, 坐标=({sampledPoint.X:F3},{sampledPoint.Y:F3},{sampledPoint.Z:F3})"); + LogManager.Debug($" 采样点[{i}/{sampleCount}]: t={t:F4}, theta={theta:F4}rad, 坐标=({sampledPoint.X:F3},{sampledPoint.Y:F3},{sampledPoint.Z:F3})"); } points.Add(sampledPoint); @@ -241,7 +241,7 @@ namespace NavisworksTransport { var lastPoint = points.Last(); double distanceToTe = (lastPoint - trajectory.Te).Length; - LogManager.Info($" 终点验证: 目标Te=({trajectory.Te.X:F3},{trajectory.Te.Y:F3},{trajectory.Te.Z:F3}), 实际终点=({lastPoint.X:F3},{lastPoint.Y:F3},{lastPoint.Z:F3}), 误差={distanceToTe:F6}m"); + LogManager.Debug($" 终点验证: 目标Te=({trajectory.Te.X:F3},{trajectory.Te.Y:F3},{trajectory.Te.Z:F3}), 实际终点=({lastPoint.X:F3},{lastPoint.Y:F3},{lastPoint.Z:F3}), 误差={distanceToTe:F6}m"); if (distanceToTe > 0.001) { LogManager.Warning($" 圆弧采样终点误差: {distanceToTe:F6}m"); diff --git a/src/Core/PathPlanningManager.cs b/src/Core/PathPlanningManager.cs index c3617bf..ca5ecb9 100644 --- a/src/Core/PathPlanningManager.cs +++ b/src/Core/PathPlanningManager.cs @@ -306,6 +306,7 @@ namespace NavisworksTransport public event EventHandler RouteGenerated; public event EventHandler CurrentRouteChanged; public event EventHandler PathPointsListUpdated; + public event EventHandler RoutesLoaded; // 保留原有事件以保持向后兼容 [Obsolete("请使用新的强类型事件接口")] @@ -657,6 +658,32 @@ namespace NavisworksTransport } } + private void RaiseRoutesLoaded(IReadOnlyList routes, string loadSource = "Database") + { + try + { + var eventArgs = new RoutesLoadedEventArgs(routes, loadSource, _managerId); + + if (_uiStateManager != null) + { + _uiStateManager.QueueUIUpdate(() => + { + RoutesLoaded?.Invoke(this, eventArgs); + }); + } + else + { + RoutesLoaded?.Invoke(this, eventArgs); + } + + LogManager.Info($"[路径加载完成] 从{loadSource}加载了 {routes.Count} 条路径"); + } + catch (Exception ex) + { + LogManager.Error($"[路径加载完成] 事件触发失败: {ex.Message}"); + } + } + #endregion #region 核心业务方法 @@ -3810,13 +3837,9 @@ namespace NavisworksTransport LogManager.Info($"设置当前路径为: {_currentRoute.Name}"); } - // 历史路径加载完成后,触发RouteGenerated事件通知UI刷新 - // 使用特殊的生成方法标记这是数据库加载 - foreach (var route in _routes) - { - RaiseRouteGenerated(route, RouteGenerationMethod.DatabaseLoad); - } - LogManager.Info($"已触发{_routes.Count}个RouteGenerated事件,通知UI刷新历史路径"); + // 历史路径加载完成后,触发RoutesLoaded事件通知UI刷新 + RaiseRoutesLoaded(_routes.AsReadOnly(), "Database"); + LogManager.Info($"已触发RoutesLoaded事件,通知UI刷新历史路径列表"); } else { diff --git a/src/Core/PathPlanningManagerEventArgs.cs b/src/Core/PathPlanningManagerEventArgs.cs index f6d45d4..ebbd08a 100644 --- a/src/Core/PathPlanningManagerEventArgs.cs +++ b/src/Core/PathPlanningManagerEventArgs.cs @@ -247,6 +247,36 @@ namespace NavisworksTransport.Core } } + /// + /// 路径加载完成事件参数 + /// 当从数据库加载路径完成时触发 + /// + public class RoutesLoadedEventArgs : PathPlanningEventArgsBase + { + /// + /// 加载的路径列表 + /// + public IReadOnlyList Routes { get; } + + /// + /// 加载的路径数量 + /// + public int RouteCount { get; } + + /// + /// 加载来源 + /// + public string LoadSource { get; } + + public RoutesLoadedEventArgs(IReadOnlyList routes, string loadSource = "Database", string managerId = null) + : base(managerId) + { + Routes = routes ?? new List(); + RouteCount = Routes.Count; + LoadSource = loadSource; + } + } + #region 枚举定义 /// diff --git a/src/UI/WPF/ViewModels/PathEditingViewModel.cs b/src/UI/WPF/ViewModels/PathEditingViewModel.cs index 12eada2..b584e72 100644 --- a/src/UI/WPF/ViewModels/PathEditingViewModel.cs +++ b/src/UI/WPF/ViewModels/PathEditingViewModel.cs @@ -2578,6 +2578,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels // 订阅路径生成事件(用于处理自动路径) _pathPlanningManager.RouteGenerated += OnRouteGenerated; + // 订阅路径加载完成事件(用于处理数据库加载的路径) + _pathPlanningManager.RoutesLoaded += OnRoutesLoaded; + // 添加错误事件订阅 - 用于处理自动路径规划失败等错误 _pathPlanningManager.ErrorOccurred += OnPathPlanningError; @@ -2603,6 +2606,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels _pathPlanningManager.CurrentRouteChanged -= OnCurrentRouteChanged; _pathPlanningManager.EditStateChanged -= OnEditStateChanged; _pathPlanningManager.RouteGenerated -= OnRouteGenerated; + _pathPlanningManager.RoutesLoaded -= OnRoutesLoaded; _pathPlanningManager.ErrorOccurred -= OnPathPlanningError; LogManager.Info("PathEditingViewModel已取消订阅PathPlanningManager事件,包括ErrorOccurred"); @@ -2972,20 +2976,52 @@ namespace NavisworksTransport.UI.WPF.ViewModels } else if (e.GenerationMethod == RouteGenerationMethod.DatabaseLoad) { - // 从数据库加载的历史路径 - LogManager.Info($"*** 开始处理数据库加载路径: {e.Route.Name} ***"); + // 注意:DatabaseLoad现在由OnRoutesLoaded事件处理,这里不再处理 + LogManager.Warning($"*** OnRouteGenerated收到DatabaseLoad方法,这不应该发生!应该由OnRoutesLoaded处理 ***"); + } + }, "处理路径生成事件"); + } + catch (Exception ex) + { + LogManager.Error($"*** OnRouteGenerated异常: {ex.Message} ***", ex); + } + } + + /// + /// 处理路径加载完成事件(用于数据库加载) + /// + private async void OnRoutesLoaded(object sender, RoutesLoadedEventArgs e) + { + LogManager.Info($"*** OnRoutesLoaded被调用!Sender: {sender?.GetType().Name}, RouteCount: {e?.RouteCount}, LoadSource: {e?.LoadSource} ***"); + + if (e?.Routes == null) + { + LogManager.Warning("*** OnRoutesLoaded: RoutesLoadedEventArgs或Routes为null,退出处理 ***"); + return; + } + + try + { + await SafeExecuteAsync(() => + { + LogManager.Info($"PathEditingViewModel收到路径加载完成事件: 加载了 {e.RouteCount} 条路径,来源: {e.LoadSource}"); + + // 处理从数据库加载的历史路径 + foreach (var coreRoute in e.Routes) + { + LogManager.Info($"*** 开始处理数据库加载路径: {coreRoute.Name} ***"); // 创建对应的 WPF ViewModel var dbPathViewModel = new PathRouteViewModel { - Id = e.Route.Id, - Name = e.Route.Name, - Description = e.Route.Description, + Id = coreRoute.Id, + Name = coreRoute.Name, + Description = coreRoute.Description, IsActive = false // 历史路径默认不激活 }; // 转换路径点 - foreach (var corePoint in e.Route.Points) + foreach (var corePoint in coreRoute.Points) { var wpfPoint = new PathPointViewModel { @@ -3002,23 +3038,28 @@ namespace NavisworksTransport.UI.WPF.ViewModels LogManager.Info($"*** 已创建PathRouteViewModel(数据库路径),包含 {dbPathViewModel.Points.Count} 个点 ***"); // 检查是否已存在同名路径,避免重复添加 - var existingPath = PathRoutes.FirstOrDefault(p => p.Name == e.Route.Name); + var existingPath = PathRoutes.FirstOrDefault(p => p.Name == coreRoute.Name); if (existingPath == null) { // 添加到 UI 列表 PathRoutes.Add(dbPathViewModel); - LogManager.Info($"*** 数据库路径已添加到UI列表: {e.Route.Name},当前PathRoutes.Count = {PathRoutes.Count} ***"); + LogManager.Info($"*** 数据库路径已添加到UI列表: {coreRoute.Name},当前PathRoutes.Count = {PathRoutes.Count} ***"); } else { - LogManager.Info($"*** 数据库路径已存在,跳过: {e.Route.Name} ***"); + LogManager.Info($"*** 数据库路径已存在,跳过: {coreRoute.Name} ***"); } } - }, "处理路径生成事件"); + + // 更新状态消息 + string statusMessage = $"✅ 已从{e.LoadSource}加载 {e.RouteCount} 条历史路径"; + UpdateMainStatus(statusMessage); + LogManager.Info($"*** 状态已更新: {statusMessage} ***"); + }, "处理路径加载完成事件"); } catch (Exception ex) { - LogManager.Error($"*** OnRouteGenerated异常: {ex.Message} ***", ex); + LogManager.Error($"*** OnRoutesLoaded异常: {ex.Message} ***", ex); } }