修改碰撞检测报告的统计数据,解决被撞构件去重的问题

This commit is contained in:
tian 2025-09-15 11:20:58 +08:00
parent 30d89b8ad7
commit 387ec332fc
3 changed files with 340 additions and 86 deletions

View File

@ -64,6 +64,9 @@ namespace NavisworksTransport.Commands
public int BoundingBoxTestCount { get; set; } // 包围盒测试数量
public int ClashDetectiveCollisionCount { get; set; } // Clash Detective结果数量
public string MovingObjectInfo { get; set; } = string.Empty;
// 新增:被撞物体去重统计
public HashSet<string> UniqueCollidedObjects { get; set; } = new HashSet<string>();
}
/// <summary>
@ -73,11 +76,15 @@ namespace NavisworksTransport.Commands
{
public string ReportContent { get; set; }
public int TotalCollisions { get; set; }
public int AnimationCollisions { get; set; }
public int IndependentCollisions { get; set; }
public int AnimationCollisions { get; set; } // 检测点数量
public int IndependentCollisions { get; set; } // 内部使用
public List<CollisionResult> AllCollisions { get; set; } = new List<CollisionResult>();
public long GenerationTimeMs { get; set; }
public string MovingObjectInfo { get; set; } = string.Empty;
// 新增:被撞物体清单
public List<string> CollidedObjectsList { get; set; } = new List<string>();
public int UniqueCollidedObjectsCount { get; set; }
}
/// <summary>
@ -116,12 +123,16 @@ namespace NavisworksTransport.Commands
var collisionData = CollectAllCollisionData();
result.AllCollisions = collisionData.AllCollisions;
// 🔧 修复:使用正确的统计数据源
// 修改统计数据
var clashIntegration = ClashDetectiveIntegration.Instance;
result.AnimationCollisions = clashIntegration?.AnimationCollisionCount ?? 0; // 动画过程缓存的碰撞数量
result.IndependentCollisions = collisionData.ClashDetectiveCollisionCount; // Clash Detective权威结果数量
result.TotalCollisions = collisionData.ClashDetectiveCollisionCount; // 总数以权威结果为准
result.MovingObjectInfo = collisionData.MovingObjectInfo; // 运动物体信息
result.AnimationCollisions = clashIntegration?.AnimationCollisionCount ?? 0; // 检测点数量
result.IndependentCollisions = collisionData.ClashDetectiveCollisionCount;
result.TotalCollisions = collisionData.ClashDetectiveCollisionCount;
result.MovingObjectInfo = collisionData.MovingObjectInfo;
// 新增:被撞物体清单
result.CollidedObjectsList = collisionData.UniqueCollidedObjects.OrderBy(x => x).ToList();
result.UniqueCollidedObjectsCount = collisionData.UniqueCollidedObjects.Count;
LogManager.Info($"碰撞报告计数 - 动画检测: {result.AnimationCollisions}, Clash Detective: {result.IndependentCollisions}, 总计: {result.TotalCollisions}");
@ -250,11 +261,48 @@ namespace NavisworksTransport.Commands
.Select(g => g.First())
.ToList();
// 新增:统计去重后的被撞物体
// 使用DictionaryModelItem作为键会自动调用Equals进行比较
var uniqueCollidedObjectsDict = new Dictionary<ModelItem, string>();
foreach (var collision in uniqueCollisions)
{
if (collision.Item2 != null)
{
// ModelItem作为字典的键会使用其Equals方法进行比较
if (!uniqueCollidedObjectsDict.ContainsKey(collision.Item2))
{
var item2Name = NavisworksApiHelper.GetModelItemNameWithAncestorFallback(collision.Item2);
uniqueCollidedObjectsDict[collision.Item2] = item2Name ?? "未知对象";
}
}
}
// 修复:保留所有碰撞对象,为相同名称的对象添加编号区分
var nameCountDict = new Dictionary<string, int>();
var uniqueCollidedObjectsList = new List<string>();
foreach (var name in uniqueCollidedObjectsDict.Values)
{
if (nameCountDict.ContainsKey(name))
{
nameCountDict[name]++;
uniqueCollidedObjectsList.Add($"{name} #{nameCountDict[name]}");
}
else
{
nameCountDict[name] = 1;
uniqueCollidedObjectsList.Add(name);
}
}
var uniqueCollidedObjectsSet = new HashSet<string>(uniqueCollidedObjectsList);
result.AllCollisions = uniqueCollisions;
result.BoundingBoxTestCount = 0; // 不再在这里统计由ClashDetectiveIntegration提供
result.UniqueCollidedObjects = uniqueCollidedObjectsSet;
result.BoundingBoxTestCount = 0;
result.ClashDetectiveCollisionCount = totalCollisionCount;
LogManager.Info($"收集完成 - Clash Detective权威结果: {result.ClashDetectiveCollisionCount}个, 去重后碰撞对象: {uniqueCollisions.Count}个");
LogManager.Info($"收集完成 - Clash Detective权威结果: {result.ClashDetectiveCollisionCount}个, 去重后碰撞对象: {uniqueCollisions.Count}个, 去重后被撞构件: {uniqueCollidedObjectsSet.Count}个");
return result;
}
@ -394,26 +442,42 @@ namespace NavisworksTransport.Commands
report.AppendLine("========================================");
report.AppendLine($"生成时间: {now:yyyy年MM月dd日 HH:mm:ss}");
report.AppendLine($"报告类型: {GetReportTypeName(reportType)}");
// 使用收集到的运动物体信息
// 运动构件信息(原运动物体信息)
if (!string.IsNullOrEmpty(collisionData.MovingObjectInfo))
{
report.AppendLine($"{collisionData.MovingObjectInfo}");
var movingInfo = collisionData.MovingObjectInfo.Replace("运动对象", "运动构件");
report.AppendLine($"{movingInfo}");
}
report.AppendLine();
// 总体统计
report.AppendLine("=== 总体统计 ===");
// 🔧 修复:获取正确的动画碰撞数量
var clashIntegration = ClashDetectiveIntegration.Instance;
var animationCollisionCount = clashIntegration?.AnimationCollisionCount ?? 0;
report.AppendLine($"动画过程检测: {animationCollisionCount}个碰撞 (包围盒快速检测结果)");
report.AppendLine($"Clash Detective权威结果: {collisionData.ClashDetectiveCollisionCount}个碰撞 (精确几何体检测结果)");
report.AppendLine($"总碰撞数量: {collisionData.ClashDetectiveCollisionCount}个 (以权威结果为准)");
report.AppendLine($"总碰撞数: {collisionData.ClashDetectiveCollisionCount}个");
report.AppendLine($"碰撞构件: {collisionData.UniqueCollidedObjects.Count}个");
report.AppendLine($"检测点: {animationCollisionCount}个");
report.AppendLine();
// 碰撞构件清单(新增)
if (collisionData.UniqueCollidedObjects?.Count > 0)
{
report.AppendLine("=== 碰撞构件清单 ===");
int index = 1;
foreach (var objName in collisionData.UniqueCollidedObjects.OrderBy(x => x).Take(20)) // 限制显示前20个
{
report.AppendLine($" {index}. {objName}");
index++;
}
if (collisionData.UniqueCollidedObjects.Count > 20)
{
report.AppendLine($" ... 还有 {collisionData.UniqueCollidedObjects.Count - 20} 个构件");
}
report.AppendLine();
}
// 按状态分类
var newCollisions = collisions.Where(c => c.Status == ClashResultStatus.New).ToList();
var activeCollisions = collisions.Where(c => c.Status == ClashResultStatus.Active).ToList();
@ -693,7 +757,7 @@ namespace NavisworksTransport.Commands
var item = selectedItems.First();
var displayName = item?.DisplayName ?? "未知对象";
LogManager.Debug($"[GetMovingObjectInfo] 单个对象名称: '{displayName}'");
return $"运动对象: {displayName}";
return $"运动构件: {displayName}";
}
else
{
@ -704,17 +768,17 @@ namespace NavisworksTransport.Commands
summary += $" 等{selectedItems.Count}个对象";
}
LogManager.Debug($"[GetMovingObjectInfo] 多个对象摘要: '{summary}'");
return $"运动对象: {summary}";
return $"运动构件: {summary}";
}
}
LogManager.Debug("[GetMovingObjectInfo] 未选择对象,返回默认信息");
return "运动对象: 物流运输对象 (建议先选择要运动的模型元素)";
return "运动构件: 物流运输对象 (建议先选择要运动的模型元素)";
}
catch (Exception ex)
{
LogManager.Error($"获取运动物体信息失败: {ex.Message}");
return "运动对象: 获取信息失败";
return "运动构件: 获取信息失败";
}
}

View File

@ -51,7 +51,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels
{
public int TotalCollisions { get; set; }
public int AnimationCollisions { get; set; }
public int IndependentCollisions { get; set; }
public int NewCollisions { get; set; }
public int ActiveCollisions { get; set; }
public int ReviewedCollisions { get; set; }
@ -72,7 +71,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels
private string _reportTitle;
private CollisionReportStatistics _statistics;
private ObservableCollection<CollisionReportItem> _animationCollisions;
private ObservableCollection<CollisionReportItem> _independentCollisions;
private string _progressMessage;
private int _progressPercentage;
private bool _isGenerating;
@ -80,6 +78,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels
private string _summaryMessage;
private string _recommendationMessage;
private string _movingObjectInfo;
private ObservableCollection<string> _collidedObjectsList;
private int _uniqueCollidedObjectsCount;
#endregion
@ -121,15 +121,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels
set => SetProperty(ref _animationCollisions, value);
}
/// <summary>
/// 独立检测碰撞列表
/// </summary>
public ObservableCollection<CollisionReportItem> IndependentCollisions
{
get => _independentCollisions;
set => SetProperty(ref _independentCollisions, value);
}
/// <summary>
/// 进度消息
@ -186,7 +177,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
}
/// <summary>
/// 运动物体信息
/// 运动构件信息
/// </summary>
public string MovingObjectInfo
{
@ -194,6 +185,24 @@ namespace NavisworksTransport.UI.WPF.ViewModels
set => SetProperty(ref _movingObjectInfo, value);
}
/// <summary>
/// 被撞物体清单
/// </summary>
public ObservableCollection<string> CollidedObjectsList
{
get => _collidedObjectsList;
set => SetProperty(ref _collidedObjectsList, value);
}
/// <summary>
/// 去重后的被撞物体总数
/// </summary>
public int UniqueCollidedObjectsCount
{
get => _uniqueCollidedObjectsCount;
set => SetProperty(ref _uniqueCollidedObjectsCount, value);
}
#endregion
#region
@ -226,8 +235,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels
{
// 初始化集合
AnimationCollisions = new ObservableCollection<CollisionReportItem>();
IndependentCollisions = new ObservableCollection<CollisionReportItem>();
CollidedObjectsList = new ObservableCollection<string>();
Statistics = new CollisionReportStatistics();
// 初始化命令
@ -268,11 +277,21 @@ namespace NavisworksTransport.UI.WPF.ViewModels
// 清空现有数据
AnimationCollisions.Clear();
IndependentCollisions.Clear();
CollidedObjectsList.Clear();
// 设置运动物体信息
// 设置运动构件信息
MovingObjectInfo = reportResult.MovingObjectInfo;
// 设置被撞物体清单和计数
UniqueCollidedObjectsCount = reportResult.UniqueCollidedObjectsCount;
if (reportResult.CollidedObjectsList != null)
{
foreach (var objName in reportResult.CollidedObjectsList)
{
CollidedObjectsList.Add(objName);
}
}
// 更新统计信息
UpdateStatistics(reportResult);
@ -329,7 +348,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels
{
TotalCollisions = reportResult.TotalCollisions,
AnimationCollisions = reportResult.AnimationCollisions,
IndependentCollisions = reportResult.IndependentCollisions,
GenerationTime = $"{reportResult.GenerationTimeMs}ms",
ReportType = "综合碰撞报告"
};
@ -353,20 +371,20 @@ namespace NavisworksTransport.UI.WPF.ViewModels
if (collisions == null || collisions.Count == 0)
return;
var independentList = new List<CollisionReportItem>();
var collisionItems = new List<CollisionReportItem>();
foreach (var collision in collisions)
{
var item = CreateCollisionReportItem(collision);
independentList.Add(item);
collisionItems.Add(item);
}
// 更新UI集合
SafeExecute(() =>
{
foreach (var item in independentList.OrderBy(i => i.Title))
IndependentCollisions.Add(item);
foreach (var item in collisionItems.OrderBy(i => i.Title))
AnimationCollisions.Add(item);
}, "更新碰撞报告项目列表", true);
}
@ -459,18 +477,10 @@ namespace NavisworksTransport.UI.WPF.ViewModels
"1. 调整路径规划,避开碰撞区域",
"2. 检查车辆尺寸和安全边距设置",
"3. 考虑增加临时障碍物标记",
"4. 重新评估物流流程设计"
"4. 重新评估物流流程设计",
"5. 建议进行更详细的碰撞检测分析"
};
if (reportResult.AnimationCollisions > reportResult.IndependentCollisions)
{
recommendations.Add("5. 动画过程碰撞较多,建议检查实时检测设置");
}
else if (reportResult.IndependentCollisions > reportResult.AnimationCollisions)
{
recommendations.Add("5. 独立检测发现更多碰撞,建议增强实时监控");
}
RecommendationMessage = string.Join("\n", recommendations);
}
}
@ -572,9 +582,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels
// 总体统计
report.AppendLine("=== 总体统计 ===");
report.AppendLine($"碰撞数: {Statistics.TotalCollisions}");
report.AppendLine($"动画检测碰撞(参考): {Statistics.AnimationCollisions}");
report.AppendLine($"ClashDetective检测碰撞: {Statistics.IndependentCollisions}");
report.AppendLine($"碰撞数: {Statistics.TotalCollisions}");
report.AppendLine($"碰撞构件: {UniqueCollidedObjectsCount}个");
report.AppendLine($"检测点: {Statistics.AnimationCollisions}个");
report.AppendLine();
// 按状态分类
@ -586,18 +596,34 @@ namespace NavisworksTransport.UI.WPF.ViewModels
report.AppendLine($"已解决: {Statistics.ResolvedCollisions}");
report.AppendLine();
// 运动物体信息
// 运动构件信息
if (!string.IsNullOrEmpty(MovingObjectInfo))
{
report.AppendLine($"{MovingObjectInfo}");
}
report.AppendLine();
// 被撞物体清单
if (CollidedObjectsList?.Count > 0)
{
report.AppendLine("=== 碰撞构件清单 ===");
int index = 1;
foreach (var objName in CollidedObjectsList.Take(20)) // 限制显示前20个
{
report.AppendLine($" {index}. {objName}");
index++;
}
if (CollidedObjectsList.Count > 20)
{
report.AppendLine($" ... 还有 {CollidedObjectsList.Count - 20} 个构件");
}
report.AppendLine();
}
// 详细碰撞信息
if (HasCollisions)
{
AddCollisionDetailsToTextReport(report, "动画过程碰撞", AnimationCollisions);
AddCollisionDetailsToTextReport(report, "独立检测碰撞", IndependentCollisions);
AddCollisionDetailsToTextReport(report, "碰撞详情", AnimationCollisions);
}
// 总结和建议
@ -643,21 +669,165 @@ namespace NavisworksTransport.UI.WPF.ViewModels
/// </summary>
private string GenerateHtmlReport()
{
// 简化的HTML报告生成
var html = new StringBuilder();
var now = DateTime.Now;
// HTML头部和样式
html.AppendLine("<!DOCTYPE html>");
html.AppendLine("<html><head><title>NavisworksTransport 碰撞报告</title>");
html.AppendLine("<style>body{font-family:Arial,sans-serif;margin:20px;} .summary{background:#f5f5f5;padding:15px;border-radius:5px;}</style>");
html.AppendLine("<html><head>");
html.AppendLine("<meta charset='UTF-8'>");
html.AppendLine("<title>NavisworksTransport 碰撞检测报告</title>");
html.AppendLine("<style>");
html.AppendLine("body { font-family: 'Microsoft YaHei', Arial, sans-serif; margin: 20px; line-height: 1.6; }");
html.AppendLine("h1 { color: #2c5aa0; text-align: center; border-bottom: 2px solid #2c5aa0; padding-bottom: 10px; }");
html.AppendLine("h2 { color: #2c5aa0; margin-top: 25px; }");
html.AppendLine(".summary { background: #f8fbff; padding: 15px; border-radius: 8px; margin: 15px 0; border-left: 4px solid #2c5aa0; }");
html.AppendLine(".stats-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; margin: 15px 0; }");
html.AppendLine(".stat-item { background: white; padding: 15px; border-radius: 6px; border: 1px solid #ddd; text-align: center; }");
html.AppendLine(".stat-label { font-size: 12px; color: #666; margin-bottom: 5px; }");
html.AppendLine(".stat-value { font-size: 18px; font-weight: bold; color: #2c5aa0; }");
html.AppendLine(".status-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; margin: 15px 0; }");
html.AppendLine(".status-item { background: #f9f9f9; padding: 10px; border-radius: 4px; text-align: center; font-size: 12px; }");
html.AppendLine(".moving-object { background: #f0f8ff; padding: 15px; border-radius: 8px; text-align: center; margin: 15px 0; border: 1px solid #b0d4f1; }");
html.AppendLine(".collided-list { background: #f8fbff; padding: 15px; border-radius: 8px; margin: 15px 0; max-height: 200px; overflow-y: auto; }");
html.AppendLine(".list-item { margin: 5px 0; padding: 5px; border-left: 3px solid #2c5aa0; padding-left: 10px; }");
html.AppendLine(".recommendation { background: #fff3cd; padding: 15px; border-radius: 8px; border-left: 4px solid #ffc107; margin: 15px 0; }");
html.AppendLine(".collision-item { background: white; margin: 10px 0; padding: 15px; border-radius: 6px; border: 1px solid #eee; }");
html.AppendLine(".collision-title { font-weight: bold; color: #333; margin-bottom: 8px; }");
html.AppendLine(".collision-status { display: inline-block; padding: 3px 8px; border-radius: 12px; font-size: 11px; color: white; margin-bottom: 8px; }");
html.AppendLine(".status-new { background-color: #ff6b6b; } .status-active { background-color: #ffa500; }");
html.AppendLine(".status-reviewed { background-color: #87ceeb; } .status-approved { background-color: #98fb98; } .status-resolved { background-color: #90ee90; }");
html.AppendLine("</style>");
html.AppendLine("</head><body>");
// 报告标题
html.AppendLine($"<h1>NavisworksTransport 碰撞检测报告</h1>");
html.AppendLine($"<p>生成时间: {DateTime.Now:yyyy年MM月dd日 HH:mm:ss}</p>");
html.AppendLine($"<div class='summary'><h2>总体统计</h2>");
html.AppendLine($"<p>总碰撞数量: {Statistics.TotalCollisions}</p>");
html.AppendLine($"<p>动画碰撞: {Statistics.AnimationCollisions}, 独立检测: {Statistics.IndependentCollisions}</p></div>");
html.AppendLine($"<p style='text-align: center; color: #666;'>生成时间: {now:yyyy年MM月dd日 HH:mm:ss}</p>");
html.AppendLine($"<p style='text-align: center; color: #666;'>报告类型: {Statistics.ReportType}</p>");
// 总体统计
html.AppendLine("<div class='summary'>");
html.AppendLine("<h2>总体统计</h2>");
html.AppendLine("<div class='stats-grid'>");
html.AppendLine("<div class='stat-item'>");
html.AppendLine("<div class='stat-label'>总碰撞数</div>");
html.AppendLine($"<div class='stat-value'>{Statistics.TotalCollisions}</div>");
html.AppendLine("</div>");
html.AppendLine("<div class='stat-item'>");
html.AppendLine("<div class='stat-label'>碰撞构件</div>");
html.AppendLine($"<div class='stat-value'>{UniqueCollidedObjectsCount}个</div>");
html.AppendLine("</div>");
html.AppendLine("<div class='stat-item'>");
html.AppendLine("<div class='stat-label'>检测点</div>");
html.AppendLine($"<div class='stat-value'>{Statistics.AnimationCollisions}个</div>");
html.AppendLine("</div>");
html.AppendLine("</div>");
html.AppendLine("</div>");
// 状态分布
html.AppendLine("<h2>状态分布</h2>");
html.AppendLine("<div class='status-grid'>");
html.AppendLine($"<div class='status-item'><strong>新发现</strong><br>{Statistics.NewCollisions}</div>");
html.AppendLine($"<div class='status-item'><strong>活跃</strong><br>{Statistics.ActiveCollisions}</div>");
html.AppendLine($"<div class='status-item'><strong>已审阅</strong><br>{Statistics.ReviewedCollisions}</div>");
html.AppendLine($"<div class='status-item'><strong>已批准</strong><br>{Statistics.ApprovedCollisions}</div>");
html.AppendLine($"<div class='status-item'><strong>已解决</strong><br>{Statistics.ResolvedCollisions}</div>");
html.AppendLine("</div>");
// 运动构件信息
if (!string.IsNullOrEmpty(MovingObjectInfo))
{
html.AppendLine("<h2>运动构件信息</h2>");
html.AppendLine("<div class='moving-object'>");
html.AppendLine($"<strong>🚛 {MovingObjectInfo}</strong>");
html.AppendLine("</div>");
}
// 碰撞构件清单
if (CollidedObjectsList?.Count > 0)
{
html.AppendLine("<h2>碰撞构件清单</h2>");
html.AppendLine("<div class='collided-list'>");
int index = 1;
foreach (var objName in CollidedObjectsList.Take(50)) // 限制显示前50个
{
html.AppendLine($"<div class='list-item'>{index}. {objName}</div>");
index++;
}
if (CollidedObjectsList.Count > 50)
{
html.AppendLine($"<div class='list-item'><em>... 还有 {CollidedObjectsList.Count - 50} 个构件</em></div>");
}
html.AppendLine("</div>");
}
// 总结与建议
html.AppendLine("<h2>总结与建议</h2>");
html.AppendLine("<div class='recommendation'>");
html.AppendLine($"<p><strong>{SummaryMessage}</strong></p>");
if (!string.IsNullOrEmpty(RecommendationMessage))
{
html.AppendLine("<p><strong>建议措施:</strong></p>");
var recommendations = RecommendationMessage.Split('\n');
html.AppendLine("<ul>");
foreach (var recommendation in recommendations)
{
if (!string.IsNullOrWhiteSpace(recommendation))
{
html.AppendLine($"<li>{recommendation}</li>");
}
}
html.AppendLine("</ul>");
}
html.AppendLine("</div>");
// 详细碰撞信息前10个
if (HasCollisions && AnimationCollisions?.Count > 0)
{
html.AppendLine("<h2>碰撞详情</h2>");
foreach (var collision in AnimationCollisions.Take(10))
{
html.AppendLine("<div class='collision-item'>");
html.AppendLine($"<div class='collision-title'>{collision.Title}</div>");
// 状态标签
var statusClass = GetStatusCssClass(collision.StatusText);
html.AppendLine($"<span class='collision-status {statusClass}'>{collision.StatusText}</span>");
html.AppendLine($"<p>{collision.Description}</p>");
html.AppendLine($"<p style='font-size: 11px; color: #666;'>{collision.Details}</p>");
html.AppendLine("</div>");
}
if (AnimationCollisions.Count > 10)
{
html.AppendLine($"<p><em>... 还有 {AnimationCollisions.Count - 10} 个碰撞未显示</em></p>");
}
}
// HTML结尾
html.AppendLine($"<hr style='margin: 30px 0;'>");
html.AppendLine($"<p style='text-align: center; color: #999; font-size: 12px;'>报告生成完成 - {now:HH:mm:ss}</p>");
html.AppendLine("</body></html>");
return html.ToString();
}
/// <summary>
/// 获取状态对应的CSS类名
/// </summary>
private string GetStatusCssClass(string statusText)
{
switch (statusText)
{
case "新发现": return "status-new";
case "活跃": return "status-active";
case "已审阅": return "status-reviewed";
case "已批准": return "status-approved";
case "已解决": return "status-resolved";
default: return "";
}
}
/// <summary>
/// 刷新报告
/// </summary>

View File

@ -208,8 +208,8 @@ NavisworksTransport 碰撞检测报告对话框 - 采用与主界面一致的Nav
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="动画碰撞" Style="{StaticResource StatisticLabelStyle}"/>
<TextBlock Grid.Row="1" Text="{Binding Statistics.AnimationCollisions}" Style="{StaticResource StatisticValueStyle}"/>
<TextBlock Grid.Row="0" Text="碰撞构件" Style="{StaticResource StatisticLabelStyle}"/>
<TextBlock Grid.Row="1" Text="{Binding UniqueCollidedObjectsCount}" Style="{StaticResource StatisticValueStyle}"/>
</Grid>
</Border>
<Border Style="{StaticResource StatisticItemStyle}">
@ -218,8 +218,8 @@ NavisworksTransport 碰撞检测报告对话框 - 采用与主界面一致的Nav
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="独立检测" Style="{StaticResource StatisticLabelStyle}"/>
<TextBlock Grid.Row="1" Text="{Binding Statistics.IndependentCollisions}" Style="{StaticResource StatisticValueStyle}"/>
<TextBlock Grid.Row="0" Text="检测" Style="{StaticResource StatisticLabelStyle}"/>
<TextBlock Grid.Row="1" Text="{Binding Statistics.AnimationCollisions}" Style="{StaticResource StatisticValueStyle}"/>
</Grid>
</Border>
</UniformGrid>
@ -259,20 +259,20 @@ NavisworksTransport 碰撞检测报告对话框 - 采用与主界面一致的Nav
</Border>
</UniformGrid>
<!-- 运动物体信息 -->
<Border Style="{StaticResource StatisticItemStyle}"
Margin="0,0,0,15"
Background="#FFF0F8FF"
<!-- 运动构件信息 -->
<Border Style="{StaticResource StatisticItemStyle}"
Margin="0,0,0,10"
Background="#FFF0F8FF"
BorderBrush="#FFB0D4F1">
<StackPanel HorizontalAlignment="Center">
<TextBlock Text="🚛 运动物体信息"
FontSize="11"
<TextBlock Text="🚛 运动构件信息"
FontSize="11"
FontWeight="SemiBold"
Foreground="{StaticResource NavisworksPrimaryBrush}"
HorizontalAlignment="Center"
Margin="0,0,0,5"/>
<TextBlock Text="{Binding MovingObjectInfo}"
FontSize="12"
<TextBlock Text="{Binding MovingObjectInfo}"
FontSize="12"
FontWeight="Normal"
Foreground="#FF333333"
HorizontalAlignment="Center"
@ -280,6 +280,27 @@ NavisworksTransport 碰撞检测报告对话框 - 采用与主界面一致的Nav
</StackPanel>
</Border>
<!-- 碰撞构件清单 -->
<StackPanel Visibility="{Binding CollidedObjectsList.Count, Converter={StaticResource CountToVisibilityConverter}}" Margin="0,0,0,15">
<Label Content="碰撞构件清单" Style="{StaticResource SectionHeaderStyle}"/>
<Border Style="{StaticResource StatisticItemStyle}" MaxHeight="150">
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
<ItemsControl ItemsSource="{Binding CollidedObjectsList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="5,2">
<TextBlock Text="•" FontWeight="Bold" Foreground="{StaticResource NavisworksPrimaryBrush}" Margin="0,0,8,0"/>
<TextBlock Text="{Binding}"
Style="{StaticResource DialogContentTextStyle}"
TextWrapping="Wrap"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Border>
</StackPanel>
<!-- 总结信息 -->
<Label Content="总结与建议" Style="{StaticResource SectionHeaderStyle}"/>
<Border Style="{StaticResource StatisticItemStyle}" Margin="0,0,0,10">
@ -298,16 +319,15 @@ NavisworksTransport 碰撞检测报告对话框 - 采用与主界面一致的Nav
<!-- 详细碰撞信息 -->
<StackPanel Visibility="{Binding HasCollisions, Converter={StaticResource BooleanToVisibilityConverter}}">
<!-- 独立检测碰撞 -->
<StackPanel Visibility="{Binding IndependentCollisions.Count, Converter={StaticResource CountToVisibilityConverter}}">
<Label Content="独立检测碰撞" Style="{StaticResource SectionHeaderStyle}"/>
<ItemsControl ItemsSource="{Binding IndependentCollisions}"
<!-- 碰撞详情 -->
<StackPanel Visibility="{Binding AnimationCollisions.Count, Converter={StaticResource CountToVisibilityConverter}}">
<Label Content="碰撞详情" Style="{StaticResource SectionHeaderStyle}"/>
<ItemsControl ItemsSource="{Binding AnimationCollisions}"
ItemTemplate="{StaticResource CollisionItemTemplate}"
Margin="0,0,0,10"/>
</StackPanel>
</StackPanel>
<!-- 无碰撞提示 -->