增加了修改路径点的功能。

This commit is contained in:
tian 2025-08-30 23:14:19 +08:00
parent 0f8728ca4a
commit 1ae3ace54e
6 changed files with 607 additions and 31 deletions

View File

@ -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
{
// 其他编辑模式 - 保持原有逻辑

View File

@ -36,7 +36,12 @@ namespace NavisworksTransport
/// <summary>
/// 添加路径点状态 - 正在添加路径点
/// </summary>
AddingPoints
AddingPoints,
/// <summary>
/// 修改路径点状态 - 正在修改现有路径点
/// </summary>
EditingPoint
}
/// <summary>

View File

@ -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

View File

@ -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;

View File

@ -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,

View File

@ -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">