Commit Graph

260 Commits

Author SHA1 Message Date
5791e57192 对系统管理UI进行修改,更改体素路径测试参数 2025-10-14 17:19:17 +08:00
3aaa176ce6 优化插件启动时的动作 2025-10-14 16:29:05 +08:00
b7a112354d merge: 集成空间索引优化碰撞检测性能
- 新增空间哈希网格系统(SpatialHashGrid + SpatialIndexManager)
- 优化碰撞检测查询效率(从O(n)到O(1)平均复杂度)
- 格子大小使用车辆宽度参数(1米),空间分割166格
- 平均每格1.71个对象,查询性能提升约10倍
- 移除DataBindingPerformanceMonitor功能(简化代码)
- 修复碰撞报告检测间隙显示格式
- 净删除代码511行,提升代码质量

测试结果:
- 空间索引构建时间:10ms(冷启动)/ 1ms(缓存)
- 284个对象分布在166个格子中
- 碰撞检测性能显著提升
2025-10-14 15:18:36 +08:00
b05bb727c6 refactor: 完成 DataBindingPerformanceMonitor 功能的完整删除
- 删除 DataBindingPerformanceMonitor.cs 文件
- 从 NavisworksTransportPlugin.csproj 移除编译引用
- 清理 ViewModelBase.cs 中的所有性能监控代码
- 清理 ThreadSafeObservableCollection.cs 中的性能监控集成
- 清理 SmartDataBindingOptimizer.cs 中的性能监控使用
- 清理 BindingExpressionOptimizer.cs 中的性能监控调用

该功能不再需要,移除后简化了代码结构
2025-10-14 15:01:26 +08:00
821725d406 perf: 优化空间索引格子大小,使用车辆宽度参数
问题分析:
1. 原实现使用运动对象包围盒最大边(6-8米)作为格子大小
2. 导致格子过大(仅10-21个格子),每格包含13-28个对象
3. 空间查询效率低,需检查大量候选对象

优化方案:
1. 改用系统配置中的车辆宽度(VehicleWidthMeters,默认1米)
2. 预期效果:格子数增加到150-200个,每格2-5个对象
3. 显著提升空间查询效率

搜索半径说明:
- 当前实现 objectDiagonal/2 + detectionGap 是正确的
- 从中心到最远角的距离恰好是对角线的一半
- 不需要修改

修改文件:
- PathAnimationManager.cs:
  - 添加 ConfigManager 引用
  - 使用车辆宽度计算格子大小
  - 添加详细日志输出

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-14 14:43:15 +08:00
40072e2eb7 fix: 格式化碰撞报告窗口中检测间隙的显示
问题:检测间隙显示为0.05001768,精度过高不便阅读
解决:在XAML绑定中添加StringFormat={}{0:F2}格式化为两位小数
效果:现在显示为0.05,清晰易读

修改文件:
- CollisionReportDialog.xaml: 为DetectionGap绑定添加格式化

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-14 12:33:07 +08:00
02ddc812cf refactor: 移除未使用的 IsChannelObjectPublic 方法
优化历程:
1. 最初添加 IsChannelObjectPublic() 用于空间索引中逐个检查对象
2. 后续优化为 GetNonChannelGeometryItemsCache() 在缓存层预过滤通道
3. IsChannelObjectPublic() 方法已不再被使用,删除以保持代码整洁

私有方法 IsChannelObject() 保留,仍在缓存构建时使用

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-14 12:28:43 +08:00
1fb6c565fd perf: 优化空间索引构建,直接使用预过滤的非通道缓存
问题分析:
- 空间索引获取290个几何对象缓存
- 然后遍历290次,每次调用 IsChannelObjectPublic() 检查是否为通道
- 使用 HashSet.Contains 虽然是O(1),但遍历290次仍然是O(n)
- 通道对象在缓存构建阶段已经识别,不应该重复判断

优化方案:
1. 添加 GetNonChannelGeometryItemsCache() 方法返回已过滤通道的缓存
2. 在 ClashDetectiveIntegration 中一次性过滤(使用LINQ Where)
3. SpatialIndexManager 直接使用284个非通道对象,无需再判断
4. 移除 IsChannelObjectPublic() 方法和相关逻辑(不再需要)

性能提升:
- 空间索引构建:减少290次 HashSet 查询
- 代码更简洁:从遍历+判断改为直接使用预过滤结果
- 逻辑更清晰:通道过滤在缓存层完成,索引层只负责索引

技术细节:
- GetNonChannelGeometryItemsCache() 使用 LINQ Where 过滤
- 线程安全:使用 lock 确保并发访问安全
- 日志优化:明确标注"通道已在缓存阶段过滤"

代码清理:
- 移除 IsChannelObjectPublic() 的使用(不再需要)
- 移除 channelExcludedCount 变量
- 简化索引构建循环逻辑

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-14 12:25:59 +08:00
f194a835ed refactor: 移除空间索引构建中的冗余缓存调用
问题分析:
- 动画生成阶段已经构建了所有缓存(几何对象+通道对象)
- 空间索引构建时再次调用 BuildChannelObjectsCache() 和 BuildAllGeometryItemsCache()
- 虽然这两个方法有"已缓存则跳过"逻辑,但调用本身是逻辑冗余

优化方案:
- 移除 BuildChannelObjectsCache() 和 BuildAllGeometryItemsCache() 调用
- 直接使用 GetAllGeometryItemsCache() 获取缓存
- 如果缓存不存在,抛出异常而非静默回退(暴露调用顺序错误)

设计原则:
- "让问题快速暴露" > "让程序看起来正常运行"
- 明确约定:调用方必须在动画生成阶段构建缓存
- 如果缓存不存在,说明调用顺序错误,应该报错

技术细节:
- 将回退逻辑从 Warning + 实时获取 改为 Error + 抛出异常
- 错误信息明确指出调用方的责任
- 确保代码的调用契约清晰可追溯

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-14 12:21:38 +08:00
320dfa23f3 perf: 空间索引复用几何对象缓存避免重复遍历
问题描述:
- BuildAllGeometryItemsCache() 已经遍历模型树获取290个几何对象
- SpatialIndexManager 又重新遍历一次模型树获取290个对象
- 重复工作导致性能浪费

优化方案:
1. 在 ClashDetectiveIntegration 中添加 GetAllGeometryItemsCache() 公开方法
2. SpatialIndexManager 调用该方法获取缓存的几何对象列表
3. 避免重复遍历模型树,提升性能

技术细节:
- GetAllGeometryItemsCache() 返回列表副本保证线程安全
- 添加缓存不存在时的回退逻辑(保险措施)
- 日志输出改为"从缓存获取"以明确数据来源

性能提升:
- 减少模型树遍历次数:2次 → 1次
- 优化空间索引构建流程
- 所有碰撞检测和空间索引共享同一个几何对象列表

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-14 12:15:29 +08:00
2c6187a674 fix: 修正碰撞报告中检测间隙单位显示错误
问题描述:
- 碰撞报告显示检测间隙为 0.1641米,但实际设置是 0.05米
- 原因:DetectionGap 属性直接返回内部模型单位值,未转换为米制

修复方案:
- 修改 PathAnimationManager.DetectionGap 属性
- 添加单位转换逻辑,将内部模型单位转换为米制单位
- 确保报告中显示的检测间隙与用户设置一致

技术细节:
- _detectionGap 字段以模型单位存储(内部使用)
- DetectionGap 属性返回米制单位(外部接口)
- 使用 UnitsConverter.GetUnitsToMetersConversionFactor() 进行转换

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-14 12:09:54 +08:00
f761d93676 feat: 添加通道对象排除逻辑到空间索引
修改内容:
1. 在 ClashDetectiveIntegration 中添加 IsChannelObjectPublic() 公开方法
2. SpatialIndexManager.BuildGlobalIndex() 构建索引前调用 BuildChannelObjectsCache()
3. 索引循环中过滤通道对象,避免将其加入空间索引
4. 增强日志输出,显示排除的通道对象数量

技术细节:
- 使用已有的 _channelObjectsCache 进行 O(1) 查询
- 在索引构建时过滤(一次性)而非每次查询时过滤
- 保持与旧架构相同的通道排除逻辑

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-14 12:05:05 +08:00
c7f6586fa9 feat: 集成空间索引到碰撞检测系统(单层架构)
重构说明:
- 移除两层架构的 GetPotentialColliders() 方法
- 移除不再使用的 CalculatePathBounds() 方法
- 在 PrecomputeAnimationFrames() 中构建全局空间索引
- 每帧使用空间索引直接查询附近对象(O(1) 复杂度)

技术细节:
- 网格大小:基于动画对象包围盒尺寸
- 搜索半径:对象对角线的一半 + 检测间隙
- 自动排除动画对象本身

性能优势:
- 旧架构:290 对象 → 108 对象(预过滤)→ 每帧遍历 108 对象
- 新架构:290 对象 → 每帧空间查询 ~5-15 对象
- 预期性能提升:10-15x
2025-10-14 11:56:03 +08:00
360d55ffa8 fix: 修复 Vector3d.Distance 调用并将 Spatial 文件添加到项目
- 修复 Distance 方法调用(使用实例方法而非静态方法)
- 将 SpatialHashGrid.cs 和 SpatialIndexManager.cs 添加到 csproj
- 在 PathAnimationManager.cs 中添加命名空间引用
2025-10-14 11:53:52 +08:00
8cec18a141 refactor: 借鉴 PointHashGrid3d 优化空间哈希网格
改进内容:
1. 使用 ScaleGridIndexer3 实现更清晰的坐标转换(职责分离)
2. 优化 FindInRadius:提前判断 distanceFunc 是否为 null,避免循环中重复检查
3. 使用 TryGetValue 避免字典的两次查找
4. 增强代码注释,说明设计参考和增强点

参考 geometry3Sharp 的 PointHashGrid3d 设计,但保留了我们实现的优势:
- 支持返回范围内所有对象(不仅是最近的一个)
- 支持直接访问网格单元
- 提供详细的统计信息
2025-10-14 11:49:39 +08:00
d889635c1c feat: 实现自定义空间哈希网格 (SpatialHashGrid)
- 创建 SpatialHashGrid.cs: 基于 Vector3i 的3D空间哈希表
  - 支持对象插入、范围查询、格子查询
  - O(1) 平均查询复杂度
  - 带精确距离检查的范围查询

- 创建 SpatialIndexManager.cs: 全局空间索引管理器
  - 单例模式,所有动画共享
  - 构建全局索引(索引所有几何对象)
  - FindNearbyObjects: 高效范围查询
  - 对象位置缓存(避免重复计算包围盒)

技术细节:
- 使用 geometry4Sharp (g4) 的 Vector3d, Vector3i
- 基于 Dictionary<Vector3i, List<ModelItem>> 实现
- 格子大小可配置(建议设为车辆半径 × 2)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-14 11:40:04 +08:00
687b342e0f 增加geometry4sharp的评估 2025-10-14 11:17:01 +08:00
bd7eeb3d46 修复路径预计算范围不对、碰撞检测报告名字匹配错误的BUG 2025-10-13 19:14:46 +08:00
882f8283b5 修复AABB包围盒碰撞检测逻辑错误
问题:
BoundingBoxesIntersectWithGap方法中gap参数加在了错误的位置:
- 当前写法:box2.Max.X + gap < box1.Min.X
- 应该写成:box1.Min.X - gap > box2.Max.X

错误原因:
gap应该只用于扩展box1(动画对象),而不是同时扩展box1和box2

修复方案:
采用标准AABB碰撞检测算法(参考MDN文档):
- X轴相交:box1.Max.X + gap >= box2.Min.X && box1.Min.X - gap <= box2.Max.X
- Y轴相交:box1.Max.Y + gap >= box2.Min.Y && box1.Min.Y - gap <= box2.Max.Y
- Z轴相交:box1.Max.Z + gap >= box2.Min.Z && box1.Min.Z - gap <= box2.Max.Z
- 三个轴向都相交才算碰撞

参考:https://developer.mozilla.org/en-US/docs/Games/Techniques/3D_collision_detection

影响:
修复后预计算阶段应该能正确检测到碰撞,但需要进一步排查
为什么当前预计算结果为0个碰撞的根本原因

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 17:47:16 +08:00
5cf9336a9c 修复:恢复PathAnimationManager变量的默认初始值
问题:
- 在修改注释时不小心删除了变量的默认初始值
- 导致_animationDuration=0, _animationFrameRate=0等
- 造成UI界面空白和除零异常

修复:
- _animationDuration = 10.0(默认10秒)
- _animationFrameRate = 30(默认30FPS)
- _collisionDetectionAccuracy = 0.1
- _movementSpeed = 1.0
- _detectionGap = 0.05

影响:修复UI界面显示问题

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 17:28:22 +08:00
0732cb493f 简化日志输出:移除模型单位显示,只保留米单位
修改内容:
- 路径总长度日志:只显示米单位
- 检测精度日志:只显示米单位/帧
- SetCollisionDetectionAccuracy日志:只显示米单位
- SetDetectionGap日志:只显示米单位

理由:
- 用户只需要看到米单位,模型单位是内部实现细节
- 简化日志输出,提高可读性

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 17:23:12 +08:00
3343f6f5c1 修复PathAnimationManager中的单位转换错误
问题:
1. 路径总长度日志显示"米",但实际计算的是模型单位
2. 检测精度内部使用模型单位,但Set方法接收米参数后未转换
3. 检测间隙内部使用模型单位,但Set方法接收米参数后未转换
4. 日志中单位标注不明确,容易造成混淆

修复内容:
1. CalculateTotalPathDistance返回模型单位,增加转换显示米单位
2. SetCollisionDetectionAccuracy接收米单位参数,内部转换为模型单位存储
3. SetDetectionGap接收米单位参数,内部转换为模型单位存储
4. 所有日志同时显示米单位和模型单位,格式:X.XX米 (Y.YY模型单位)

设计原则:
- 内部存储统一使用模型单位(与Navisworks API Point3D/BoundingBox3D一致)
- 对外接口(Set方法参数)使用米单位(符合用户习惯)
- 日志同时显示两种单位,避免歧义

影响范围:
- SetupAnimation()中的路径总长度日志
- PrecomputeAnimationFrames()中的路径总长和检测精度日志
- SetCollisionDetectionAccuracy()参数单位转换
- SetDetectionGap()参数单位转换

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 17:15:28 +08:00
1a3d1e7f49 清理多余文件 2025-10-13 16:53:40 +08:00
ca8bcc0bba 移除碰撞检测中的自定义进度条,避免与ClashDetective进度条冲突
问题:
- 在CreateAllAnimationCollisionTests中显示自定义进度条
- 调用TestsRunTest()时ClashDetective显示自己的自动保存进度条
- 两个进度条同时出现,造成视觉混乱

修改:
- 移除Progress progress变量声明
- 移除BeginProgress()调用
- 移除finally块中的EndProgress()调用

解决方案:
- 只显示ClashDetective的原生自动保存进度条
- 保持与Navisworks API的一致性
- 避免进度条冲突,提供更简洁的用户体验

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 13:00:01 +08:00
89722efaca 修复碰撞检测进度条闪烁:使用不确定进度条样式
移除了CreateAllAnimationCollisionTests方法中的progress.Update()调用,
使进度条保持不确定样式(滚动条,无百分比显示)。

原因分析:
- ClashDetective的TestsRunTest()在后台运行,不提供进度回调
- 频繁调用progress.Update()导致进度条在确定/不确定样式间切换,产生闪烁
- 每个碰撞点处理时间不固定(包括对象移动、测试运行、测试删除)

解决方案:
- 去掉Update()调用,让Progress API保持一致的不确定进度条样式
- 仍保留BeginProgress/EndProgress,提供"正在处理N个碰撞点"的提示

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 12:50:45 +08:00
07bd9351bf 代码优化:简化命名空间引用,使用using别名
修改内容:
- 将 Autodesk.Navisworks.Api.Progress 简化为 Progress
- 将 Autodesk.Navisworks.Api.Application.BeginProgress() 简化为 NavisApplication.BeginProgress()
- 将 Autodesk.Navisworks.Api.Application.EndProgress() 简化为 NavisApplication.EndProgress()

理由:
- 文件顶部已经有 using Autodesk.Navisworks.Api;
- 文件顶部已经有 using NavisApplication = Autodesk.Navisworks.Api.Application;
- 使用using别名可以简化代码,提高可读性

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 12:16:14 +08:00
aaebbcad21 优化批量导出进度显示:统一使用Progress API,分离职责
核心改进:
1. ExportLayerToNwd专注导出逻辑,不再管理进度条
2. LayerManagementViewModel统一管理批量导出进度条
3. 状态栏只在开始/结束时显示,避免UI刷新同步问题

修改内容:

**ModelSplitterManager.cs**
- 移除ExportLayerToNwd内的Progress API相关代码
- 移除进度条声明、初始化、更新和清理代码
- 移除用户取消检查(由调用者管理)
- 保留核心导出逻辑:隔离、导出、恢复

**LayerManagementViewModel.cs**
- 在批量导出循环开始前创建Progress API进度条
- 循环中为每个文件更新进度条描述和百分比
- 显示:"正在导出第 X/Y 个分层:分层名"
- 移除循环中的状态栏进度更新(避免UI同步问题)
- 只在结束时更新状态栏最终结果
- finally块确保进度条被正确关闭

最终效果:
-  单文件导出:无进度条,快速完成
-  批量导出:统一的Progress API显示完整进度信息
-  状态栏:只显示开始/结束提示,不跟踪过程进度
-  职责清晰:导出逻辑与进度显示分离

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 12:14:20 +08:00
2e583cb9b6 清理ModelSplitterManager中未使用的辅助函数
删除以下未使用的方法:
- GetAllModelItems: 已被新的深度遍历函数替代
- PreviewSplitByAttribute: 通用属性预览方法已不再使用

这些函数的功能已经被更优化的实现替代,删除以保持代码整洁。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 11:48:22 +08:00
fec15d0805 优化进度条功能:移除碰撞检测的取消支持
碰撞检测是一个整体流程,中途取消会导致部分碰撞结果丢失。
因此移除取消检查,但保留进度显示功能。

修改内容:
- 移除 progress.IsCanceled 取消检查代码
- 保留 progress.Update() 进度更新
- 保留 finally 块中的进度条清理
- 添加注释说明不支持取消的原因

对比:
- 分层导出:支持取消(跳过当前文件不影响其他文件)
- 碰撞检测:不支持取消(确保获得完整的碰撞检测结果)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 11:47:47 +08:00
543479ee65 为分层导出和碰撞检测添加Progress API进度条支持
- 分层导出(ExportLayerToNwd):增加三阶段进度条(隔离30%/导出70%/完成100%)和用户取消支持
- 碰撞检测(CreateAllAnimationCollisionTests):增加循环进度条和用户取消支持
- 清理LayerManagementCommands中未使用的辅助函数

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 11:37:44 +08:00
a0a667d45d 修复路径删除时数据库未同步删除的bug
问题描述:
在路径编辑界面删除路径时,虽然UI列表和3D可视化被正确清除,
但数据库中的路径记录没有被删除,导致数据不一致。

根本原因:
PathEditingViewModel.ExecuteDeletePathAsync 方法直接操作集合:
- 直接调用 _pathPlanningManager.ModifiableRoutes.Remove(coreRoute)
- 绕过了 PathPlanningManager.DeleteRoute() 方法
- PathPlanningManager.DeleteRoute() 包含数据库删除逻辑

修复方案:
 使用 PathPlanningManager.DeleteRoute() 替代直接集合操作
 确保完整的删除流程:
   1. 清除3D可视化显示
   2. 调用 PathPlanningManager.DeleteRoute()
      - 从内存集合删除
      - 调用 PathDatabase.DeletePathRoute()
      - 更新当前路径状态
   3. 更新UI列表

修改文件:
- src/UI/WPF/ViewModels/PathEditingViewModel.cs (754-764行)

影响范围:
- 修复数据库一致性问题
- 增强日志记录(记录删除成功/失败)
- 不影响现有UI和可视化功能

测试建议:
1. 在路径列表中删除路径
2. 重启Navisworks验证路径是否真正被删除
3. 检查数据库中PathRoutes表记录是否减少

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 11:05:18 +08:00
e9e0d8c83f 合并体素网格路径规划功能分支到 2026
🎯 核心功能:
-  VoxelGrid 基础数据结构 - 3D体素网格表示
-  VoxelGridGenerator - 使用SDF精确体素化生成器
-  集成 geometry4Sharp 库 (v1.0.0) - MeshSignedDistanceGrid支持
-  XY平面障碍物膨胀算法 - 支持车辆安全间隙
-  3D体素路径规划 - A*算法在体素空间寻路
-  体素网格可视化验证 - UI测试命令

📐 签名距离场 (SDF) 方法:
- 使用 MeshSignedDistanceGrid 计算精确距离场
- 支持复杂几何体的准确体素化
- 门类型留空(不作为障碍物)
- 真实障碍物精确标记

🔧 膨胀算法:
- XY平面(每层独立)障碍物膨胀
- 支持车辆半径安全间隙设置
- 边界检测和特殊处理
- 多层高度支持

 性能优化:
- 批量 COM Selection 创建 - 减少API调用
- 进度条支持 - 实时显示处理进度
- 用户可取消操作 - 优雅中断
- 耗时统计和日志优化

📚 文档完善:
- 扩展 Progress API 使用指南(527行)
- 添加体素网格任务跟踪文档
- 实际应用案例和最佳实践
- 完整代码示例

🧪 测试功能:
- 体素网格SDF测试命令
- 体素路径规划测试命令
- UI测试面板集成

🛠️ 代码改进:
- 统一 ExtractTriangles 方法实现
- 优化集合提取器性能
- 完善错误处理和资源清理
- 移除重复代码

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 10:47:57 +08:00
a1d2a65010 优化集合提取器 2025-10-13 10:41:33 +08:00
e12e1125d2 为几何体提取添加进度条支持,优化用户体验
主要改进:
- 添加 Navisworks Progress API 支持到 ExtractTriangles 方法
- 实时显示片段处理进度(百分比)
- 支持用户取消操作(IsCanceled 检查)
- 移除批量日志输出,改用进度条展示
- 统一 ExtractTriangles 方法,移除单个项目的重复实现
- 在 finally 块中确保进度条正确关闭

文档更新:
- 扩展 NavisworksAPI使用方法.md 中的进度条章节
- 添加详细的 Progress API 使用指南
- 包含实际应用案例、最佳实践和常见陷阱
- 提供完整的代码示例和性能优化建议

性能改进:
- 每个片段更新一次进度(3516次调用,可接受)
- 移除频繁的日志写入(每100个片段),减少 I/O 开销
- 保留关键日志(开始、结束、取消、错误)

用户体验提升:
- 可视化进度反馈,避免假死感
- 支持随时取消长时间操作
- 优雅的错误处理和资源清理

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 10:40:24 +08:00
51be24161d 优化三角形提取性能 - 实现批量COM Selection创建
问题分析:
- 当前逐个ModelItem创建COM Selection(290次)
- 从290个模型项提取776140个三角形耗时较长
- COM对象创建/销毁开销大

优化方案:
1. 新增 GeometryHelper.ExtractTrianglesBatch 方法
   - 批量创建COM Selection(290次 → 1次)
   - 一次性提取所有模型项的三角形
   - 添加进度日志(每100个片段输出一次)

2. 修改 NavisworksToDMesh3Converter.ConvertFromModelItems
   - 从逐个调用 ExtractTriangles 改为批量调用 ExtractTrianglesBatch
   - 添加详细的耗时统计(毫秒和秒)
   - 添加 System.Linq 引用支持ToList()

3. 保留原有 ExtractTriangles 方法
   - 向后兼容单个模型项提取场景
   - 用于小规模提取或特殊场景

预期效果:
- COM Selection创建:290次 → 1次
- 预计性能提升:50-70%
- 日志更详细,便于性能分析

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 09:34:52 +08:00
2e9b9fe2b3 添加三角形提取阶段的耗时统计
在DMesh3转换过程中添加了三角形提取阶段的耗时统计,
便于性能分析和优化。

修改内容:
- 在ConvertFromModelItems方法中添加Stopwatch
- 统计从ModelItem提取三角形的耗时
- 日志格式:从 N 个模型项共提取 M 个三角形,耗时: X ms

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 09:21:38 +08:00
27908540c2 实现XY平面膨胀算法和3D体素路径规划
本次提交包含三个主要改进:

1. XY平面膨胀算法(VoxelGrid.cs)
   - 实现简单迭代形态学膨胀
   - 只在水平方向(XY平面)的4邻域膨胀
   - 不在Z方向(垂直方向)膨胀
   - 符合车辆物流场景:车辆只侧面/顶部碰撞障碍物

2. 3D体素路径规划(VoxelPathFinder.cs)
   - 集成RoyT.AStar库进行3D A*路径规划
   - 支持体素网格上的路径搜索
   - 添加VoxelPathFindingTestCommand测试命令

3. UI和测试改进
   - 删除旧的包围盒测试命令(VoxelGridTestCommand.cs)
   - 更新SystemManagementView UI
   - 添加体素路径规划测试功能

核心设计原则:
- 门模型在SDF生成前被排除(留出通道空洞)
- SDF阶段只标记几何体内部为障碍物
- 安全间隙仅在XY平面膨胀阶段应用
- 避免Z方向的错误膨胀

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 21:13:02 +08:00
2f78b4e58e 修复SDF标记阶段在Z方向应用安全间隙的问题
问题:
- SDF标记阶段使用了3D距离判断(distance < safetyMargin)
- 导致薄楼板上下0.6米范围内的体素都被标记为障碍物
- 违反了"车辆只会侧面或顶部碰撞"的设计原则

解决方案:
- SDF标记阶段只标记几何体内部(distance < 0)为障碍物
- 移除SDF阶段的安全间隙判断(minPassableDistance)
- 安全间隙只在后续的XY平面膨胀阶段应用

效果:
- 薄楼板只在其实际占据的Z层被标记为障碍物
- 楼板上下空间不会被错误标记
- 安全间隙仅在水平方向(XY平面)生效

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 21:12:27 +08:00
1e11f60042 feat(voxel): 实现障碍物膨胀算法 - 阶段1.5完成
完成任务1.5 - 障碍物膨胀算法(Obstacle Inflation)

核心实现:
-  VoxelGrid.InflateObstacles() 主方法(约200行)
-  PerformFastSweeping() 8方向扫描
-  Sweep() 单向距离传播
-  CheckAndUpdate() 邻居距离更新
-  从geometry4Sharp移植Fast Sweeping算法

技术特性:
- 3D距离变换使用DenseGrid3f存储距离场
- 8方向扫描:(+1,+1,+1), (-1,-1,-1)等8个方向
- 每次扫描检查7个邻居进行距离更新
- 门类型体素保护机制(门不膨胀)
- 正确的模型单位转换处理

性能数据(gatehouse_pub.nwd):
- 初始障碍物:3,747个体素
- 膨胀后障碍物:4,477个体素
- 新增膨胀:730个体素(19.5%增量)
- Fast Sweeping耗时:3ms
- 总膨胀耗时:4-5ms
- 可通行比例:22.9% → 7.9%

集成测试:
- VoxelGridSDFTestCommand新增膨胀测试
- SystemManagementViewModel调整测试参数(0.6米膨胀半径)
- 膨胀半径必须 >= 体素大小才能生效

问题修复:
- 修复膨胀为0的问题(参数配置:0.3米 < 0.5米体素)
- 调整测试参数为0.6米(600模型单位 > 500体素大小)
- 移除VoxelGridSDFTestCommand构造函数默认参数

阶段1完成:
- 任务1.1-1.5全部完成 
- 性能远超目标(< 1秒 vs 目标 < 5秒)
- 提前5天完成阶段1
- 建议继续阶段2

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 17:00:06 +08:00
b0b29c581c fix(ui): 修复XAML资源引用错误
问题:
- 使用了不存在的 NavisworksSecondaryTextBrush 资源
- 导致插件加载时 XAML 解析异常崩溃

修复:
- 将 NavisworksSecondaryTextBrush 改为 NavisworksDarkBrush
- 只使用 NavisworksStyles.xaml 中已定义的资源

可用的 Brush 资源:
- NavisworksPrimaryBrush
- NavisworksSecondaryBrush
- NavisworksLightBrush
- NavisworksBackgroundBrush
- NavisworksButtonBrush
- NavisworksTextBrush
- NavisworksDarkBrush

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 13:56:56 +08:00
6460dda879 feat(voxel): 添加体素网格测试UI和命令
实现内容:
1. 创建 VoxelGridTestCommand - 体素网格测试命令
   - 选中对象创建体素网格
   - 简单的边界标记(边界为障碍物,内部为自由空间)
   - 生成可视化报告
   - 防止体素数量过多(>100万)

2. 在系统管理页签添加功能测试区域
   - 新增"功能测试"分组
   - 添加"测试体素网格"按钮
   - 集成到 SystemManagementViewModel

3. 功能特性
   - 自动计算选中对象的总包围盒
   - 提取三角网格(为后续SDF做准备)
   - 体素统计信息(总数、可通行、障碍物)
   - 生成详细的测试报告

使用方法:
1. 在 Navisworks 中选择一个或多个模型对象
2. 打开插件面板 -> 系统管理页签
3. 滚动到最下方"功能测试"区域
4. 点击"测试体素网格"按钮
5. 查看测试结果对话框和日志

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 13:49:55 +08:00
805814616a feat(voxel): 阶段1.5 - 体素网格可视化验证
实现内容:
- 创建 VoxelGridVisualizer 类,支持多种可视化模式
- VisualizeAsPoints(): 完整网格可视化(支持采样率)
- VisualizeSlice(): 单层切片可视化
- VisualizeBoundary(): 障碍物边界可视化
- ConvertToPathRoute(): 转换为 PathRoute 以便集成到现有渲染系统
- QuickVisualizationTest(): 快速测试套件
- GenerateVisualizationReport(): 文本报告生成

设计策略:
- 复用现有 PathPointRenderPlugin,而非创建新的 RenderPlugin
- 将体素转换为 PathPoint 对象进行渲染
- 使用小球体表示体素,不同颜色区分类型

完成情况:
-  编译通过,无错误
-  阶段 1 全部 5 个任务完成 (100%)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 13:38:57 +08:00
f64e79d372 feat(voxel): 阶段1.4 - 测试 geometry4Sharp 的 MeshSignedDistanceGrid
- 创建 MeshSDFTester.cs: 测试 geometry4Sharp 库的可用性和功能
- 实现 Navisworks Triangle3D 到 DMesh3 的转换
- 实现 MeshSignedDistanceGrid (SDF) 计算功能
- 添加库可用性快速测试方法
- 手动构建测试立方体网格

特性(原型版本):
- QuickLibraryTest(): 验证 geometry4Sharp 库是否正常工作
- ConvertToDMesh3(): 将 Navisworks 三角形转换为 DMesh3 格式
- ComputeSDF(): 计算签名距离场(使用 DMeshAABBTree3 加速)
- TestFullPipeline(): 完整测试流程(ModelItem → 三角形 → DMesh3 → SDF)
- CreateTestCubeMesh(): 手动创建测试立方体

注意:
- 这是原型版本,部分 SDF 距离查询 API 需要进一步研究
- 验证了 DMesh3, DMeshAABBTree3, MeshSignedDistanceGrid 基本可用
- 与 GeometryHelper.ExtractTriangles() 集成

下一步: 体素可视化验证(阶段1.5)或根据实际需求调整
2025-10-12 13:20:29 +08:00
40946091dd docs(voxel): 更新任务跟踪 - 任务1.3已完成
- 标记任务 1.3(实现简单体素化原型)为已完成
- 更新总体进度:3/17 任务完成(18%)
- 更新阶段 1 进度:3/5 任务完成(60%)
- 添加变更日志:VoxelGridGenerator 360行代码完成

完成情况:
- 包围盒体素化算法实现
- 物流类型自动识别
- 障碍物膨胀功能
- 单位自动转换
- 性能统计日志
2025-10-12 11:47:01 +08:00
064945bfa6 feat(voxel): 阶段1.3 - 实现简单体素化原型 (VoxelGridGenerator)
- 创建 VoxelGridGenerator.cs: 从 BIM 模型生成体素网格
- 使用包围盒方法进行简单体素化(阶段1原型版本)
- 支持障碍物膨胀(车辆半径)
- 自动识别物流元素类型(从属性或名称推断)
- 详细的性能日志和统计信息
- 包含 CreateTestGrid() 快速测试方法

特性:
- 包围盒体素化算法
- 物流类型自动识别(门、楼梯、电梯、通道、障碍物)
- 体素膨胀处理(仅对障碍物)
- 单位自动转换(米 → 模型单位)
- 完整的 XML 中文注释(360行代码)

性能:
- 支持大规模场景处理
- 详细的时间统计和进度日志

下一步: 测试 MeshSignedDistanceGrid(阶段1.4)
2025-10-12 11:45:38 +08:00
aece9fbbe1 docs(voxel): 更新任务跟踪文档 - 任务1.1和1.2已完成
- 标记任务 1.1(安装 geometry4Sharp)为已完成
- 标记任务 1.2(创建 VoxelGrid 基础数据结构)为已完成
- 更新总体进度:2/17 任务完成(12%)
- 更新阶段 1 进度:2/5 任务完成(40%)
- 添加变更日志条目

完成情况:
- VoxelCell.cs: 167 行代码
- VoxelGrid.cs: 365 行代码
- 完整的 XML 中文注释
- 编译通过,无错误
2025-10-12 11:27:29 +08:00
c9ca6b4d32 feat(voxel): 阶段1.2 - 创建 VoxelGrid 基础数据结构
- 创建 VoxelCell.cs: 体素单元类,包含类型、通行性、距离、成本等属性
- 创建 VoxelGrid.cs: 3D体素网格类,包含坐标转换、邻域查询、统计信息等方法
- 添加到 NavisworksTransportPlugin.csproj 编译项
- 编译成功验证

特性:
- VoxelCell: 物流属性集成,SDF距离存储,成本计算方法
- VoxelGrid: 世界坐标↔体素索引转换,6/26邻域查询,欧几里得/曼哈顿距离计算
- 完整的 XML 文档注释(中文)

下一步: 实现简单体素化原型
2025-10-12 11:25:45 +08:00
0a61057476 feat(voxel): 阶段1.1 - 添加 geometry4Sharp 1.0.0 NuGet 包
- 安装 geometry4Sharp 1.0.0
- 更新 packages.config
- 添加 DLL 引用到 NavisworksTransportPlugin.csproj
- 使用 net48 版本确保 .NET Framework 4.8 兼容性

依赖项: packages\geometry4Sharp.1.0.0\lib\net48\geometry4Sharp.dll

下一步: 创建 VoxelGrid 基础数据结构
2025-10-12 11:22:52 +08:00
2b0b13c43a docs(voxel): 添加体素网格路径规划任务跟踪文档
- 创建详细的 4 阶段任务清单(17 个子任务)
- 每个任务包含:工作量、验收标准、阻塞问题
- 包含风险管理、进度跟踪、决策流程
- 包含 Git 工作流和提交规范

文件位置: doc/working/voxel_pathfinding_task_tracker.md
2025-10-12 11:15:55 +08:00
dd991d38ce 增加体素网格和GPU加速2个可行性方案 2025-10-12 11:05:29 +08:00