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 {