diff --git a/src/Core/Animation/PathAnimationManager.cs b/src/Core/Animation/PathAnimationManager.cs index fd661e9..88d968e 100644 --- a/src/Core/Animation/PathAnimationManager.cs +++ b/src/Core/Animation/PathAnimationManager.cs @@ -770,6 +770,10 @@ namespace NavisworksTransport.Core.Animation $"[路径起点诊断] 路径point0=({pathStartPoint.X:F3},{pathStartPoint.Y:F3},{pathStartPoint.Z:F3}), " + $"起点目标trackedPoint=({startPosition.X:F3},{startPosition.Y:F3},{startPosition.Z:F3}), 路径类型={_route.PathType.GetDisplayName()}"); + LogManager.Debug( + $"[移动到起点-诊断] _trackedPosition=({_trackedPosition.X:F3},{_trackedPosition.Y:F3},{_trackedPosition.Z:F3}), " + + $"startPosition=({startPosition.X:F3},{startPosition.Y:F3},{startPosition.Z:F3})"); + if (shouldUsePlanarPureIncrementStart && TryApplyPlanarRealObjectStartIncrementalTransform(_route.PathType, startPosition, out double planarTargetYawRadians)) { @@ -1183,7 +1187,15 @@ namespace NavisworksTransport.Core.Animation // 吊装路径:所有线段都使用水平吊运方向(与MoveObjectToPathStart保持一致) if (_route.PathType == PathType.Hoisting) { - yawRadians = Math.Atan2(_pathPoints[2].Y - _pathPoints[1].Y, _pathPoints[2].X - _pathPoints[1].X); + if (_pathPoints.Count >= 3) + { + yawRadians = Math.Atan2(_pathPoints[2].Y - _pathPoints[1].Y, _pathPoints[2].X - _pathPoints[1].X); + } + else + { + // 2点路径(纯垂直):无水平方向,保持当前朝向 + yawRadians = _currentYaw; + } } // 🔥 空中路径:根据路径类型和线段索引调整物体位置 @@ -4354,8 +4366,9 @@ namespace NavisworksTransport.Core.Animation var adapter = CoordinateSystemManager.Instance.CreateHostAdapter(); if (!PathTargetFrameResolver.TryResolvePlanarHostYaw(hostForward, adapter.HostType, out targetYawRadians)) { - LogManager.Error($"[{pathType.GetDisplayName()}纯增量起点] 无法从路径方向解析宿主平面角。"); - return false; + // 纯垂直路径无水平方向,无法从路径计算 yaw,保持物体当前朝向 + LogManager.Debug($"[{pathType.GetDisplayName()}纯增量起点] 路径方向为纯垂直,保持当前朝向。"); + targetYawRadians = _currentYaw; } // 提取非 up 轴修正角度 @@ -4373,13 +4386,22 @@ namespace NavisworksTransport.Core.Animation double currentYawRadians = _currentYaw; double deltaYawRadians = NormalizeRadians(targetYawRadians - currentYawRadians); - if (Math.Abs(angleXRadians) > 1e-9 || Math.Abs(angleNonUpRadians) > 1e-9 || Math.Abs(deltaYawRadians) > 1e-9) + bool hasRotation = Math.Abs(angleXRadians) > 1e-9 || + Math.Abs(angleNonUpRadians) > 1e-9 || + Math.Abs(deltaYawRadians) > 1e-9; + double posDiff = Math.Abs(_trackedPosition.X - targetTrackedPosition.X) + + Math.Abs(_trackedPosition.Y - targetTrackedPosition.Y) + + Math.Abs(_trackedPosition.Z - targetTrackedPosition.Z); + bool hasTranslation = posDiff > 1e-6; + + if (hasRotation || hasTranslation) { LogManager.Debug( $"[{pathType.GetDisplayName()}纯增量起点] 当前Yaw={currentYawRadians * 180.0 / Math.PI:F2}°, " + $"目标Yaw={targetYawRadians * 180.0 / Math.PI:F2}°, 增量Yaw={deltaYawRadians * 180.0 / Math.PI:F2}°, " + $"当前跟踪点=({_trackedPosition.X:F3},{_trackedPosition.Y:F3},{_trackedPosition.Z:F3}), " + - $"目标跟踪点=({targetTrackedPosition.X:F3},{targetTrackedPosition.Y:F3},{targetTrackedPosition.Z:F3})"); + $"目标跟踪点=({targetTrackedPosition.X:F3},{targetTrackedPosition.Y:F3},{targetTrackedPosition.Z:F3}), " + + $"旋转变化={hasRotation}, 位移变化={hasTranslation}"); ModelItemTransformHelper.MoveItemCombinedAxisRotationAndTranslation( CurrentControlledObject, diff --git a/src/Core/PathPlanningManager.cs b/src/Core/PathPlanningManager.cs index dff1669..1652ff1 100644 --- a/src/Core/PathPlanningManager.cs +++ b/src/Core/PathPlanningManager.cs @@ -4010,8 +4010,61 @@ namespace NavisworksTransport LogManager.Error($"[吊装模式] 生成起吊点和提升点失败: {ex.Message}", ex); } - // 提示用户点击添加转向点 - RaiseStatusChanged($"吊装高度已设置为 {liftHeightMetersInput:F2}米,点击添加转向点(点击地面位置),完成后点击完成按钮", PathPlanningStatusType.Info); + // 检查完成模式 + if (heightDialog.IsTwoPointMode) + { + // 2点路径:提升点直接作为终点,无下降段落 + LogManager.Info("[吊装模式] 首次点击2点路径,提升点即为终点"); + + var lastPoint = CurrentRoute.Points.Last(); + lastPoint.Type = PathPointType.EndPoint; + lastPoint.Name = "终点"; + + // 清理吊装模式临时变量 + _hoistingStartPoint = null; + _hoistingLiftHeight = 0; + _hoistingGroundIntermediatePoints.Clear(); + _enableHoistingMode = false; + + // 渲染最终路径 + if (_renderPlugin != null) + { + _renderPlugin.RenderPath(CurrentRoute); + } + + // 添加路径到集合 + if (!_routes.Contains(CurrentRoute)) + { + _routes.Add(CurrentRoute); + } + + // 切换回查看状态 + SwitchToViewingState(); + + // 触发事件通知UI刷新 + RaisePathPointsListUpdated(CurrentRoute, "2点路径完成"); + SetCurrentRouteInternal(CurrentRoute, triggerEvent: true); + RaiseRouteGenerated(CurrentRoute, RouteGenerationMethod.Manual); + RaiseStatusChanged("2点垂直吊装路径创建完成", PathPlanningStatusType.Success); + } + else if (heightDialog.IsSetAsEndPoint) + { + LogManager.Info("[吊装模式] 首次点击设为终点,直接完成路径"); + bool finished = FinishEditing(); + if (finished && CurrentRoute != null) + { + RaisePathPointsListUpdated(CurrentRoute, "设为终点完成路径"); + } + else + { + RaiseStatusChanged("吊装路径完成失败", PathPlanningStatusType.Warning); + } + } + else + { + // 提示用户点击添加转向点 + RaiseStatusChanged($"吊装高度已设置为 {liftHeightMetersInput:F2}米,点击添加转向点(点击地面位置),完成后点击完成按钮", PathPlanningStatusType.Info); + } } catch (Exception ex) { diff --git a/src/UI/WPF/Views/AerialHeightDialog.xaml b/src/UI/WPF/Views/AerialHeightDialog.xaml index 692a6d2..51f9369 100644 --- a/src/UI/WPF/Views/AerialHeightDialog.xaml +++ b/src/UI/WPF/Views/AerialHeightDialog.xaml @@ -1,7 +1,7 @@  +