From 668073b100c6e276ee73e8d9ffb68fcc3836ae31 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Sun, 18 Jan 2026 17:14:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=90=8A=E8=A3=85=E9=80=9A?= =?UTF-8?q?=E8=A1=8C=E7=A9=BA=E9=97=B4=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Core/PathPointRenderPlugin.cs | 215 +++++++----------- .../ViewModels/AnimationControlViewModel.cs | 52 +---- 2 files changed, 97 insertions(+), 170 deletions(-) diff --git a/src/Core/PathPointRenderPlugin.cs b/src/Core/PathPointRenderPlugin.cs index baade85..d717b1f 100644 --- a/src/Core/PathPointRenderPlugin.cs +++ b/src/Core/PathPointRenderPlugin.cs @@ -1328,7 +1328,84 @@ namespace NavisworksTransport } /// - /// 构建路径连线(真实路径,不透明) + /// 计算通行空间参数(高度、宽度、颜色、透明度、垂直偏移) + /// + /// 路径可视化对象 + /// 米到模型单位的转换系数 + /// 通行空间参数元组 + private (double heightInModelUnits, double widthInModelUnits, Color lineColor, double lineOpacity, double verticalOffset) + CalculatePassageSpaceParameters(PathVisualization visualization, double metersToModelUnits) + { + double heightInMeters; + double widthInMeters; + Color lineColor; + double lineOpacity; + + if (_visualizationMode == PathVisualizationMode.VehicleSpace) + { + // VehicleSpace 模式:使用车辆高度和宽度 + // 根据路径类型调整参数 + if (visualization.PathRoute.PathType == NavisworksTransport.PathType.Hoisting) + { + // 吊装路径:通行空间截面使用车辆的宽度和长度(不是高度) + heightInMeters = _vehicleLength + _safetyMargin; // Y方向使用车辆长度 + widthInMeters = _vehicleWidth + 2 * _safetyMargin; // X方向使用车辆宽度 + } + else + { + // 地面路径和空轨:使用最大宽度和高度 + heightInMeters = _vehicleHeight + _safetyMargin; + widthInMeters = _vehicleWidth + 2 * _safetyMargin; + } + var renderStyle = GetRenderStyle(RenderStyleName.VehicleSpace); + lineColor = renderStyle.Color; + lineOpacity = renderStyle.Alpha; + } + else if (_visualizationMode == PathVisualizationMode.RibbonLine) + { + // RibbonLine 模式:使用较低的带状高度 + heightInMeters = GetLineRadius() / metersToModelUnits * 0.1; + widthInMeters = GetLineRadius() / metersToModelUnits * 2; + var renderStyle = GetRenderStyle(RenderStyleName.Line); + lineColor = renderStyle.Color; + lineOpacity = renderStyle.Alpha; + } + else + { + // StandardLine 模式:不需要高度和宽度(圆柱体) + heightInMeters = 0; + widthInMeters = 0; + var renderStyle = GetRenderStyle(RenderStyleName.Line); + lineColor = renderStyle.Color; + lineOpacity = renderStyle.Alpha; + } + + // 转换为模型单位 + double heightInModelUnits = heightInMeters * metersToModelUnits; + double widthInModelUnits = widthInMeters * metersToModelUnits; + + // 计算通行空间的垂直偏移(根据路径类型) + double verticalOffset = 0; + if (_visualizationMode == PathVisualizationMode.VehicleSpace) + { + if (visualization.PathRoute.PathType == NavisworksTransport.PathType.Ground) + { + // 地面路径:路径点是地面位置,通行空间底面在地面,中心需要向上偏移半个高度 + verticalOffset = heightInModelUnits / 2.0; + } + else if (visualization.PathRoute.PathType == NavisworksTransport.PathType.Rail) + { + // 空轨路径:路径点是空轨下表面位置,通行空间顶面在空轨下表面,中心需要向下偏移半个高度 + verticalOffset = -heightInModelUnits / 2.0; + } + // 吊装路径:路径点是设备中心位置,不需要偏移 + } + + return (heightInModelUnits, widthInModelUnits, lineColor, lineOpacity, verticalOffset); + } + + /// + /// 构建路径连线(使用Edges,包含直线段和圆弧段) /// /// 路径可视化对象 /// 排序后的路径点列表 @@ -1368,72 +1445,14 @@ namespace NavisworksTransport // 获取单位转换系数 double metersToModelUnits = UnitsConverter.GetMetersToUnitsConversionFactor(); - // 根据可视化模式计算高度和宽度 - double heightInMeters; - double widthInMeters; - Color lineColor; - double lineOpacity; + // 计算通行空间参数 + var (heightInModelUnits, widthInModelUnits, lineColor, lineOpacity, verticalOffset) = + CalculatePassageSpaceParameters(visualization, metersToModelUnits); + // 记录日志 if (_visualizationMode == PathVisualizationMode.VehicleSpace) { - // VehicleSpace 模式:使用车辆高度和宽度 - // 根据路径类型调整参数 - if (visualization.PathRoute.PathType == NavisworksTransport.PathType.Hoisting) - { - // 吊装路径:通行空间截面使用车辆的宽度和长度(不是高度) - heightInMeters = _vehicleLength + _safetyMargin; // Y方向使用车辆长度 - widthInMeters = _vehicleWidth + 2 * _safetyMargin; // X方向使用车辆宽度 - LogManager.Info($"[通行空间渲染] 吊装路径: 车辆参数(长×宽×高)={_vehicleLength:F2}×{_vehicleWidth:F2}×{_vehicleHeight:F2}m, 安全间隙={_safetyMargin:F2}m, 通行空间截面(宽×高)={widthInMeters:F2}×{heightInMeters:F2}m"); - } - else - { - // 地面路径和空轨:使用最大宽度和高度 - heightInMeters = _vehicleHeight + _safetyMargin; - widthInMeters = _vehicleWidth + 2 * _safetyMargin; - LogManager.Info($"[通行空间渲染] {visualization.PathRoute.PathType}路径: 车辆参数(长×宽×高)={_vehicleLength:F2}×{_vehicleWidth:F2}×{_vehicleHeight:F2}m, 安全间隙={_safetyMargin:F2}m, 通行空间截面(宽×高)={widthInMeters:F2}×{heightInMeters:F2}m"); - } - var renderStyle = GetRenderStyle(RenderStyleName.VehicleSpace); - lineColor = renderStyle.Color; - lineOpacity = renderStyle.Alpha; - } - else if (_visualizationMode == PathVisualizationMode.RibbonLine) - { - // RibbonLine 模式:使用较低的带状高度 - heightInMeters = GetLineRadius() / metersToModelUnits * 0.1; - widthInMeters = GetLineRadius() / metersToModelUnits * 2; // 路径宽度(转换为米) - var renderStyle = GetRenderStyle(RenderStyleName.Line); - lineColor = renderStyle.Color; - lineOpacity = renderStyle.Alpha; - } - else - { - // StandardLine 模式:不需要高度和宽度(圆柱体) - heightInMeters = 0; - widthInMeters = 0; - var renderStyle = GetRenderStyle(RenderStyleName.Line); - lineColor = renderStyle.Color; - lineOpacity = renderStyle.Alpha; - } - - // 转换为模型单位 - double heightInModelUnits = heightInMeters * metersToModelUnits; - double widthInModelUnits = widthInMeters * metersToModelUnits; - - // 计算通行空间的垂直偏移(根据路径类型) - double verticalOffset = 0; - if (_visualizationMode == PathVisualizationMode.VehicleSpace) - { - if (visualization.PathRoute.PathType == NavisworksTransport.PathType.Ground) - { - // 地面路径:路径点是地面位置,通行空间底面在地面,中心需要向上偏移半个高度 - verticalOffset = heightInModelUnits / 2.0; - } - else if (visualization.PathRoute.PathType == NavisworksTransport.PathType.Rail) - { - // 空轨路径:路径点是空轨下表面位置,通行空间顶面在空轨下表面,中心需要向下偏移半个高度 - verticalOffset = -heightInModelUnits / 2.0; - } - // 吊装路径:路径点是设备中心位置,不需要偏移 + LogManager.Info($"[通行空间渲染] {visualization.PathRoute.PathType}路径: 车辆参数(长×宽×高)={_vehicleLength:F2}×{_vehicleWidth:F2}×{_vehicleHeight:F2}m, 安全间隙={_safetyMargin:F2}m, 通行空间截面(宽×高)={widthInModelUnits/metersToModelUnits:F2}×{heightInModelUnits/metersToModelUnits:F2}m"); } // 3. 构建路径连线(Edges包含直线段和圆弧段) @@ -1527,72 +1546,14 @@ namespace NavisworksTransport // 获取单位转换系数 double metersToModelUnits = UnitsConverter.GetMetersToUnitsConversionFactor(); - // 根据可视化模式计算高度和宽度 - double heightInMeters; - double widthInMeters; - Color lineColor; - double lineOpacity; + // 计算通行空间参数 + var (heightInModelUnits, widthInModelUnits, lineColor, lineOpacity, verticalOffset) = + CalculatePassageSpaceParameters(visualization, metersToModelUnits); + // 记录日志 if (_visualizationMode == PathVisualizationMode.VehicleSpace) { - // VehicleSpace 模式:使用车辆高度和宽度 - // 根据路径类型调整参数 - if (visualization.PathRoute.PathType == NavisworksTransport.PathType.Hoisting) - { - // 吊装路径:通行空间截面使用车辆的宽度和长度(不是高度) - heightInMeters = _vehicleLength + _safetyMargin; // Y方向使用车辆长度 - widthInMeters = _vehicleWidth + 2 * _safetyMargin; // X方向使用车辆宽度 - LogManager.Info($"[通行空间渲染] 吊装路径(直接连线): 车辆参数(长×宽×高)={_vehicleLength:F2}×{_vehicleWidth:F2}×{_vehicleHeight:F2}m, 安全间隙={_safetyMargin:F2}m, 通行空间截面(宽×高)={widthInMeters:F2}×{heightInMeters:F2}m"); - } - else - { - // 地面路径和空轨:使用最大宽度和高度 - heightInMeters = _vehicleHeight + _safetyMargin; - widthInMeters = _vehicleWidth + 2 * _safetyMargin; - LogManager.Info($"[通行空间渲染] {visualization.PathRoute.PathType}路径(直接连线): 车辆参数(长×宽×高)={_vehicleLength:F2}×{_vehicleWidth:F2}×{_vehicleHeight:F2}m, 安全间隙={_safetyMargin:F2}m, 通行空间截面(宽×高)={widthInMeters:F2}×{heightInMeters:F2}m"); - } - var renderStyle = GetRenderStyle(RenderStyleName.VehicleSpace); - lineColor = renderStyle.Color; - lineOpacity = renderStyle.Alpha; - } - else if (_visualizationMode == PathVisualizationMode.RibbonLine) - { - // RibbonLine 模式:使用较低的带状高度 - heightInMeters = GetLineRadius() / metersToModelUnits * 0.1; - widthInMeters = GetLineRadius() / metersToModelUnits * 2; // 路径宽度(转换为米) - var renderStyle = GetRenderStyle(RenderStyleName.Line); - lineColor = renderStyle.Color; - lineOpacity = renderStyle.Alpha; - } - else - { - // StandardLine 模式:不需要高度和宽度(圆柱体) - heightInMeters = 0; - widthInMeters = 0; - var renderStyle = GetRenderStyle(RenderStyleName.Line); - lineColor = renderStyle.Color; - lineOpacity = renderStyle.Alpha; - } - - // 转换为模型单位 - double heightInModelUnits = heightInMeters * metersToModelUnits; - double widthInModelUnits = widthInMeters * metersToModelUnits; - - // 计算通行空间的垂直偏移(根据路径类型) - double verticalOffset = 0; - if (_visualizationMode == PathVisualizationMode.VehicleSpace) - { - if (visualization.PathRoute.PathType == NavisworksTransport.PathType.Ground) - { - // 地面路径:路径点是地面位置,通行空间底面在地面,中心需要向上偏移半个高度 - verticalOffset = heightInModelUnits / 2.0; - } - else if (visualization.PathRoute.PathType == NavisworksTransport.PathType.Rail) - { - // 空轨路径:路径点是空轨下表面位置,通行空间顶面在空轨下表面,中心需要向下偏移半个高度 - verticalOffset = -heightInModelUnits / 2.0; - } - // 吊装路径:路径点是设备中心位置,不需要偏移 + LogManager.Info($"[通行空间渲染] {visualization.PathRoute.PathType}路径(直接连线): 车辆参数(长×宽×高)={_vehicleLength:F2}×{_vehicleWidth:F2}×{_vehicleHeight:F2}m, 安全间隙={_safetyMargin:F2}m, 通行空间截面(宽×高)={widthInModelUnits/metersToModelUnits:F2}×{heightInModelUnits/metersToModelUnits:F2}m"); } // 直接使用路径点构建直线连线 diff --git a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs index 620e3fd..b4b338e 100644 --- a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs +++ b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs @@ -2456,31 +2456,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels vehicleHeight = VirtualVehicleLength; // Y方向(使用车辆长度) - // 计算路径的Z长度差 + vehicleLength = VirtualVehicleLength; // 保持虚拟车辆长度不变 - if (CurrentPathRoute.Points.Count >= 2) - - { - - var startPoint = CurrentPathRoute.Points.First(); - - var endPoint = CurrentPathRoute.Points.Last(); - - double metersToModelUnits = UnitsConverter.GetMetersToUnitsConversionFactor(); - - vehicleLength = Math.Abs(endPoint.Z - startPoint.Z) / metersToModelUnits; - - } - - else - - { - - vehicleLength = VirtualVehicleLength; // fallback - - } - - LogManager.Info($"[通行空间可视化] 吊装路径使用虚拟车辆尺寸: 宽×高×长={vehicleWidth:F2}×{vehicleHeight:F2}×{vehicleLength:F2}m"); + LogManager.Info($"[通行空间可视化] 吊装路径使用虚拟车辆尺寸: 宽×高={vehicleWidth:F2}×{vehicleHeight:F2}m"); } @@ -2518,25 +2496,13 @@ namespace NavisworksTransport.UI.WPF.ViewModels if (CurrentPathRoute.PathType == NavisworksTransport.PathType.Hoisting) { // 吊装路径(严格垂直路径): - // - 宽度 = X方向尺寸 - // - 高度 = Y方向尺寸 - // - 长度 = 路径起点到终点的Z值差 - vehicleWidth = sizeX; - vehicleHeight = sizeY; - - // 计算路径的Z长度差 - if (CurrentPathRoute.Points.Count >= 2) - { - var startPoint = CurrentPathRoute.Points.First(); - var endPoint = CurrentPathRoute.Points.Last(); - vehicleLength = Math.Abs(endPoint.Z - startPoint.Z) / metersToModelUnits; - } - else - { - vehicleLength = sizeZ; // fallback - } - - LogManager.Info($"[通行空间可视化] 吊装路径使用物体XY尺寸 ({SelectedAnimatedObject.DisplayName}): 宽={vehicleWidth:F2}m, 高={vehicleHeight:F2}m, 长度(路径Z差)={vehicleLength:F2}m"); + // 通行空间截面使用物体的长度和宽度 + double objectLength = Math.Max(sizeX, sizeY); + double objectWidth = Math.Min(sizeX, sizeY); + vehicleWidth = objectWidth; // 通行空间宽度 = 物体宽度 + vehicleHeight = objectLength; // 通行空间高度 = 物体长度 + vehicleLength = sizeZ; // 物体Z尺寸 + LogManager.Info($"[通行空间可视化] 吊装路径使用物体尺寸 ({SelectedAnimatedObject.DisplayName}): 物体长×宽={objectLength:F2}×{objectWidth:F2}m, 通行空间宽×高={vehicleWidth:F2}×{vehicleHeight:F2}m"); } else {