From 1ae3ace54e499aa78a7a56fed2be80b78f4d520b Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Sat, 30 Aug 2025 23:14:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E7=82=B9=E7=9A=84=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Core/PathPlanningManager.cs | 246 +++++++++++++++++ src/Core/PathPlanningModels.cs | 7 +- src/Core/PathPointRenderPlugin.cs | 111 ++++++++ src/UI/WPF/Models/PathRouteViewModel.cs | 12 + src/UI/WPF/ViewModels/PathEditingViewModel.cs | 257 ++++++++++++++++-- src/UI/WPF/Views/PathEditingView.xaml | 5 + 6 files changed, 607 insertions(+), 31 deletions(-) diff --git a/src/Core/PathPlanningManager.cs b/src/Core/PathPlanningManager.cs index 8109839..3f96fe3 100644 --- a/src/Core/PathPlanningManager.cs +++ b/src/Core/PathPlanningManager.cs @@ -51,6 +51,11 @@ namespace NavisworksTransport private bool _isPreviewMode = false; private int _previewInsertIndex = -1; // 保存预览点应该插入的索引位置 + // 修改路径点管理 + private int _editingPointIndex = -1; // 正在修改的路径点索引 + private PathPoint _originalPoint = null; // 修改前的原始路径点 + private PathPoint _editingPreviewPoint = null; // 修改时的预览路径点 + /// /// 获取当前是否在预览模式 /// @@ -1272,6 +1277,240 @@ namespace NavisworksTransport } } + #region 修改路径点功能 + + /// + /// 开始修改指定的路径点 + /// + /// 要修改的路径点索引 + /// 是否成功开始修改 + public bool StartEditingPoint(int pointIndex) + { + try + { + if (CurrentRoute == null || pointIndex < 0 || pointIndex >= CurrentRoute.Points.Count) + { + RaiseErrorOccurred("无效的路径点索引或当前没有路径"); + return false; + } + + // 保存原始点和索引 + _editingPointIndex = pointIndex; + var originalPoint = CurrentRoute.Points[pointIndex]; + _originalPoint = new PathPoint + { + Id = originalPoint.Id, + Name = originalPoint.Name, + Position = originalPoint.Position, + Type = originalPoint.Type + }; + + // 切换到修改路径点状态 + PathEditState = PathEditState.EditingPoint; + + // 激活ToolPlugin以接收3D点击 + ActivateToolPlugin(); + + RaiseStatusChanged($"开始修改路径点: {_originalPoint.Name}", PathPlanningStatusType.Info); + LogManager.Info($"开始修改路径点,索引: {pointIndex}, 名称: {_originalPoint.Name}"); + + return true; + } + catch (Exception ex) + { + RaiseErrorOccurred($"开始修改路径点失败: {ex.Message}", ex); + return false; + } + } + + /// + /// 设置修改路径点时的预览位置 + /// + /// 新的预览位置 + public void SetEditingPreviewPoint(Point3D position) + { + try + { + if (PathEditState != PathEditState.EditingPoint || _editingPointIndex == -1) + { + return; + } + + // 创建预览路径点 + _editingPreviewPoint = new PathPoint + { + Position = position, + Name = _originalPoint.Name + "_预览", + Type = _originalPoint.Type + }; + + // 更新预览可视化 + UpdateEditingPreviewVisualization(); + + LogManager.Info($"设置修改预览点: ({position.X:F3}, {position.Y:F3}, {position.Z:F3})"); + } + catch (Exception ex) + { + LogManager.Error($"设置修改预览点失败: {ex.Message}"); + } + } + + /// + /// 确认修改路径点 + /// + /// 是否成功确认修改 + public bool ConfirmEditPoint() + { + try + { + if (PathEditState != PathEditState.EditingPoint || + _editingPointIndex == -1 || + _editingPreviewPoint == null || + CurrentRoute == null) + { + RaiseErrorOccurred("当前不在修改路径点状态或没有预览点"); + return false; + } + + // 更新路径点位置 + var pointToUpdate = CurrentRoute.Points[_editingPointIndex]; + pointToUpdate.Position = _editingPreviewPoint.Position; + + // 添加历史记录 + var historyEntry = new PathHistoryEntry( + CurrentRoute.Id, + PathHistoryOperationType.Edited, + CurrentRoute, + $"修改路径点 {pointToUpdate.Name} 位置"); + _historyManager.AddHistoryEntry(historyEntry); + + // 清理修改预览可视化(会自动清除预览并重新渲染正常路径) + ClearEditingPreviewVisualization(); + + // 清理修改状态 + ClearEditingState(); + + // 切换回查看状态 + PathEditState = PathEditState.Viewing; + + // 停用ToolPlugin + DeactivateToolPlugin(); + + // 触发路径点列表更新事件 + RaisePathPointsListUpdated(CurrentRoute, "路径点修改完成"); + + RaiseStatusChanged($"路径点 {pointToUpdate.Name} 修改完成", PathPlanningStatusType.Success); + LogManager.Info($"路径点修改完成: {pointToUpdate.Name}"); + + return true; + } + catch (Exception ex) + { + RaiseErrorOccurred($"确认修改路径点失败: {ex.Message}", ex); + return false; + } + } + + /// + /// 取消修改路径点 + /// + /// 是否成功取消修改 + public bool CancelEditPoint() + { + try + { + if (PathEditState != PathEditState.EditingPoint) + { + return true; // 已经不在修改状态,认为成功 + } + + // 清理修改状态 + ClearEditingState(); + + // 切换回查看状态 + PathEditState = PathEditState.Viewing; + + // 停用ToolPlugin + DeactivateToolPlugin(); + + // 清理预览可视化 + ClearEditingPreviewVisualization(); + + RaiseStatusChanged("已取消路径点修改", PathPlanningStatusType.Info); + LogManager.Info("已取消路径点修改"); + + return true; + } + catch (Exception ex) + { + RaiseErrorOccurred($"取消修改路径点失败: {ex.Message}", ex); + return false; + } + } + + /// + /// 清理修改路径点的状态 + /// + private void ClearEditingState() + { + _editingPointIndex = -1; + _originalPoint = null; + _editingPreviewPoint = null; + } + + /// + /// 更新修改路径点时的预览可视化 + /// + private void UpdateEditingPreviewVisualization() + { + try + { + if (_renderPlugin == null || CurrentRoute == null || _editingPreviewPoint == null) + { + return; + } + + // 创建预览路径,替换修改中的路径点 + var previewRoute = CurrentRoute.Clone() as PathRoute; + previewRoute.Points[_editingPointIndex] = _editingPreviewPoint; + + // 渲染预览路径(使用特殊的预览样式) + _renderPlugin.RenderPreviewPath(previewRoute); + } + catch (Exception ex) + { + LogManager.Error($"更新修改预览可视化失败: {ex.Message}"); + } + } + + /// + /// 清理修改路径点时的预览可视化 + /// + private void ClearEditingPreviewVisualization() + { + try + { + if (_renderPlugin == null) + { + return; + } + + // 清理预览渲染,恢复原始路径渲染 + _renderPlugin.ClearPreview(); + + if (CurrentRoute != null) + { + _renderPlugin.RenderPath(CurrentRoute); + } + } + catch (Exception ex) + { + LogManager.Error($"清理修改预览可视化失败: {ex.Message}"); + } + } + + #endregion + /// /// 取消当前编辑 /// @@ -2121,6 +2360,13 @@ namespace NavisworksTransport LogManager.WriteLog("[手动编辑] ✗ 预览点设置失败"); } } + else if (PathEditState == PathEditState.EditingPoint) + { + // 修改路径点模式 - 设置预览位置 + LogManager.WriteLog("[手动编辑] 设置修改路径点预览位置"); + SetEditingPreviewPoint(pickResult.Point); + LogManager.WriteLog($"[手动编辑] ✓ 修改路径点预览位置已设置: ({pickResult.Point.X:F3}, {pickResult.Point.Y:F3}, {pickResult.Point.Z:F3})"); + } else { // 其他编辑模式 - 保持原有逻辑 diff --git a/src/Core/PathPlanningModels.cs b/src/Core/PathPlanningModels.cs index 01f5cea..75f0dfa 100644 --- a/src/Core/PathPlanningModels.cs +++ b/src/Core/PathPlanningModels.cs @@ -36,7 +36,12 @@ namespace NavisworksTransport /// /// 添加路径点状态 - 正在添加路径点 /// - AddingPoints + AddingPoints, + + /// + /// 修改路径点状态 - 正在修改现有路径点 + /// + EditingPoint } /// diff --git a/src/Core/PathPointRenderPlugin.cs b/src/Core/PathPointRenderPlugin.cs index f18dd4e..5fbdb52 100644 --- a/src/Core/PathPointRenderPlugin.cs +++ b/src/Core/PathPointRenderPlugin.cs @@ -943,6 +943,117 @@ namespace NavisworksTransport } } + /// + /// 渲染预览路径(用于修改路径点时的预览) + /// + /// 包含预览修改的路径 + public void RenderPreviewPath(PathRoute previewRoute) + { + try + { + if (previewRoute == null || previewRoute.Points.Count == 0) + { + LogManager.WriteLog("[预览路径渲染] 预览路径为null或没有路径点,跳过渲染"); + return; + } + + lock (_lockObject) + { + LogManager.WriteLog($"[预览路径渲染] 开始渲染预览路径: {previewRoute.Name}, 点数: {previewRoute.Points.Count}"); + + // 清理现有预览 + ClearPreview(); + + // 渲染预览路径点 + for (int i = 0; i < previewRoute.Points.Count; i++) + { + var point = previewRoute.Points[i]; + + // 对于修改中的点,使用特殊颜色(白色) + if (point.Name.Contains("_预览")) + { + RenderPreviewPoint(point); + } + } + + // 渲染预览连线 + if (previewRoute.Points.Count > 1) + { + RenderPreviewPathLines(previewRoute); + } + + RequestViewRefresh(); + LogManager.WriteLog("[预览路径渲染] 预览路径渲染完成"); + } + } + catch (Exception ex) + { + LogManager.WriteLog($"[预览路径渲染] 渲染预览路径失败: {ex.Message}"); + LogManager.WriteLog($"[预览路径渲染] 堆栈跟踪: {ex.StackTrace}"); + } + } + + /// + /// 渲染预览路径的连线 + /// + /// 预览路径 + private void RenderPreviewPathLines(PathRoute previewRoute) + { + try + { + ClearPreviewLines(); + + for (int i = 0; i < previewRoute.Points.Count - 1; i++) + { + var startPoint = previewRoute.Points[i]; + var endPoint = previewRoute.Points[i + 1]; + + var lineMarker = new LineMarker + { + StartPoint = startPoint.Position, + EndPoint = endPoint.Position, + Color = Color.FromByteRGB(128, 128, 128), // 预览连线使用灰色 + Radius = GetLineRadius() + }; + + _previewLines.Add(lineMarker); + } + + LogManager.WriteLog($"[预览路径连线] 已创建 {_previewLines.Count} 条预览连线"); + } + catch (Exception ex) + { + LogManager.WriteLog($"[预览路径连线] 渲染预览连线失败: {ex.Message}"); + } + } + + /// + /// 清理所有预览渲染 + /// + public void ClearPreview() + { + try + { + lock (_lockObject) + { + LogManager.WriteLog("[清理预览] 开始清理所有预览渲染"); + + // 清理预览点 + ClearPreviewPoint(); + + // 清理预览连线 + ClearPreviewLines(); + + RequestViewRefresh(); + LogManager.WriteLog("[清理预览] 预览清理完成"); + } + } + catch (Exception ex) + { + LogManager.WriteLog($"[清理预览] 清理预览失败: {ex.Message}"); + } + } + #endregion #region 私有辅助方法 diff --git a/src/UI/WPF/Models/PathRouteViewModel.cs b/src/UI/WPF/Models/PathRouteViewModel.cs index e8874cc..b7361c2 100644 --- a/src/UI/WPF/Models/PathRouteViewModel.cs +++ b/src/UI/WPF/Models/PathRouteViewModel.cs @@ -17,12 +17,22 @@ namespace NavisworksTransport.UI.WPF.ViewModels /// public class PathPointViewModel : ViewModelBase { + private string _id; private double _x; private double _y; private double _z; private string _name; private NavisworksTransport.PathPointType _type; // 使用完全限定名 + /// + /// 路径点ID + /// + public string Id + { + get => _id; + set => SetProperty(ref _id, value); + } + /// /// X坐标 /// @@ -109,6 +119,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels public PathPointViewModel() : base() { // 设置默认值 + _id = Guid.NewGuid().ToString(); _name = "路径点"; _type = NavisworksTransport.PathPointType.WayPoint; _x = 0.0; @@ -126,6 +137,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels /// 点类型 public PathPointViewModel(string name, double x, double y, double z, NavisworksTransport.PathPointType type = NavisworksTransport.PathPointType.WayPoint) : base() { + _id = Guid.NewGuid().ToString(); _name = name ?? "路径点"; _x = x; _y = y; diff --git a/src/UI/WPF/ViewModels/PathEditingViewModel.cs b/src/UI/WPF/ViewModels/PathEditingViewModel.cs index 854628e..c5c4023 100644 --- a/src/UI/WPF/ViewModels/PathEditingViewModel.cs +++ b/src/UI/WPF/ViewModels/PathEditingViewModel.cs @@ -34,6 +34,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels // 路径集合 private ObservableCollection _pathRoutes; private PathRouteViewModel _selectedPathRoute; + private PathPointViewModel _selectedPathPoint; private bool _isPathEditMode; // 自动路径规划参数 @@ -82,18 +83,35 @@ namespace NavisworksTransport.UI.WPF.ViewModels { if (SetProperty(ref _selectedPathRoute, value)) { + // 路径变更时清除选中的路径点 + SelectedPathPoint = null; + // 更新命令状态 OnPropertyChanged(nameof(CanExecuteStartEdit)); OnPropertyChanged(nameof(CanExecuteEndEdit)); OnPropertyChanged(nameof(CanExecuteClearPath)); OnPropertyChanged(nameof(CanExecuteExportPath)); OnPropertyChanged(nameof(CanExecuteSaveAsPath)); + OnPropertyChanged(nameof(CanExecuteModifyPoint)); // 实现路径选择时的可视化切换 UpdatePathVisualization(); } } } + + public PathPointViewModel SelectedPathPoint + { + get => _selectedPathPoint; + set + { + if (SetProperty(ref _selectedPathPoint, value)) + { + // 更新修改路径点按钮的启用状态 + OnPropertyChanged(nameof(CanExecuteModifyPoint)); + } + } + } /// /// 更新路径可视化显示:清理其他路径,只显示当前选中的路径 /// @@ -306,6 +324,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels public ICommand EndEditCommand { get; private set; } public ICommand ClearPathCommand { get; private set; } public ICommand DeletePointCommand { get; private set; } + public ICommand ModifyPointCommand { get; private set; } + public ICommand CancelModifyPointCommand { get; private set; } public ICommand SelectStartPointCommand { get; private set; } public ICommand SelectEndPointCommand { get; private set; } public ICommand AutoPlanPathCommand { get; private set; } @@ -327,7 +347,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels public bool CanExecuteEndEdit => (_pathPlanningManager?.PathEditState == PathEditState.Creating || _pathPlanningManager?.PathEditState == PathEditState.Editing || - _pathPlanningManager?.PathEditState == PathEditState.AddingPoints); + _pathPlanningManager?.PathEditState == PathEditState.AddingPoints || + _pathPlanningManager?.PathEditState == PathEditState.EditingPoint); public bool CanExecuteClearPath => SelectedPathRoute != null && SelectedPathRoute.Points.Count > 0; @@ -335,6 +356,10 @@ namespace NavisworksTransport.UI.WPF.ViewModels public bool CanExecuteSaveAsPath => SelectedPathRoute != null && SelectedPathRoute.Points.Count > 0; + public bool CanExecuteModifyPoint => SelectedPathPoint != null && + _pathPlanningManager?.PathEditState != PathEditState.EditingPoint; + public bool CanExecuteCancelModifyPoint => _pathPlanningManager?.PathEditState == PathEditState.EditingPoint; + #endregion #region 构造函数 @@ -387,6 +412,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels EndEditCommand = new RelayCommand(async () => await ExecuteEndEditAsync(), () => CanExecuteEndEdit); ClearPathCommand = new RelayCommand(async () => await ExecuteClearPathAsync(), () => CanExecuteClearPath); DeletePointCommand = new RelayCommand(async (point) => await ExecuteDeletePointAsync(point)); + ModifyPointCommand = new RelayCommand(async () => await ExecuteModifyPointAsync(), () => CanExecuteModifyPoint); + CancelModifyPointCommand = new RelayCommand(async () => await ExecuteCancelModifyPointAsync(), () => CanExecuteCancelModifyPoint); SelectStartPointCommand = new RelayCommand(async () => await ExecuteSelectStartPointAsync()); SelectEndPointCommand = new RelayCommand(async () => await ExecuteSelectEndPointAsync()); AutoPlanPathCommand = new RelayCommand(async () => await ExecuteAutoPlanPathAsync(), () => CanExecuteAutoPlanPath); @@ -442,6 +469,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { var wpfPoint = new PathPointViewModel { + Id = corePoint.Id, Name = corePoint.Name, X = corePoint.X, Y = corePoint.Y, @@ -917,37 +945,50 @@ namespace NavisworksTransport.UI.WPF.ViewModels if (_pathPlanningManager != null) { - // 记录是否在预览模式(因为确认预览点后会退出预览模式) - wasInPreviewMode = _pathPlanningManager.IsPreviewMode; + // 检查是否在修改路径点模式 + bool isEditingPoint = _pathPlanningManager.PathEditState == PathEditState.EditingPoint; - if (wasInPreviewMode) + if (isEditingPoint) { - // 预览模式 - 先确认预览点,然后立即完成编辑 - var confirmedPoint = _pathPlanningManager.ConfirmPreviewPoint(); - if (confirmedPoint != null) - { - LogManager.Info($"[UI-预览模式] 预览点已确认: {confirmedPoint.Name},现在完成编辑"); - - // 立即完成编辑,不让用户继续添加点 - success = _pathPlanningManager.FinishEditing(); - operationMessage = success ? $"预览点已确认并完成编辑: {confirmedPoint.Name}" : "预览点确认后完成编辑失败"; - } - else - { - LogManager.Error("[UI-预览模式] 预览点确认失败"); - operationMessage = "预览点确认失败"; - success = false; - } - - LogManager.Info($"[UI-预览模式] {operationMessage}"); + // 修改路径点模式 - 确认修改 + success = _pathPlanningManager.ConfirmEditPoint(); + operationMessage = success ? "路径点修改已确认" : "路径点修改确认失败"; + LogManager.Info($"[UI-修改路径点] {operationMessage}"); } else { - // 普通模式 - 直接完成编辑 - success = _pathPlanningManager.FinishEditing(); - operationMessage = success ? "路径编辑完成" : "路径编辑完成失败"; + // 记录是否在预览模式(因为确认预览点后会退出预览模式) + wasInPreviewMode = _pathPlanningManager.IsPreviewMode; - LogManager.Info($"[UI-编辑模式] {operationMessage}"); + if (wasInPreviewMode) + { + // 预览模式 - 先确认预览点,然后立即完成编辑 + var confirmedPoint = _pathPlanningManager.ConfirmPreviewPoint(); + if (confirmedPoint != null) + { + LogManager.Info($"[UI-预览模式] 预览点已确认: {confirmedPoint.Name},现在完成编辑"); + + // 立即完成编辑,不让用户继续添加点 + success = _pathPlanningManager.FinishEditing(); + operationMessage = success ? $"预览点已确认并完成编辑: {confirmedPoint.Name}" : "预览点确认后完成编辑失败"; + } + else + { + LogManager.Error("[UI-预览模式] 预览点确认失败"); + operationMessage = "预览点确认失败"; + success = false; + } + + LogManager.Info($"[UI-预览模式] {operationMessage}"); + } + else + { + // 普通模式 - 直接完成编辑 + success = _pathPlanningManager.FinishEditing(); + operationMessage = success ? "路径编辑完成" : "路径编辑完成失败"; + + LogManager.Info($"[UI-编辑模式] {operationMessage}"); + } } } @@ -958,7 +999,12 @@ namespace NavisworksTransport.UI.WPF.ViewModels // 编辑完成成功 if (SelectedPathRoute != null) { - if (wasInPreviewMode) + if (_pathPlanningManager?.PathEditState == PathEditState.EditingPoint || operationMessage.Contains("路径点修改")) + { + AutoPathStatus = $"✅ 路径点修改完成: {SelectedPathRoute.Name}"; + PathEditTipText = "路径点修改已完成"; + } + else if (wasInPreviewMode) { AutoPathStatus = $"✅ 预览点已确认,路径编辑完成: {SelectedPathRoute.Name}"; } @@ -986,6 +1032,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels // 手动触发按钮状态更新 - 确保UI及时响应 OnPropertyChanged(nameof(CanExecuteStartEdit)); OnPropertyChanged(nameof(CanExecuteEndEdit)); + OnPropertyChanged(nameof(CanExecuteCancelModifyPoint)); }); }, "结束路径编辑"); } @@ -1064,6 +1111,147 @@ namespace NavisworksTransport.UI.WPF.ViewModels }, "删除路径点"); } + private async Task ExecuteModifyPointAsync() + { + if (!CanExecuteModifyPoint) return; + + await SafeExecuteAsync(async () => + { + await _uiStateManager.ExecuteUIUpdateAsync(() => + { + if (SelectedPathPoint != null && _pathPlanningManager != null) + { + // 获取选中路径点的索引 + var currentRoute = _pathPlanningManager.CurrentRoute; + if (currentRoute != null && currentRoute.Points != null) + { + int pointIndex = -1; + + // 详细调试信息 + LogManager.Info($"开始查找路径点索引 - 选中点Id: {SelectedPathPoint.Id}, 选中点名称: {SelectedPathPoint.Name}"); + LogManager.Info($"当前路径包含 {currentRoute.Points.Count} 个路径点"); + + // 遍历查找匹配的Id + for (int i = 0; i < currentRoute.Points.Count; i++) + { + var currentPoint = currentRoute.Points[i]; + LogManager.Info($"检查路径点 [{i}] - Id: {currentPoint.Id}, 名称: {currentPoint.Name}"); + + if (currentPoint.Id == SelectedPathPoint.Id) + { + pointIndex = i; + LogManager.Info($"找到匹配的路径点,索引: {pointIndex}"); + break; + } + } + + if (pointIndex >= 0) + { + // 调用PathPlanningManager开始修改路径点 + bool success = _pathPlanningManager.StartEditingPoint(pointIndex); + + if (success) + { + AutoPathStatus = $"正在修改路径点: {SelectedPathPoint.Name} - 请在3D视图中点击新位置"; + PathEditTipText = "修改路径点模式:在3D视图中点击选择新位置,然后点击'确认'按钮完成修改"; + LogManager.Info($"已开始修改路径点: {SelectedPathPoint.Name}, 索引: {pointIndex}"); + + // 更新UI状态 + OnPropertyChanged(nameof(AutoPathStatus)); + OnPropertyChanged(nameof(PathEditTipText)); + + // 刷新命令状态 + OnPropertyChanged(nameof(CanExecuteStartEdit)); + OnPropertyChanged(nameof(CanExecuteEndEdit)); + OnPropertyChanged(nameof(CanExecuteModifyPoint)); + OnPropertyChanged(nameof(CanExecuteCancelModifyPoint)); + } + else + { + AutoPathStatus = "修改路径点失败,请检查路径状态"; + LogManager.Error($"开始修改路径点失败: {SelectedPathPoint.Name}, 索引: {pointIndex}"); + } + } + else + { + AutoPathStatus = "找不到选中的路径点"; + LogManager.Error($"找不到路径点索引 - 选中点Id: {SelectedPathPoint.Id}, 选中点名称: {SelectedPathPoint.Name}"); + LogManager.Error("可能原因:1)选中的路径点与当前路径不匹配 2)路径点数据不同步 3)Id不匹配"); + } + } + else + { + if (currentRoute == null) + { + AutoPathStatus = "当前没有活动路径"; + LogManager.Error("尝试修改路径点时没有当前路径"); + } + else + { + AutoPathStatus = "当前路径没有路径点数据"; + LogManager.Error("当前路径的Points集合为空"); + } + } + } + else + { + if (SelectedPathPoint == null) + { + AutoPathStatus = "请先选中要修改的路径点"; + LogManager.Warning("修改路径点时没有选中路径点"); + } + else + { + AutoPathStatus = "路径规划管理器未初始化"; + LogManager.Error("修改路径点时PathPlanningManager为空"); + } + } + }); + }, "修改路径点"); + } + + /// + /// 取消修改路径点 + /// + private async Task ExecuteCancelModifyPointAsync() + { + if (!CanExecuteCancelModifyPoint) return; + + await SafeExecuteAsync(async () => + { + await _uiStateManager.ExecuteUIUpdateAsync(() => + { + if (_pathPlanningManager != null) + { + // 调用PathPlanningManager取消修改路径点 + bool success = _pathPlanningManager.CancelEditPoint(); + + if (success) + { + AutoPathStatus = "已取消修改路径点"; + PathEditTipText = "修改路径点操作已取消"; + LogManager.Info("用户取消了修改路径点操作"); + } + else + { + AutoPathStatus = "取消修改路径点失败"; + LogManager.Error("取消修改路径点失败"); + } + + // 更新UI状态 + OnPropertyChanged(nameof(AutoPathStatus)); + OnPropertyChanged(nameof(PathEditTipText)); + + // 刷新命令状态 + OnPropertyChanged(nameof(CanExecuteStartEdit)); + OnPropertyChanged(nameof(CanExecuteEndEdit)); + OnPropertyChanged(nameof(CanExecuteModifyPoint)); + OnPropertyChanged(nameof(CanExecuteCancelModifyPoint)); + } + }); + }, "取消修改路径点"); + } + #endregion #region 文件管理命令 @@ -1389,6 +1577,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { var wpfPoint = new PathPointViewModel { + Id = corePoint.Id, Name = corePoint.Name, X = corePoint.X, Y = corePoint.Y, @@ -1894,6 +2083,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { var pointViewModel = new PathPointViewModel { + Id = point.Id, Name = point.Name, X = point.Position.X, Y = point.Position.Y, @@ -1973,10 +2163,11 @@ namespace NavisworksTransport.UI.WPF.ViewModels { LogManager.Info($"路径编辑状态变更: {e.PreviousState} -> {e.NewState}"); - // 修复:包含 AddingPoints 状态 + // 修复:包含 AddingPoints 和 EditingPoint 状态 IsPathEditMode = (e.NewState == PathEditState.Creating || e.NewState == PathEditState.Editing || - e.NewState == PathEditState.AddingPoints); + e.NewState == PathEditState.AddingPoints || + e.NewState == PathEditState.EditingPoint); LogManager.Info($"[UI状态更新] IsPathEditMode 设为: {IsPathEditMode}"); @@ -1992,6 +2183,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels case PathEditState.AddingPoints: AutoPathStatus = $"正在添加路径点到: {e.EditingRoute?.Name} - 请在3D视图中点击设置路径点"; break; + case PathEditState.EditingPoint: + AutoPathStatus = $"正在修改路径点: {e.EditingRoute?.Name} - 请在3D视图中点击新位置,然后点击'结束'确认"; + break; case PathEditState.Viewing: AutoPathStatus = "路径编辑已完成"; break; @@ -2003,8 +2197,10 @@ namespace NavisworksTransport.UI.WPF.ViewModels // 通知命令状态更新 OnPropertyChanged(nameof(CanExecuteStartEdit)); OnPropertyChanged(nameof(CanExecuteEndEdit)); + OnPropertyChanged(nameof(CanExecuteModifyPoint)); + OnPropertyChanged(nameof(CanExecuteCancelModifyPoint)); - LogManager.Info($"[UI状态更新] 按钮状态已通知更新 - CanExecuteStartEdit: {CanExecuteStartEdit}, CanExecuteEndEdit: {CanExecuteEndEdit}"); + LogManager.Info($"[UI状态更新] 按钮状态已通知更新 - CanExecuteStartEdit: {CanExecuteStartEdit}, CanExecuteEndEdit: {CanExecuteEndEdit}, CanExecuteModifyPoint: {CanExecuteModifyPoint}, CanExecuteCancelModifyPoint: {CanExecuteCancelModifyPoint}"); }, "处理编辑状态变更事件"); } catch (Exception ex) @@ -2051,6 +2247,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { var wpfPoint = new PathPointViewModel { + Id = corePoint.Id, Name = corePoint.Name, X = corePoint.X, Y = corePoint.Y, diff --git a/src/UI/WPF/Views/PathEditingView.xaml b/src/UI/WPF/Views/PathEditingView.xaml index 9fa92ef..8fe78db 100644 --- a/src/UI/WPF/Views/PathEditingView.xaml +++ b/src/UI/WPF/Views/PathEditingView.xaml @@ -245,6 +245,10 @@ NavisworksTransport 路径编辑页签视图 - 采用与动画控制和分层管 Command="{Binding StartEditCommand}" Style="{StaticResource ActionButtonStyle}" IsEnabled="{Binding CanExecuteStartEdit}"/> +