NavisworksTransport/AGENTS.md

454 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AGENTS.md
本文件为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
- 构建 Release 配置的 x64 平台
- 输出目录: `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
```
该脚本将:
1. 构建主项目
2. 构建测试项目
3. 使用 VSTest.Console 运行单元测试
### 部署插件
```bash
./deploy-plugin.bat
```
自动复制插件文件到 Navisworks 插件目录:
`C:\ProgramData\Autodesk\Navisworks Manage 2026\plugins\NavisworksTransportPlugin\`
## 项目架构
### 目录结构
```
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 # 几何计算
└── ...
UnitTests/ # 单元测试
├── Core/ # 核心功能测试
├── Commands/ # 命令测试
└── Utils/ # 工具类测试
```
### 插件类型说明
| 插件类 | 类型 | 功能 |
|--------|------|------|
| `MainPlugin.cs` | DockPanePlugin | 主UI面板包含WPF控件宿主 |
| `PathClickToolPlugin.cs` | ToolPlugin | 鼠标点击工具获取精确的3D坐标 |
| `PathPointRenderPlugin.cs` | RenderPlugin | 3D渲染显示路径点和连线 |
### 关键依赖
**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
// 1. System命名空间
using System;
using System.Collections.Generic;
using System.Linq;
// 2. 第三方库
using RoyT.AStar;
// 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.PathPlanning;
using NavisworksTransport.UI.WPF.ViewModels;
using NavisworksTransport.Utils;
```
### 命名约定
| 类型 | 命名规则 | 示例 |
|------|----------|------|
| 类 | 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
```
`UnitsConverter` 提供以下方法:
- `GetUnitsToMetersConversionFactor()` - 文档单位转米
- `GetMetersToUnitsConversionFactor()` - 米转文档单位
- `ConvertToMeters(distance)` - 转换距离为米
- `ConvertFromMeters(distanceInMeters)` - 从米转换距离
### 错误处理
```csharp
// ✅ 正确:记录并适当处理异常
try
{
var result = SomeOperation();
return result;
}
catch (Exception ex)
{
LogManager.Error($"Operation failed: {ex.Message}");
throw; // 或适当处理
}
// ❌ 错误:静默吞掉异常
try
{
var result = SomeOperation();
return result;
}
catch
{
return null; // 隐藏了问题!
}
```
### 线程安全和UI更新
所有UI操作必须编组到主线程
```csharp
// ✅ 正确使用UIStateManager进行线程安全更新
_uiStateManager.UpdateStatus("正在处理...");
// ✅ 正确:异步事件触发避免死锁
private void OnStatusChanged(string status)
{
Task.Run(() =>
{
try
{
StatusChanged?.Invoke(this, status);
}
catch (Exception ex)
{
LogManager.Error($"StatusChanged事件失败: {ex.Message}");
}
});
}
```
## 配置系统
配置文件使用 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 # 圆弧采样步长
[visualization]
margin_ratio = 0.1 # 地图边距比例
[animation]
frame_rate = 30 # 动画帧率
duration_seconds = 10.0 # 动画持续时间
detection_tolerance_meters = 0.05 # 检测容差
spatial_index_cell_size = 1.0 # 空间索引格子大小
[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` 访问配置。
## 测试策略
### 测试项目结构
```
UnitTests/
├── Core/
│ ├── PathCurveEngineTests.cs
│ └── UIStateManagerBasicTests.cs
├── Commands/
│ └── CommandBaseTests.cs
├── Collections/
│ └── ThreadSafeObservableCollectionBasicTests.cs
└── Utils/
└── UnitsConverterTests.cs
```
### 测试框架
- **框架**: MSTest 3.0.4
- **运行器**: VSTest.Console.exe
- **目标框架**: .NET Framework 4.8
### 编写测试
```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 开发,不考虑向后兼容。