修复批处理未加载待处理项,并修复空中路径创建

This commit is contained in:
tian 2026-01-29 13:27:43 +08:00
parent 4aa62864f3
commit 4069668a2a
4 changed files with 419 additions and 113 deletions

435
AGENTS.md
View File

@ -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 2022Community/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 与 `<Reference Include>` 和 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 开发,不考虑向后兼容。

View File

@ -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() 代替");
}
/// <summary>
/// 从数据库加载所有待处理项到内存队列
/// 用于重新启动插件后继续执行队列
/// </summary>
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<int>(_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}");
}
}
/// <summary>
/// 获取队列列表
/// </summary>

View File

@ -1492,13 +1492,14 @@ namespace NavisworksTransport
/// </summary>
/// <param name="routeName">路径名称</param>
/// <param name="isRailPath">是否为空轨路径</param>
/// <param name="pathType">路径类型(默认为地面路径)</param>
/// <returns>创建的新路径</returns>
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);

View File

@ -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