用标准的ClashDetective的API重新碰撞部分。
This commit is contained in:
parent
41cac3dedd
commit
ca3a1e5ccf
@ -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": [],
|
||||
|
||||
@ -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
2788
src/Core/Collision/ClashDetectiveIntegration_copy.cs
Normal file
2788
src/Core/Collision/ClashDetectiveIntegration_copy.cs
Normal file
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user