修改碰撞检测报告的统计数据,解决被撞构件去重的问题
This commit is contained in:
parent
30d89b8ad7
commit
387ec332fc
@ -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();
|
||||
|
||||
// 新增:统计去重后的被撞物体
|
||||
// 使用Dictionary,ModelItem作为键会自动调用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 "运动构件: 获取信息失败";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
<!-- 无碰撞提示 -->
|
||||
|
||||
Loading…
Reference in New Issue
Block a user