diff --git a/src/Core/Collision/ClashDetectiveIntegration.cs b/src/Core/Collision/ClashDetectiveIntegration.cs index 9adb4f2..06d92e4 100644 --- a/src/Core/Collision/ClashDetectiveIntegration.cs +++ b/src/Core/Collision/ClashDetectiveIntegration.cs @@ -323,8 +323,14 @@ namespace NavisworksTransport var mainTestName = $"物流碰撞检测_{pathName}_{DateTime.Now:yyyyMMdd_HHmmss}"; LogManager.Info($"[分组测试] 创建主测试: {mainTestName}"); + Progress progress = null; try { + // 开始进度条(ClashDetective本身会显示进度,这里只提供提示信息) + progress = Application.BeginProgress( + "碰撞检测数据分析中,请稍候..." + ); + // 使用事务确保操作的原子性 using (var transaction = doc.BeginTransaction("创建分组碰撞测试")) { @@ -362,7 +368,7 @@ namespace NavisworksTransport // 调试:打印所有去重后的碰撞对信息 LogManager.Debug($"[分组测试] 去重后的碰撞对列表:"); - int groupIndex = 0; + int debugIndex = 0; foreach (var group in groupedCollisions) { var firstCollision = group.First(); @@ -376,8 +382,8 @@ namespace NavisworksTransport var item2Hash = item2?.GetHashCode() ?? -1; var frameCount = group.Count(); - LogManager.Debug($" [{groupIndex}] Item1={item1Name}(Hash:{item1Hash}), Item2={item2Name}(Hash:{item2Hash}), 帧数={frameCount}"); - groupIndex++; + LogManager.Debug($" [{debugIndex}] Item1={item1Name}(Hash:{item1Hash}), Item2={item2Name}(Hash:{item2Hash}), 帧数={frameCount}"); + debugIndex++; } var collisionGroup = new ClashResultGroup @@ -391,8 +397,17 @@ namespace NavisworksTransport int skippedCount = 0; // 2. 遍历每一组 - foreach (var group in groupedCollisions) + for (int groupIndex = 0; groupIndex < groupedCollisions.Count; groupIndex++) { + // 检查用户是否取消 + if (progress.IsCanceled) + { + LogManager.Info($"[分组测试] 用户取消操作,已处理 {groupIndex}/{groupedCollisions.Count} 组"); + break; + } + + var group = groupedCollisions[groupIndex]; + // 3. 排序:按距离/重叠深度排序,优先检测最严重的碰撞 // 注意:Distance通常越小(或负值越大)表示碰撞越深,具体取决于计算方式 // 这里假设Distance越小越严重 @@ -566,6 +581,14 @@ namespace NavisworksTransport { LogManager.Error($"[分组测试] 创建分组测试失败: {groupEx.Message}"); } + finally + { + // 确保关闭进度条 + if (progress != null) + { + Application.EndProgress(); + } + } // 关键修复:碰撞测试完成后,将物体恢复到动画终点位置 if (animatedObject != null && IsModelItemValid(animatedObject))