diff --git a/doc/requirement/todo_features.md b/doc/requirement/todo_features.md index 337b289..079a32e 100644 --- a/doc/requirement/todo_features.md +++ b/doc/requirement/todo_features.md @@ -2,16 +2,29 @@ ## 功能点 +### [2026/2/3] + +1. [ ] (优化)预计算高亮正确,结果高亮错误,高亮了很多不相干的同名物体 +2. [ ] (BUG)预计算一个目标物体,161帧碰撞,机制有问题 +3. [ ] (BUG)吊装路径,终点前的一段拐弯,通行空间方向不对 +4. [ ] (BUG)批处理时杀死程序,重新打开有执行中的任务,但删除选中没激活,再运行批处理,收到停止信号结束 +5. [ ] (BUG)碰撞检测历史列表,不自动加载,不自动刷新 +6. [ ] (优化)将通行空间透明度变成系统参数,可以修改 +7. [ ] (优化)ClashDetective检测中,每执行100次打印一下日志 +8. [ ] (研究)如何利用剖面,过滤被隐藏的内容 +9. [ ] (研究)根据路径高度范围,过滤几何体 +10. [x] (BUG)批处理指定检测物体,预计算时没有忽略空间缓存建立 + ### [2026/1/28] 1. [ ] (优化)将ViewPonit的RenderStyle改成Shaded,以免影响高亮(考虑在显示碰撞时,改成Wireframe) -2、[ ] (优化)修改架构适应模型坐标系的变化(Yup-Xright-Zfront) -3、[x] (优化)修改吊装路径适应桁车空中路线(纵向+平移,有吊绳) -4、[x] (优化)对系统配置文件的修改即时起效 -5、[ ] (优化)切换文档时重新加载数据库 -6、[x] (优化)默认打开指定碰撞物体 -7、[ ] (优化)动画运行视角优化设计,不能只用俯视图 -8、[x] (BUG)旧版配置文件要主动提示升级配置文件,不能崩溃 +2. [ ] (优化)修改架构适应模型坐标系的变化(Yup-Xright-Zfront) +3. [x] (优化)修改吊装路径适应桁车空中路线(纵向+平移,有吊绳) +4. [x] (优化)对系统配置文件的修改即时起效 +5. [ ] (优化)切换文档时重新加载数据库 +6. [x] (优化)默认打开指定碰撞物体 +7. [ ] (优化)动画运行视角优化设计,不能只用俯视图 +8. [x] (BUG)旧版配置文件要主动提示升级配置文件,不能崩溃 ### [2026/1/26] @@ -58,7 +71,7 @@ ### [2025/12/09] 1. [x] (BUG)路径列表和动画当前路径的变化存在循环引用的情况 -2. [x] (BUG)动画过程中,有一些被碰撞的墙、柱子和其他对象没有被检测到 +2. [x] (BUG)动画过程中,有一些被碰撞的墙. 柱子和其他对象没有被检测到 ### [2025/12/08] @@ -69,7 +82,7 @@ 5. [x] (BUG)只有手动路径时,导出路径按钮没激活 6. [x] (BUG)重复打开模型,有时程序崩溃,需要先关闭物流插件窗口 7. [x] (优化)提高碰撞检测在处理大型模型时的性能 -8. [ ] (功能)如果进行耗时处理(超过30秒),弹出确认窗口,告诉用户预估时间、耗时原因和优化建议(如隐藏不需要的节点) +8. [ ] (功能)如果进行耗时处理(超过30秒),弹出确认窗口,告诉用户预估时间. 耗时原因和优化建议(如隐藏不需要的节点) ### [2025/12/05] @@ -130,15 +143,15 @@ 1. [x] (功能)修改碰撞检测报告,增加碰撞构件的数量和清单 2. [x] (功能) 修改动画和碰撞参数,检测精度(步长)=路径长度/(帧率*时长),速度=路径长度/时长 3. [x] (优化) 完善网格的高度数据,修改在A*算法中的高度处理错误 -4. [x] (功能) 完善物流属性列表的能力,实现同步选择视图、单个模型可见性、属性数值回填设置区 +4. [x] (功能) 完善物流属性列表的能力,实现同步选择视图. 单个模型可见性. 属性数值回填设置区 ### [2025/09/14] -1. [x] (功能)增加空间通道连线方式:1、宽度路径,半透明,膨胀直径高度为车高加安全距离 +1. [x] (功能)增加空间通道连线方式:1. 宽度路径,半透明,膨胀直径高度为车高加安全距离 ### [2025/09/12] -1. [x] (功能)给动画增加步进功能,同时提供反向功能(反向播放、反向步进) +1. [x] (功能)给动画增加步进功能,同时提供反向功能(反向播放. 反向步进) 2. [x] (功能) 自动生成的路径,贴合通道表面 3. [x] (功能) 文档更新后,插件重新初始化 @@ -182,7 +195,7 @@ 3. [x] (优化)增加直接采用包围盒的2.5D自动寻路算法,代替空间索引+高度扫描算法。 4. [x] (BUG)自动规划有时成功(过滤3个通道,找到26个障碍物),有时失败(过滤2个通道,只找到2个障碍物),连续自动规划,有时会崩溃。 5. [ ] (BUG)还有厚度为0的障碍物(不一定是bug) -6. [x] (优化) 用SearchAPI来搜索CategoryAttributeManager中的FilterByLogisticsType()、FilterTraversableItems()等方法 +6. [x] (优化) 用SearchAPI来搜索CategoryAttributeManager中的FilterByLogisticsType(). FilterTraversableItems()等方法 ### [2025/08/31] @@ -197,16 +210,16 @@ ### [2025/08/29] -1. [x](BUG)路径导出,只有一条路径时,导出按钮不能点击;导出的内容有时不完整,只导出一个包含起点、一个路径点、终点的不存在的路径。 +1. [x](BUG)路径导出,只有一条路径时,导出按钮不能点击;导出的内容有时不完整,只导出一个包含起点. 一个路径点. 终点的不存在的路径。 2. [x](优化)垂直扫描处理器性能问题:COM API几何提取效率极低,23个候选项需要5715ms,复杂几何体比简单几何体效率低4倍,需要优化批量处理和并行机制。 3. [x](优化)修复并行任务未观察异常导致程序崩溃:AggregateException错误表明Task异常处理不当,需要加强并行处理的异常处理和Task生命周期管理。 ### [2025/08/28] -1. [x](优化)将“自动规划路径”中的车辆长度、宽度的默认值改为1米,安全间隙改为0.25米。高级设置中,网格的大小 +1. [x](优化)将“自动规划路径”中的车辆长度. 宽度的默认值改为1米,安全间隙改为0.25米。高级设置中,网格的大小 ,默认值改为0.5米。 2. [x](功能)将这些参数,作为插件配置文件的参数,在系统管理的插件管理中,统一管理 -3. [x](优化)修改分层预览的业务逻辑:从一级节点开始,遍历每个节点查找指定的分层属性,如果找到,记录下来作为一个分层,不再遍历其下级节点;如果没找到,继续遍历其子节点,直到找到为止,遍历深度受到用户指定的遍历深度限制。特殊处理:1、对于智能检测,使用一组候选的分层属性,对每个节点进行查找,按属性的评分(优先级)确定选择何种属性。2、对于自定义查找,用指定的分层属性,在每个节点的"分层信息“属性类别中查找。 +3. [x](优化)修改分层预览的业务逻辑:从一级节点开始,遍历每个节点查找指定的分层属性,如果找到,记录下来作为一个分层,不再遍历其下级节点;如果没找到,继续遍历其子节点,直到找到为止,遍历深度受到用户指定的遍历深度限制。特殊处理:1. 对于智能检测,使用一组候选的分层属性,对每个节点进行查找,按属性的评分(优先级)确定选择何种属性。2. 对于自定义查找,用指定的分层属性,在每个节点的"分层信息“属性类别中查找。 4. [x](优化)对自动路径规划进行重构,按地面层+高度剖面投影层的方式,构建可通行网格,然后用A*算法获取最短路径。 ### [2025/08/27] diff --git a/src/Core/BatchQueueManager.cs b/src/Core/BatchQueueManager.cs index b52b3e5..52133cb 100644 --- a/src/Core/BatchQueueManager.cs +++ b/src/Core/BatchQueueManager.cs @@ -422,13 +422,11 @@ namespace NavisworksTransport.Core } } - // 初始化碰撞检测缓存 - LogManager.Info("[批处理] 初始化碰撞检测缓存..."); - ClashDetectiveIntegration.InitializeCollisionDetectionCache(animatedObject); - - // 从 ModelItemReferences 表查询手工指定的检测物体(在主线程外完成查询) + // 从 ModelItemReferences 表查询手工指定的检测物体(在主线程外完成查询) List manualDetectionTargets = null; - if (!item.DetectAllObjects) + bool isManualMode = !item.DetectAllObjects; + + if (isManualMode) { var targetReferences = await _database.GetModelItemReferencesAsync( item.Id, @@ -468,6 +466,9 @@ namespace NavisworksTransport.Core LogManager.Info($"[批处理] 加载手工指定检测物体,成功: {manualDetectionTargets.Count}/{targetReferences.Count}"); } } + + // 统一准备碰撞检测(根据模式自动决定是否构建全局缓存) + ClashDetectiveIntegration.PrepareCollisionDetection(animatedObject, isManualMode, manualDetectionTargets); // 在主线程执行Navisworks API调用 var result = await UIStateManager.Instance.ExecuteUIUpdateAsync(() => diff --git a/src/Core/Collision/ClashDetectiveIntegration.cs b/src/Core/Collision/ClashDetectiveIntegration.cs index 0ff5843..fed0b0b 100644 --- a/src/Core/Collision/ClashDetectiveIntegration.cs +++ b/src/Core/Collision/ClashDetectiveIntegration.cs @@ -1343,6 +1343,48 @@ namespace NavisworksTransport LogManager.Info("[碰撞检测] 碰撞检测缓存初始化完成"); } + /// + /// 统一准备碰撞检测(整合常规处理和批处理的公共逻辑) + /// + /// 运动物体 + /// 是否为手工指定检测对象模式 + /// 手工指定的检测目标(仅在手工模式下使用) + /// 是否成功准备 + public static bool PrepareCollisionDetection(ModelItem animatedObject, bool isManualMode, List manualTargets = null) + { + try + { + if (animatedObject == null) + { + LogManager.Warning("[碰撞检测] 准备失败:运动物体为空"); + return false; + } + + if (isManualMode) + { + // 手工模式:只设置移动物体,不构建全局缓存 + LogManager.Info("[碰撞检测] 手工模式 - 跳过全局缓存初始化"); + lock (_cacheLock) + { + _animatedObject = animatedObject; + } + return true; + } + else + { + // 全局模式:需要构建空间索引缓存 + LogManager.Info("[碰撞检测] 全局模式 - 初始化碰撞检测缓存"); + InitializeCollisionDetectionCache(animatedObject); + return true; + } + } + catch (Exception ex) + { + LogManager.Error($"[碰撞检测] 准备碰撞检测失败: {ex.Message}"); + return false; + } + } + /// /// 获取通道对象缓存(供外部使用) /// diff --git a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs index edbf463..a75dcc6 100644 --- a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs +++ b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs @@ -2710,12 +2710,10 @@ namespace NavisworksTransport.UI.WPF.ViewModels animatedObject = SelectedAnimatedObject; } - // 初始化碰撞检测缓存(在 animatedObject 声明之后) - if (!manualModeEnabled) - { - ClashDetectiveIntegration.InitializeCollisionDetectionCache(animatedObject); - } + // 统一准备碰撞检测(根据模式自动决定是否构建全局缓存) + ClashDetectiveIntegration.PrepareCollisionDetection(animatedObject, manualModeEnabled, manualTargets); + // 设置碰撞检测目标 if (manualModeEnabled) { _pathAnimationManager.SetManualCollisionTargets(manualTargets, true); diff --git a/src/UI/WPF/Views/LogViewerDialog.xaml b/src/UI/WPF/Views/LogViewerDialog.xaml index 1f04efb..d1daaef 100644 --- a/src/UI/WPF/Views/LogViewerDialog.xaml +++ b/src/UI/WPF/Views/LogViewerDialog.xaml @@ -16,11 +16,11 @@ NavisworksTransport 日志查看器对话框 - 采用与主界面一致的Navisw xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" Title="日志查看器" - Height="600" + Height="1200" Width="900" ResizeMode="CanResize" WindowStartupLocation="CenterOwner" - MinHeight="400" + MinHeight="800" MinWidth="600">