优化ClashDetective碰撞结果处理逻辑,直接使用移动物体本身作为Item1,并按碰撞对象去重,确保结果准确性
This commit is contained in:
parent
8398f0530a
commit
6f5afdd50b
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user