diff --git a/src/Commands/ViewCollisionReportCommand.cs b/src/Commands/ViewCollisionReportCommand.cs index 11977aa..f095072 100644 --- a/src/Commands/ViewCollisionReportCommand.cs +++ b/src/Commands/ViewCollisionReportCommand.cs @@ -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 UniqueCollidedObjects { get; set; } = new HashSet(); } /// @@ -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 AllCollisions { get; set; } = new List(); public long GenerationTimeMs { get; set; } public string MovingObjectInfo { get; set; } = string.Empty; + + // 新增:被撞物体清单 + public List CollidedObjectsList { get; set; } = new List(); + public int UniqueCollidedObjectsCount { get; set; } } /// @@ -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(); + 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(); + var uniqueCollidedObjectsList = new List(); + + 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(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 "运动构件: 获取信息失败"; } } diff --git a/src/UI/WPF/ViewModels/CollisionReportViewModel.cs b/src/UI/WPF/ViewModels/CollisionReportViewModel.cs index e85eaf2..6cf954b 100644 --- a/src/UI/WPF/ViewModels/CollisionReportViewModel.cs +++ b/src/UI/WPF/ViewModels/CollisionReportViewModel.cs @@ -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 _animationCollisions; - private ObservableCollection _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 _collidedObjectsList; + private int _uniqueCollidedObjectsCount; #endregion @@ -121,15 +121,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels set => SetProperty(ref _animationCollisions, value); } - /// - /// 独立检测碰撞列表 - /// - public ObservableCollection IndependentCollisions - { - get => _independentCollisions; - set => SetProperty(ref _independentCollisions, value); - } - /// /// 进度消息 @@ -186,7 +177,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels } /// - /// 运动物体信息 + /// 运动构件信息 /// public string MovingObjectInfo { @@ -194,6 +185,24 @@ namespace NavisworksTransport.UI.WPF.ViewModels set => SetProperty(ref _movingObjectInfo, value); } + /// + /// 被撞物体清单 + /// + public ObservableCollection CollidedObjectsList + { + get => _collidedObjectsList; + set => SetProperty(ref _collidedObjectsList, value); + } + + /// + /// 去重后的被撞物体总数 + /// + public int UniqueCollidedObjectsCount + { + get => _uniqueCollidedObjectsCount; + set => SetProperty(ref _uniqueCollidedObjectsCount, value); + } + #endregion #region 命令属性 @@ -226,8 +235,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels { // 初始化集合 AnimationCollisions = new ObservableCollection(); - IndependentCollisions = new ObservableCollection(); - + CollidedObjectsList = new ObservableCollection(); + 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(); + var collisionItems = new List(); 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 /// private string GenerateHtmlReport() { - // 简化的HTML报告生成 var html = new StringBuilder(); + var now = DateTime.Now; + + // HTML头部和样式 html.AppendLine(""); - html.AppendLine("NavisworksTransport 碰撞报告"); - html.AppendLine(""); + html.AppendLine(""); + html.AppendLine(""); + html.AppendLine("NavisworksTransport 碰撞检测报告"); + html.AppendLine(""); html.AppendLine(""); + + // 报告标题 html.AppendLine($"

NavisworksTransport 碰撞检测报告

"); - html.AppendLine($"

生成时间: {DateTime.Now:yyyy年MM月dd日 HH:mm:ss}

"); - html.AppendLine($"

总体统计

"); - html.AppendLine($"

总碰撞数量: {Statistics.TotalCollisions}

"); - html.AppendLine($"

动画碰撞: {Statistics.AnimationCollisions}, 独立检测: {Statistics.IndependentCollisions}

"); + html.AppendLine($"

生成时间: {now:yyyy年MM月dd日 HH:mm:ss}

"); + html.AppendLine($"

报告类型: {Statistics.ReportType}

"); + + // 总体统计 + html.AppendLine("
"); + html.AppendLine("

总体统计

"); + html.AppendLine("
"); + html.AppendLine("
"); + html.AppendLine("
总碰撞数
"); + html.AppendLine($"
{Statistics.TotalCollisions}
"); + html.AppendLine("
"); + html.AppendLine("
"); + html.AppendLine("
碰撞构件
"); + html.AppendLine($"
{UniqueCollidedObjectsCount}个
"); + html.AppendLine("
"); + html.AppendLine("
"); + html.AppendLine("
检测点
"); + html.AppendLine($"
{Statistics.AnimationCollisions}个
"); + html.AppendLine("
"); + html.AppendLine("
"); + html.AppendLine("
"); + + // 状态分布 + html.AppendLine("

状态分布

"); + html.AppendLine("
"); + html.AppendLine($"
新发现
{Statistics.NewCollisions}
"); + html.AppendLine($"
活跃
{Statistics.ActiveCollisions}
"); + html.AppendLine($"
已审阅
{Statistics.ReviewedCollisions}
"); + html.AppendLine($"
已批准
{Statistics.ApprovedCollisions}
"); + html.AppendLine($"
已解决
{Statistics.ResolvedCollisions}
"); + html.AppendLine("
"); + + // 运动构件信息 + if (!string.IsNullOrEmpty(MovingObjectInfo)) + { + html.AppendLine("

运动构件信息

"); + html.AppendLine("
"); + html.AppendLine($"🚛 {MovingObjectInfo}"); + html.AppendLine("
"); + } + + // 碰撞构件清单 + if (CollidedObjectsList?.Count > 0) + { + html.AppendLine("

碰撞构件清单

"); + html.AppendLine("
"); + int index = 1; + foreach (var objName in CollidedObjectsList.Take(50)) // 限制显示前50个 + { + html.AppendLine($"
{index}. {objName}
"); + index++; + } + if (CollidedObjectsList.Count > 50) + { + html.AppendLine($"
... 还有 {CollidedObjectsList.Count - 50} 个构件
"); + } + html.AppendLine("
"); + } + + // 总结与建议 + html.AppendLine("

总结与建议

"); + html.AppendLine("
"); + html.AppendLine($"

{SummaryMessage}

"); + if (!string.IsNullOrEmpty(RecommendationMessage)) + { + html.AppendLine("

建议措施:

"); + var recommendations = RecommendationMessage.Split('\n'); + html.AppendLine("
    "); + foreach (var recommendation in recommendations) + { + if (!string.IsNullOrWhiteSpace(recommendation)) + { + html.AppendLine($"
  • {recommendation}
  • "); + } + } + html.AppendLine("
"); + } + html.AppendLine("
"); + + // 详细碰撞信息(前10个) + if (HasCollisions && AnimationCollisions?.Count > 0) + { + html.AppendLine("

碰撞详情

"); + foreach (var collision in AnimationCollisions.Take(10)) + { + html.AppendLine("
"); + html.AppendLine($"
{collision.Title}
"); + + // 状态标签 + var statusClass = GetStatusCssClass(collision.StatusText); + html.AppendLine($"{collision.StatusText}"); + + html.AppendLine($"

{collision.Description}

"); + html.AppendLine($"

{collision.Details}

"); + html.AppendLine("
"); + } + if (AnimationCollisions.Count > 10) + { + html.AppendLine($"

... 还有 {AnimationCollisions.Count - 10} 个碰撞未显示

"); + } + } + + // HTML结尾 + html.AppendLine($"
"); + html.AppendLine($"

报告生成完成 - {now:HH:mm:ss}

"); html.AppendLine(""); + return html.ToString(); } + /// + /// 获取状态对应的CSS类名 + /// + 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 ""; + } + } + /// /// 刷新报告 /// diff --git a/src/UI/WPF/Views/CollisionReportDialog.xaml b/src/UI/WPF/Views/CollisionReportDialog.xaml index bf15e62..93074ea 100644 --- a/src/UI/WPF/Views/CollisionReportDialog.xaml +++ b/src/UI/WPF/Views/CollisionReportDialog.xaml @@ -208,8 +208,8 @@ NavisworksTransport 碰撞检测报告对话框 - 采用与主界面一致的Nav - - + + @@ -218,8 +218,8 @@ NavisworksTransport 碰撞检测报告对话框 - 采用与主界面一致的Nav - - + + @@ -259,20 +259,20 @@ NavisworksTransport 碰撞检测报告对话框 - 采用与主界面一致的Nav - - + - - + + + +