From d1ae5c83f4cbede7029a9786711dbcd939cbf88c Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Wed, 28 Jan 2026 17:04:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A0=E7=A2=B0=E6=92=9E=E4=B9=9F=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E6=95=B0=E6=8D=AE=E5=BA=93=EF=BC=8C=E7=94=9F=E6=88=90?= =?UTF-8?q?=E7=A2=B0=E6=92=9E=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Core/Animation/PathAnimationManager.cs | 58 ++++--- .../Collision/ClashDetectiveIntegration.cs | 142 ++++++++---------- .../ViewModels/AnimationControlViewModel.cs | 16 -- 3 files changed, 91 insertions(+), 125 deletions(-) diff --git a/src/Core/Animation/PathAnimationManager.cs b/src/Core/Animation/PathAnimationManager.cs index 308d1cd..b0ad93c 100644 --- a/src/Core/Animation/PathAnimationManager.cs +++ b/src/Core/Animation/PathAnimationManager.cs @@ -1519,42 +1519,36 @@ namespace NavisworksTransport.Core.Animation // 检查此动画配置是否已经进行过碰撞检测 if (!_completedCollisionTests.Contains(_currentAnimationHash)) { - if (_allCollisionResults.Count > 0) + LogManager.Info($"此动画配置首次完成,开始创建碰撞测试汇总(基于 {_allCollisionResults.Count} 个预计算碰撞记录)..."); + + // 🔥 设置等待光标,避免进度条关闭后的无响应 + var oldCursor = System.Windows.Input.Mouse.OverrideCursor; + System.Windows.Input.Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait; + + try { - LogManager.Info($"此动画配置首次完成,开始创建碰撞测试汇总(基于 {_allCollisionResults.Count} 个预计算碰撞记录)..."); - - // 🔥 设置等待光标,避免进度条关闭后的无响应 - var oldCursor = System.Windows.Input.Mouse.OverrideCursor; - System.Windows.Input.Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait; - - try - { - // 🔥 使用用户设置的检测容差(米) - ClashDetectiveIntegration.Instance.CreateAllAnimationCollisionTests( - _allCollisionResults, - _detectionTolerance, - _pathName, - _currentRouteId, - _animatedObject, - _isVirtualVehicle, - _animationFrameRate, - _animationDuration, - _virtualVehicleLength, - _virtualVehicleWidth, - _virtualVehicleHeight, - _pathPoints - ); - } - finally - { - // 恢复光标 - System.Windows.Input.Mouse.OverrideCursor = oldCursor; - } + // 🔥 使用用户设置的检测容差(米) + ClashDetectiveIntegration.Instance.CreateAllAnimationCollisionTests( + _allCollisionResults, + _detectionTolerance, + _pathName, + _currentRouteId, + _animatedObject, + _isVirtualVehicle, + _animationFrameRate, + _animationDuration, + _virtualVehicleLength, + _virtualVehicleWidth, + _virtualVehicleHeight, + _pathPoints + ); } - else + finally { - LogManager.Info("无碰撞数据,跳过碰撞测试创建"); + // 恢复光标 + System.Windows.Input.Mouse.OverrideCursor = oldCursor; } + _completedCollisionTests.Add(_currentAnimationHash); // 记录此配置已完成碰撞检测 LogManager.Info($"碰撞测试汇总已创建并记录,此配置后续播放将跳过碰撞检测"); } diff --git a/src/Core/Collision/ClashDetectiveIntegration.cs b/src/Core/Collision/ClashDetectiveIntegration.cs index 6db70d5..acec555 100644 --- a/src/Core/Collision/ClashDetectiveIntegration.cs +++ b/src/Core/Collision/ClashDetectiveIntegration.cs @@ -500,12 +500,6 @@ namespace NavisworksTransport IsModelItemValid(collision.Item2) ).ToList(); - if (validCollisions.Count == 0) - { - LogManager.Warning("[ClashDetective] 没有有效的碰撞可以创建测试"); - return (null, null, 0); - } - LogManager.Info($"[ClashDetective] 有效碰撞数量: {validCollisions.Count}"); // 第一步:创建主测试(不包含选择集,纯容器) @@ -535,6 +529,29 @@ namespace NavisworksTransport return (null, null, 0); } + // 如果没有有效碰撞,直接保存空记录并返回 + if (validCollisions.Count == 0) + { + LogManager.Warning("[ClashDetective] 没有有效的碰撞,保存空碰撞记录"); + + // 保存到数据库 + SaveClashDetectiveResultToDatabase( + pathName, + routeId, + new List(), + frameRate, + duration, + detectionGap, + animatedObject, + isVirtualVehicle, + virtualVehicleLength, + virtualVehicleWidth, + virtualVehicleHeight + ); + + return (null, addedMainTest, 0); + } + // 第二步:创建分组并添加碰撞结果(应用智能去重) // 1. 分组:按碰撞对象对分组 var groupedCollisions = validCollisions @@ -774,58 +791,46 @@ namespace NavisworksTransport { try { - LogManager.Info($"=== 使用预计算碰撞数据创建ClashDetective测试(容差: {detectionGap}米) ==="); - - if (_documentClash == null || precomputedCollisions == null || precomputedCollisions.Count == 0) - { - LogManager.Info($"无预计算碰撞数据需要处理 - _documentClash: {_documentClash != null}, precomputedCollisions: {precomputedCollisions?.Count ?? 0}"); - return; - } - - LogManager.Info($"[预计算数据] 共有 {precomputedCollisions.Count} 个碰撞记录"); - - // 直接使用所有预计算结果,只过滤有效对象(不去重) - var collisionResults = precomputedCollisions - .Where(result => IsModelItemValid(result.Item1) && IsModelItemValid(result.Item2)) - .ToList(); - - if (collisionResults.Count == 0) - { - LogManager.Warning("没有有效的预计算碰撞可以创建测试"); - return; - } - - // 记录动画过程中的碰撞数量 - _animationCollisionCount = collisionResults.Count; - LogManager.Info($"[预计算处理] 原始记录: {precomputedCollisions.Count},有效碰撞: {_animationCollisionCount}"); - - // 获取动画对象 - if (collisionResults.Count > 0) - { - animatedObject = collisionResults[0].Item1; - } - - var doc = Application.ActiveDocument; - - // 调用公共方法运行ClashDetective测试并保存到数据库 - Progress progress = Application.BeginProgress("碰撞检测数据分析中,请稍候..."); - ClashTest addedMainTest = null; - ClashResultGroup collisionGroup = null; - int confirmedCount = 0; - - try - { - var result = RunClashDetectiveTestsAndSaveToDatabase( - precomputedCollisions, - detectionGap, - pathName, - routeId, - animatedObject, - isVirtualVehicle, - frameRate, - duration, - virtualVehicleLength, - virtualVehicleWidth, + LogManager.Info($"=== 使用预计算碰撞数据创建ClashDetective测试(容差: {detectionGap}米)==="); + + LogManager.Info($"[预计算数据] 共有 {precomputedCollisions.Count} 个碰撞记录"); + + // 直接使用所有预计算结果,只过滤有效对象(不去重) + var collisionResults = precomputedCollisions + .Where(result => IsModelItemValid(result.Item1) && IsModelItemValid(result.Item2)) + .ToList(); + + // 记录动画过程中的碰撞数量 + _animationCollisionCount = collisionResults.Count; + LogManager.Info($"[预计算处理] 原始记录: {precomputedCollisions.Count},有效碰撞: {_animationCollisionCount}"); + + // 获取动画对象 + if (collisionResults.Count > 0) + { + animatedObject = collisionResults[0].Item1; + } + + var doc = Application.ActiveDocument; + + // 调用公共方法运行ClashDetective测试并保存到数据库 + Progress progress = Application.BeginProgress("碰撞检测数据分析中,请稍候..."); + ClashTest addedMainTest = null; + ClashResultGroup collisionGroup = null; + int confirmedCount = 0; + + try + { + var result = RunClashDetectiveTestsAndSaveToDatabase( + precomputedCollisions, + detectionGap, + pathName, + routeId, + animatedObject, + isVirtualVehicle, + frameRate, + duration, + virtualVehicleLength, + virtualVehicleWidth, virtualVehicleHeight, progress ); @@ -1534,28 +1539,11 @@ namespace NavisworksTransport { LogManager.Info($"[批处理] 使用预计算碰撞数据创建ClashDetective测试(容差: {detectionGap}米)"); - if (_documentClash == null || precomputedCollisions == null || precomputedCollisions.Count == 0) - { - LogManager.Info($"[批处理] 无预计算碰撞数据需要处理"); - return null; - } - LogManager.Info($"[批处理] 共有 {precomputedCollisions.Count} 个碰撞记录"); - // 过滤有效的碰撞 - var validCollisions = precomputedCollisions - .Where(collision => IsModelItemValid(collision.Item1) && IsModelItemValid(collision.Item2)) - .ToList(); - - if (validCollisions.Count == 0) - { - LogManager.Warning("[批处理] 没有有效的预计算碰撞可以创建测试"); - return null; - } - // 记录动画过程中的碰撞数量 - _animationCollisionCount = validCollisions.Count; - LogManager.Info($"[批处理] 原始记录: {precomputedCollisions.Count},有效碰撞: {_animationCollisionCount}"); + _animationCollisionCount = precomputedCollisions.Count; + LogManager.Info($"[批处理] 预计算碰撞: {_animationCollisionCount}"); // 调用公共方法运行ClashDetective测试并保存到数据库 var result = RunClashDetectiveTestsAndSaveToDatabase( diff --git a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs index a103c4f..9c4503d 100644 --- a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs +++ b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs @@ -1586,22 +1586,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels var animationManager = Core.Animation.PathAnimationManager.GetInstance(); var hasAnimationCollisions = animationManager?.AllCollisionResults?.Count > 0; - // 如果当前动画没有碰撞数据,但CurrentTestName存在,说明是旧数据 - // 需要清空CurrentTestName,避免使用上一次的测试数据 - if (!hasAnimationCollisions && !string.IsNullOrEmpty(_clashIntegration?.CurrentTestName)) - { - LogManager.Info("当前动画无碰撞数据,清空ClashDetectiveIntegration的CurrentTestName"); - _clashIntegration.ClearCurrentTestName(); - } - - // 如果没有测试名称,创建一个临时的测试名称(用于无碰撞情况) - if (string.IsNullOrEmpty(_clashIntegration?.CurrentTestName)) - { - var tempTestName = $"无碰撞_{DateTime.Now:yyyyMMdd_HHmmss}"; - LogManager.Info($"创建临时测试名称用于无碰撞报告: {tempTestName}"); - _clashIntegration.SetCurrentTestName(tempTestName); - } - // 统一使用GenerateCollisionReportCommand生成报告(无论有无碰撞) UpdateMainStatus($"正在生成碰撞报告...", -1, true);