继续修复多层吊装路径
This commit is contained in:
parent
62548197b3
commit
dda04250b0
@ -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
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user