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}"/>
+