diff --git a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs index 4f33267..72a84f8 100644 --- a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs +++ b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs @@ -359,6 +359,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels // 角度修正相关字段 private LocalEulerRotationCorrection _objectRotationCorrection = LocalEulerRotationCorrection.Zero; // 物体绕宿主 X/Y/Z 轴的角度修正 private double _objectGroundLiftHeightInMeters; + private double? _autoAabbSx, _autoAabbSy, _autoAabbSz; // 移动物体原始尺寸(米,在选择物体时保存) private double _objectOriginalLength; // 物体原始长度(X方向) @@ -2189,6 +2190,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels _objectGroundLiftHeightInMeters = placementRequest.VerticalLiftInMeters; _pathAnimationManager?.ApplyObjectStartPlacementRequest(placementRequest); ObjectRotationCorrection = placementRequest.RotationCorrection; + if (dialog.AutoAdjustAabbSizes.HasValue) + (_autoAabbSx, _autoAabbSy, _autoAabbSz) = dialog.AutoAdjustAabbSizes.Value; string liftSummary = enableGroundLift ? $", 上下偏移={_objectGroundLiftHeightInMeters:F3}m" @@ -2281,7 +2284,10 @@ namespace NavisworksTransport.UI.WPF.ViewModels double neededLiftModelUnits = groundLevel + request.VehicleHeightModelUnits - objectBottomWorld; result = ObjectPassageProjectionOptimizationResult.CreateSuccess( - result.Correction, result.Score, neededLiftModelUnits); + result.Correction, result.Score, neededLiftModelUnits, + measureBounds.Max.X - measureBounds.Min.X, + measureBounds.Max.Y - measureBounds.Min.Y, + measureBounds.Max.Z - measureBounds.Min.Z); LogManager.Debug( $"[自动调整] 物体底面={objectBottomWorld:F3}, 地面={groundLevel:F3}, " + @@ -4724,7 +4730,18 @@ namespace NavisworksTransport.UI.WPF.ViewModels } // 计算旋转后的有效尺寸(考虑角度修正) - (double effectiveLength, double effectiveWidth, double effectiveHeight) = CalculateRotatedDimensions(); + double effectiveLength, effectiveWidth, effectiveHeight; + if (_autoAabbSx.HasValue) + { + effectiveLength = _autoAabbSx.Value; + effectiveWidth = _autoAabbSz.Value; + effectiveHeight = _autoAabbSy.Value; + _autoAabbSx = null; + } + else + { + (effectiveLength, effectiveWidth, effectiveHeight) = CalculateRotatedDimensions(); + } var renderPlugin = PathPointRenderPlugin.Instance; if (renderPlugin == null) @@ -4758,7 +4775,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels // 地面路径:物体的长度方向(X轴,前进方向)朝向路径方向 // 通行空间沿路径方向 = X方向尺寸(长度),垂直于路径方向 = Y方向尺寸(宽度),高度上方加间隙(下方不需要,因为有地面) passageAcrossPath = effectiveWidth + 2 * safetyMargin; // 旋转后宽度 + 2*间隙(垂直于路径方向) - passageNormalToPath = effectiveHeight + (_objectGroundLiftHeightInMeters * metersToUnitsPassage) + safetyMargin; // 物体高度 + 上下偏移 + 上方间隙 + passageNormalToPath = effectiveHeight + safetyMargin + Math.Max(0, _objectGroundLiftHeightInMeters * metersToUnitsPassage); // 负lift不压缩高度 passageAlongPath = effectiveLength; // 旋转后长度(沿路径方向) // 地面路径不需要分段参数 passageNormalToPathVertical = passageNormalToPath; @@ -4802,7 +4819,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels // 物体的长度方向(X轴,前进方向)朝向路径方向 // 通行空间沿路径方向 = X方向尺寸(长度),垂直于路径方向 = Y方向尺寸(宽度),高度上方加间隙(下方不需要,因为有地面) passageAcrossPath = effectiveWidth + 2 * safetyMargin; // 旋转后宽度 + 2*间隙(垂直于路径方向) - passageNormalToPath = effectiveHeight + (_objectGroundLiftHeightInMeters * metersToUnitsPassage) + safetyMargin; // 物体高度 + 上下偏移 + 上方间隙 + passageNormalToPath = effectiveHeight + safetyMargin + Math.Max(0, _objectGroundLiftHeightInMeters * metersToUnitsPassage); // 物体高度 + 上方间隙(负lift不压缩高度) passageAlongPath = effectiveLength; // 旋转后长度(沿路径方向) // 地面路径不需要分段参数 passageNormalToPathVertical = passageNormalToPath; diff --git a/src/UI/WPF/Views/EditRotationWindow.xaml.cs b/src/UI/WPF/Views/EditRotationWindow.xaml.cs index 14fc159..e448ce8 100644 --- a/src/UI/WPF/Views/EditRotationWindow.xaml.cs +++ b/src/UI/WPF/Views/EditRotationWindow.xaml.cs @@ -40,6 +40,8 @@ namespace NavisworksTransport.UI.WPF.Views set => _requireWidthLarger = value; } + public (double sx, double sy, double sz)? AutoAdjustAabbSizes { get; private set; } + public double VehicleHeightInMeters { get => _vehicleHeightInMeters; @@ -188,6 +190,8 @@ namespace NavisworksTransport.UI.WPF.Views { GroundPathLiftHeightInMeters = Math.Round(UnitsConverter.ConvertToMeters(result.ComputedLiftOffsetModelUnits.Value), 3); } + if (result.AabbSx.HasValue) + AutoAdjustAabbSizes = (result.AabbSx.Value, result.AabbSy.Value, result.AabbSz.Value); LogManager.Debug( $"[自动调整] 已写入角度: {RotationCorrection}, " + $"截面宽度={result.Score.WidthAcrossPath:F3}, 高度={result.Score.HeightAlongHostUp:F3}, 面积={result.Score.Area:F3}"); diff --git a/src/Utils/CoordinateSystem/ObjectPassageProjectionOptimizer.cs b/src/Utils/CoordinateSystem/ObjectPassageProjectionOptimizer.cs index fbf5f3a..c19a57a 100644 --- a/src/Utils/CoordinateSystem/ObjectPassageProjectionOptimizer.cs +++ b/src/Utils/CoordinateSystem/ObjectPassageProjectionOptimizer.cs @@ -56,13 +56,15 @@ namespace NavisworksTransport.Utils.CoordinateSystem LocalEulerRotationCorrection correction, ObjectPassageProjectionScore score, string errorMessage, - double? computedLiftOffsetModelUnits = null) + double? computedLiftOffsetModelUnits = null, + double? aabbSx = null, double? aabbSy = null, double? aabbSz = null) { Success = success; Correction = correction; Score = score; ErrorMessage = errorMessage; ComputedLiftOffsetModelUnits = computedLiftOffsetModelUnits; + AabbSx = aabbSx; AabbSy = aabbSy; AabbSz = aabbSz; } public bool Success { get; } @@ -77,13 +79,17 @@ namespace NavisworksTransport.Utils.CoordinateSystem /// 自动调整后计算出的上下偏移(模型单位),使物体底面贴合物流车高度。仅地面路径有效。 /// public double? ComputedLiftOffsetModelUnits { get; } +public double? AabbSx { get; } +public double? AabbSy { get; } +public double? AabbSz { get; } public static ObjectPassageProjectionOptimizationResult CreateSuccess( LocalEulerRotationCorrection correction, ObjectPassageProjectionScore score, - double? computedLiftOffsetModelUnits = null) + double? computedLiftOffsetModelUnits = null, + double? aabbSx = null, double? aabbSy = null, double? aabbSz = null) { - return new ObjectPassageProjectionOptimizationResult(true, correction, score, null, computedLiftOffsetModelUnits); + return new ObjectPassageProjectionOptimizationResult(true, correction, score, null, computedLiftOffsetModelUnits, aabbSx, aabbSy, aabbSz); } public static ObjectPassageProjectionOptimizationResult CreateFailure(string errorMessage)