From 6f5afdd50b2664685f94aeb348917d00a5df8e37 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Thu, 22 Jan 2026 22:48:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96ClashDetective=E7=A2=B0?= =?UTF-8?q?=E6=92=9E=E7=BB=93=E6=9E=9C=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E7=9B=B4=E6=8E=A5=E4=BD=BF=E7=94=A8=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E7=89=A9=E4=BD=93=E6=9C=AC=E8=BA=AB=E4=BD=9C=E4=B8=BAItem1?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E6=8C=89=E7=A2=B0=E6=92=9E=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E5=8E=BB=E9=87=8D=EF=BC=8C=E7=A1=AE=E4=BF=9D=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E5=87=86=E7=A1=AE=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Collision/ClashDetectiveIntegration.cs | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/Core/Collision/ClashDetectiveIntegration.cs b/src/Core/Collision/ClashDetectiveIntegration.cs index 54a43e6..7acd9b1 100644 --- a/src/Core/Collision/ClashDetectiveIntegration.cs +++ b/src/Core/Collision/ClashDetectiveIntegration.cs @@ -769,14 +769,19 @@ namespace NavisworksTransport LogManager.Info($"[分组测试] ClashDetective检测完成: 确认碰撞 {confirmedCount} 组, 跳过 {skippedCount} 个冗余检测点"); // 第三步:处理碰撞结果 - // 🔥 重要:ClashDetective 返回的是几何体级别的碰撞结果,需要向上查找有意义的父级容器 + // 🔥 重要:ClashDetective 返回的是几何体级别的碰撞结果 + // Item1 是移动物体的组件名(如"车轮1"、"车轮2"),需要统一为移动物体本身 + // Item2 是被撞物体,需要向上查找有意义的父级容器 var clashResults = new List(); 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;