From 84e5abf592c1f87b892ff1b603b857cc49e26612 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Fri, 6 Feb 2026 21:49:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=89=A9=E4=BD=93=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E4=BF=9D=E5=AD=98=E4=B8=8E=E6=81=A2=E5=A4=8D=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=9B=E5=9C=A8=E7=A2=B0=E6=92=9E=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E5=89=8D=E5=90=8E=E5=B0=86=E7=89=A9=E4=BD=93=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E5=88=B0=E7=BB=88=E7=82=B9=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Core/Animation/PathAnimationManager.cs | 100 +++++++++++++++--- .../Collision/ClashDetectiveIntegration.cs | 24 ++--- 2 files changed, 99 insertions(+), 25 deletions(-) diff --git a/src/Core/Animation/PathAnimationManager.cs b/src/Core/Animation/PathAnimationManager.cs index a375b7c..8ab4606 100644 --- a/src/Core/Animation/PathAnimationManager.cs +++ b/src/Core/Animation/PathAnimationManager.cs @@ -159,6 +159,11 @@ namespace NavisworksTransport.Core.Animation // === 调试辅助 === private static HashSet _arcInfoPrinted = new HashSet(); // 记录已打印信息的圆弧段索引 + // === 物体状态保存和恢复 === + private Point3D _savedObjectPosition; + private double _savedObjectYaw; + private bool _hasSavedObjectState = false; + /// /// 当前正在进行动画的对象 /// @@ -2166,6 +2171,89 @@ namespace NavisworksTransport.Core.Animation /// public int TotalFrames => _animationFrames?.Count ?? 0; + /// + /// 获取物体当前位置和朝向 + /// + 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); + } + + /// + /// 保存物体当前位置和朝向 + /// + 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}"); + } + } + + /// + /// 恢复物体到保存的位置和朝向 + /// + 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}"); + } + } + /// /// 获取播放方向(1=正向,-1=反向) /// @@ -2418,18 +2506,6 @@ namespace NavisworksTransport.Core.Animation } } - /// - /// 验证动画对象是否有效 - /// - private bool IsAnimatedObjectValid() - { - if (_animatedObject == null) - return false; - - // 使用DocumentStateManager验证 - return DocumentStateManager.Instance.IsModelItemValid(_animatedObject); - } - /// /// 文档失效事件处理 /// diff --git a/src/Core/Collision/ClashDetectiveIntegration.cs b/src/Core/Collision/ClashDetectiveIntegration.cs index c342611..c929655 100644 --- a/src/Core/Collision/ClashDetectiveIntegration.cs +++ b/src/Core/Collision/ClashDetectiveIntegration.cs @@ -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;