解决动画过程中,高亮时有时无的情况
This commit is contained in:
parent
28c6f18f47
commit
be174ab6bb
@ -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() 作为唯一标识符
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user