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
{