Revit 命令桥:让 AI 客户端直接操控 Revit 的本地桥接方案

面向 Revit 2020–2026 的本地命令桥:不依赖 Dynamo、不绑定模型厂商,通过 MCP / REST / CLI / OpenAI 兼容 API 统一调用 execute_plan,用受控原子步骤完成建模、出图与导出

一、这个项目要解决什么问题

如果你在做 BIM 自动化,大概会遇到这样几类需求:

  • 想让 AI 助手帮你在 Revit 里批量建标高、轴网、墙体
  • 想把 Revit 接到自己的工作流里(Python 脚本、后端服务、自动化平台)
  • 想用不同厂商的模型(Codex、Claude、DeepSeek……),不想被某一个生态锁死
  • 不想为了每个功能写一个插件命令,更不想在插件里开放任意代码执行

Revit 命令桥(Revit Command Bridge) 就是为这些场景设计的:一个面向 Revit 的本地命令桥

它的定位可以用一句话概括:

Revit 插件只执行受控 Revit API 命令;Codex、WorkBuddy、任意 MCP 客户端、任意 Function Calling Harness 或 OpenAI 兼容模型 API,通过统一 JSON、CLI、REST 或 MCP 接口调用。

几个关键设计取向:

  • 不依赖 Dynamo:纯 Revit API 实现,不引入 Dynamo 运行时
  • 不绑定模型厂商:只要客户端能发 MCP、HTTP 或 Function Calling 参数即可
  • 新建模统一走 execute_plan:一个计划可组合建筑、结构、机电、空间、出图、参数和选中显示,而不是为每一种构件增加一个插件命令
  • 不开放任意代码执行:桥接层不执行任意 C#、Python 或自然语言,只接受已注册的顶层 operation 和受控原子步骤

二、版本支持:为什么不能用一个"万能 DLL"

这是 Revit 二次开发绕不过去的一条硬约束:

每个 Revit 年份必须使用对应 API 编译出的 DLL,不能共用一个"万能 DLL"。

原因是 Revit 的 API 程序集(RevitAPI.dll / RevitAPIUI.dll)与宿主版本强绑定,跨版本加载通常直接失败或行为异常。

本交付包支持 Revit 2020–2026,适配入口在 src/Adapter/ 下按 AdapterEntry20.cs ... 27.cs 组织,版本边界细节见仓库的 VERSION-SUPPORT.md

对安装体验的优化在于:

  • 单文件安装器会自动扫描本机 Revit 2020–2026,使用内置预编译适配包
  • 普通用户不需要选择 DLL、安装 Visual Studio 或手工填写 Revit 路径
  • 构建机器才需要准备对应年份的 Revit API NuGet 包(通过 Nice3point)和 .NET Framework 4.8 目标包 / .NET 8 SDK

三、工作方式与架构

原文给出的数据流非常清晰:

这条链路里有几个值得注意的工程决策:

  • 本地队列解耦:外部请求先落到本地原子 JSON 队列(inbox / outbox),插件再按需消费,避免外部进程直接触碰 Revit 线程模型
  • ExternalEvent 主线程调度:Revit API 不是线程安全的,所有操作必须回到主线程执行,ExternalEvent 是官方推荐的正规做法
  • 事务化写入execute_plan 中所有写步骤使用一个 all-or-nothing Revit Transaction,失败即整体回滚
  • 网络面最小化:REST 默认只绑定 127.0.0.1,未检测到活动 Revit 桥时拒绝提交

四、安装

先看工具产出对照表,理解每个脚本干什么:

脚本产出说明
dotnet build -c "Debug R26"bin\R26\RevitCommandBridge.dll单版本 DLL,通过 .csproj + Nice3point NuGet
build.ps1 -RevitVersion 2026dist\RevitCommandBridge-2026\编译 DLL + 打包配套脚本
build-all.ps1dist\RevitCommandBridge-202{0..6}\全部版本 DLL
build-installer.ps1dist\RevitCommandBridgeSetup.exe单文件安装器(内置所有年份 DLL + Node)
build-installer.ps1 -OutputPath ...自定义输出文件名单版本安装器,方便版本区分
install-revit.ps1%LOCALAPPDATA%\RevitCommandBridge\{year}\复制文件 + 写 .addin 清单

01 方式 A:开发者模式(编译 → 安装)

# 0. 先关闭 Revit
# 1. 查看本机安装的 Revit 版本
.\install-revit.ps1 -ListDetected

# 2. 构建指定版本(编译 DLL + 打包安装器)
.\build.ps1 -RevitVersion 2026

# 或直接使用 dotnet:
dotnet build -c "Debug R26"

# 3. 安装到本机 Revit
.\install-revit.ps1 -RevitVersion 2026

build.ps1 产出:

dist\RevitCommandBridge-2026\
├── RevitCommandBridge.dll
├── RevitCommandBridge.pdb
├── bridge.config.json
├── scripts\      ← MCP Server、REST 网关、CLI 发送器
├── examples\     ← JSON 请求模板
├── deploy\       ← .addin 模板
├── schemas\      ← JSON Schema
├── install-revit.ps1
├── uninstall-revit.ps1
├── PROTOCOL.md 等文档

install-revit.ps1 自动完成六件事:

  1. 检测本机 Revit 安装路径(注册表 + C:\Program Files\Autodesk
  2. 匹配 dist\RevitCommandBridge-{year}\
  3. 复制所有文件至 %LOCALAPPDATA%\RevitCommandBridge\{year}\
  4. 写入 %APPDATA%\Autodesk\Revit\Addins\{year}\RevitCommandBridge.addin
  5. 清理旧版本残留文件(对比 install-manifest.json
  6. 可选配置 AI 客户端连接(-Connector

安装前确保 Revit 已关闭。install-revit.ps1 支持 -WhatIf 预览安装位置不实际写入。

02 方式 B:最终用户模式(单文件安装器)

# 步骤 1:编译指定版本
.\build.ps1 -RevitVersion 2026

# 步骤 2:打包安装器(默认输出 dist\RevitCommandBridgeSetup.exe)
.\build-installer.ps1

# 也可指定版本号后缀的输出文件名:
.\build-installer.ps1 -OutputPath "dist\RevitCommandBridgeSetup-2026.exe"

打包多个版本到同一个安装器:

.\build.ps1 -RevitVersion 2026
.\build.ps1 -RevitVersion 2027
.\build-installer.ps1 -RevitVersion 2026,2027 -OutputPath "dist\RevitCommandBridgeSetup-2026-2027.exe"

产出文件可分发到没有开发环境的机器

dist\
├── RevitCommandBridgeSetup.exe ← 双击或命令行运行
├── RevitCommandBridge-2026\
└── RevitCommandBridge-2027\

RevitCommandBridgeSetup.exe 内置了 DLL 和 Node.js 运行时:

  • 自动扫描本机 Revit
  • 使用内置预编译适配包
  • 自动配置已识别的 MCP 客户端(Codex、WorkBuddy、Claude Desktop、Cursor、Windsurf、Cline、Roo Code)

03 两条安装路径怎么选

04 验证安装

启动 Revit 并打开项目后,桥接自动启动。运行健康检查:

& "$env:LOCALAPPDATA\RevitCommandBridge\2026\scripts\send-revit-command.ps1" `
  -RequestPath "$env:LOCALAPPDATA\RevitCommandBridge\2026\examples\health.json"

返回 "status": "ok" 即安装成功。功能区"Revit 命令桥"选项卡的"启动桥接"按钮也可确认连接信息。

05 卸载

.\uninstall-revit.ps1 -RevitVersion 2026

卸载程序会移除桥接文件、.addin 注册清单和队列目录。不同年份的桥接互不干扰,只卸载指定版本。

五、快速开始

启动 Revit(以 2026 为例):

& 'C:\Program Files\Autodesk\Revit 2026\Revit.exe'

打开 Revit 后,桥接会自动启动;功能区"Revit 命令桥"的"启动桥接"按钮可用于确认连接信息。

随后执行一次只读健康检查:

& "$env:LOCALAPPDATA\RevitCommandBridge\2026\scripts\send-revit-command.ps1" -RequestPath "$env:LOCALAPPDATA\RevitCommandBridge\2026\examples\health.json"

预览一个通用建模计划,不修改模型

& "$env:LOCALAPPDATA\RevitCommandBridge\2026\scripts\send-revit-command.ps1" -RequestPath "$env:LOCALAPPDATA\RevitCommandBridge\2026\examples\preview-universal-plan.json"

确认预览返回正确后,把请求中的 preview 改为 false 再提交。实际写入使用 Revit Transaction,可在 Revit 中用原生撤销命令回退

功能区"命令面板"提供当前桥接状态、最近操作和当前项目状态;点击"刷新项目状态"会提交只读 health 请求。“预览计划"不会修改模型,“确认执行"会再次要求确认;完成后用 Revit 原生 Ctrl+Z 撤销该事务。

一次典型的"预览 → 确认"流程

六、接入不同客户端

安装器固定使用"自动识别并配置本机 AI 客户端”。它会生成并保存连接配置到安装目录的 connections 文件夹;未识别的客户端直接使用"复制 MCP"按钮提供的通用配置。

先看能力与入口的对照:

客户端能力入口适用场景
支持 stdio MCPscripts/revit-mcp-server.mjsCodex、WorkBuddy 和其它 MCP Harness
能调用 HTTPscripts/revit-http-gateway.mjs任意 Function Calling Harness、后端服务、自动化平台
只有 OpenAI 兼容模型 APIscripts/revit-openai-compatible-chat.mjsDeepSeek 及其它支持 Chat Completions + Tool Calling 的模型
能运行 PowerShellscripts/send-revit-command.ps1Codex Shell、人工测试、批处理
只能读写文件%LOCALAPPDATA%\RevitCommandBridge\inbox/outbox自定义旧系统或最小 Harness

用一张图理解五种接入方式的定位:

01 Codex MCP

优先在 Revit 功能区点击"复制 MCP”,再粘贴到客户端的 MCP 配置页。手工配置时,使用安装器内置的年份 Node 运行时(不要求另装 Node.js):

[mcp_servers.revit]
command = "C:\\Users\\<用户名>\\AppData\\Local\\RevitCommandBridge\\2026\\runtime\\node.exe"
args = ["C:\\Users\\<用户名>\\AppData\\Local\\RevitCommandBridge\\2026\\scripts\\revit-mcp-server.mjs"]

重新启动 Codex 任务后,客户端可发现 revit_execute_plan这是长期主入口;旧的 revit_create_wall 等工具仅为兼容已有脚本保留。

02 通用 MCP JSON

使用 JSON MCP 配置的客户端采用相同进程参数:

{
  "mcpServers": {
    "revit-command-bridge": {
      "command": "C:\\Users\\<用户名>\\AppData\\Local\\RevitCommandBridge\\2026\\runtime\\node.exe",
      "args": [
        "C:\\Users\\<用户名>\\AppData\\Local\\RevitCommandBridge\\2026\\scripts\\revit-mcp-server.mjs"
      ]
    }
  }
}

03 REST 与通用 Function Calling Harness

启动仅监听本机的 REST 网关:

node "$env:LOCALAPPDATA\RevitCommandBridge\2026\scripts\revit-http-gateway.mjs"

查询状态:

Invoke-RestMethod 'http://127.0.0.1:8765/health'

提交并等待预览结果:

$body = @{
  operation = 'execute_plan'
  args = @{
    steps = @(
      @{ id = 'check'; operation = 'query_document'; args = @{} }
      @{ id = 'support'; operation = 'create_direct_shape'; args = @{ name = '测试支座' geometry = @(@{ kind = 'box'; min = @{ x = 0; y = 0; z = 0 }; max = @{ x = 3000; y = 2000; z = 2500 } }) } }
    )
  }
  preview = $true
} | ConvertTo-Json -Depth 12

Invoke-RestMethod -Method Post -Uri 'http://127.0.0.1:8765/commands?wait_seconds=60' -ContentType 'application/json; charset=utf-8' -Body $body

远程模型 API 本身不直接访问本机 Revit;本机 Harness 把 Function Calling 参数转发到这个 REST 端点,或直接启动 MCP Server。

需要使用模型 API 时,运行 scripts/configure-ai-provider.ps1 保存配置,再启动本机助手。API Key 使用 Windows DPAPI 按当前用户加密保存,不写入 MCP/REST 配置文件。

七、当前能力范围

模块已实现的高频操作
查询与编辑文档、目录、元素、参数、删除、选择与定位
建筑标高、轴网、墙、楼板、墙洞口、模型线、房间、空间、DirectShape
结构梁、柱、斜撑,以及已载入结构族的实例放置
MEP管道、风管、线管、桥架、直连/弯头/三通/活接连接
样板查询、新建 .rfa、参数、类型、box/cylinder/extrusion 几何、保存、载入、放置
放置方式非宿主、宿主、面宿主、工作平面、视图、线基和自适应族
出图与注释3D / 平面 / 天花 / 结构平面 / 绘图 / 剖面 / 立面 / 详图索引视图、复制与样板、图纸、视图/明细表放图纸、详图线、文字、尺寸、标签、填充区域、修订及修订云线
导出与交付PNG/JPG/TIFF/BMP 图像、DWG/DXF、IFC、明细表 CSV/TXT、保存 .rvt;导出/保存须作为独立计划执行

用于出图时,先以 query_catalog(kind=view_types|title_blocks|text_types|filled_region_types|revisions) 查询项目资源;需要尺寸或标签时,以 query_references 读取元素稳定引用,再提交 create_dimensioncreate_tag

exportsave_document 有外部文件副作用,须分别放在只含一个步骤的 execute_plan

关于"为什么不做成万能执行器",原文的态度很明确:

“Revit 的所有功能"包含数千个 API 对象,桥接不会开放任意 C# 执行;新增能力统一以受控原子步骤加入 execute_plan

八、原子操作一览

所有顶层 operationexecute_plan 中的 steps[].operation 均由一张注册表调度。

01 顶层操作(直接传入 operation 字段)

操作名称功能
health桥接健康检查,返回状态、文档信息
execute_plan主入口。执行多步骤建模/出图计划,写步骤合并为一个事务
new_project创建新项目(可选 .rte 样板),可选保存为 .rvt
create_family从 .rft 样板创建 .rfa 族,支持参数/类型/几何
load_family载入已有 .rfa 到当前项目
list_family_templates列出本机 Revit 族样板路径
list_levels列出项目标高(兼容旧入口)
list_wall_types列出基本墙类型(兼容旧入口)
create_level创建标高(兼容旧入口)
create_grid创建轴网(兼容旧入口)
create_wall创建直墙(兼容旧入口)
create_rectangle_walls创建四面闭合矩形墙(兼容旧入口)

02 查询类原子步骤

操作名称功能
query_document返回当前文档信息(标题、路径、活动视图等)
query_catalog项目资源目录:标高、类别、视图、图纸、明细表、族类型、MEP 类型、链接等
query_elements按类别/名称/族名/ID 过滤查询元素及其参数
query_references返回元素的稳定几何引用(面/边)
query_parameters列出单个元素的所有参数
query_geometry返回元素包围盒、实体摘要或面信息
query_room查询房间/空间,支持按点查找或全量列出
query_selection读取 Revit 界面当前选中的图元 ID、名称、类别
query_mep_network从种子元素遍历 MEP 连接拓扑
query_view_range返回平面视图范围(顶/剖切面/底/视图深度)

03 创建类原子步骤

操作名称功能
create_level创建标高
create_grid创建轴网
create_wall创建直墙,支持新墙类型克隆
create_floor从闭合轮廓创建楼板
create_room创建房间
create_space创建 MEP 空间
create_model_curve创建模型线
create_direct_shape从几何图元(box/cylinder/sphere 等)创建 DirectShape
create_swept_shape沿路径扫掠创建实体(矩形/圆形/管道截面)
create_mep_curve创建 MEP 管线(管道/风管/线管/桥架)
connect_mep连接 MEP 元素,支持直连/弯头/三通/变径/四通
create_mep_system创建管道或风管系统
create_insulation添加管道/风管保温层
place_family_instance放置族实例,支持多种放置方式
load_family载入 .rfa 到项目
create_structural_member创建结构构件(梁/斜撑/柱)
create_view创建 3D/平面/天花/结构平面视图
create_sheet创建图纸(可选标题栏)
place_view_on_sheet将视图放置到图纸
create_opening创建洞口(墙/楼板/竖井)
create_drafting_view创建绘图视图
create_section_view创建剖面/详图视图
create_elevation_view创建立面视图
create_callout创建详图索引视图
duplicate_view复制视图,可选应用视图样板
create_view_template从现有视图创建视图样板
create_detail_curve创建详图线
create_text_note创建文字注释
create_dimension创建尺寸标注
create_tag创建独立标记
create_filled_region创建填充区域
create_revision创建修订
create_revision_cloud创建修订云线
create_schedule创建明细表(常规/材质提取/关键字/视图列表/图纸列表/修订)
place_schedule_on_sheet将明细表放置到图纸

04 视图属性与覆盖

操作名称功能
set_view_properties设置视图属性(比例、裁剪框、样板、详细程度、规程等)
set_element_overrides设置元素图形覆盖(颜色、线宽、半色调等)
set_category_overrides设置类别图形覆盖
manage_view_filters管理视图过滤器(添加/删除,支持规则与覆盖)
set_view_range设置平面视图范围(顶/剖切面/底/视图深度)
manage_schedule_fields管理明细表字段(添加/删除/隐藏/排序/过滤)
manage_graphics_resources管理图形资源(线样式子类别/填充图案)

05 编辑与变更

操作名称功能
set_parameters批量设置元素参数值
manage_schema_data扩展数据读写与搬运
manage_family_parameters编辑族参数(添加/重命名/删除/设公式)
manage_project_parameters管理项目参数
duplicate_type复制 ElementType,可选覆盖参数
transform_elements移动/复制/旋转/镜像元素
rename_element重命名元素(单个或批量前缀模式)
set_element_curve修改线性元素的 LocationCurve
delete_elements删除元素
select_elements选中并显示/缩放至元素

06 外部操作(需单独执行)

操作名称功能
export导出视图(PNG/JPG/DWG/DXF/IFC/明细表 CSV)
save_document保存当前文档

全部操作共约 73 个原子步骤。新增能力以受控原子步骤加入此表,不开放任意 C# 执行。完整参数定义见 PROTOCOL.mdschemas/execute-plan.schema.json

九、目录结构

revit-mcp-local-bridge/
│
├── src/                    ← ★ 单一事实源(全部版本共享)
│   ├── BridgeModels.cs
│   ├── BridgeRuntime.cs
│   ├── PlanCommandExecutor.cs
│   ├── PlanValues.cs
│   ├── RevitApiExtensions.cs
│   ├── RevitCommandBridgeApp.cs
│   ├── RevitCommandExecutor.cs
│   ├── RevitFamilyOperations.cs
│   ├── RevitGeometryFactory.cs
│   ├── RevitLookups.cs
│   ├── RevitOutputOperations.cs
│   ├── RevitParameterAdmin.cs
│   ├── RevitPlanCreations.cs
│   ├── RevitPlanMutations.cs
│   ├── RevitPlanQueries.cs
│   ├── RevitPlanOperations.cs
│   ├── RevitSectionFactory.cs
│   ├── CommandPanelForm.cs
│   ├── BridgeFailurePreprocessor.cs
│   ├── BridgeFamilyLoadOptions.cs
│   ├── BridgeFileQueue.cs
│   ├── BridgeSchemas.cs
│   ├── BridgeBuildInfo.cs
│   ├── GlobalUsings.cs
│   │
│   ├── Adapter/             ← 版本适配入口(R20–R27)
│   │   ├── AdapterEntry20.cs .. 27.cs
│   │   └── Utils/           ← 工具类
│   │
│   ├── build/               ← 版本矩阵
│   └── version-manifest.json
│
├── scripts/                 ← 运行时脚本
│   ├── revit-mcp-server.mjs
│   ├── revit-http-gateway.mjs
│   ├── revit-openai-compatible-chat.mjs
│   ├── bridge-client.mjs
│   ├── send-revit-command.ps1
│   ├── configure-ai-provider.ps1
│   ├── configure-connector.ps1
│   ├── configure-detected-clients.ps1
│   └── start-openai-compatible-chat.ps1
│
├── examples/                ← 请求示例
│   ├── health.json
│   ├── create-level.json
│   ├── preview-rectangle-walls.json
│   ├── preview-universal-plan.json
│   ├── preview-create-family.json
│   ├── preview-export-image.json
│   ├── preview-architecture-output-plan.json
│   └── preview-output-documentation-plan.json
│
├── schemas/
│   └── execute-plan.schema.json
│
├── plans/                   ← 设计方案
│   ├── BUILD-PIPELINE.md
│   ├── EXTENSION-PLAN.md
│   ├── CAD-BRIDGE-PLAN.md
│   ├── ATOMIC-ANALYSIS.md
│   ├── FAQ.md
│   └── PR-DESCRIPTION.md
│
├── deploy/
│   ├── RevitCommandBridge.addin.template
│   └── RevitCommandBridge.2026.addin    ← 生成部署清单
│
├── verification/
│   └── 2026-08-19-regression.md
│
├── setup/
│   ├── RevitAIHubSetup.cs
│   └── RevitCommandBridge.ico
│
├── depandency/              ← 预编译依赖(SQLite、Json、RevitAPI 等)
├── release/                 ← 发布包输出
│
├── build.ps1                ← 单版本编译
├── build-all.ps1            ← 全版本批量编译
├── build-installer.ps1      ← 安装器打包
├── install-revit.ps1        ← 安装/检测
├── uninstall-revit.ps1
├── fix_all.ps1
├── fix_value.ps1
├── RevitCommandBridge.csproj      ← 单一项目,条件编译 R20–R26
├── RevitCommandBridge.slnx        ← .slnx 新格式解决方案
├── PROTOCOL.md
├── ARCHITECTURE.md
├── VERSION-SUPPORT.md
├── CONNECTORS.md
├── ENGINEERING-RECORD.md
├── NOTICE.md
├── LICENSE
├── SOURCE-PACKAGE.txt
└── README.md

更多构建管道细节见仓库内的 plans/BUILD-PIPELINE.md

十、安全边界与设计约束

这部分虽然不是"功能清单”,但它决定了这个项目能否被放心地接进生产流程。

核心约束可以归纳为四条:

  1. 不执行任意代码:不执行任意 C#、Python 或自然语言,只接受已注册的顶层 operation 和受控原子步骤
  2. 校验前置:校验参数和目标文档后才调用 Revit API
  3. 事务原子性execute_plan 中所有写步骤使用一个 all-or-nothing Revit Transaction
  4. 网络面收敛:REST 默认只绑定 127.0.0.1,未检测到活动 Revit 桥时拒绝提交

关于可扩展性,原文的表述也很克制:

客户端识别只是安装层适配器,不进入 Revit 插件核心。以后支持新软件只增加一条配置适配规则,不需要重新设计 Revit 命令协议或建模功能。

十一、常见问题

现象原因与处理
REST 返回 503 bridge_not_runningRevit 未启动、插件未加载,或启动后尚未完成初始化
返回"尚未打开项目文档"在 Revit 中打开或新建 .rvt 项目后重试
返回文档标题不一致请求指定了 document_title,但当前活动项目不是该文档
返回命令 ID 已存在读取已有 outbox 结果,或生成新 id
Revit 功能区没有按钮检查 %APPDATA%\Autodesk\Revit\Addins\<year>\RevitCommandBridge.addin
其它年份 Revit 不加载为对应年份重新引用 RevitAPI.dll / RevitAPIUI.dll 并编译适配包

十二、写在最后

这个项目的思路其实很清晰:把"能力"和"接入方式"彻底分开。

  • Revit 插件这一侧只做一件事——执行受控的 Revit API 原子操作,用事务保证一致性
  • 接入层这一侧则完全开放——MCP、REST、CLI、OpenAI 兼容 API、文件队列,随便什么 Harness 都能接

这种分层带来的好处是:换模型、换客户端、换编排框架,都不需要动 Revit 插件本体。对 BIM 这种工具链常年迭代、版本碎片化严重的领域来说,这个取舍很实用。

如果你也想让 AI 助手直接在你的 Revit 项目里干活,又不想开放"任意代码执行"这种危险的口子,这个桥接方案值得研究一下。


风险提示:本文为项目文档整理,所述脚本包含本机 Revit 插件安装、写入 %APPDATA%、启动本地服务(127.0.0.1:8765)以及保存 API 密钥配置等操作。实际使用前请自行评估环境风险,并在测试项目中先行验证。文中命令与配置以仓库文档为准,不同版本可能有所差异。