From be174ab6bbb280878266d7e21feabb63469b07da Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Tue, 6 Jan 2026 12:48:20 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=8A=A8=E7=94=BB=E8=BF=87?= =?UTF-8?q?=E7=A8=8B=E4=B8=AD=EF=BC=8C=E9=AB=98=E4=BA=AE=E6=97=B6=E6=9C=89?= =?UTF-8?q?=E6=97=B6=E6=97=A0=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/design/2026/NavisworksAPI使用方法.md | 6 ++- src/Core/Animation/PathAnimationManager.cs | 55 +++++++++++++++++++--- 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/doc/design/2026/NavisworksAPI使用方法.md b/doc/design/2026/NavisworksAPI使用方法.md index 8f1237e..445a12f 100644 --- a/doc/design/2026/NavisworksAPI使用方法.md +++ b/doc/design/2026/NavisworksAPI使用方法.md @@ -2733,4 +2733,8 @@ transform3dComponents.Translation = new Vector3D(origin_X, origin_Y, origin_Z); Transform3D newTransform3D = transform3dComponents.Combine(); //Change model units value Units units = Units.Meters; -models.SetModelUnitsAndTransform(model, units , newTransform3D, true); \ No newline at end of file +models.SetModelUnitsAndTransform(model, units , newTransform3D, true); + +### 如何唯一标识一个ModelItem + +使用 ModelItem.GetHashCode() 作为唯一标识符 diff --git a/src/Core/Animation/PathAnimationManager.cs b/src/Core/Animation/PathAnimationManager.cs index c7c290f..913e03b 100644 --- a/src/Core/Animation/PathAnimationManager.cs +++ b/src/Core/Animation/PathAnimationManager.cs @@ -105,6 +105,7 @@ namespace NavisworksTransport.Core.Animation private List _allCollisionResults; // 所有碰撞结果(不去重) private bool _lastHighlightState = false; // 上一帧的高亮状态 + private HashSet _lastCollisionObjectIds = new HashSet(); // 上一帧碰撞对象的ID集合 // === 路径相关 === private PathRoute _route = null; // 路径引用 @@ -543,7 +544,7 @@ namespace NavisworksTransport.Core.Animation // 添加朝向计算日志 if (edge.SegmentType == PathSegmentType.Arc) { - LogManager.Info($"帧[{i}] 圆弧段: 边索引={edgeIndex}, 边进度={edgeProgress:F4}, 朝向={yawRadians * 180.0 / Math.PI:F2}度, 位置=({framePosition.X:F3},{framePosition.Y:F3},{framePosition.Z:F3})"); + LogManager.Debug($"帧[{i}] 圆弧段: 边索引={edgeIndex}, 边进度={edgeProgress:F4}, 朝向={yawRadians * 180.0 / Math.PI:F2}度, 位置=({framePosition.X:F3},{framePosition.Y:F3},{framePosition.Z:F3})"); } // 创建帧并检测碰撞 @@ -977,6 +978,7 @@ namespace NavisworksTransport.Core.Animation _fpsCounterStart = DateTime.Now; _frameInterval = 1000.0 / _animationFrameRate; _lastHighlightState = false; // 重置高亮状态 + _lastCollisionObjectIds.Clear(); // 重置碰撞对象ID集合 // 启动动画播放 StartAnimationPlayback(); @@ -2325,24 +2327,46 @@ namespace NavisworksTransport.Core.Animation var currentFrame = _animationFrames[_currentFrameIndex]; bool currentHasCollision = currentFrame.HasCollision; - // 只在状态变化时更新高亮,避免重复操作 - if (currentHasCollision != _lastHighlightState) + // 收集当前帧碰撞对象的ID集合 + var currentCollisionObjectIds = new HashSet(); + if (currentHasCollision && currentFrame.Collisions != null) + { + foreach (var collision in currentFrame.Collisions) + { + var item1 = collision.GetValidItem1(); + var item2 = collision.GetValidItem2(); + + if (item1 != null) + currentCollisionObjectIds.Add(item1.GetHashCode()); + if (item2 != null) + currentCollisionObjectIds.Add(item2.GetHashCode()); + } + } + + // 检查是否需要更新高亮: + // 1. 碰撞状态改变(有碰撞 vs 无碰撞) + // 2. 碰撞对象集合改变(碰撞的物体变了) + bool stateChanged = currentHasCollision != _lastHighlightState; + bool objectsChanged = !currentCollisionObjectIds.SetEquals(_lastCollisionObjectIds); + + if (stateChanged || objectsChanged) { if (currentHasCollision) { - // 从无碰撞到有碰撞:高亮当前帧的碰撞对象 + // 有碰撞:高亮当前帧的碰撞对象 ClashDetectiveIntegration.Instance.HighlightCollisions(currentFrame.Collisions); - LogManager.Debug($"[高亮状态] 帧{_currentFrameIndex}: 开始高亮碰撞 ({currentFrame.Collisions.Count}个)"); + LogManager.Debug($"[高亮状态] 帧{_currentFrameIndex}: 高亮碰撞 ({currentFrame.Collisions.Count}个, 对象{currentCollisionObjectIds.Count}个)"); } else { - // 从有碰撞到无碰撞:清除高亮 + // 无碰撞:清除高亮 ModelHighlightHelper.ClearCategory("collisionresults"); LogManager.Debug($"[高亮状态] 帧{_currentFrameIndex}: 清除高亮"); } // 更新状态记录 _lastHighlightState = currentHasCollision; + _lastCollisionObjectIds = currentCollisionObjectIds; } // 每次都触发碰撞事件(用于UI更新等) @@ -2533,6 +2557,25 @@ namespace NavisworksTransport.Core.Animation sb.Append($"Vehicle:{vehicleConfig.VehicleLengthMeters:F2}x{vehicleConfig.VehicleWidthMeters:F2}x{vehicleConfig.VehicleHeightMeters:F2}"); sb.Append("|"); + // 包含手工检测对象列表(确保手工指定模式的目标变化时重新检测) + if (_manualCollisionOverrideEnabled && _manualCollisionTargets != null && _manualCollisionTargets.Count > 0) + { + sb.Append("ManualTargets:"); + foreach (var target in _manualCollisionTargets.OrderBy(t => t.DisplayName)) + { + try + { + sb.Append(target.DisplayName); + sb.Append(","); + } + catch (Exception) + { + // 忽略无效对象 + } + } + sb.Append("|"); + } + // 包含路径边的摘要信息(区分不同的曲线化结果) if (route?.Edges != null) {