From 0fe7179494b1a1e2a97fb7b4beec315777045057 Mon Sep 17 00:00:00 2001
From: tian <11429339@qq.com>
Date: Tue, 9 Jun 2026 02:04:54 +0800
Subject: [PATCH] refactor: replace 3-click end face detection with
single-click FaceInferTool
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Remove '找端面' button and all 3-click logic
- Keep single-click '取端面' button only
- Remove: AnalyzeCurrentAssemblyEndFace, BeginAssemblyEndFaceSelection,
OnAssemblyEndFaceMouseClicked, ExecuteAnalyzeAssemblyTerminalFaceAsync
- Retain CleanupAssemblyEndFaceSelection (shared with quick pick)
---
src/UI/WPF/ViewModels/PathEditingViewModel.cs | 166 +-----------------
src/UI/WPF/Views/PathEditingView.xaml | 4 -
2 files changed, 5 insertions(+), 165 deletions(-)
diff --git a/src/UI/WPF/ViewModels/PathEditingViewModel.cs b/src/UI/WPF/ViewModels/PathEditingViewModel.cs
index c3ed508..0d8436d 100644
--- a/src/UI/WPF/ViewModels/PathEditingViewModel.cs
+++ b/src/UI/WPF/ViewModels/PathEditingViewModel.cs
@@ -1410,8 +1410,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels
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 QuickAnalyzeAssemblyEndFaceCommand { get; private set; }
public ICommand DecreaseSelectedRailNormalOffsetCommand { get; private set; }
public ICommand IncreaseSelectedRailNormalOffsetCommand { get; private set; }
@@ -1479,19 +1477,11 @@ namespace NavisworksTransport.UI.WPF.ViewModels
!_isSelectingAssemblyStartPoint &&
!_isSelectingAssemblyEndFacePoints &&
!_isSelectingAssemblyInstallationPoint;
- public bool CanAnalyzeAssemblyTerminalFaceForCreate => HasAssemblyTerminalObject &&
- _pathPlanningManager != null &&
- !IsSelectingAssemblyStartPoint &&
- !IsSelectingAssemblyEndFacePoints &&
- !_isSelectingAssemblyInstallationPoint;
- public bool CanQuickAnalyzeAssemblyEndFace => CanAnalyzeAssemblyTerminalFaceForCreate;
- public bool CanAnalyzeAssemblyTerminalFaceForEdit => HasAssemblyTerminalObject &&
- IsRailRouteSelected &&
- SelectedPathRoute != null &&
- _pathPlanningManager != null &&
- !IsSelectingAssemblyStartPoint &&
- !IsSelectingAssemblyEndFacePoints &&
- !_isSelectingAssemblyInstallationPoint;
+ public bool CanQuickAnalyzeAssemblyEndFace => HasAssemblyTerminalObject &&
+ _pathPlanningManager != null &&
+ !IsSelectingAssemblyStartPoint &&
+ !IsSelectingAssemblyEndFacePoints &&
+ !_isSelectingAssemblyInstallationPoint;
public string CreateAssemblyInstallationPointButtonText => _hasAssemblyInstallationReference && !IsRailEditingWorkflowActive
? "重选安装点"
@@ -1693,9 +1683,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
private void NotifyRailAssemblyCommandStateChanged()
{
- OnPropertyChanged(nameof(CanAnalyzeAssemblyTerminalFaceForCreate));
OnPropertyChanged(nameof(CanQuickAnalyzeAssemblyEndFace));
- OnPropertyChanged(nameof(CanAnalyzeAssemblyTerminalFaceForEdit));
OnPropertyChanged(nameof(CanSelectAssemblyStartPointForCreate));
OnPropertyChanged(nameof(CanRepositionRailStartPoint));
OnPropertyChanged(nameof(CanSelectAssemblyInstallationPointForCreate));
@@ -2075,8 +2063,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels
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);
QuickAnalyzeAssemblyEndFaceCommand = new RelayCommand(() => BeginAssemblyEndFaceQuickPick(), () => CanQuickAnalyzeAssemblyEndFace);
DecreaseSelectedRailNormalOffsetCommand = new RelayCommand(() => AdjustSelectedRailNormalOffset(-RailNormalOffsetNudgeStepInMeters));
IncreaseSelectedRailNormalOffsetCommand = new RelayCommand(() => AdjustSelectedRailNormalOffset(RailNormalOffsetNudgeStepInMeters));
@@ -2268,29 +2254,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels
}
}
- private async Task ExecuteAnalyzeAssemblyTerminalFaceAsync(RailAssemblyWorkflowMode workflowMode)
- {
- await SafeExecuteAsync(() =>
- {
- if (_pathPlanningManager == null)
- {
- throw new InvalidOperationException("路径规划管理器未初始化,无法分析端面。");
- }
-
- if (_assemblyTerminalObject == null || !ModelItemAnalysisHelper.IsModelItemValid(_assemblyTerminalObject))
- {
- throw new InvalidOperationException("终点箱体未设置或已失效,请先捕获终点箱体。");
- }
-
- PrepareRailAssemblyWorkflowForMode(
- workflowMode,
- editActionDescription: "请先选中一条需要编辑安装点的 Rail 路径。",
- syncMountModeFromRoute: true);
-
- BeginAssemblyEndFaceSelection(workflowMode);
- }, "分析终端端面");
- }
-
private async Task ExecuteSelectAssemblyInstallationPointAsync(RailAssemblyWorkflowMode workflowMode)
{
await SafeExecuteAsync(() =>
@@ -2345,47 +2308,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels
}
}
- private async void OnAssemblyEndFaceMouseClicked(object sender, PickItemResult pickResult)
- {
- try
- {
- if (!_isSelectingAssemblyEndFacePoints || pickResult == null)
- {
- return;
- }
-
- await SafeExecuteAsync(() =>
- {
- if (!IsPickOnAssemblyTerminalObject(pickResult))
- {
- UpdateMainStatus("请点击当前终点箱体的同一个端面,不要点到其他对象。");
- return;
- }
-
- _assemblyEndFaceSeedPoints.Add(pickResult.Point);
- RenderAssemblyEndFaceSeedPoints();
-
- int pickedCount = _assemblyEndFaceSeedPoints.Count;
- LogManager.Info($"[直线装配] 已记录端面种子点 {pickedCount}: ({pickResult.Point.X:F3}, {pickResult.Point.Y:F3}, {pickResult.Point.Z:F3})");
-
- if (pickedCount < 3)
- {
- UpdateMainStatus($"已记录端面点 {pickedCount}/3,请继续在同一端面平面上点击。");
- return;
- }
-
- AnalyzeCurrentAssemblyEndFace();
- CleanupAssemblyEndFaceSelection(clearVisuals: false);
- }, "处理端面三点拾取");
- }
- catch (Exception ex)
- {
- LogManager.Error($"[直线装配] 端面三点分析失败: {ex.Message}", ex);
- UpdateMainStatus($"端面三点分析失败: {ex.Message}");
- CleanupAssemblyEndFaceSelection(clearVisuals: false);
- }
- }
-
private async void OnAssemblyInstallationMouseClicked(object sender, PickItemResult pickResult)
{
try
@@ -2594,34 +2516,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels
}
}
- private void BeginAssemblyEndFaceSelection(RailAssemblyWorkflowMode workflowMode)
- {
- CleanupAssemblyReferenceSelection();
- CleanupAssemblyEndFaceSelection(clearVisuals: false);
- CleanupAssemblyInstallationSelection();
- ClearAssemblyEndFaceAnalysisVisuals();
- ResetAssemblyEndFaceAnalysisState();
- ClearAssemblyInstallationReferenceVisuals();
- ResetAssemblyInstallationReferenceState();
- _assemblyEndFaceSeedPoints.Clear();
-
- _pathPlanningManager.DisableMouseHandling();
- _isSelectingAssemblyEndFacePoints = true;
- NotifyRailAssemblyCommandStateChanged();
-
- PathClickToolPlugin.MouseClicked -= OnAssemblyEndFaceMouseClicked;
- PathClickToolPlugin.MouseClicked += OnAssemblyEndFaceMouseClicked;
-
- if (!ForceReinitializeToolPlugin(subscribeToEvents: false))
- {
- CleanupAssemblyEndFaceSelection(clearVisuals: false);
- throw new InvalidOperationException("ToolPlugin 初始化失败,请重试。");
- }
-
- UpdateMainStatus("请在同一个端面平面上连续点击 3 个点,系统将分析端面中心。");
- LogManager.Info($"[直线装配] 已进入端面三点分析模式,模式={GetRailAssemblyWorkflowLabel(workflowMode)}");
- }
-
private void BeginAssemblyInstallationSelection()
{
CleanupAssemblyReferenceSelection();
@@ -3646,7 +3540,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels
{
try
{
- PathClickToolPlugin.MouseClicked -= OnAssemblyEndFaceMouseClicked;
_isSelectingAssemblyEndFacePoints = false;
_pathPlanningManager?.EnableMouseHandling();
_pathPlanningManager?.StopClickTool();
@@ -3679,55 +3572,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels
return pickResult.ModelItem.AncestorsAndSelf.Any(ancestor => ModelItemAnalysisHelper.ModelItemEquals(ancestor, _assemblyTerminalObject));
}
- private void AnalyzeCurrentAssemblyEndFace()
- {
- if (_assemblyEndFaceSeedPoints.Count != 3)
- {
- throw new InvalidOperationException("端面分析需要恰好 3 个种子点。");
- }
-
- var triangles = GeometryHelper.ExtractTriangles(new[] { _assemblyTerminalObject })
- .Select(triangle => new AnalysisTriangle3(
- new Vector3((float)triangle.Point1.X, (float)triangle.Point1.Y, (float)triangle.Point1.Z),
- new Vector3((float)triangle.Point2.X, (float)triangle.Point2.Y, (float)triangle.Point2.Z),
- new Vector3((float)triangle.Point3.X, (float)triangle.Point3.Y, (float)triangle.Point3.Z)))
- .ToList();
-
- EndFaceAnalysisResult result = AssemblyEndFaceAnalyzer.Analyze(
- triangles,
- new Vector3((float)_assemblyEndFaceSeedPoints[0].X, (float)_assemblyEndFaceSeedPoints[0].Y, (float)_assemblyEndFaceSeedPoints[0].Z),
- new Vector3((float)_assemblyEndFaceSeedPoints[1].X, (float)_assemblyEndFaceSeedPoints[1].Y, (float)_assemblyEndFaceSeedPoints[1].Z),
- new Vector3((float)_assemblyEndFaceSeedPoints[2].X, (float)_assemblyEndFaceSeedPoints[2].Y, (float)_assemblyEndFaceSeedPoints[2].Z));
-
- if (!result.IsReliable)
- {
- throw new InvalidOperationException(result.DiagnosticMessage);
- }
-
- Point3D centerPoint = AssemblyEndFaceAnalyzer.ToPoint3D(result.Center);
- Point3D sphereCenterPoint = new Point3D(
- AssemblySphereCenterX,
- AssemblySphereCenterY,
- AssemblySphereCenterZ);
- Vector3 orientedNormal = AssemblyEndFaceAnalyzer.OrientNormalTowardTarget(
- result.Normal,
- new Vector3((float)centerPoint.X, (float)centerPoint.Y, (float)centerPoint.Z),
- new Vector3((float)sphereCenterPoint.X, (float)sphereCenterPoint.Y, (float)sphereCenterPoint.Z));
- _hasAssemblyEndFaceAnalysis = true;
- _assemblyEndFaceCenterPoint = centerPoint;
- _assemblyEndFaceNormal = orientedNormal;
- RenderAssemblyEndFaceSeedPoints();
- RenderAssemblyEndFaceCenter(centerPoint);
- RenderAssemblyEndFaceNormal(centerPoint, orientedNormal);
- RefreshAssemblyTerminalObjectInfo();
- RefreshAssemblyReferenceRodIfNeeded();
- UpdateMainStatus($"端面分析完成:中心=({centerPoint.X:F2}, {centerPoint.Y:F2}, {centerPoint.Z:F2}),候选三角形={result.CandidateTriangleCount}");
- LogManager.Info(
- $"[直线装配] 端面分析完成: 中心=({centerPoint.X:F3}, {centerPoint.Y:F3}, {centerPoint.Z:F3}), " +
- $"法向=({orientedNormal.X:F4}, {orientedNormal.Y:F4}, {orientedNormal.Z:F4}), " +
- $"三角形={result.CandidateTriangleCount}, 顶点={result.CandidateVertexCount}, 偏差={result.MaxPlaneDeviation:F6}");
- }
-
private async Task ExecuteNewPathAsync()
{
await SafeExecuteAsync(() =>
diff --git a/src/UI/WPF/Views/PathEditingView.xaml b/src/UI/WPF/Views/PathEditingView.xaml
index fe3e696..828eba2 100644
--- a/src/UI/WPF/Views/PathEditingView.xaml
+++ b/src/UI/WPF/Views/PathEditingView.xaml
@@ -534,10 +534,6 @@ NavisworksTransport 路径编辑页签视图 - 采用与动画控制和分层管
-