diff --git a/src/UI/WPF/ViewModels/PathEditingViewModel.cs b/src/UI/WPF/ViewModels/PathEditingViewModel.cs index a650edd..aa104d7 100644 --- a/src/UI/WPF/ViewModels/PathEditingViewModel.cs +++ b/src/UI/WPF/ViewModels/PathEditingViewModel.cs @@ -71,6 +71,13 @@ namespace NavisworksTransport.UI.WPF.ViewModels /// public class PathEditingViewModel : ViewModelBase, IDisposable { + private enum RailAssemblyWorkflowMode + { + None, + CreateNewRailPath, + EditSelectedRail + } + #region 私有字段 private PathPlanningManager _pathPlanningManager; @@ -144,7 +151,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels private bool _isSelectingAssemblyEndFacePoints; private bool _isSelectingAssemblyInstallationPoint; private bool _isEditingSelectedRailInstallationPoint; - private bool _isEditingSelectedRail; + private RailAssemblyWorkflowMode _railAssemblyWorkflowMode = RailAssemblyWorkflowMode.None; private bool _hasAssemblyEndFaceAnalysis; private bool _hasAssemblyInstallationReference; private ModelItem _assemblyTerminalObject; @@ -219,8 +226,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels ClearAssemblyInstallationReferenceVisuals(); // 重置 Rail 编辑状态 - _isEditingSelectedRail = false; - OnPropertyChanged(nameof(AssemblyInstallationPointButtonText)); + SetRailAssemblyWorkflowMode(RailAssemblyWorkflowMode.None); // 🔧 修复:同步PathPlanningManager的CurrentRoute if (_pathPlanningManager != null && value != null) @@ -287,8 +293,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels OnPropertyChanged(nameof(SelectedRailMountMode)); OnPropertyChanged(nameof(SelectedRailNormalOffsetInMeters)); OnPropertyChanged(nameof(CanRepositionRailStartPoint)); - OnPropertyChanged(nameof(CanSelectAssemblyInstallationPoint)); - OnPropertyChanged(nameof(AssemblyInstallationPointButtonText)); + NotifyRailAssemblyCommandStateChanged(); if (!CanUsePathLines && ShowPathLines) { // 吊装和空轨路径不能使用路径线,自动关闭 @@ -1069,14 +1074,16 @@ namespace NavisworksTransport.UI.WPF.ViewModels public ICommand ImportPathCommand { get; private set; } public ICommand ExportPathCommand { get; private set; } public ICommand SaveAsPathCommand { get; private set; } - public ICommand CaptureAssemblyTerminalObjectCommand { get; private set; } - public ICommand ReCaptureAssemblyTerminalObjectCommand { get; private set; } + public ICommand CaptureAssemblyTerminalObjectForCreateCommand { get; private set; } + public ICommand ReCaptureAssemblyTerminalObjectForEditCommand { get; private set; } public ICommand GenerateAssemblyReferenceRodCommand { get; private set; } - public ICommand SelectAssemblyStartPointCommand { get; private set; } + public ICommand SelectAssemblyStartPointForCreateCommand { get; private set; } public ICommand RepositionRailStartPointCommand { get; private set; } - public ICommand SelectAssemblyInstallationPointCommand { get; private set; } + public ICommand SelectAssemblyInstallationPointForCreateCommand { get; private set; } + public ICommand SelectAssemblyInstallationPointForEditCommand { get; private set; } public ICommand ClearAssemblyReferenceRodCommand { get; private set; } - public ICommand AnalyzeAssemblyTerminalFaceCommand { get; private set; } + public ICommand AnalyzeAssemblyTerminalFaceForCreateCommand { get; private set; } + public ICommand AnalyzeAssemblyTerminalFaceForEditCommand { get; private set; } public ICommand DecreaseSelectedRailNormalOffsetCommand { get; private set; } public ICommand IncreaseSelectedRailNormalOffsetCommand { get; private set; } @@ -1118,10 +1125,12 @@ namespace NavisworksTransport.UI.WPF.ViewModels _hasAssemblyInstallationReference && AssemblyReferenceRodLengthInMeters > 0 && AssemblyReferenceRodDiameterInMeters > 0; - public bool CanSelectAssemblyStartPoint => HasAssemblyTerminalObject && - _pathPlanningManager != null && - AssemblyReferencePathManager.Instance.HasReferenceLine && - !IsSelectingAssemblyStartPoint; + public bool CanSelectAssemblyStartPointForCreate => HasAssemblyTerminalObject && + _pathPlanningManager != null && + AssemblyReferencePathManager.Instance.HasReferenceLine && + !IsSelectingAssemblyStartPoint && + !_isSelectingAssemblyEndFacePoints && + !_isSelectingAssemblyInstallationPoint; public bool CanRepositionRailStartPoint => HasAssemblyTerminalObject && IsRailRouteSelected && SelectedPathRoute != null && @@ -1130,25 +1139,44 @@ namespace NavisworksTransport.UI.WPF.ViewModels !IsSelectingAssemblyStartPoint && !_isSelectingAssemblyEndFacePoints && !_isSelectingAssemblyInstallationPoint; - public bool CanSelectAssemblyInstallationPoint => HasAssemblyTerminalObject && - IsRailRouteSelected && - SelectedPathRoute != null && - _pathPlanningManager != null && - !_isSelectingAssemblyStartPoint && - !_isSelectingAssemblyEndFacePoints && - !_isSelectingAssemblyInstallationPoint; - public bool CanAnalyzeAssemblyTerminalFace => HasAssemblyTerminalObject && - _pathPlanningManager != null && - !IsSelectingAssemblyStartPoint && - !IsSelectingAssemblyEndFacePoints && - !_isSelectingAssemblyInstallationPoint; + public bool CanSelectAssemblyInstallationPointForCreate => HasAssemblyTerminalObject && + _pathPlanningManager != null && + !_isSelectingAssemblyStartPoint && + !_isSelectingAssemblyEndFacePoints && + !_isSelectingAssemblyInstallationPoint; + public bool CanSelectAssemblyInstallationPointForEdit => HasAssemblyTerminalObject && + IsRailRouteSelected && + SelectedPathRoute != null && + _pathPlanningManager != null && + !_isSelectingAssemblyStartPoint && + !_isSelectingAssemblyEndFacePoints && + !_isSelectingAssemblyInstallationPoint; + public bool CanAnalyzeAssemblyTerminalFaceForCreate => HasAssemblyTerminalObject && + _pathPlanningManager != null && + !IsSelectingAssemblyStartPoint && + !IsSelectingAssemblyEndFacePoints && + !_isSelectingAssemblyInstallationPoint; + public bool CanAnalyzeAssemblyTerminalFaceForEdit => HasAssemblyTerminalObject && + IsRailRouteSelected && + SelectedPathRoute != null && + _pathPlanningManager != null && + !IsSelectingAssemblyStartPoint && + !IsSelectingAssemblyEndFacePoints && + !_isSelectingAssemblyInstallationPoint; - public string AssemblyInstallationPointButtonText => HasSelectedRailInstallationReference() + public string CreateAssemblyInstallationPointButtonText => _hasAssemblyInstallationReference && !IsRailEditingWorkflowActive + ? "重选安装点" + : "选安装点"; + + public string EditAssemblyInstallationPointButtonText => HasSelectedRailInstallationReference() ? "重选安装点" : "选安装点"; public bool IsSelectingAssemblyEndFacePoints => _isSelectingAssemblyEndFacePoints; + private bool IsRailCreateWorkflowActive => _railAssemblyWorkflowMode == RailAssemblyWorkflowMode.CreateNewRailPath; + private bool IsRailEditingWorkflowActive => _railAssemblyWorkflowMode == RailAssemblyWorkflowMode.EditSelectedRail; + public bool CanExecuteModifyPoint => SelectedPathPoint != null && _pathPlanningManager?.PathEditState != PathEditState.EditingPoint; public bool CanExecuteCancelModifyPoint => _pathPlanningManager?.PathEditState == PathEditState.EditingPoint; @@ -1294,14 +1322,31 @@ namespace NavisworksTransport.UI.WPF.ViewModels LogManager.Info($"[Rail构型] {coreRoute.Name}: {logMessage}"); } - private bool HasSelectedRailInstallationReference() + private void SetRailAssemblyWorkflowMode(RailAssemblyWorkflowMode mode) { - // 只有在点击"重选箱体"进入编辑状态后才显示"重选安装点" - if (!_isEditingSelectedRail) + if (_railAssemblyWorkflowMode == mode) { - return false; + return; } + _railAssemblyWorkflowMode = mode; + NotifyRailAssemblyCommandStateChanged(); + } + + private void NotifyRailAssemblyCommandStateChanged() + { + OnPropertyChanged(nameof(CanAnalyzeAssemblyTerminalFaceForCreate)); + OnPropertyChanged(nameof(CanAnalyzeAssemblyTerminalFaceForEdit)); + OnPropertyChanged(nameof(CanSelectAssemblyStartPointForCreate)); + OnPropertyChanged(nameof(CanRepositionRailStartPoint)); + OnPropertyChanged(nameof(CanSelectAssemblyInstallationPointForCreate)); + OnPropertyChanged(nameof(CanSelectAssemblyInstallationPointForEdit)); + OnPropertyChanged(nameof(CreateAssemblyInstallationPointButtonText)); + OnPropertyChanged(nameof(EditAssemblyInstallationPointButtonText)); + } + + private bool HasSelectedRailInstallationReference() + { var coreRoute = GetSelectedCoreRoute(); return coreRoute != null && coreRoute.PathType == PathType.Rail && @@ -1389,7 +1434,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels AssemblyReferenceLine referenceLine; - if (_isEditingSelectedRail) + if (IsRailEditingWorkflowActive) { // 编辑状态:使用默认杆长度构建参考线,方便选择更远的起点 try @@ -1420,8 +1465,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels AssemblyStartPointText = $"({referenceLine.StartPoint.X:F2}, {referenceLine.StartPoint.Y:F2}, {referenceLine.StartPoint.Z:F2})"; RefreshAssemblyTerminalObjectInfo(referenceLine.StartPoint, referenceLine.EndPoint); RenderAssemblyReferenceLine(referenceLine); - OnPropertyChanged(nameof(CanSelectAssemblyStartPoint)); - OnPropertyChanged(nameof(CanRepositionRailStartPoint)); + NotifyRailAssemblyCommandStateChanged(); if (!string.IsNullOrWhiteSpace(statusMessage)) { @@ -1493,7 +1537,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { SyncPathViewModelFromCoreRoute(SelectedPathRoute, route, preserveSelection: true); OnPropertyChanged(nameof(SelectedRailNormalOffsetInMeters)); - OnPropertyChanged(nameof(AssemblyInstallationPointButtonText)); + NotifyRailAssemblyCommandStateChanged(); RefreshAssemblyTerminalObjectInfo(); RefreshSelectedRailInstallationReferenceVisuals(); RefreshSelectedRailReferenceLineVisuals(); @@ -1504,12 +1548,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels private void RefreshSelectedRailInstallationReferenceVisuals() { - if (!_isSelectingAssemblyInstallationPoint) - { - ClearAssemblyInstallationReferenceVisuals(); - return; - } - var coreRoute = GetSelectedCoreRoute(); if (!IsAssemblyInstallationReferenceActiveForRoute(coreRoute)) { @@ -1671,14 +1709,16 @@ namespace NavisworksTransport.UI.WPF.ViewModels ImportPathCommand = new RelayCommand(async () => await ExecuteImportPathAsync()); ExportPathCommand = new RelayCommand(async () => await ExecuteExportPathAsync(), () => CanExecuteExportPath); SaveAsPathCommand = new RelayCommand(async () => await ExecuteSaveAsPathAsync(), () => CanExecuteSaveAsPath); - CaptureAssemblyTerminalObjectCommand = new RelayCommand(async () => await ExecuteCaptureAssemblyTerminalObjectAsync()); - ReCaptureAssemblyTerminalObjectCommand = new RelayCommand(async () => await ExecuteReCaptureAssemblyTerminalObjectAsync()); + CaptureAssemblyTerminalObjectForCreateCommand = new RelayCommand(async () => await ExecuteCaptureAssemblyTerminalObjectAsync(RailAssemblyWorkflowMode.CreateNewRailPath)); + ReCaptureAssemblyTerminalObjectForEditCommand = new RelayCommand(async () => await ExecuteCaptureAssemblyTerminalObjectAsync(RailAssemblyWorkflowMode.EditSelectedRail)); GenerateAssemblyReferenceRodCommand = new RelayCommand(async () => await ExecuteGenerateAssemblyReferenceRodAsync(), () => CanGenerateAssemblyReferenceRod); - SelectAssemblyStartPointCommand = new RelayCommand(async () => await ExecuteSelectAssemblyStartPointAsync(), () => CanSelectAssemblyStartPoint); + SelectAssemblyStartPointForCreateCommand = new RelayCommand(async () => await ExecuteSelectAssemblyStartPointAsync(), () => CanSelectAssemblyStartPointForCreate); RepositionRailStartPointCommand = new RelayCommand(async () => await ExecuteRepositionRailStartPointAsync(), () => CanRepositionRailStartPoint); - SelectAssemblyInstallationPointCommand = new RelayCommand(async () => await ExecuteSelectAssemblyInstallationPointAsync(), () => CanSelectAssemblyInstallationPoint); + SelectAssemblyInstallationPointForCreateCommand = new RelayCommand(async () => await ExecuteSelectAssemblyInstallationPointAsync(RailAssemblyWorkflowMode.CreateNewRailPath), () => CanSelectAssemblyInstallationPointForCreate); + SelectAssemblyInstallationPointForEditCommand = new RelayCommand(async () => await ExecuteSelectAssemblyInstallationPointAsync(RailAssemblyWorkflowMode.EditSelectedRail), () => CanSelectAssemblyInstallationPointForEdit); ClearAssemblyReferenceRodCommand = new RelayCommand(() => ExecuteClearAssemblyReferenceRod()); - AnalyzeAssemblyTerminalFaceCommand = new RelayCommand(async () => await ExecuteAnalyzeAssemblyTerminalFaceAsync(), () => CanAnalyzeAssemblyTerminalFace); + AnalyzeAssemblyTerminalFaceForCreateCommand = new RelayCommand(async () => await ExecuteAnalyzeAssemblyTerminalFaceAsync(RailAssemblyWorkflowMode.CreateNewRailPath), () => CanAnalyzeAssemblyTerminalFaceForCreate); + AnalyzeAssemblyTerminalFaceForEditCommand = new RelayCommand(async () => await ExecuteAnalyzeAssemblyTerminalFaceAsync(RailAssemblyWorkflowMode.EditSelectedRail), () => CanAnalyzeAssemblyTerminalFaceForEdit); DecreaseSelectedRailNormalOffsetCommand = new RelayCommand(() => AdjustSelectedRailNormalOffset(-RailNormalOffsetNudgeStepInMeters)); IncreaseSelectedRailNormalOffsetCommand = new RelayCommand(() => AdjustSelectedRailNormalOffset(RailNormalOffsetNudgeStepInMeters)); } @@ -1689,7 +1729,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels #region 路径管理命令 - private async Task ExecuteCaptureAssemblyTerminalObjectAsync() + private async Task ExecuteCaptureAssemblyTerminalObjectAsync(RailAssemblyWorkflowMode mode) { await SafeExecuteAsync(() => { @@ -1707,8 +1747,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels throw new InvalidOperationException("当前选择对象无效,请重新选择终点箱体"); } - // 注意:不在这里设置 _isEditingSelectedRail - // 新建路径时保持 false,只有点击"重选箱体"时才设置为 true + SetRailAssemblyWorkflowMode(mode); _assemblyTerminalObject = selectedItem; _assemblyStartPoint = Point3D.Origin; @@ -1722,11 +1761,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels ClearAssemblyEndFaceAnalysisVisuals(); ClearAssemblyInstallationReferenceVisuals(); OnPropertyChanged(nameof(CanGenerateAssemblyReferenceRod)); - OnPropertyChanged(nameof(CanSelectAssemblyStartPoint)); - OnPropertyChanged(nameof(CanRepositionRailStartPoint)); - OnPropertyChanged(nameof(CanSelectAssemblyInstallationPoint)); - OnPropertyChanged(nameof(CanAnalyzeAssemblyTerminalFace)); - OnPropertyChanged(nameof(AssemblyInstallationPointButtonText)); + NotifyRailAssemblyCommandStateChanged(); // 新建路径时隐藏其他路径的辅助线 ClearAssemblyReferenceLineVisuals(); @@ -1736,14 +1771,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels }, "捕获终点箱体"); } - private async Task ExecuteReCaptureAssemblyTerminalObjectAsync() - { - // 先进入编辑状态,再执行捕获 - _isEditingSelectedRail = true; - OnPropertyChanged(nameof(AssemblyInstallationPointButtonText)); - await ExecuteCaptureAssemblyTerminalObjectAsync(); - } - private void ClearNonGridPathVisualizations(string context) { if (PathPointRenderPlugin.Instance == null) @@ -1793,8 +1820,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels FocusOnAssemblyReferenceArea(referenceLine.StartPoint, referenceLine.EndPoint); UpdateMainStatus("已生成终端安装辅助线,请在三维视图中确认终点锚点、方向、外端位置和辅助线贴合情况"); - OnPropertyChanged(nameof(CanSelectAssemblyStartPoint)); - OnPropertyChanged(nameof(CanRepositionRailStartPoint)); + NotifyRailAssemblyCommandStateChanged(); LogManager.Info( $"[直线装配] 已生成参考杆: {AssemblyTerminalObjectName}, " + $"终点锚点=({referenceLine.EndPoint.X:F2}, {referenceLine.EndPoint.Y:F2}, {referenceLine.EndPoint.Z:F2}), " + @@ -1827,7 +1853,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels _pathPlanningManager.DisableMouseHandling(); IsSelectingAssemblyStartPoint = true; - OnPropertyChanged(nameof(CanSelectAssemblyStartPoint)); + NotifyRailAssemblyCommandStateChanged(); PathClickToolPlugin.MouseClicked -= OnAssemblyReferenceMouseClicked; PathClickToolPlugin.MouseClicked += OnAssemblyReferenceMouseClicked; @@ -1864,6 +1890,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels throw new InvalidOperationException("请先选中一条需要编辑起点的 Rail 路径。"); } + SetRailAssemblyWorkflowMode(RailAssemblyWorkflowMode.EditSelectedRail); RefreshSelectedRailReferenceLineVisuals(); if (!AssemblyReferencePathManager.Instance.HasReferenceLine) { @@ -1875,9 +1902,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels _pathPlanningManager.DisableMouseHandling(); _isEditingSelectedRailStartPoint = true; IsSelectingAssemblyStartPoint = true; - OnPropertyChanged(nameof(CanSelectAssemblyStartPoint)); - OnPropertyChanged(nameof(CanRepositionRailStartPoint)); - OnPropertyChanged(nameof(CanRepositionRailStartPoint)); + NotifyRailAssemblyCommandStateChanged(); PathClickToolPlugin.MouseClicked -= OnAssemblyReferenceMouseClicked; PathClickToolPlugin.MouseClicked += OnAssemblyReferenceMouseClicked; @@ -1899,6 +1924,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels try { ClearAssemblyReferenceLineVisuals(); + ClearAssemblyEndFaceAnalysisVisuals(); + ClearAssemblyInstallationReferenceVisuals(); UpdateMainStatus("已隐藏终端安装辅助线"); LogManager.Info("[直线装配] 已隐藏辅助线"); } @@ -1908,7 +1935,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels } } - private async Task ExecuteAnalyzeAssemblyTerminalFaceAsync() + private async Task ExecuteAnalyzeAssemblyTerminalFaceAsync(RailAssemblyWorkflowMode workflowMode) { await SafeExecuteAsync(() => { @@ -1922,13 +1949,19 @@ namespace NavisworksTransport.UI.WPF.ViewModels throw new InvalidOperationException("终点箱体未设置或已失效,请先捕获终点箱体。"); } - var selectedRailRoute = GetSelectedCoreRoute(); - if (selectedRailRoute == null || selectedRailRoute.PathType != PathType.Rail) + bool isEditingExistingRailRoute = workflowMode == RailAssemblyWorkflowMode.EditSelectedRail; + var selectedRailRoute = isEditingExistingRailRoute ? GetSelectedCoreRoute() : null; + if (isEditingExistingRailRoute) { - throw new InvalidOperationException("请先选中一条需要编辑安装点的 Rail 路径。"); + if (selectedRailRoute == null || selectedRailRoute.PathType != PathType.Rail) + { + throw new InvalidOperationException("请先选中一条需要编辑安装点的 Rail 路径。"); + } + + AssemblyMountMode = selectedRailRoute.RailMountMode; } - AssemblyMountMode = selectedRailRoute.RailMountMode; + SetRailAssemblyWorkflowMode(workflowMode); CleanupAssemblyReferenceSelection(); CleanupAssemblyEndFaceSelection(clearVisuals: false); @@ -1941,10 +1974,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels _pathPlanningManager.DisableMouseHandling(); _isSelectingAssemblyEndFacePoints = true; - OnPropertyChanged(nameof(CanAnalyzeAssemblyTerminalFace)); - OnPropertyChanged(nameof(CanSelectAssemblyStartPoint)); - OnPropertyChanged(nameof(CanRepositionRailStartPoint)); - OnPropertyChanged(nameof(CanSelectAssemblyInstallationPoint)); + NotifyRailAssemblyCommandStateChanged(); PathClickToolPlugin.MouseClicked -= OnAssemblyEndFaceMouseClicked; PathClickToolPlugin.MouseClicked += OnAssemblyEndFaceMouseClicked; @@ -1956,11 +1986,12 @@ namespace NavisworksTransport.UI.WPF.ViewModels } UpdateMainStatus("请在同一个端面平面上连续点击 3 个点,系统将分析端面中心。"); - LogManager.Info("[直线装配] 已进入端面三点分析模式"); + LogManager.Info( + $"[直线装配] 已进入端面三点分析模式,模式={(isEditingExistingRailRoute ? "编辑现有Rail路径" : "新建Rail路径")}"); }, "分析终端端面"); } - private async Task ExecuteSelectAssemblyInstallationPointAsync() + private async Task ExecuteSelectAssemblyInstallationPointAsync(RailAssemblyWorkflowMode workflowMode) { await SafeExecuteAsync(() => { @@ -1974,6 +2005,15 @@ namespace NavisworksTransport.UI.WPF.ViewModels throw new InvalidOperationException("终点箱体未设置或已失效,请先捕获终点箱体。"); } + bool isEditingExistingRailRoute = workflowMode == RailAssemblyWorkflowMode.EditSelectedRail; + var selectedRailRoute = isEditingExistingRailRoute ? GetSelectedCoreRoute() : null; + if (isEditingExistingRailRoute && (selectedRailRoute == null || selectedRailRoute.PathType != PathType.Rail)) + { + throw new InvalidOperationException("请先选中一条需要编辑安装点的 Rail 路径。"); + } + + SetRailAssemblyWorkflowMode(workflowMode); + CleanupAssemblyReferenceSelection(); CleanupAssemblyEndFaceSelection(clearVisuals: false); CleanupAssemblyInstallationSelection(); @@ -1982,14 +2022,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels _pathPlanningManager.DisableMouseHandling(); _isSelectingAssemblyInstallationPoint = true; - // 判断是编辑现有路径还是创建新路径 - var selectedRailRoute = GetSelectedCoreRoute(); - _isEditingSelectedRailInstallationPoint = selectedRailRoute != null && selectedRailRoute.PathType == PathType.Rail; + _isEditingSelectedRailInstallationPoint = isEditingExistingRailRoute; - OnPropertyChanged(nameof(CanAnalyzeAssemblyTerminalFace)); - OnPropertyChanged(nameof(CanSelectAssemblyStartPoint)); - OnPropertyChanged(nameof(CanRepositionRailStartPoint)); - OnPropertyChanged(nameof(CanSelectAssemblyInstallationPoint)); + NotifyRailAssemblyCommandStateChanged(); PathClickToolPlugin.MouseClicked -= OnAssemblyInstallationMouseClicked; PathClickToolPlugin.MouseClicked += OnAssemblyInstallationMouseClicked; @@ -2136,14 +2171,14 @@ namespace NavisworksTransport.UI.WPF.ViewModels // 创建新路径:生成参考线,等待用户选择起点 LogManager.Info("[直线装配] 安装点已确定,请继续选择起点以生成新路径"); } - CleanupAssemblyInstallationSelection(); + CleanupAssemblyInstallationSelection(clearVisuals: false); }, "处理安装点拾取"); } catch (Exception ex) { LogManager.Error($"[直线装配] 安装点计算失败: {ex.Message}", ex); UpdateMainStatus($"安装点计算失败: {ex.Message}"); - CleanupAssemblyInstallationSelection(); + CleanupAssemblyInstallationSelection(clearVisuals: true); } } @@ -2259,9 +2294,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { AssemblyStartPointText = "未选择"; } - OnPropertyChanged(nameof(CanSelectAssemblyStartPoint)); - OnPropertyChanged(nameof(CanSelectAssemblyInstallationPoint)); - OnPropertyChanged(nameof(CanAnalyzeAssemblyTerminalFace)); + NotifyRailAssemblyCommandStateChanged(); if (!string.IsNullOrWhiteSpace(statusMessage)) { UpdateMainStatus(statusMessage); @@ -2349,9 +2382,11 @@ namespace NavisworksTransport.UI.WPF.ViewModels _assemblyInstallationBaseAnchorPoint.Y + _assemblyInstallationPlaneNormal.Y * (float)offset, _assemblyInstallationBaseAnchorPoint.Z + _assemblyInstallationPlaneNormal.Z * (float)offset); - if (_isSelectingAssemblyInstallationPoint) + if (_hasAssemblyInstallationReference) { + RenderAssemblyInstallationPickPoints(_assemblyInstallationSeedPoints); RenderAssemblyInstallationAnchorPoint(_assemblyInstallationAnchorPoint); + RenderAssemblyInstallationCenterLine(_assemblyInstallationPickPoint, GetCurrentAssemblyOpticalAxisDirection()); RenderAssemblyInstallationPlane(_assemblyInstallationAnchorPoint, GetCurrentAssemblyOpticalAxisDirection(), _assemblyInstallationPlaneSpanDirection); } else @@ -2521,7 +2556,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels RenderAssemblyAnchorMarker(); RenderAssemblyCenterGuideLine(); RenderAssemblyReferenceLine(referenceLine); - OnPropertyChanged(nameof(CanSelectAssemblyStartPoint)); + NotifyRailAssemblyCommandStateChanged(); } catch (Exception ex) { @@ -2845,7 +2880,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels $"安装点=({_assemblyInstallationAnchorPoint.X:F3}, {_assemblyInstallationAnchorPoint.Y:F3}, {_assemblyInstallationAnchorPoint.Z:F3}), " + $"偏距={_assemblyInstallationOffsetDistanceInMeters:F3}m, 平面法向=({result.PlaneNormal.X:F4}, {result.PlaneNormal.Y:F4}, {result.PlaneNormal.Z:F4})"); OnPropertyChanged(nameof(CanGenerateAssemblyReferenceRod)); - OnPropertyChanged(nameof(AssemblyInstallationPointButtonText)); + NotifyRailAssemblyCommandStateChanged(); } private void RenderAssemblyInstallationPickPoints(IReadOnlyList pickPoints) @@ -3028,7 +3063,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels ClearAssemblyAnchorMarker(); ClearAssemblyCenterGuideLine(); ClearAssemblyReferenceLine(); - OnPropertyChanged(nameof(CanSelectAssemblyStartPoint)); + NotifyRailAssemblyCommandStateChanged(); OnPropertyChanged(nameof(CanRepositionRailStartPoint)); } @@ -3081,7 +3116,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels _assemblyAnchorVerticalOffsetInMeters = DefaultAssemblyAnchorVerticalOffsetInMeters; OnPropertyChanged(nameof(AssemblyAnchorVerticalOffsetInMeters)); OnPropertyChanged(nameof(CanGenerateAssemblyReferenceRod)); - OnPropertyChanged(nameof(AssemblyInstallationPointButtonText)); + NotifyRailAssemblyCommandStateChanged(); } private void CleanupAssemblyReferenceSelection() @@ -3093,8 +3128,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels _isEditingSelectedRailStartPoint = false; _pathPlanningManager?.EnableMouseHandling(); _pathPlanningManager?.StopClickTool(); - OnPropertyChanged(nameof(CanSelectAssemblyStartPoint)); - OnPropertyChanged(nameof(CanRepositionRailStartPoint)); + NotifyRailAssemblyCommandStateChanged(); } catch (Exception ex) { @@ -3102,7 +3136,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels } } - private void CleanupAssemblyInstallationSelection() + private void CleanupAssemblyInstallationSelection(bool clearVisuals = true) { try { @@ -3111,12 +3145,11 @@ namespace NavisworksTransport.UI.WPF.ViewModels _isEditingSelectedRailInstallationPoint = false; _pathPlanningManager?.EnableMouseHandling(); _pathPlanningManager?.StopClickTool(); - ClearAssemblyInstallationReferenceVisuals(); - OnPropertyChanged(nameof(CanAnalyzeAssemblyTerminalFace)); - OnPropertyChanged(nameof(CanSelectAssemblyStartPoint)); - OnPropertyChanged(nameof(CanRepositionRailStartPoint)); - OnPropertyChanged(nameof(CanSelectAssemblyInstallationPoint)); - OnPropertyChanged(nameof(AssemblyInstallationPointButtonText)); + if (clearVisuals) + { + ClearAssemblyInstallationReferenceVisuals(); + } + NotifyRailAssemblyCommandStateChanged(); } catch (Exception ex) { @@ -3138,11 +3171,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels ClearAssemblyEndFaceAnalysisVisuals(); ResetAssemblyEndFaceAnalysisState(); } - OnPropertyChanged(nameof(CanAnalyzeAssemblyTerminalFace)); - OnPropertyChanged(nameof(CanSelectAssemblyStartPoint)); - OnPropertyChanged(nameof(CanRepositionRailStartPoint)); - OnPropertyChanged(nameof(CanSelectAssemblyInstallationPoint)); - OnPropertyChanged(nameof(AssemblyInstallationPointButtonText)); + NotifyRailAssemblyCommandStateChanged(); } catch (Exception ex) { diff --git a/src/UI/WPF/Views/PathEditingView.xaml b/src/UI/WPF/Views/PathEditingView.xaml index b17ac0d..59c1afb 100644 --- a/src/UI/WPF/Views/PathEditingView.xaml +++ b/src/UI/WPF/Views/PathEditingView.xaml @@ -478,24 +478,24 @@ NavisworksTransport 路径编辑页签视图 - 采用与动画控制和分层管