增加了修改路径点的功能。
This commit is contained in:
parent
0f8728ca4a
commit
1ae3ace54e
@ -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; // 修改时的预览路径点
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前是否在预览模式
|
||||
/// </summary>
|
||||
@ -1272,6 +1277,240 @@ namespace NavisworksTransport
|
||||
}
|
||||
}
|
||||
|
||||
#region 修改路径点功能
|
||||
|
||||
/// <summary>
|
||||
/// 开始修改指定的路径点
|
||||
/// </summary>
|
||||
/// <param name="pointIndex">要修改的路径点索引</param>
|
||||
/// <returns>是否成功开始修改</returns>
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置修改路径点时的预览位置
|
||||
/// </summary>
|
||||
/// <param name="position">新的预览位置</param>
|
||||
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}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 确认修改路径点
|
||||
/// </summary>
|
||||
/// <returns>是否成功确认修改</returns>
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取消修改路径点
|
||||
/// </summary>
|
||||
/// <returns>是否成功取消修改</returns>
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清理修改路径点的状态
|
||||
/// </summary>
|
||||
private void ClearEditingState()
|
||||
{
|
||||
_editingPointIndex = -1;
|
||||
_originalPoint = null;
|
||||
_editingPreviewPoint = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新修改路径点时的预览可视化
|
||||
/// </summary>
|
||||
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}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清理修改路径点时的预览可视化
|
||||
/// </summary>
|
||||
private void ClearEditingPreviewVisualization()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_renderPlugin == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// 清理预览渲染,恢复原始路径渲染
|
||||
_renderPlugin.ClearPreview();
|
||||
|
||||
if (CurrentRoute != null)
|
||||
{
|
||||
_renderPlugin.RenderPath(CurrentRoute);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogManager.Error($"清理修改预览可视化失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 取消当前编辑
|
||||
/// </summary>
|
||||
@ -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
|
||||
{
|
||||
// 其他编辑模式 - 保持原有逻辑
|
||||
|
||||
@ -36,7 +36,12 @@ namespace NavisworksTransport
|
||||
/// <summary>
|
||||
/// 添加路径点状态 - 正在添加路径点
|
||||
/// </summary>
|
||||
AddingPoints
|
||||
AddingPoints,
|
||||
|
||||
/// <summary>
|
||||
/// 修改路径点状态 - 正在修改现有路径点
|
||||
/// </summary>
|
||||
EditingPoint
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -943,6 +943,117 @@ namespace NavisworksTransport
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 渲染预览路径(用于修改路径点时的预览)
|
||||
/// </summary>
|
||||
/// <param name="previewRoute">包含预览修改的路径</param>
|
||||
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}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 渲染预览路径的连线
|
||||
/// </summary>
|
||||
/// <param name="previewRoute">预览路径</param>
|
||||
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}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清理所有预览渲染
|
||||
/// </summary>
|
||||
public void ClearPreview()
|
||||
{
|
||||
try
|
||||
{
|
||||
lock (_lockObject)
|
||||
{
|
||||
LogManager.WriteLog("[清理预览] 开始清理所有预览渲染");
|
||||
|
||||
// 清理预览点
|
||||
ClearPreviewPoint();
|
||||
|
||||
// 清理预览连线
|
||||
ClearPreviewLines();
|
||||
|
||||
RequestViewRefresh();
|
||||
LogManager.WriteLog("[清理预览] 预览清理完成");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogManager.WriteLog($"[清理预览] 清理预览失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 私有辅助方法
|
||||
|
||||
@ -17,12 +17,22 @@ namespace NavisworksTransport.UI.WPF.ViewModels
|
||||
/// </summary>
|
||||
public class PathPointViewModel : ViewModelBase
|
||||
{
|
||||
private string _id;
|
||||
private double _x;
|
||||
private double _y;
|
||||
private double _z;
|
||||
private string _name;
|
||||
private NavisworksTransport.PathPointType _type; // 使用完全限定名
|
||||
|
||||
/// <summary>
|
||||
/// 路径点ID
|
||||
/// </summary>
|
||||
public string Id
|
||||
{
|
||||
get => _id;
|
||||
set => SetProperty(ref _id, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// X坐标
|
||||
/// </summary>
|
||||
@ -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
|
||||
/// <param name="type">点类型</param>
|
||||
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;
|
||||
|
||||
@ -34,6 +34,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
|
||||
// 路径集合
|
||||
private ObservableCollection<PathRouteViewModel> _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));
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 更新路径可视化显示:清理其他路径,只显示当前选中的路径
|
||||
/// </summary>
|
||||
@ -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<PathPointViewModel>(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为空");
|
||||
}
|
||||
}
|
||||
});
|
||||
}, "修改路径点");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取消修改路径点
|
||||
/// </summary>
|
||||
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,
|
||||
|
||||
@ -245,6 +245,10 @@ NavisworksTransport 路径编辑页签视图 - 采用与动画控制和分层管
|
||||
Command="{Binding StartEditCommand}"
|
||||
Style="{StaticResource ActionButtonStyle}"
|
||||
IsEnabled="{Binding CanExecuteStartEdit}"/>
|
||||
<Button Content="修改路径点"
|
||||
Command="{Binding ModifyPointCommand}"
|
||||
Style="{StaticResource SecondaryButtonStyle}"
|
||||
IsEnabled="{Binding CanExecuteModifyPoint}"/>
|
||||
<Button Content="结束"
|
||||
Command="{Binding EndEditCommand}"
|
||||
Style="{StaticResource SecondaryButtonStyle}"
|
||||
@ -277,6 +281,7 @@ NavisworksTransport 路径编辑页签视图 - 采用与动画控制和分层管
|
||||
|
||||
<!-- 路径点列表 -->
|
||||
<ListView ItemsSource="{Binding SelectedPathRoute.Points}"
|
||||
SelectedItem="{Binding SelectedPathPoint}"
|
||||
Height="150"
|
||||
BorderBrush="#FFCCCCCC"
|
||||
BorderThickness="1">
|
||||
|
||||
Loading…
Reference in New Issue
Block a user