Add explicit exit for rail assembly workflow

This commit is contained in:
tian 2026-03-31 23:38:47 +08:00
parent c9744699b1
commit c3b103c159
2 changed files with 80 additions and 6 deletions

View File

@ -222,11 +222,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
{
// 路径变更时清除选中的路径点
SelectedPathPoint = null;
ClearAssemblyReferenceLineVisuals();
ClearAssemblyInstallationReferenceVisuals();
// 重置 Rail 编辑状态
SetRailAssemblyWorkflowMode(RailAssemblyWorkflowMode.None);
ResetRailAssemblyWorkflowState(announce: false);
// 🔧 修复同步PathPlanningManager的CurrentRoute
if (_pathPlanningManager != null && value != null)
@ -1082,6 +1078,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
public ICommand SelectAssemblyInstallationPointForCreateCommand { get; private set; }
public ICommand SelectAssemblyInstallationPointForEditCommand { get; private set; }
public ICommand ClearAssemblyReferenceRodCommand { get; private set; }
public ICommand CancelRailAssemblyWorkflowCommand { get; private set; }
public ICommand AnalyzeAssemblyTerminalFaceForCreateCommand { get; private set; }
public ICommand AnalyzeAssemblyTerminalFaceForEditCommand { get; private set; }
public ICommand DecreaseSelectedRailNormalOffsetCommand { get; private set; }
@ -1114,7 +1111,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels
public bool CanExecuteEndEdit => (_pathPlanningManager?.PathEditState == PathEditState.Creating ||
_pathPlanningManager?.PathEditState == PathEditState.Editing ||
_pathPlanningManager?.PathEditState == PathEditState.AddingPoints ||
_pathPlanningManager?.PathEditState == PathEditState.EditingPoint);
_pathPlanningManager?.PathEditState == PathEditState.EditingPoint) ||
CanCancelRailAssemblyWorkflow;
public bool CanExecuteClearPath => SelectedPathRoute != null && SelectedPathRoute.Points.Count > 0;
@ -1173,6 +1171,13 @@ namespace NavisworksTransport.UI.WPF.ViewModels
: "选安装点";
public bool IsSelectingAssemblyEndFacePoints => _isSelectingAssemblyEndFacePoints;
public bool CanCancelRailAssemblyWorkflow => _railAssemblyWorkflowMode != RailAssemblyWorkflowMode.None ||
HasAssemblyTerminalObject ||
_isSelectingAssemblyStartPoint ||
_isSelectingAssemblyEndFacePoints ||
_isSelectingAssemblyInstallationPoint ||
_hasAssemblyEndFaceAnalysis ||
_hasAssemblyInstallationReference;
private bool IsRailCreateWorkflowActive => _railAssemblyWorkflowMode == RailAssemblyWorkflowMode.CreateNewRailPath;
private bool IsRailEditingWorkflowActive => _railAssemblyWorkflowMode == RailAssemblyWorkflowMode.EditSelectedRail;
@ -1343,6 +1348,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels
OnPropertyChanged(nameof(CanSelectAssemblyInstallationPointForEdit));
OnPropertyChanged(nameof(CreateAssemblyInstallationPointButtonText));
OnPropertyChanged(nameof(EditAssemblyInstallationPointButtonText));
OnPropertyChanged(nameof(CanCancelRailAssemblyWorkflow));
OnPropertyChanged(nameof(CanExecuteEndEdit));
}
private bool HasSelectedRailInstallationReference()
@ -1717,6 +1724,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
SelectAssemblyInstallationPointForCreateCommand = new RelayCommand(async () => await ExecuteSelectAssemblyInstallationPointAsync(RailAssemblyWorkflowMode.CreateNewRailPath), () => CanSelectAssemblyInstallationPointForCreate);
SelectAssemblyInstallationPointForEditCommand = new RelayCommand(async () => await ExecuteSelectAssemblyInstallationPointAsync(RailAssemblyWorkflowMode.EditSelectedRail), () => CanSelectAssemblyInstallationPointForEdit);
ClearAssemblyReferenceRodCommand = new RelayCommand(() => ExecuteClearAssemblyReferenceRod());
CancelRailAssemblyWorkflowCommand = new RelayCommand(() => ExecuteCancelRailAssemblyWorkflow(), () => CanCancelRailAssemblyWorkflow);
AnalyzeAssemblyTerminalFaceForCreateCommand = new RelayCommand(async () => await ExecuteAnalyzeAssemblyTerminalFaceAsync(RailAssemblyWorkflowMode.CreateNewRailPath), () => CanAnalyzeAssemblyTerminalFaceForCreate);
AnalyzeAssemblyTerminalFaceForEditCommand = new RelayCommand(async () => await ExecuteAnalyzeAssemblyTerminalFaceAsync(RailAssemblyWorkflowMode.EditSelectedRail), () => CanAnalyzeAssemblyTerminalFaceForEdit);
DecreaseSelectedRailNormalOffsetCommand = new RelayCommand(() => AdjustSelectedRailNormalOffset(-RailNormalOffsetNudgeStepInMeters));
@ -2306,6 +2314,55 @@ namespace NavisworksTransport.UI.WPF.ViewModels
}
}
private void ResetRailAssemblyWorkflowState(bool announce, string statusMessage = null, string logMessage = null)
{
CleanupAssemblyReferenceSelection();
CleanupAssemblyEndFaceSelection(clearVisuals: true);
CleanupAssemblyInstallationSelection(clearVisuals: true);
ClearAssemblyReferenceLineVisuals();
ClearAssemblyEndFaceAnalysisVisuals();
ClearAssemblyInstallationReferenceVisuals();
ResetAssemblyEndFaceAnalysisState();
ResetAssemblyInstallationReferenceState();
_assemblyTerminalObject = null;
_assemblyStartPoint = Point3D.Origin;
HasAssemblyTerminalObject = false;
AssemblyTerminalObjectName = "未选择";
AssemblyTerminalObjectInfo = "请选择终点处已安装箱体";
AssemblyStartPointText = "未选择";
SetRailAssemblyWorkflowMode(RailAssemblyWorkflowMode.None);
OnPropertyChanged(nameof(CanGenerateAssemblyReferenceRod));
NotifyRailAssemblyCommandStateChanged();
if (announce && !string.IsNullOrWhiteSpace(statusMessage))
{
UpdateMainStatus(statusMessage);
}
if (!string.IsNullOrWhiteSpace(logMessage))
{
LogManager.Info(logMessage);
}
}
private void ExecuteCancelRailAssemblyWorkflow()
{
try
{
ResetRailAssemblyWorkflowState(
announce: true,
statusMessage: "已取消 Rail 装配流程",
logMessage: "[直线装配] 已取消 Rail 装配流程并清理状态");
}
catch (Exception ex)
{
LogManager.Error($"[直线装配] 取消 Rail 装配流程失败: {ex.Message}", ex);
UpdateMainStatus($"取消 Rail 装配流程失败: {ex.Message}");
}
}
private Point3D GetAssemblyTerminalAnchorPoint()
{
if (_assemblyTerminalObject == null || !ModelItemAnalysisHelper.IsModelItemValid(_assemblyTerminalObject))
@ -4798,6 +4855,13 @@ namespace NavisworksTransport.UI.WPF.ViewModels
{
if (!CanExecuteEndEdit) return;
if ((_pathPlanningManager == null || _pathPlanningManager.PathEditState == PathEditState.Viewing) &&
CanCancelRailAssemblyWorkflow)
{
ExecuteCancelRailAssemblyWorkflow();
return;
}
await SafeExecuteAsync(async () =>
{
bool success = false;

View File

@ -499,6 +499,10 @@ NavisworksTransport 路径编辑页签视图 - 采用与动画控制和分层管
<Button Content="隐藏辅助线"
Command="{Binding ClearAssemblyReferenceRodCommand}"
Style="{StaticResource SecondaryButtonStyle}"/>
<Button Content="取消装配"
Command="{Binding CancelRailAssemblyWorkflowCommand}"
Style="{StaticResource SecondaryButtonStyle}"
IsEnabled="{Binding CanCancelRailAssemblyWorkflow}"/>
</WrapPanel>
</StackPanel>
</Expander>
@ -580,6 +584,12 @@ NavisworksTransport 路径编辑页签视图 - 采用与动画控制和分层管
Command="{Binding RepositionRailStartPointCommand}"
IsEnabled="{Binding CanRepositionRailStartPoint}"
Style="{StaticResource SecondaryButtonStyle}"/>
<Button Content="取消装配"
Padding="10,2"
Margin="10,0,0,0"
Command="{Binding CancelRailAssemblyWorkflowCommand}"
IsEnabled="{Binding CanCancelRailAssemblyWorkflow}"
Style="{StaticResource SecondaryButtonStyle}"/>
</WrapPanel>
<Label Grid.Column="0"
Grid.Row="2"