From dda04250b06e7bf1690f9538fffb119625debd8c Mon Sep 17 00:00:00 2001
From: tian <11429339@qq.com>
Date: Tue, 24 Feb 2026 18:09:08 +0800
Subject: [PATCH] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E4=BF=AE=E5=A4=8D=E5=A4=9A?=
=?UTF-8?q?=E5=B1=82=E5=90=8A=E8=A3=85=E8=B7=AF=E5=BE=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/Core/PathPointRenderPlugin.cs | 81 ++++++++++++++++---------------
1 file changed, 43 insertions(+), 38 deletions(-)
diff --git a/src/Core/PathPointRenderPlugin.cs b/src/Core/PathPointRenderPlugin.cs
index 803b77b..48a5ccb 100644
--- a/src/Core/PathPointRenderPlugin.cs
+++ b/src/Core/PathPointRenderPlugin.cs
@@ -1409,9 +1409,10 @@ namespace NavisworksTransport
/// 路径可视化对象
/// 是否是垂直段(仅用于吊装路径)
/// 是否是与初始方向垂直的水平段(吊装路径转折90度)
+ /// 是否是第一个或最后一个线段(起吊/下降段)
/// 通行空间参数元组
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
{