diff --git a/src/Core/Collision/ClashDetectiveIntegration.cs b/src/Core/Collision/ClashDetectiveIntegration.cs
index d5f125f..c443e47 100644
--- a/src/Core/Collision/ClashDetectiveIntegration.cs
+++ b/src/Core/Collision/ClashDetectiveIntegration.cs
@@ -881,233 +881,6 @@ namespace NavisworksTransport
}
}
- ///
- /// 基于包围盒的快速碰撞检测(不用Clash Detective)
- ///
- public List DetectCollisions(ModelItem animatedObject,
- ModelItemCollection excludeObjects, double detectionGap)
- {
- var results = new List();
-
- try
- {
- var animatedBoundingBox = animatedObject.BoundingBox();
-
- // 性能分析计时器
- var exclusionStopwatch = new System.Diagnostics.Stopwatch();
- var getAllItemsStopwatch = new System.Diagnostics.Stopwatch();
- var excludeLogicStopwatch = new System.Diagnostics.Stopwatch();
- var boundingBoxStopwatch = new System.Diagnostics.Stopwatch();
- var intersectionStopwatch = new System.Diagnostics.Stopwatch();
- var distanceStopwatch = new System.Diagnostics.Stopwatch();
-
- // 计时:构建排除列表
- exclusionStopwatch.Start();
- var exclusionList = new List();
-
- // 1. 排除动画对象本身及其所有子对象
- exclusionList.AddRange(animatedObject.DescendantsAndSelf.Where(d => d.HasGeometry));
-
- // 2. 合并用户指定的排除对象
- if (excludeObjects != null)
- {
- foreach (var item in excludeObjects)
- {
- if (!exclusionList.Contains(item))
- {
- exclusionList.Add(item);
- }
- }
- }
- exclusionStopwatch.Stop();
-
- // 🔥 使用预构建的缓存获取对象列表
- getAllItemsStopwatch.Start();
- List itemList;
-
- lock (_cacheLock)
- {
- if (_allGeometryItemsCache != null)
- {
- // 从缓存中过滤掉动画对象本身
- itemList = _allGeometryItemsCache.Where(item => !item.Equals(animatedObject)).ToList();
- }
- else
- {
- // 缓存不存在,回退到实时获取(不应该发生,但保险起见)
- LogManager.Warning("几何对象缓存不存在,回退到实时获取(这可能影响性能)");
- var allItems = Application.ActiveDocument.Models.RootItemDescendantsAndSelf
- .Where(item => item.HasGeometry && !item.Equals(animatedObject));
- itemList = allItems.ToList();
- }
- }
-
- getAllItemsStopwatch.Stop();
-
- int checkedCount = 0;
- int excludedCount = 0;
- int boundingBoxCallCount = 0;
- int intersectionCallCount = 0;
- int distanceCallCount = 0;
-
- foreach (var item in itemList)
- {
- try
- {
- // 计时:排除逻辑检查(现在使用缓存,应该很快)
- excludeLogicStopwatch.Start();
- bool shouldExclude = ShouldExcludeFromCollisionDetectionSimple(item, exclusionList);
- excludeLogicStopwatch.Stop();
-
- if (shouldExclude)
- {
- excludedCount++;
- continue;
- }
-
- // 计时:包围盒获取
- boundingBoxStopwatch.Start();
- var itemBoundingBox = item.BoundingBox();
- boundingBoxStopwatch.Stop();
- boundingBoxCallCount++;
-
- // 使用UI设置的检测间隙作为碰撞容差
- var tolerance = detectionGap;
-
- // 计时:相交检测
- intersectionStopwatch.Start();
- bool intersects = BoundingBoxGeometryUtils.BoundingBoxesIntersectWithTolerance(animatedBoundingBox, itemBoundingBox, tolerance);
- intersectionStopwatch.Stop();
- intersectionCallCount++;
-
- // 检查是否在容差范围内接近
- if (intersects)
- {
- // 计时:距离计算
- distanceStopwatch.Start();
- var distance = BoundingBoxGeometryUtils.CalculateDistance(animatedBoundingBox, itemBoundingBox);
- distanceStopwatch.Stop();
- distanceCallCount++;
-
- // 只有真正相交(距离为0)或在检测间隙内的才算碰撞
- if (distance <= tolerance)
- {
- // 🔧 智能容器映射:使用有名称的容器对象而非几何体子对象
- var mappedAnimatedObject = GetCollisionObjectWithValidIdentity(animatedObject);
- var mappedCollisionObject = GetCollisionObjectWithValidIdentity(item);
-
- // 检查是否进行了容器映射
- bool hasMapping1 = !mappedAnimatedObject.Equals(animatedObject);
- bool hasMapping2 = !mappedCollisionObject.Equals(item);
-
- var result = new CollisionResult
- {
- ClashGuid = Guid.NewGuid(),
- DisplayName = $"纯碰撞检测: {mappedAnimatedObject.DisplayName} <-> {mappedCollisionObject.DisplayName}",
- Status = ClashResultStatus.New,
- Item1 = mappedAnimatedObject, // 使用映射后的容器对象
- Item2 = mappedCollisionObject, // 使用映射后的容器对象
- OriginalItem1 = animatedObject, // 保存原始几何体对象
- OriginalItem2 = item, // 保存原始几何体对象
- HasContainerMapping = hasMapping1 || hasMapping2, // 标记是否进行了映射
- CreatedTime = DateTime.Now,
- Distance = distance,
- Center = BoundingBoxGeometryUtils.CalculateCenter(animatedBoundingBox, itemBoundingBox)
- };
-
- results.Add(result);
- }
- }
-
- checkedCount++;
- }
- catch (Exception itemEx)
- {
- LogManager.Warning($"检查单个对象碰撞时出错 {item.DisplayName}: {itemEx.Message}");
- }
- }
-
- if (results.Count == 0)
- {
- LogManager.Info($"未发现碰撞");
- }
-
- // 更新动画碰撞计数器
- _animationCollisionCount = results.Count;
- LogManager.Info($"动画碰撞计数器已更新: {_animationCollisionCount}");
- }
- catch (Exception ex)
- {
- LogManager.Error($"纯碰撞检测失败: {ex.Message}", ex);
- }
-
- return results;
- }
-
- ///
- /// 简化的排除判断逻辑(不依赖LogisticsAnimationManager)
- ///
- /// 要测试的对象
- /// 排除列表
- /// 如果应该排除返回true
- private bool ShouldExcludeFromCollisionDetectionSimple(ModelItem testObject, List exclusionList)
- {
- try
- {
- // 1. 基本排除列表检查
- if (exclusionList != null && exclusionList.Contains(testObject))
- {
- return true;
- }
-
- // 2. 通道对象检查(保留原有逻辑)
- if (IsChannelObject(testObject))
- {
- return true;
- }
-
- return false;
- }
- catch (Exception ex)
- {
- LogManager.Warning($"简化排除判断异常: {ex.Message}");
- return false; // 出错时保守处理,不排除
- }
- }
-
- ///
- /// 检查物体是否为通道物体(通道物体在碰撞检测时不应该变红)
- ///
- private bool IsChannelObject(ModelItem item)
- {
- try
- {
- // 使用缓存的通道对象集合
- if (_channelObjectsCache == null)
- {
- BuildChannelObjectsCache();
- }
-
- // 直接查询缓存,避免递归和重复属性查询
- return _channelObjectsCache.Contains(item);
- }
- catch (Exception ex)
- {
- LogManager.Warning($"检查通道物体时出错 {item.DisplayName}: {ex.Message}");
- return false;
- }
- }
-
- ///
- /// 公开方法:检查物体是否为通道物体(供外部使用)
- ///
- /// 要检查的模型对象
- /// 如果是通道对象返回 true
- public bool IsChannelObjectPublic(ModelItem item)
- {
- return IsChannelObject(item);
- }
-
///
/// 构建通道对象缓存,一次性扫描所有对象,避免重复的属性查询
///