新增物体状态保存与恢复功能;在碰撞检测前后将物体恢复到终点位置
This commit is contained in:
parent
6be1de113e
commit
84e5abf592
@ -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>
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user