From 4069668a2a857360c8fc461e417e0a416bbaddd8 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Thu, 29 Jan 2026 13:27:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=B9=E5=A4=84=E7=90=86?= =?UTF-8?q?=E6=9C=AA=E5=8A=A0=E8=BD=BD=E5=BE=85=E5=A4=84=E7=90=86=E9=A1=B9?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E4=BF=AE=E5=A4=8D=E7=A9=BA=E4=B8=AD=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 435 ++++++++++++++---- src/Core/BatchQueueManager.cs | 57 ++- src/Core/PathPlanningManager.cs | 24 +- src/UI/WPF/ViewModels/PathEditingViewModel.cs | 16 +- 4 files changed, 419 insertions(+), 113 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 3e1f4e1..3ba84e8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,130 +1,247 @@ # AGENTS.md -本文件包含在 NavisworksTransport 仓库中工作的代理编码助手所需的构建/测试命令和代码风格指南。 +本文件为AI编码助手提供 NavisworksTransport 项目的完整开发指南。阅读本文件前,请确保你已经了解项目的基本结构和目标。 + +## 项目概述 + +**NavisworksTransport** 是专为 Autodesk Navisworks Manage 2026 开发的物流路径规划插件,用于BIM模型中的运输冲突检测和路径规划。 + +### 核心功能 + +- **物流属性管理**: 为模型分配类别属性(门、电梯、楼梯、通道、障碍物) +- **自动路径规划**: 基于A*算法的2.5D网格路径规划,支持通道优先策略 +- **碰撞检测**: 与Navisworks ClashDetective集成,实现动态碰撞检测 +- **动画仿真**: TimeLiner集成,支持路径动画播放和仿真 +- **吊装路径**: 支持空中吊装路径规划(两次点击模式) +- **数据导出**: 支持XML、JSON、CSV格式的路径数据导出,以及DELMIA数据格式 + +### 技术栈 + +| 组件 | 版本/说明 | +|------|----------| +| 目标平台 | Navisworks Manage 2026 | +| 框架 | .NET Framework 4.8 | +| 语言 | C# 7.3 | +| 架构 | x64 | +| UI框架 | WPF (MVVM模式) + Windows Forms集成 | + +### 项目文件 + +| 文件 | 说明 | +|------|------| +| `NavisworksTransportPlugin.csproj` | 主插件项目(旧式csproj格式) | +| `NavisworksTransport.UnitTests.csproj` | 单元测试项目 | +| `NavisworksTransport.sln` | Visual Studio 解决方案 | +| `packages.config` | NuGet包配置(旧式包管理) | +| `default_config.toml` | 默认配置文件模板 | +| `compile.bat` | 构建脚本 | +| `run-unit-tests.bat` | 测试脚本 | +| `deploy-plugin.bat` | 部署脚本 | ## 构建命令 +### 环境要求 + +- Windows 10 或更高版本 +- Visual Studio 2022(Community/Professional) +- Navisworks Manage 2026(已安装) +- .NET Framework 4.8 Developer Pack + ### 主要构建 ```bash ./compile.bat ``` -- 使用 Visual Studio 2022 的 MSBuild +- 自动检测 Visual Studio 2022 的 MSBuild - 构建 Release 配置的 x64 平台 -- 目标框架:.NET Framework 4.8 +- 输出目录: `bin\x64\Release\` -### 测试命令 +### 手动构建 + +```bash +# 设置MSBuild路径 +set MSBUILD_PATH="C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" + +# 构建主项目 +%MSBUILD_PATH% "NavisworksTransportPlugin.csproj" /p:Configuration=Release /p:Platform=x64 + +# 构建测试项目 +%MSBUILD_PATH% "NavisworksTransport.UnitTests.csproj" /p:Configuration=Release /p:Platform=x64 +``` + +### 运行测试 ```bash ./run-unit-tests.bat ``` -- 首先构建主项目 -- 构建测试项目(Release/x64) -- 使用 VSTest 控制台运行单元测试 -- 测试框架:MSTest 3.0.4 +该脚本将: +1. 构建主项目 +2. 构建测试项目 +3. 使用 VSTest.Console 运行单元测试 -### 手动测试执行 +### 部署插件 ```bash -# 仅构建测试项目 -MSBuild.exe NavisworksTransport.UnitTests.csproj /p:Configuration=Release /p:Platform=x64 - -# 运行特定测试(使用 Release 路径匹配构建输出) -VSTest.Console.exe "bin\x64\Release\NavisworksTransport.UnitTests.dll" /Framework:".NETFramework,Version=v4.8" /TestAdapterPath:"packages\MSTest.TestAdapter.3.0.4\build\net462" +./deploy-plugin.bat ``` -## 项目结构 +自动复制插件文件到 Navisworks 插件目录: +`C:\ProgramData\Autodesk\Navisworks Manage 2026\plugins\NavisworksTransportPlugin\` -### 目标环境 +## 项目架构 -- **平台**: Navisworks 2026 (Windows 10+) -- **框架**: .NET Framework 4.8 -- **语言**: C# 7.3 -- **架构**: x64 +### 目录结构 -### 关键目录 +``` +src/ +├── Core/ # 核心插件和业务逻辑 +│ ├── MainPlugin.cs # DockPanePlugin - Ribbon UI + 停靠面板 +│ ├── PathClickToolPlugin.cs # ToolPlugin - 3D鼠标交互工具 +│ ├── PathPointRenderPlugin.cs # RenderPlugin - 3D可视化渲染 +│ ├── PathPlanningManager.cs # 路径规划管理器(与UI解耦) +│ ├── PathDataManager.cs # 路径数据管理 +│ ├── PathDatabase.cs # SQLite数据库操作 +│ ├── PathCurveEngine.cs # 路径曲线化引擎 +│ ├── UIStateManager.cs # 线程安全的UI状态管理 +│ ├── Animation/ # 动画系统 +│ │ ├── PathAnimationManager.cs +│ │ └── TimeLinerIntegrationManager.cs +│ ├── Collision/ # 碰撞检测 +│ │ ├── ClashDetectiveIntegration.cs +│ │ └── BatchCollisionProcessor.cs +│ ├── Spatial/ # 空间索引 +│ │ ├── SpatialHashGrid.cs +│ │ └── SpatialIndexManager.cs +│ ├── Properties/ # 属性管理 +│ │ ├── CategoryAttributeManager.cs +│ │ └── NavisworksComPropertyManager.cs +│ └── Config/ # 配置管理 +│ ├── SystemConfig.cs +│ └── ConfigManager.cs +├── Commands/ # 命令模式实现 +│ ├── CommandBase.cs +│ ├── CommandManager.cs +│ ├── AutoPathPlanningCommand.cs +│ └── ... +├── PathPlanning/ # A*算法和网格地图 +│ ├── GridMap.cs # 网格地图定义 +│ ├── GridMapGenerator.cs # 网格生成器 +│ ├── AutoPathFinder.cs # A*寻路实现 +│ ├── ChannelBasedGridBuilder.cs # 通道优先网格构建 +│ ├── VoxelGrid.cs # 3D体素网格(实验性) +│ └── PathOptimizer.cs # 路径优化 +├── UI/WPF/ # WPF用户界面 +│ ├── Views/ # XAML视图 +│ ├── ViewModels/ # MVVM视图模型 +│ ├── Models/ # 数据模型 +│ ├── Converters/ # 值转换器 +│ ├── Commands/ # WPF命令 +│ └── Services/ # UI服务 +└── Utils/ # 工具类 + ├── UnitsConverter.cs # 单位转换(关键!) + ├── LogManager.cs # 日志管理 + ├── GeometryHelper.cs # 几何计算 + └── ... -- `src/Core/` - 主插件文件和业务逻辑 -- `src/Commands/` - 命令模式实现 -- `src/PathPlanning/` - A* 算法和网格地图生成 -- `src/UI/WPF/` - WPF MVVM UI 组件 -- `src/Utils/` - 工具类和助手 -- `UnitTests/` - 测试文件 +UnitTests/ # 单元测试 +├── Core/ # 核心功能测试 +├── Commands/ # 命令测试 +└── Utils/ # 工具类测试 +``` -### 插件架构 +### 插件类型说明 -- **MainPlugin.cs**: AddInPlugin - Ribbon UI + 停靠面板 -- **PathClickToolPlugin.cs**: ToolPlugin - 3D 鼠标交互 -- **PathPointRenderPlugin.cs**: RenderPlugin - 3D 可视化 +| 插件类 | 类型 | 功能 | +|--------|------|------| +| `MainPlugin.cs` | DockPanePlugin | 主UI面板,包含WPF控件宿主 | +| `PathClickToolPlugin.cs` | ToolPlugin | 鼠标点击工具,获取精确的3D坐标 | +| `PathPointRenderPlugin.cs` | RenderPlugin | 3D渲染,显示路径点和连线 | -### API 使用 +### 关键依赖 -- **Native API** (`Autodesk.Navisworks.Api`): 核心功能 -- **COM API** (`Autodesk.Navisworks.ComApi`): 属性持久化, TimeLiner -- 在 MainPlugin 构造函数中初始化 `GlobalExceptionHandler` +**Navisworks API(必须安装Navisworks 2026):** +- `Autodesk.Navisworks.Api.dll` +- `Autodesk.Navisworks.ComApi.dll` +- `Autodesk.Navisworks.Interop.ComApi.dll` +- `Autodesk.Navisworks.Timeliner.dll` +- `Autodesk.Navisworks.Clash.dll` +- `Autodesk.Navisworks.Controls.dll` -## 代码风格指南 +**NuGet包:** +- `RoyT.AStar 3.0.2` - A*寻路算法 +- `geometry4Sharp 1.0.0` - 3D几何计算(体素路径规划) +- `System.Data.SQLite.Core 1.0.118.0` - SQLite数据库 +- `Tomlyn 0.19.0` - TOML配置文件解析 +- `MSTest.TestFramework 3.0.4` - 单元测试框架 -### 导入和命名空间 +## 代码规范 + +### 导入顺序 ```csharp -// System 命名空间优先 +// 1. System命名空间 using System; using System.Collections.Generic; -using System.Threading.Tasks; +using System.Linq; -// 第三方库 +// 2. 第三方库 using RoyT.AStar; -// Navisworks API 命名空间 -using Autodesk.Navisworks.ComApi; +// 3. Navisworks API using Autodesk.Navisworks.Api; +using Autodesk.Navisworks.ComApi; using Autodesk.Navisworks.Api.Plugins; -// 项目命名空间(按字母顺序) +// 4. 项目命名空间(按字母顺序) +using NavisworksTransport.Commands; using NavisworksTransport.Core; -using NavisworksTransport.Utils; +using NavisworksTransport.PathPlanning; using NavisworksTransport.UI.WPF.ViewModels; +using NavisworksTransport.Utils; ``` ### 命名约定 -- **类**: PascalCase (例如: `PathPlanningManager`) -- **方法**: PascalCase (例如: `GenerateGridMap`) -- **属性**: PascalCase (例如: `CellSize`) -- **字段**: camelCase 带下划线前缀 (例如: `_uiStateManager`) -- **常量**: PascalCase (例如: `MaxHeightDiff`) -- **接口**: PascalCase 带 'I' 前缀 (例如: `IPathPlanningCommand`) -- **枚举**: PascalCase (例如: `LogLevel`) +| 类型 | 命名规则 | 示例 | +|------|----------|------| +| 类 | PascalCase | `PathPlanningManager` | +| 接口 | PascalCase + 'I'前缀 | `IPathPlanningCommand` | +| 方法 | PascalCase | `GenerateGridMap` | +| 属性 | PascalCase | `CellSize` | +| 字段 | camelCase + 下划线前缀 | `_uiStateManager` | +| 常量 | PascalCase | `MaxHeightDiff` | +| 枚举 | PascalCase | `GridGenerationMode` | ### 单位系统 - 极其重要 -所有网格地图和路径规划计算**必须使用模型单位**,不要用米制单位。 +**所有网格地图和路径规划计算必须使用模型单位,严禁混用米制单位。** ```csharp -// ✅ 正确:在函数入口转换 +// ✅ 正确:在函数入口统一转换 public GridMap GenerateFromBIM(BoundingBox3D bounds, double cellSizeMeters, ...) { double factor = UnitsConverter.GetMetersToUnitsConversionFactor(Application.ActiveDocument.Units); double cellSizeInModelUnits = cellSizeMeters * factor; - // 使用模型单位进行所有计算 + // 后续所有计算使用 cellSizeInModelUnits } -// ❌ 错误:在计算中混用单位 -private const double MAX_HEIGHT_DIFF = 0.35; // 米! -if (heightDiff > MAX_HEIGHT_DIFF) // Bug! +// ❌ 错误:混用单位 +private const double MAX_HEIGHT_DIFF = 0.35; // 这是米! +if (heightDiff > MAX_HEIGHT_DIFF) // 单位不匹配,严重Bug! ``` +`UnitsConverter` 提供以下方法: +- `GetUnitsToMetersConversionFactor()` - 文档单位转米 +- `GetMetersToUnitsConversionFactor()` - 米转文档单位 +- `ConvertToMeters(distance)` - 转换距离为米 +- `ConvertFromMeters(distanceInMeters)` - 从米转换距离 + ### 错误处理 -- **防御性编程**: 检测并报告错误,不要隐藏它们 -- **日志记录**: 使用 `LogManager` 进行所有错误报告 -- **异常**: 不要仅仅为了吞噬异常而捕获它们 - ```csharp -// ✅ 正确:记录并重新抛出或适当处理 +// ✅ 正确:记录并适当处理异常 try { var result = SomeOperation(); @@ -133,10 +250,10 @@ try catch (Exception ex) { LogManager.Error($"Operation failed: {ex.Message}"); - throw; // 重新抛出或适当处理 + throw; // 或适当处理 } -// ❌ 错误:吞噬异常 +// ❌ 错误:静默吞掉异常 try { var result = SomeOperation(); @@ -144,18 +261,19 @@ try } catch { - return null; // 隐藏问题 + return null; // 隐藏了问题! } ``` ### 线程安全和UI更新 -- 使用 `UIStateManager` 进行线程安全的UI更新 -- UI操作必须编组到主线程 -- 使用异步事件触发避免死锁 +所有UI操作必须编组到主线程: ```csharp -// ✅ 正确:异步事件触发 +// ✅ 正确:使用UIStateManager进行线程安全更新 +_uiStateManager.UpdateStatus("正在处理..."); + +// ✅ 正确:异步事件触发避免死锁 private void OnStatusChanged(string status) { Task.Run(() => @@ -172,45 +290,164 @@ private void OnStatusChanged(string status) } ``` -### 包管理 +## 配置系统 -- 使用旧式 csproj 与 `` 和 HintPath -- packages.config 用于手动包管理 -- **不要** 使用 `dotnet add package` -- 包路径: `packages\{PackageId}.{Version}\lib\{TargetFramework}\{Assembly}.dll` +配置文件使用 TOML 格式,默认配置位于 `default_config.toml`: -### 文档和注释 +```toml +[path_editing] +cell_size_meters = 0.5 # 网格单元大小(米) +max_height_diff_meters = 0.35 # 最大高度差(米) +vehicle_length_meters = 1.5 # 车辆长度 +vehicle_width_meters = 1.0 # 车辆宽度 +vehicle_height_meters = 2.0 # 车辆高度 +safety_margin_meters = 0.1 # 安全间隙 +default_path_turn_radius = 2.5 # 默认转弯半径 +arc_sampling_step = 0.05 # 圆弧采样步长 -- 对公共 API 使用 XML 文档 -- 业务逻辑可以使用中文注释 -- 注释重点说明"为什么"而不是"什么" +[visualization] +margin_ratio = 0.1 # 地图边距比例 -### 性能考虑 +[animation] +frame_rate = 30 # 动画帧率 +duration_seconds = 10.0 # 动画持续时间 +detection_tolerance_meters = 0.05 # 检测容差 +spatial_index_cell_size = 1.0 # 空间索引格子大小 -- 缓存频繁访问的几何数据 -- 使用空间索引进行碰撞检测 -- 使用 `SmartDataBindingOptimizer` 优化 UI 更新 -- 最小化跨线程操作 +[logistics] +traversable = true # 默认可通行性 +priority = 5 # 优先级(1-5) +height_limit_meters = 3.0 # 高度限制 +speed_limit_meters_per_second = 0.8 # 速度限制 +width_limit_meters = 3.0 # 宽度限制 +``` -## 常见错误避免 +运行时通过 `ConfigManager.Instance.Current` 访问配置。 -1. **单位混淆**: 绝不要在计算中混用米制和模型单位 -2. **线程违规**: 始终将UI操作编组到主线程 -3. **异常吞噬**: 正确记录和处理错误 -4. **内存泄漏**: 释放资源并取消事件订阅 -5. **API兼容性**: 专门针对 Navisworks 2026,不考虑向后兼容 +## 测试策略 -## 验证 +### 测试项目结构 -运行命令前,代理应该验证: +``` +UnitTests/ +├── Core/ +│ ├── PathCurveEngineTests.cs +│ └── UIStateManagerBasicTests.cs +├── Commands/ +│ └── CommandBaseTests.cs +├── Collections/ +│ └── ThreadSafeObservableCollectionBasicTests.cs +└── Utils/ + └── UnitsConverterTests.cs +``` -- 构建输出存在: `dir bin\x64\Release\NavisworksTransportPlugin.dll` -- 测试程序集存在: `dir bin\x64\Release\NavisworksTransport.UnitTests.dll` -- 依赖项在预期的包路径中 -- MSBuild 和 VSTest 在预期位置可用 +### 测试框架 -## 调试 +- **框架**: MSTest 3.0.4 +- **运行器**: VSTest.Console.exe +- **目标框架**: .NET Framework 4.8 -- 调试日志位置: `"C:\ProgramData\Autodesk\Navisworks Manage 2026\plugins\NavisworksTransportPlugin\logs\debug.log"` -- 使用 `LogManager` 进行结构化日志记录 -- 在 Navisworks 2026 环境中测试以进行完整集成测试 +### 编写测试 + +```csharp +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace NavisworksTransport.UnitTests +{ + [TestClass] + public class ExampleTests + { + [TestMethod] + public void TestMethod_ShouldDoSomething() + { + // Arrange + var input = "test"; + + // Act + var result = SomeMethod(input); + + // Assert + Assert.AreEqual("expected", result); + } + } +} +``` + +### 注意事项 + +- 独立测试:不依赖Navisworks环境,测试核心算法逻辑 +- 集成测试:需要完整的Navisworks 2026环境 +- 日志位置: `C:\ProgramData\Autodesk\Navisworks Manage 2026\plugins\NavisworksTransportPlugin\logs\debug.log` + +## 开发工作流 + +### 添加新功能的标准流程 + +1. **定义接口**(如果需要) + - 在 `src/Commands/` 或 `src/Core/` 中定义接口 + +2. **实现核心逻辑** + - 业务逻辑放在 `src/Core/` 或 `src/PathPlanning/` + - 确保单位转换正确 + +3. **添加命令封装**(如果需要) + - 在 `src/Commands/` 中实现命令类 + - 继承 `CommandBase` 或实现 `IPathPlanningCommand` + +4. **更新UI** + - ViewModel 在 `src/UI/WPF/ViewModels/` + - View 在 `src/UI/WPF/Views/` + +5. **注册到主插件** + - 在 `MainPlugin.cs` 或相关管理器中集成 + +6. **添加测试** + - 在 `UnitTests/` 对应目录添加测试 + +### 调试技巧 + +1. **查看日志**: 日志文件位于 `C:\ProgramData\Autodesk\Navisworks Manage 2026\plugins\NavisworksTransportPlugin\logs\` +2. **使用 LogManager**: 所有重要操作都应记录日志 +3. **Navisworks插件调试**: + - 附加到 `Roamer.exe` 进程 + - 使用 `LogManager.Debug()` 输出调试信息 + +## 常见问题 + +### 构建失败 + +- **错误**: "MSBuild not found" + - **解决**: 安装 Visual Studio 2022 或 Build Tools + +- **错误**: "无法找到 Autodesk.Navisworks.Api" + - **解决**: 安装 Navisworks Manage 2026 + +### 运行时错误 + +- **错误**: "单位不匹配导致的计算错误" + - **解决**: 检查 `UnitsConverter` 使用是否正确 + +- **错误**: "跨线程UI操作异常" + - **解决**: 使用 `UIStateManager` 或 `Dispatcher.Invoke` + +- **错误**: "插件未加载" + - **解决**: 检查插件是否部署到正确目录,检查依赖项是否存在 + +## 文档资源 + +- **API文档**: `doc/navisworks_api/NET/documentation/NET API.chm` +- **COM API文档**: `doc/navisworks_api/COM/documentation/NavisWorksCOM.chm` +- **设计文档**: `doc/design/2026/` +- **架构设计**: `doc/architecture/` +- **迁移指南**: `doc/migration/`(2017到2026的API变更) + +## 版本信息 + +- **当前版本**: 2.0.0.0 +- **程序集**: NavisworksTransportPlugin +- **作者**: Tian +- **版权**: Copyright © 2024 + +--- + +**注意**: 本插件专门针对 Navisworks 2026 开发,不考虑向后兼容。 diff --git a/src/Core/BatchQueueManager.cs b/src/Core/BatchQueueManager.cs index 23946b5..9c67fc2 100644 --- a/src/Core/BatchQueueManager.cs +++ b/src/Core/BatchQueueManager.cs @@ -129,6 +129,12 @@ namespace NavisworksTransport.Core LogManager.Warning($"[批处理队列] 清除路径可视化失败: {ex.Message}"); } + // 确保处理器已初始化(会初始化 _database) + EnsureProcessorInitialized(); + + // 🔥 关键:从数据库加载所有待处理项到内存队列(支持重新启动后继续执行) + await LoadPendingItemsToQueueAsync(); + // 开始进度条 progress = Autodesk.Navisworks.Api.Application.BeginProgress( "执行批处理队列", @@ -172,7 +178,6 @@ namespace NavisworksTransport.Core try { - EnsureProcessorInitialized(); var item = await _database.GetBatchQueueItemAsync(itemId); _currentItem = item; @@ -509,6 +514,56 @@ namespace NavisworksTransport.Core LogManager.Warning("[批处理队列] CancelCurrentItem() 已废弃,请使用 StopExecution() 代替"); } + /// + /// 从数据库加载所有待处理项到内存队列 + /// 用于重新启动插件后继续执行队列 + /// + private async Task LoadPendingItemsToQueueAsync() + { + try + { + if (_database == null) + { + LogManager.Warning("[批处理队列] 数据库未初始化,无法加载待处理项"); + return; + } + + // 获取所有待处理项 + var pendingItems = await _database.GetBatchQueueItemsAsync( + statusFilter: BatchQueueStatus.Pending, + limit: 1000); + + if (pendingItems == null || pendingItems.Count == 0) + { + LogManager.Info("[批处理队列] 数据库中没有待处理项"); + return; + } + + // 将待处理项加入内存队列(避免重复添加) + int addedCount = 0; + lock (_queueLock) + { + // 获取当前队列中已有的项ID + var existingIds = new HashSet(_queue.ToArray()); + + foreach (var item in pendingItems) + { + if (!existingIds.Contains(item.Id)) + { + _queue.Enqueue(item.Id); + addedCount++; + } + } + } + + LogManager.Info($"[批处理队列] 已从数据库加载 {addedCount} 个待处理项到内存队列"); + } + catch (Exception ex) + { + LogManager.Error($"[批处理队列] 加载待处理项失败: {ex.Message}"); + } + } + /// /// 获取队列列表 /// diff --git a/src/Core/PathPlanningManager.cs b/src/Core/PathPlanningManager.cs index 3b18887..7f1f8ed 100644 --- a/src/Core/PathPlanningManager.cs +++ b/src/Core/PathPlanningManager.cs @@ -1492,13 +1492,14 @@ namespace NavisworksTransport /// /// 路径名称 /// 是否为空轨路径 + /// 路径类型(默认为地面路径) /// 创建的新路径 - public PathRoute StartCreatingNewRoute(string routeName = null, bool isRailPath = false) + public PathRoute StartCreatingNewRoute(string routeName = null, bool isRailPath = false, PathType pathType = PathType.Ground) { try { // 空轨路径不需要自动选择可通行物流模型 - if (!isRailPath) + if (!isRailPath && pathType == PathType.Ground) { // 自动选择所有可通行的物流模型(先检查是否有可通行的模型) AutoSelectLogisticsChannels(); @@ -1515,17 +1516,26 @@ namespace NavisworksTransport // 设置为创建状态 PathEditState = PathEditState.Creating; - // 创建新路径 - var newRoute = new PathRoute(routeName ?? $"人工_{DateTime.Now:MMdd_HHmmss}"); + // 创建新路径,并设置路径类型 + var newRoute = new PathRoute(routeName ?? $"人工_{DateTime.Now:MMdd_HHmmss}") + { + PathType = pathType + }; _editingRoute = newRoute; SetCurrentRouteInternal(newRoute, triggerEvent: true); // 智能管理ToolPlugin状态 ManageToolPluginForEditState(); - string statusMessage = isRailPath - ? $"正在新建空轨路径: {newRoute.Name} - 请在3D视图中点击空轨模型设置路径点(将自动吸附到基准路径)" - : $"正在新建路径: {newRoute.Name} - 请在3D视图中可通行的物流模型上点击设置路径点"; + string statusMessage; + if (pathType == PathType.Aerial) + { + statusMessage = $"正在新建空中路径: {newRoute.Name} - 请在3D视图中设置路径点"; + } + else + { + statusMessage = $"正在新建地面路径: {newRoute.Name} - 请在3D视图中可通行的物流模型上点击设置路径点"; + } RaiseStatusChanged(statusMessage, PathPlanningStatusType.Info); diff --git a/src/UI/WPF/ViewModels/PathEditingViewModel.cs b/src/UI/WPF/ViewModels/PathEditingViewModel.cs index ab2858c..c9205ff 100644 --- a/src/UI/WPF/ViewModels/PathEditingViewModel.cs +++ b/src/UI/WPF/ViewModels/PathEditingViewModel.cs @@ -945,12 +945,14 @@ namespace NavisworksTransport.UI.WPF.ViewModels if (_pathPlanningManager != null) { - var newRoute = _pathPlanningManager.StartCreatingNewRoute(isRailPath: true); + // 创建空中路径(空轨) + var newRoute = _pathPlanningManager.StartCreatingNewRoute( + isRailPath: true, + pathType: PathType.Aerial); if (newRoute != null) { - // 设置路径类型为空中路径(空轨) - newRoute.PathType = PathType.Aerial; + // 设置空中路径子类型为空轨 newRoute.AerialSubType = AerialSubType.Rail; // 创建对应的 WPF ViewModel @@ -1029,12 +1031,14 @@ namespace NavisworksTransport.UI.WPF.ViewModels if (_pathPlanningManager != null) { - var newRoute = _pathPlanningManager.StartCreatingNewRoute(isRailPath: false); + // 创建空中路径(吊装) + var newRoute = _pathPlanningManager.StartCreatingNewRoute( + isRailPath: false, + pathType: PathType.Aerial); if (newRoute != null) { - // 设置路径类型为空中路径(吊装) - newRoute.PathType = PathType.Aerial; + // 设置空中路径子类型为吊装 newRoute.AerialSubType = AerialSubType.ThreeStepHoisting; // 创建对应的 WPF ViewModel