Separate rail creation and edit assembly flows

This commit is contained in:
tian 2026-03-31 13:41:15 +08:00
parent d4c49fc227
commit c9744699b1
2 changed files with 151 additions and 122 deletions

View File

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

View File

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