NavisworksTransport/AGENTS.md

14 KiB
Raw Blame History

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

主要构建

./compile.bat
  • 自动检测 Visual Studio 2022 的 MSBuild
  • 构建 Release 配置的 x64 平台
  • 输出目录: bin\x64\Release\

手动构建

# 设置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

运行测试

./run-unit-tests.bat

该脚本将:

  1. 构建主项目
  2. 构建测试项目
  3. 使用 VSTest.Console 运行单元测试

部署插件

./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 - 单元测试框架

代码规范

导入顺序

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

单位系统 - 极其重要

所有网格地图和路径规划计算必须使用模型单位,严禁混用米制单位。

// ✅ 正确:在函数入口统一转换
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) - 从米转换距离

错误处理

// ✅ 正确:记录并适当处理异常
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操作必须编组到主线程

// ✅ 正确使用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

[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

编写测试

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操作异常"

    • 解决: 使用 UIStateManagerDispatcher.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 开发,不考虑向后兼容。