用标准的ClashDetective的API重新碰撞部分。

This commit is contained in:
tian 2025-09-04 19:26:51 +08:00
parent 41cac3dedd
commit ca3a1e5ccf
5 changed files with 3372 additions and 689 deletions

View File

@ -69,6 +69,65 @@
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\doc\\navisworks_api\\NET\\examples\\PlugIns\\ClashDetective\\SimpleUI/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\doc\\navisworks_api\\NET\\examples\\PlugIns\\ClashDetective\\SimpleUI/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\doc\\navisworks_api\\NET\\examples\\PlugIns\\ClashDetective\\ClashGrouper/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\doc\\navisworks_api\\NET\\examples\\PlugIns\\ClashDetective\\ClashGrouper/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\doc\\navisworks_api\\NET\\examples\\PlugIns\\ClashDetective\\ClashGrouper/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Commands/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Commands/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Commands/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Commands/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Commands/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Commands/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Commands/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Commands/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Commands/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Commands/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\UI\\WPF\\ViewModels/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Commands/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Commands/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\doc\\navisworks_api\\NET\\documentation\\NET API\\html/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\doc\\navisworks_api\\NET\\examples\\PlugIns\\ClashDetective\\ClashGrouper/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)",
"Read(/C:\\Users\\Tellme\\apps\\NavisworksTransport\\src\\Core\\Collision/**)"
],
"deny": [],

View File

@ -116,9 +116,10 @@ namespace NavisworksTransport.Commands
var collisionData = CollectAllCollisionData();
result.AllCollisions = collisionData.AllCollisions;
// 直接使用收集到的统计数字,无需参数传递!
result.AnimationCollisions = collisionData.BoundingBoxTestCount; // 包围盒测试数量
result.IndependentCollisions = collisionData.ClashDetectiveCollisionCount; // Clash Detective结果数量
// 🔧 修复:使用正确的统计数据源
var clashIntegration = ClashDetectiveIntegration.Instance;
result.AnimationCollisions = clashIntegration?.AnimationCollisionCount ?? 0; // 动画过程缓存的碰撞数量
result.IndependentCollisions = collisionData.ClashDetectiveCollisionCount; // Clash Detective权威结果数量
result.TotalCollisions = collisionData.ClashDetectiveCollisionCount; // 总数以权威结果为准
result.MovingObjectInfo = collisionData.MovingObjectInfo; // 运动物体信息
@ -200,24 +201,45 @@ namespace NavisworksTransport.Commands
return result;
}
int animationTestCount = 0; // 包围盒测试数量
int totalCollisionCount = 0; // Clash Detective总碰撞数
// 遍历所有测试,区分动画测试和统计信息
foreach (var test in documentClash.TestsData.Tests)
// 🔧 修复:只统计最新的物流路径碰撞汇总测试,避免重复累积
var latestTest = documentClash.TestsData.Tests.Cast<ClashTest>()
.Where(t => t.DisplayName.StartsWith("物流路径碰撞汇总_"))
.OrderByDescending(t => t.DisplayName)
.FirstOrDefault();
if (latestTest != null)
{
if (test is ClashTest clashTest)
LogManager.Info($"找到最新的物流路径测试: {latestTest.DisplayName}");
// 提取最新测试的碰撞数据
var testCollisions = ExtractCollisionsFromTest(latestTest);
allCollisions.AddRange(testCollisions);
// 统计最新测试的碰撞总数
totalCollisionCount = GetTotalClashResultCountFromTest(latestTest);
LogManager.Debug($"最新测试 '{latestTest.DisplayName}' 包含 {totalCollisionCount} 个碰撞");
}
else
{
LogManager.Info("未找到物流路径碰撞汇总测试");
// 备用方案:收集所有动画相关测试(兼容旧版本)
foreach (var test in documentClash.TestsData.Tests)
{
var testCollisions = ExtractCollisionsFromTest(clashTest);
allCollisions.AddRange(testCollisions);
// 统计信息:如果是动画相关测试,记录包围盒测试数量
if (clashTest.DisplayName.Contains("动画路径碰撞"))
if (test is ClashTest clashTest)
{
animationTestCount = documentClash.TestsData.Tests.Cast<ClashTest>()
.Where(t => t.DisplayName.Contains("动画路径碰撞"))
.Count();
totalCollisionCount += clashTest.Children.Count;
if (clashTest.DisplayName.Contains("动画路径碰撞") ||
clashTest.DisplayName.Contains("动画碰撞"))
{
var testCollisions = ExtractCollisionsFromTest(clashTest);
allCollisions.AddRange(testCollisions);
var testTotalCount = GetTotalClashResultCountFromTest(clashTest);
totalCollisionCount += testTotalCount;
LogManager.Debug($"备用统计 - 测试 '{clashTest.DisplayName}' 包含 {testTotalCount} 个碰撞");
}
}
}
}
@ -229,10 +251,10 @@ namespace NavisworksTransport.Commands
.ToList();
result.AllCollisions = uniqueCollisions;
result.BoundingBoxTestCount = animationTestCount;
result.ClashDetectiveCollisionCount = totalCollisionCount > 0 ? totalCollisionCount : uniqueCollisions.Count;
result.BoundingBoxTestCount = 0; // 不再在这里统计由ClashDetectiveIntegration提供
result.ClashDetectiveCollisionCount = totalCollisionCount;
LogManager.Info($"收集完成 - 包围盒测试: {result.BoundingBoxTestCount}个, Clash Detective: {result.ClashDetectiveCollisionCount}个, 去重后碰撞: {uniqueCollisions.Count}个");
LogManager.Info($"收集完成 - Clash Detective权威结果: {result.ClashDetectiveCollisionCount}个, 去重后碰撞对象: {uniqueCollisions.Count}个");
return result;
}
@ -304,6 +326,58 @@ namespace NavisworksTransport.Commands
return results;
}
/// <summary>
/// 递归统计测试中的碰撞结果总数(包括分组内的结果)
/// </summary>
/// <param name="test">要统计的测试</param>
/// <returns>碰撞结果总数</returns>
private int GetTotalClashResultCountFromTest(ClashTest test)
{
if (test == null) return 0;
int totalCount = 0;
foreach (var child in test.Children)
{
if (child is ClashResult)
{
totalCount++;
}
else if (child is ClashResultGroup group)
{
// 递归统计分组内的结果
totalCount += CountClashResultsInGroup(group);
}
}
return totalCount;
}
/// <summary>
/// 递归统计分组内的碰撞结果数量
/// </summary>
/// <param name="group">分组</param>
/// <returns>分组内的碰撞结果总数</returns>
private int CountClashResultsInGroup(ClashResultGroup group)
{
if (group == null) return 0;
int count = 0;
foreach (var child in group.Children)
{
if (child is ClashResult)
{
count++;
}
else if (child is ClashResultGroup nestedGroup)
{
// 递归处理嵌套分组
count += CountClashResultsInGroup(nestedGroup);
}
}
return count;
}
/// <summary>
/// 生成报告内容
/// </summary>
@ -331,9 +405,12 @@ namespace NavisworksTransport.Commands
// 总体统计
report.AppendLine("=== 总体统计 ===");
// 使用收集到的统计数字
report.AppendLine($"包围盒测试发现: {collisionData.BoundingBoxTestCount}个碰撞 (快速粗略检测结果)");
report.AppendLine($"Clash Detective确认: {collisionData.ClashDetectiveCollisionCount}个碰撞 (精确权威检测结果)");
// 🔧 修复:获取正确的动画碰撞数量
var clashIntegration = ClashDetectiveIntegration.Instance;
var animationCollisionCount = clashIntegration?.AnimationCollisionCount ?? 0;
report.AppendLine($"动画过程检测: {animationCollisionCount}个碰撞 (包围盒快速检测结果)");
report.AppendLine($"Clash Detective权威结果: {collisionData.ClashDetectiveCollisionCount}个碰撞 (精确几何体检测结果)");
report.AppendLine($"总碰撞数量: {collisionData.ClashDetectiveCollisionCount}个 (以权威结果为准)");
report.AppendLine();

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1271,26 +1271,32 @@ namespace NavisworksTransport.UI.WPF.ViewModels
PathName = CurrentPathRoute?.Name ?? "未知路径"
};
// 获取所有动画相关的碰撞测试
// 获取所有动画相关的碰撞测试(包括新的分组测试)
var animationTests = documentClash.TestsData.Tests.Cast<ClashTest>()
.Where(t => t.DisplayName.Contains("动画路径碰撞"))
.Where(t => t.DisplayName.Contains("动画路径碰撞") ||
t.DisplayName.Contains("物流路径碰撞汇总") ||
t.DisplayName.Contains("动画碰撞"))
.ToList();
LogManager.Info($"找到 {animationTests.Count} 个动画碰撞测试");
foreach (var test in animationTests)
{
// 递归统计测试中的碰撞总数(包括分组内的)
var totalCollisionCount = GetTotalClashResultCountForReport(test);
var testInfo = new CollisionTestInfo
{
TestName = test.DisplayName,
TestType = test.TestType.ToString(),
Tolerance = test.Tolerance,
CollisionCount = test.Children.Count,
CollisionCount = totalCollisionCount,
Status = test.Status.ToString()
};
// 获取每个碰撞的详细信息
foreach (var clashResult in test.Children.Cast<ClashResult>())
// 递归获取每个碰撞的详细信息(包括分组内的)
var allClashResults = GetAllClashResultsFromTest(test);
foreach (var clashResult in allClashResults)
{
var collision = new CollisionDetailInfo
{
@ -1352,8 +1358,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels
{
if (reportData.IsValid)
{
// 直接使用报告数据统计
CollisionSummary = $"动画检测: {reportData.TotalTests}个 | Clash Detective权威结果: {reportData.TotalCollisions}个";
// 🔧 修复:显示动画过程缓存的碰撞数量,而非测试数量
var animationCollisionCount = _clashIntegration?.AnimationCollisionCount ?? 0;
CollisionSummary = $"动画碰撞: {animationCollisionCount}个 | Clash Detective权威结果: {reportData.TotalCollisions}个";
}
else
{
@ -1573,6 +1580,102 @@ namespace NavisworksTransport.UI.WPF.ViewModels
}
}
/// <summary>
/// 递归统计测试中的碰撞结果总数(包括分组内的结果)- 用于报告
/// </summary>
private int GetTotalClashResultCountForReport(ClashTest test)
{
if (test == null) return 0;
int totalCount = 0;
foreach (var child in test.Children)
{
if (child is ClashResult)
{
totalCount++;
}
else if (child is ClashResultGroup group)
{
// 递归统计分组内的结果
totalCount += CountClashResultsInGroupForReport(group);
}
}
return totalCount;
}
/// <summary>
/// 递归统计分组内的碰撞结果数量 - 用于报告
/// </summary>
private int CountClashResultsInGroupForReport(ClashResultGroup group)
{
if (group == null) return 0;
int count = 0;
foreach (var child in group.Children)
{
if (child is ClashResult)
{
count++;
}
else if (child is ClashResultGroup nestedGroup)
{
// 递归处理嵌套分组
count += CountClashResultsInGroupForReport(nestedGroup);
}
}
return count;
}
/// <summary>
/// 递归获取测试中的所有碰撞结果(包括分组内的)- 用于报告
/// </summary>
private List<ClashResult> GetAllClashResultsFromTest(ClashTest test)
{
var results = new List<ClashResult>();
if (test == null) return results;
foreach (var child in test.Children)
{
if (child is ClashResult result)
{
results.Add(result);
}
else if (child is ClashResultGroup group)
{
// 递归获取分组内的结果
results.AddRange(GetAllClashResultsFromGroup(group));
}
}
return results;
}
/// <summary>
/// 递归获取分组内的所有碰撞结果 - 用于报告
/// </summary>
private List<ClashResult> GetAllClashResultsFromGroup(ClashResultGroup group)
{
var results = new List<ClashResult>();
if (group == null) return results;
foreach (var child in group.Children)
{
if (child is ClashResult result)
{
results.Add(result);
}
else if (child is ClashResultGroup nestedGroup)
{
// 递归处理嵌套分组
results.AddRange(GetAllClashResultsFromGroup(nestedGroup));
}
}
return results;
}
#endregion
}
}