继续修复多层吊装路径

This commit is contained in:
tian 2026-02-24 18:09:08 +08:00
parent 62548197b3
commit dda04250b0

View File

@ -1409,9 +1409,10 @@ namespace NavisworksTransport
/// <param name="visualization">路径可视化对象</param>
/// <param name="isVerticalSegment">是否是垂直段(仅用于吊装路径)</param>
/// <param name="isTurn90Horizontal">是否是与初始方向垂直的水平段吊装路径转折90度</param>
/// <param name="isFirstOrLastSegment">是否是第一个或最后一个线段(起吊/下降段)</param>
/// <returns>通行空间参数元组</returns>
private (double height, double width, Color lineColor, double lineOpacity, double verticalOffset)
CalculatePassageSpaceParameters(PathVisualization visualization, bool isVerticalSegment = false, bool isTurn90Horizontal = false)
CalculatePassageSpaceParameters(PathVisualization visualization, bool isVerticalSegment = false, bool isTurn90Horizontal = false, bool isFirstOrLastSegment = false)
{
// 🔥 验证通行空间参数是否已正确设置
if (_passageAcrossPath <= 0 || _passageNormalToPath <= 0 || _passageAlongPath <= 0)
@ -1494,9 +1495,19 @@ namespace NavisworksTransport
}
else if (visualization.PathRoute.PathType == NavisworksTransport.PathType.Hoisting)
{
// 吊装路径:物体顶面中心就是路径点,通行空间整体向下移动半个高度
// 这样通行空间顶面中心对齐路径点
verticalOffset = -height / 2.0;
// 吊装路径:根据段类型设置偏移
// 起吊/下降段:底面对齐起点/终点,不需要偏移
// 水平段和层间过渡:顶面中心对齐路径点,向下偏移半个高度
if (isVerticalSegment && isFirstOrLastSegment)
{
// 起吊段或下降段:底面对齐地面
verticalOffset = 0;
}
else
{
// 水平段或层间过渡:顶面中心对齐路径点
verticalOffset = -height / 2.0;
}
}
}
@ -1809,8 +1820,9 @@ namespace NavisworksTransport
var startPoint = sortedPoints[i];
var endPoint = sortedPoints[i + 1];
// 对于吊装路径,判断是否是垂直段
// 对于吊装路径,判断是否是垂直段和起吊/下降段
bool isVerticalSegment = false;
bool isFirstOrLastSegment = false;
if (visualization.PathRoute.PathType == NavisworksTransport.PathType.Hoisting)
{
// 吊装路径:支持动态数量的路径点
@ -1830,8 +1842,20 @@ namespace NavisworksTransport
int firstSegment = 0; // 起吊段
int lastSegment = totalSegments - 1; // 下降段
// 第一个线段和最后一个线段是垂直的
isVerticalSegment = (i == firstSegment || i == lastSegment);
// 检测Z方向变化来判断垂直段
double dz = endPoint.Position.Z - startPoint.Position.Z;
double dx = endPoint.Position.X - startPoint.Position.X;
double dy = endPoint.Position.Y - startPoint.Position.Y;
double horizontalDist = Math.Sqrt(dx * dx + dy * dy);
// 如果Z变化占主导垂直段或者是第一个/最后一个线段
bool isZDominant = Math.Abs(dz) > horizontalDist * 2.0; // 垂直变化是水平变化的2倍以上
// 第一个线段和最后一个线段是起吊/下降段
// 中间的垂直段是层间过渡
isVerticalSegment = (i == firstSegment || i == lastSegment || isZDominant);
// 检测是否是第一个或最后一个线段(起吊/下降段)
isFirstOrLastSegment = (i == firstSegment || i == lastSegment);
}
// 计算通行空间参数(根据段类型)
@ -1854,7 +1878,7 @@ namespace NavisworksTransport
}
var (height, width, lineColor, lineOpacity, verticalOffset) =
CalculatePassageSpaceParameters(visualization, isVerticalSegment, isTurn90Horizontal);
CalculatePassageSpaceParameters(visualization, isVerticalSegment, isTurn90Horizontal, isFirstOrLastSegment);
// 计算长方体的轴向量right和up向量
var (right, up) = CalculateCuboidAxes(startPoint.Position, endPoint.Position, horizontalDirection);
@ -1867,36 +1891,17 @@ namespace NavisworksTransport
if (_showObjectSpace && Math.Abs(verticalOffset) > 0.001)
{
// 通行空间模式且有垂直偏移时
// 垂直空中路径只沿Z轴偏移没有水平偏移
// 水平路径沿up向量偏移up是垂直的
if (isVerticalSegment)
{
// 垂直段只沿Z轴偏移
adjustedStartPoint = new Point3D(
startPoint.Position.X,
startPoint.Position.Y,
startPoint.Position.Z + verticalOffset
);
adjustedEndPoint = new Point3D(
endPoint.Position.X,
endPoint.Position.Y,
endPoint.Position.Z + verticalOffset
);
}
else
{
// 水平段沿up向量偏移up是垂直的
adjustedStartPoint = new Point3D(
startPoint.Position.X + up.X * verticalOffset,
startPoint.Position.Y + up.Y * verticalOffset,
startPoint.Position.Z + up.Z * verticalOffset
);
adjustedEndPoint = new Point3D(
endPoint.Position.X + up.X * verticalOffset,
endPoint.Position.Y + up.Y * verticalOffset,
endPoint.Position.Z + up.Z * verticalOffset
);
}
// 所有空中路径统一沿Z轴向下偏移顶面中心对齐路径点
adjustedStartPoint = new Point3D(
startPoint.Position.X,
startPoint.Position.Y,
startPoint.Position.Z + verticalOffset
);
adjustedEndPoint = new Point3D(
endPoint.Position.X,
endPoint.Position.Y,
endPoint.Position.Z + verticalOffset
);
}
else
{