解决动画过程中,高亮时有时无的情况

This commit is contained in:
tian 2026-01-06 12:48:20 +08:00
parent 28c6f18f47
commit be174ab6bb
2 changed files with 54 additions and 7 deletions

View File

@ -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);
models.SetModelUnitsAndTransform(model, units , newTransform3D, true);
### 如何唯一标识一个ModelItem
使用 ModelItem.GetHashCode() 作为唯一标识符

View File

@ -105,6 +105,7 @@ namespace NavisworksTransport.Core.Animation
private List<CollisionResult> _allCollisionResults; // 所有碰撞结果(不去重)
private bool _lastHighlightState = false; // 上一帧的高亮状态
private HashSet<int> _lastCollisionObjectIds = new HashSet<int>(); // 上一帧碰撞对象的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<int>();
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)
{