修正吊装通行空间显示问题。

This commit is contained in:
tian 2026-01-18 17:14:19 +08:00
parent bc1ad3f4c3
commit 668073b100
2 changed files with 97 additions and 170 deletions

View File

@ -1328,7 +1328,84 @@ namespace NavisworksTransport
}
/// <summary>
/// 构建路径连线(真实路径,不透明)
/// 计算通行空间参数(高度、宽度、颜色、透明度、垂直偏移)
/// </summary>
/// <param name="visualization">路径可视化对象</param>
/// <param name="metersToModelUnits">米到模型单位的转换系数</param>
/// <returns>通行空间参数元组</returns>
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);
}
/// <summary>
/// 构建路径连线使用Edges包含直线段和圆弧段
/// </summary>
/// <param name="visualization">路径可视化对象</param>
/// <param name="sortedPoints">排序后的路径点列表</param>
@ -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");
}
// 直接使用路径点构建直线连线

View File

@ -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
{