From 06faf04b8335ec15de4e088bb031db5c248de019 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Sun, 28 Sep 2025 20:10:59 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E9=80=9A=E9=81=93=E7=9A=84=E9=AB=98?= =?UTF-8?q?=E5=BA=A6=E8=8C=83=E5=9B=B4+=E8=BD=A6=E8=BE=86=E9=AB=98?= =?UTF-8?q?=E5=BA=A6+=E5=AE=89=E5=85=A8=E9=97=B4=E9=9A=99=E4=BD=9C?= =?UTF-8?q?=E4=B8=BA=E8=BF=87=E6=BB=A4=E8=8C=83=E5=9B=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 14 +++++++++++ src/PathPlanning/AutoPathFinder.cs | 1 - src/PathPlanning/ChannelBasedGridBuilder.cs | 24 +++++++------------ src/PathPlanning/GridMapGenerator.cs | 26 ++++++++++++++------- 4 files changed, 41 insertions(+), 24 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index d86598a..c625c43 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -139,6 +139,20 @@ public class PathClickToolPlugin : ToolPlugin { } - **Modern animation system**: Use Navisworks 2026 native animation components instead of manual Transform manipulation - **Enhanced APIs**: Take advantage of improved 2026 APIs for collision detection, animation, and model management +### Serena MCP工具配置 + +- **Token限制策略**: 所有serena MCP工具调用必须使用`max_answer_chars: 3000`参数 +- **适用工具**: 包括但不限于: + - `mcp__serena__search_for_pattern` + - `mcp__serena__find_symbol` + - `mcp__serena__get_symbols_overview` + - `mcp__serena__find_referencing_symbols` + - 所有其他支持`max_answer_chars`参数的serena工具 +- **执行原则**: + - 优先使用精确搜索而非宽泛搜索以减少token消耗 + - 分步骤获取信息,避免一次性获取大量内容 + - 如遇到3k限制导致内容截断,应使用更精确的搜索条件重新查询 + ## API Documentation Search Strategy ### CHM文档搜索最佳实践 diff --git a/src/PathPlanning/AutoPathFinder.cs b/src/PathPlanning/AutoPathFinder.cs index 1f681d4..de37c2d 100644 --- a/src/PathPlanning/AutoPathFinder.cs +++ b/src/PathPlanning/AutoPathFinder.cs @@ -728,7 +728,6 @@ namespace NavisworksTransport.PathPlanning Math.Abs(optimizedPath[checkIdx+1].Z - optimizedPath[checkIdx].Z) > heightTolerance)) { canSkip = false; - LogManager.Debug($"[斜线优化] 不能跳过点{checkIdx},存在高度变化"); break; } } diff --git a/src/PathPlanning/ChannelBasedGridBuilder.cs b/src/PathPlanning/ChannelBasedGridBuilder.cs index a0be163..a89f53c 100644 --- a/src/PathPlanning/ChannelBasedGridBuilder.cs +++ b/src/PathPlanning/ChannelBasedGridBuilder.cs @@ -216,22 +216,16 @@ namespace NavisworksTransport.PathPlanning // 计算网格中心点在三角形平面上的精确高度 double gridCenterHeight = GetHeightAtPoint(triangle, worldPos.X, worldPos.Y); - // 调试日志:打印生成的网格坐标和高度 - LogManager.Debug($"[调试] 生成通道网格: ({gridPos.X}, {gridPos.Y}) 高度: {gridCenterHeight:F2}"); + // 使用SetCell方法正确创建通道网格并更新统计信息 + gridMap.SetCell(gridPos, true, 0, CategoryAttributeManager.LogisticsElementType.通道); - // 直接设置网格属性 - var cell = new GridCell - { - IsWalkable = true, - CellType = CategoryAttributeManager.LogisticsElementType.通道, - IsInChannel = true, - PassableHeight = new HeightInterval(), - ChannelType = ChannelType.Corridor, - WorldPosition = new Point3D(worldPos.X, worldPos.Y, gridCenterHeight), - RelatedModelItem = null - }; - cell.Cost = cell.GetCost(); - gridMap.Cells[gridPos.X, gridPos.Y] = cell; + // 然后更新特定的通道属性 + var updatedCell = gridMap.Cells[gridPos.X, gridPos.Y]; + updatedCell.WorldPosition = new Point3D(worldPos.X, worldPos.Y, gridCenterHeight); + updatedCell.PassableHeight = new HeightInterval(); + updatedCell.ChannelType = ChannelType.Corridor; + updatedCell.RelatedModelItem = null; + gridMap.Cells[gridPos.X, gridPos.Y] = updatedCell; } } } diff --git a/src/PathPlanning/GridMapGenerator.cs b/src/PathPlanning/GridMapGenerator.cs index 91170e6..73161e0 100644 --- a/src/PathPlanning/GridMapGenerator.cs +++ b/src/PathPlanning/GridMapGenerator.cs @@ -120,7 +120,7 @@ namespace NavisworksTransport.PathPlanning // 2. 直接遍历处理障碍物(包围盒检测) - 使用高性能优化版本 LogManager.Info("【生成网格地图】步骤2: 高性能包围盒遍历处理障碍物"); - ProcessObstaclesWithBoundingBoxOptimized(channelCoverage.GridMap, channelRelatedItems, scanHeightInModelUnits); + ProcessObstaclesWithBoundingBox(channelCoverage.GridMap, channelRelatedItems, scanHeightInModelUnits, channelCoverage); LogManager.Info($"【阶段2完成】障碍物处理后网格统计: {channelCoverage.GridMap.GetStatistics()}"); @@ -1126,11 +1126,11 @@ namespace NavisworksTransport.PathPlanning /// 使用包围盒遍历方式处理障碍物(高性能优化版) /// 分离API访问和数值计算,利用并行处理加速纯计算部分 /// - /// Navisworks文档 /// 网格地图 /// 通道模型项列表 /// 扫描高度范围(模型单位) - private void ProcessObstaclesWithBoundingBoxOptimized(GridMap gridMap, HashSet channelItems, double scanHeightInModelUnits) + /// 通道覆盖信息,包含通道边界 + private void ProcessObstaclesWithBoundingBox(GridMap gridMap, HashSet channelItems, double scanHeightInModelUnits, ChannelCoverage channelCoverage) { try { @@ -1168,8 +1168,16 @@ namespace NavisworksTransport.PathPlanning var filterElapsed = (DateTime.Now - filterStart).TotalMilliseconds; LogManager.Info($"[高性能障碍物处理] 阶段3完成: 从缓存中筛选出 {validItems.Count} 个有效项,耗时: {filterElapsed:F1}ms"); - // 阶段4:网格覆盖计算(并行几何计算)- 使用50%CPU核心优化 + 精确高度检查 - LogManager.Info("[高性能障碍物处理] 阶段4: 并行网格覆盖计算 + 精确高度检查"); + // 获取通道高度范围信息 + var channelBounds = channelCoverage.TotalBounds; + var channelMinZ = channelBounds.Min.Z; + var channelMaxZ = channelBounds.Max.Z; + var channelHeightRange = channelMaxZ - channelMinZ; + LogManager.Info($"[高性能障碍物处理] 通道高度信息 - 最低点: {channelMinZ:F2}, 最高点: {channelMaxZ:F2}"); + LogManager.Info($"[高性能障碍物处理] 通道高度范围: {channelHeightRange:F2}, 加车辆高度后扫描范围: [{channelMinZ:F2}, {channelMaxZ + scanHeightInModelUnits:F2}]"); + + // 阶段4:网格覆盖计算(并行几何计算)- 使用50%CPU核心优化 + 基于通道的精确高度检查 + LogManager.Info("[高性能障碍物处理] 阶段4: 并行网格覆盖计算 + 基于通道高度的精确高度检查"); var gridCalcStart = DateTime.Now; var heightCheckedItems = validItems.AsParallel() @@ -1188,9 +1196,11 @@ namespace NavisworksTransport.PathPlanning } var centerCell = gridMap.Cells[centerGridPos.X, centerGridPos.Y]; - var referenceZ = centerCell.WorldPosition.Z; - var scanMin = referenceZ; - var scanMax = referenceZ + scanHeightInModelUnits; + + // 使用通道高度范围计算扫描范围 + // 扫描范围:从通道最低点开始,到通道最高点+车辆高度+安全间隙 + var scanMin = channelMinZ; + var scanMax = channelMaxZ + scanHeightInModelUnits; // 只有与该网格高度范围重叠的几何体才进入处理 bool isInRange = !(bbox.Max.Z < scanMin || bbox.Min.Z > scanMax);