Separate rail creation and edit assembly flows
This commit is contained in:
parent
d4c49fc227
commit
c9744699b1
@ -71,6 +71,13 @@ namespace NavisworksTransport.UI.WPF.ViewModels
|
||||
/// </summary>
|
||||
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<Point3D> 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)
|
||||
{
|
||||
|
||||
@ -478,24 +478,24 @@ NavisworksTransport 路径编辑页签视图 - 采用与动画控制和分层管
|
||||
|
||||
<WrapPanel Margin="0,8,0,0">
|
||||
<Button Content="捕获箱体"
|
||||
Command="{Binding CaptureAssemblyTerminalObjectCommand}"
|
||||
Command="{Binding CaptureAssemblyTerminalObjectForCreateCommand}"
|
||||
Style="{StaticResource SecondaryButtonStyle}"/>
|
||||
<Button Content="找端面"
|
||||
Command="{Binding AnalyzeAssemblyTerminalFaceCommand}"
|
||||
Command="{Binding AnalyzeAssemblyTerminalFaceForCreateCommand}"
|
||||
Style="{StaticResource SecondaryButtonStyle}"
|
||||
IsEnabled="{Binding CanAnalyzeAssemblyTerminalFace}"/>
|
||||
<Button Content="{Binding AssemblyInstallationPointButtonText}"
|
||||
Command="{Binding SelectAssemblyInstallationPointCommand}"
|
||||
IsEnabled="{Binding CanAnalyzeAssemblyTerminalFaceForCreate}"/>
|
||||
<Button Content="{Binding CreateAssemblyInstallationPointButtonText}"
|
||||
Command="{Binding SelectAssemblyInstallationPointForCreateCommand}"
|
||||
Style="{StaticResource SecondaryButtonStyle}"
|
||||
IsEnabled="{Binding CanSelectAssemblyInstallationPoint}"/>
|
||||
IsEnabled="{Binding CanSelectAssemblyInstallationPointForCreate}"/>
|
||||
<Button Content="生成辅助线"
|
||||
Command="{Binding GenerateAssemblyReferenceRodCommand}"
|
||||
Style="{StaticResource ActionButtonStyle}"
|
||||
IsEnabled="{Binding CanGenerateAssemblyReferenceRod}"/>
|
||||
<Button Content="取起点"
|
||||
Command="{Binding SelectAssemblyStartPointCommand}"
|
||||
Command="{Binding SelectAssemblyStartPointForCreateCommand}"
|
||||
Style="{StaticResource ActionButtonStyle}"
|
||||
IsEnabled="{Binding CanSelectAssemblyStartPoint}"/>
|
||||
IsEnabled="{Binding CanSelectAssemblyStartPointForCreate}"/>
|
||||
<Button Content="隐藏辅助线"
|
||||
Command="{Binding ClearAssemblyReferenceRodCommand}"
|
||||
Style="{StaticResource SecondaryButtonStyle}"/>
|
||||
@ -563,17 +563,17 @@ NavisworksTransport 路径编辑页签视图 - 采用与动画控制和分层管
|
||||
<Button Content="重选箱体"
|
||||
Padding="10,2"
|
||||
Margin="0,0,10,0"
|
||||
Command="{Binding ReCaptureAssemblyTerminalObjectCommand}"
|
||||
Command="{Binding ReCaptureAssemblyTerminalObjectForEditCommand}"
|
||||
Style="{StaticResource SecondaryButtonStyle}"/>
|
||||
<TextBox Width="150"
|
||||
Margin="0,0,10,0"
|
||||
Text="{Binding AssemblyTerminalObjectName}"
|
||||
Style="{StaticResource ReadOnlyTextBoxStyle}"/>
|
||||
<Button Content="{Binding AssemblyInstallationPointButtonText}"
|
||||
<Button Content="{Binding EditAssemblyInstallationPointButtonText}"
|
||||
Padding="10,2"
|
||||
Margin="0,0,10,0"
|
||||
Command="{Binding SelectAssemblyInstallationPointCommand}"
|
||||
IsEnabled="{Binding CanSelectAssemblyInstallationPoint}"
|
||||
Command="{Binding SelectAssemblyInstallationPointForEditCommand}"
|
||||
IsEnabled="{Binding CanSelectAssemblyInstallationPointForEdit}"
|
||||
Style="{StaticResource SecondaryButtonStyle}"/>
|
||||
<Button Content="重选起点"
|
||||
Padding="10,2"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user