新增物体状态保存与恢复功能;在碰撞检测前后将物体恢复到终点位置

This commit is contained in:
tian 2026-02-06 21:49:57 +08:00
parent 6be1de113e
commit 84e5abf592
2 changed files with 99 additions and 25 deletions

View File

@ -159,6 +159,11 @@ namespace NavisworksTransport.Core.Animation
// === 调试辅助 ===
private static HashSet<int> _arcInfoPrinted = new HashSet<int>(); // 记录已打印信息的圆弧段索引
// === 物体状态保存和恢复 ===
private Point3D _savedObjectPosition;
private double _savedObjectYaw;
private bool _hasSavedObjectState = false;
/// <summary>
/// 当前正在进行动画的对象
/// </summary>
@ -2166,6 +2171,89 @@ namespace NavisworksTransport.Core.Animation
/// </summary>
public int TotalFrames => _animationFrames?.Count ?? 0;
/// <summary>
/// 获取物体当前位置和朝向
/// </summary>
public (Point3D Position, double Yaw) GetObjectCurrentPosition(ModelItem obj)
{
if (obj == null)
{
LogManager.Warning("GetObjectCurrentPosition: 对象为空");
return (null, 0);
}
var bbox = obj.BoundingBox();
var position = new Point3D(
bbox.Center.X,
bbox.Center.Y,
bbox.Min.Z
);
var yaw = ModelItemTransformHelper.GetYawFromTransform(obj.Transform);
return (position, yaw);
}
/// <summary>
/// 保存物体当前位置和朝向
/// </summary>
public void SaveObjectState(ModelItem obj)
{
if (obj == null)
{
LogManager.Warning("SaveObjectState: 对象为空");
return;
}
try
{
var (position, yaw) = GetObjectCurrentPosition(obj);
_savedObjectPosition = position;
_savedObjectYaw = yaw;
_hasSavedObjectState = true;
LogManager.Info($"已保存物体状态: pos=({position.X:F2},{position.Y:F2},{position.Z:F2}), yaw={yaw * 180 / Math.PI:F2}度");
}
catch (Exception ex)
{
LogManager.Error($"SaveObjectState: 保存物体状态失败: {ex.Message}");
}
}
/// <summary>
/// 恢复物体到保存的位置和朝向
/// </summary>
public void RestoreObjectState(ModelItem obj)
{
if (obj == null)
{
LogManager.Warning("RestoreObjectState: 对象为空");
return;
}
if (!_hasSavedObjectState)
{
LogManager.Warning("RestoreObjectState: 没有保存的物体状态");
return;
}
try
{
var originalAnimatedObject = _animatedObject;
_animatedObject = obj;
var bbox = obj.BoundingBox();
_currentPosition = new Point3D(bbox.Center.X, bbox.Center.Y, bbox.Min.Z);
_currentYaw = ModelItemTransformHelper.GetYawFromTransform(obj.Transform);
UpdateObjectPosition(_savedObjectPosition, _savedObjectYaw);
_animatedObject = originalAnimatedObject;
LogManager.Info($"已恢复物体状态: pos=({_savedObjectPosition.X:F2},{_savedObjectPosition.Y:F2},{_savedObjectPosition.Z:F2}), yaw={_savedObjectYaw * 180 / Math.PI:F2}度");
}
catch (Exception ex)
{
LogManager.Error($"RestoreObjectState: 恢复物体状态失败: {ex.Message}");
}
}
/// <summary>
/// 获取播放方向1=正向,-1=反向)
/// </summary>
@ -2418,18 +2506,6 @@ namespace NavisworksTransport.Core.Animation
}
}
/// <summary>
/// 验证动画对象是否有效
/// </summary>
private bool IsAnimatedObjectValid()
{
if (_animatedObject == null)
return false;
// 使用DocumentStateManager验证
return DocumentStateManager.Instance.IsModelItemValid(_animatedObject);
}
/// <summary>
/// 文档失效事件处理
/// </summary>

View File

@ -595,6 +595,12 @@ namespace NavisworksTransport
{
LogManager.Info($"[ClashDetective] 开始运行碰撞检测并保存到数据库(容差: {detectionGap}米)");
// 保存碰撞检测前的物体状态
if (animatedObject != null && IsModelItemValid(animatedObject))
{
PathAnimationManager.GetInstance().SaveObjectState(animatedObject);
}
// 过滤有效的碰撞
var validCollisions = precomputedCollisions.Where(collision =>
collision.HasPositionInfo &&
@ -1009,19 +1015,11 @@ namespace NavisworksTransport
LogManager.Warning("[分组测试] 分组为空(未检测到真实几何碰撞),未添加到主测试");
}
// 碰撞测试完成后,不再将物体恢复到路径起点(客户要求保持最终位置)
// if (animatedObject != null && IsModelItemValid(animatedObject) && pathPoints != null && pathPoints.Count > 0)
// {
// try
// {
// PathAnimationManager.GetInstance().MoveVehicleToPathStart(animatedObject, pathPoints);
// LogManager.Info($"已将 {animatedObject.DisplayName} 恢复到路径起点位置");
// }
// catch (Exception restoreEx)
// {
// LogManager.Error($"恢复物体到路径起点失败: {restoreEx.Message}");
// }
// }
// 恢复物体到碰撞检测前的状态
if (animatedObject != null && IsModelItemValid(animatedObject))
{
PathAnimationManager.GetInstance().RestoreObjectState(animatedObject);
}
// 检查是否成功创建了主测试
var finalMainTest = _documentClash.TestsData.Tests.FirstOrDefault(t => t.DisplayName.Contains("碰撞检测")) as ClashTest;