优化ClashDetective碰撞结果处理逻辑,直接使用移动物体本身作为Item1,并按碰撞对象去重,确保结果准确性

This commit is contained in:
tian 2026-01-22 22:48:50 +08:00
parent 8398f0530a
commit 6f5afdd50b

View File

@ -769,14 +769,19 @@ namespace NavisworksTransport
LogManager.Info($"[分组测试] ClashDetective检测完成: 确认碰撞 {confirmedCount} 组, 跳过 {skippedCount} 个冗余检测点");
// 第三步:处理碰撞结果
// 🔥 重要ClashDetective 返回的是几何体级别的碰撞结果,需要向上查找有意义的父级容器
// 🔥 重要ClashDetective 返回的是几何体级别的碰撞结果
// Item1 是移动物体的组件名(如"车轮1"、"车轮2"),需要统一为移动物体本身
// Item2 是被撞物体,需要向上查找有意义的父级容器
var clashResults = new List<CollisionResult>();
foreach (var child in collisionGroup.Children)
{
if (child is ClashResult clashResult)
{
// 向上查找有意义的父级容器
var compositeItem1 = ModelItemAnalysisHelper.FindNamedParentContainer(clashResult.Item1);
// 🔥 修改Item1 直接使用移动物体本身animatedObject
// 原因ClashDetective 返回的是组件名,需要统一为移动物体本身,这样才有重复的记录可以合并
var compositeItem1 = animatedObject; // 直接使用移动物体本身
// Item2 保持现有逻辑:向上查找有意义的父级容器
var compositeItem2 = ModelItemAnalysisHelper.FindNamedParentContainer(clashResult.Item2);
var collisionResult = new CollisionResult
@ -784,8 +789,8 @@ namespace NavisworksTransport
ClashGuid = clashResult.Guid,
DisplayName = clashResult.DisplayName,
Status = clashResult.Status,
Item1 = compositeItem1,
Item2 = compositeItem2,
Item1 = compositeItem1, // 移动物体本身
Item2 = compositeItem2, // 被撞物体的父级容器
Center = clashResult.Center,
Distance = clashResult.Distance,
CreatedTime = DateTime.Now
@ -794,12 +799,21 @@ namespace NavisworksTransport
}
}
// 缓存结果
// 🔥 新增:按碰撞对象对去重
// 原因:同一个移动物体与同一个被撞物体的多个组件碰撞,需要合并为一个记录
var finalClashResults = clashResults
.GroupBy(c => new { Item1 = c.Item1, Item2 = c.Item2 })
.Select(g => g.First())
.ToList();
LogManager.Info($"[最终去重] ClashDetective结果去重: {clashResults.Count} 个碰撞 -> {finalClashResults.Count} 个唯一碰撞对");
// 缓存最终结果
lock (_clashResultsCacheLock)
{
_clashDetectiveResultsCache[_currentTestName] = clashResults;
_clashDetectiveResultsCache[_currentTestName] = finalClashResults;
}
LogManager.Info($"已缓存ClashDetective结果{clashResults.Count}个碰撞,测试名称:{_currentTestName}");
LogManager.Info($"已缓存ClashDetective结果{finalClashResults.Count}个碰撞,测试名称:{_currentTestName}");
// 更新碰撞计数器
_clashDetectiveCollisionCount = clashResults.Count;