AutoRevit.2021 0.2.0-rc

This is a prerelease version of AutoRevit.2021.
dotnet add package AutoRevit.2021 --version 0.2.0-rc
                    
NuGet\Install-Package AutoRevit.2021 -Version 0.2.0-rc
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AutoRevit.2021" Version="0.2.0-rc" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="AutoRevit.2021" Version="0.2.0-rc" />
                    
Directory.Packages.props
<PackageReference Include="AutoRevit.2021" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add AutoRevit.2021 --version 0.2.0-rc
                    
#r "nuget: AutoRevit.2021, 0.2.0-rc"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package AutoRevit.2021@0.2.0-rc
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=AutoRevit.2021&version=0.2.0-rc&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=AutoRevit.2021&version=0.2.0-rc&prerelease
                    
Install as a Cake Tool

AutoRevit

Revit 二次开发框架,让你能快速且轻松地使用 Revit API,告别冗长的样板代码。

特性

  • 源代码生成器 — 通过 [AutoExternalCommand][AutoExternalEventHandler] 特性自动生成 IExternalCommand / IExternalEventHandler 样板代码
  • 模块化架构 — 基于 IExternalModule 的插件化模块系统
  • 命令扩展管道 — 支持热更新(IHotUpdateExtend)和拦截器(IInterceptorExtend
  • 异步事件系统ExternalEventTask 让你在 Revit 外部事件中方便地使用 async/await
  • Fluent Ribbon API — 链式 API 快速构建 Revit 插件面板界面
  • 丰富的扩展方法 — 对 TransactionCurveXYZDocument 等常用类型提供便捷扩展
  • 多版本支持 — 覆盖 Revit 2016 ~ 2026

安装

通过 NuGet 安装对应 Revit 版本的包:

# Revit 2026
dotnet add package AutoRevit.2026

# Revit 2025
dotnet add package AutoRevit.2025

# ...以此类推

如果要使用 [AutoExternalCommand][AutoExternalEventHandler] 源代码生成器,还需额外安装:

dotnet add package AutoRevit.Generator

快速开始

1. 创建命令

[AutoExternalCommand] 标记一个静态方法,生成器会自动创建 IExternalCommand 实现类:

using Autodesk.Revit.UI;
using AutoRevit;

public class MyCommands
{
    [AutoExternalCommand(TransactionMode = nameof(TransactionMode.Manual))]
    public static Result SayHello()
    {
        TaskDialog.Show("AutoRevit", "Hello, Revit!");
        return Result.Succeeded;
    }
}

生成的类名默认为 {方法名}AutoExternalCommand,可通过 ClassName 属性自定义。

2. 创建外部事件处理

[AutoExternalEventHandler] 标记静态方法,用于在命令外部触发 Revit API 调用:

using Autodesk.Revit.UI;
using AutoRevit;

public class MyEvents
{
    [AutoExternalEventHandler]
    public static void DoSomething(UIApplication uiapp)
    {
        // 在 Revit 主线程中执行
        TaskDialog.Show("Event", "Done!");
    }
}

3. 注册模块和 Ribbon

实现 IExternalModule 接口,在 OnStartup 中构建 Ribbon 面板:

using Autodesk.Revit.UI;
using AutoRevit.Entry.Application;
using AutoRevit.Ribbon;
using AutoRevit.Ribbon.Ribbon.Mapper;

public class MyModule : IExternalModule
{
    public Result OnStartup(UIControlledApplication application)
    {
        var panel = new PanelMapper("MyPlugin")
        {
            Items =
            [
                new PushButtonMapper<SayHelloAutoExternalCommand>("Say Hello"),
            ]
        };

        new ControlManager(application).Map([panel]);
        return Result.Succeeded;
    }

    public Result OnShutdown(UIControlledApplication application) => Result.Succeeded;
}

4. 注册入口

继承 ExternalApplication,通过 AddModuleClasses 扫描程序集自动发现模块:

using System.Reflection;
using AutoRevit.Entry.Application;

public class App : ExternalApplication
{
    protected override Result OnStartup(UIControlledApplication application)
    {
        AddModuleClasses(Assembly.GetExecutingAssembly());
        return base.OnStartup(application);
    }
}

5. 配置 .addin 清单

在 Revit 插件目录创建 .addin 文件,指向编译后的程序集和入口类:

<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
  <AddIn Type="Application">
    <Name>MyPlugin</Name>
    <Assembly>path\to\YourPlugin.dll</Assembly>
    <AddInId>YOUR-GUID-HERE</AddInId>
    <FullClassName>YourNamespace.App</FullClassName>
    <VendorId>YOUR-NAME</VendorId>
  </AddIn>
</RevitAddIns>

详细指南

AutoExternalCommand 特性参数

参数 类型 默认值 说明
Namespace string 方法所在命名空间 生成类的命名空间
ClassName string {方法名}AutoExternalCommand 生成类的名称
TransactionMode string "Manual" 事务模式:Manual / ReadOnly / Automatic
JournalingMode string 日志模式
RegenerationOption string 重生成选项

方法签名

[AutoExternalCommand] 标记的方法必须满足:

  • 必须为 static
  • 返回值必须为 Autodesk.Revit.UI.Result
  • 访问修饰符为 publicinternal

可选参数类型:

  • 无参数
  • ExternalCommandData
  • ref string message
  • ElementSet elements
  • IRevitData(封装了上述所有参数)

命令扩展

继承 AutoCommand 基类而非直接使用特性,可获得扩展能力:

// 热更新 — 不重启 Revit 重新加载程序集
public class HotUpdateCommand : AutoCommand, IHotUpdateExtend
{
    protected override Result Execute(IRevitData revitData)
    {
        return Result.Succeeded;
    }
}

// 拦截器 — 在命令执行前拦截
public class InterceptorCommand : AutoCommand, IInterceptorExtend
{
    protected override Result Execute(IRevitData revitData)
    {
        return Result.Succeeded;
    }
}

如果不需要被拦截,可标记 [IgnoreInterceptor]

异步外部事件

var task = new ExternalEventTask();

await task.RunAsync(uiapp =>
{
    // 在 Revit 上下文中执行
    var doc = uiapp.ActiveUIDocument.Document;
    // ...
});

// 带返回值
var result = await task.RunAsync<int>(uiapp =>
{
    return 42;
});

Ribbon 构建

var tabMapper = new TabMapper("CustomTab");
tabMapper.AddPanel(new PanelMapper("MyPanel")
{
    Items =
    [
        new PushButtonMapper<MyCommand>("按钮文字"),
        new SplitButtonMapper("分组按钮")
        {
            Items =
            [
                new PushButtonMapper<CmdA>("A"),
                new PushButtonMapper<CmdB>("B"),
            ]
        }
    ]
});

new ControlManager(application).Map([tabMapper]);

工具方法

// 选择过滤器
var element = doc.SelectElement(new SelectionFilter<Element>());

// Transaction 扩展
using (var trans = new Transaction(doc, "My Operation"))
{
    trans.StartWithFailureHandling(); // 自动处理失败
    // ...
    trans.CommitWithFailurePreprocessor();
}

// XYZ 扩展
var midpoint = xyz1.Mid(xyz2);
var distance = xyz1.DistanceTo(xyz2);

// Curve 扩展
var line = new Line(startPoint, endPoint); // 替代 Revit 冗长的 API

项目结构

src/
├── AutoRevit/              # 共享代码库 (.projitems)
│   ├── Entry/              # 入口:ExternalApplication, AutoCommand
│   ├── Event/              # 异步外部事件系统
│   ├── Ribbon/             # Fluent Ribbon API
│   ├── DB/Extensions/      # Revit 类型扩展方法
│   ├── Selection/          # 选择过滤
│   ├── Storage/            # 元素数据存储
│   ├── Shortcut/           # 快捷键
│   ├── Tool/               # 用户交互工具
│   └── Utils/              # 工具类
├── AutoRevit.2016~2026/    # 各 Revit 版本包装项目
├── AutoRevit.Generator/    # Roslyn 源代码生成器
└── Demo/                   # 示例项目

版本兼容性

Revit 版本 目标框架
2016-2024 .NET Framework 4.8
2025-2026 .NET 8.0

构建

# 构建全部项目
dotnet build src/AutoRevit.slnx

# 构建特定版本
dotnet build src/AutoRevit.2026/AutoRevit.2026.csproj

# 打包 NuGet
dotnet pack src/AutoRevit.2026/AutoRevit.2026.csproj -c Release

许可

MIT License

Product Compatible and additional computed target framework versions.
.NET Framework net48 is compatible.  net481 was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.2.0-rc 85 4/29/2026
0.1.6 133 4/23/2025
0.1.2 136 1/1/2025