简介:Revit2018 API 开发学习资源包,面向利用 C#/.NET 扩展 Revit 功能的开发者与工程师。包内含官方帮助文档、Lookup 源码程序和 Addin-Manager 外部加载工具,覆盖 API 函数/类库说明、插件编写指导、模型数据实时查询与插件管理配置等环节;压缩包共 170 个文件,以 cs 源码、dll 程序集及 resx/resources 资源文件为主,辅以 htm/chm 文档、addin 配置、sln/csproj 工程文件等,整体 51.65MB,目录清晰便于按模块研读。目前已有 2027 人学习下载。通过研读帮助文档可掌握 Revit 元素、参数、视图、事务管理及事件处理等核心概念;查看 Lookup 源码能理解实时查询模型数据的实现思路,用于调试和优化自己的插件;参考 Addin-Manager 可学习插件加载机制与配置管理设计,提升 Revit 二次开发的工程化能力。 做Revit二次开发,绕不开这三样东西:帮助文档、Lookup、外部加载工具。尤其是还在用Revit 2018的朋友,网上资料不少但都是碎片,要么只说怎么装Lookup,要么扔一个.addin模板就完事,真正把“查文档→看数据→加载调试”这条链路串起来的少。这篇就一次性讲透,从环境准备到问题排查,把你实际开发中要用的东西都过一遍。
1. 为什么这三样是Revit 2018二次开发的“标配”
1.1 2018版本的环境特征
先说清楚一个背景:Revit 2018对应的API是基于.NET Framework 4.6的,开发环境建议用Visual Studio 2015或2017。VS2019也能用,关键是目标框架要选对,别默认选了.NET Core或.NET 5+,Revit 2018根本不认识。
另外,Revit 2018的SDK里自带RevitAPI.dll和RevitAPIUI.dll的引用文件,也有文档和示例工程。安装完Revit 2018之后,SDK需要单独下载安装,默认路径一般是:
C:\Program Files\Autodesk\Revit 2018 SDK\SDK解压后能看到的目录大概有这些:AddInManager、RevitLookup、Samples、Docs等。这三个工具在2018这个时代,就是开发者手上的“三板斧”。
1.2 三样工具的协作关系
这三者不是孤立存在的,它们的配合关系一句话就能说清:遇到不确定的API,先翻帮助文档确认签名和用法;对象内部结构搞不清楚时,用Lookup直接“透视”Revit内存里的元素数据;写完代码后,用外部加载工具把dll注入到Revit里测试,同时挂上VS调试器断点跟数据。
所以这篇博文的路线就是:先说帮助文档怎么用最高效,再说Lookup怎么定位数据,最后讲外部加载工具怎么配合调试。三条链路串起来,你才算是把2018的二次开发环境真正用熟了。
2. 帮助文档:你的第一手API权威字典
2.1 本地Help文档与在线文档的差异
Revit 2018的API帮助文档,在SDK安装完成后可以在Docs文件夹里找到,核心是两个CHM文件:RevitAPI.chm和RevitAPIUI.chm。前者是所有基础类、方法、属性的总集,后者是UI相关类(比如ExternalCommand、ExternalApplication所在的名字空间)的专属文档。
用CHM文档最大的好处是离线随时查,尤其在公司内网或者网络不好的场景下很稳。不过CHM文档有个烦人的地方,Windows默认可能锁定内容,打开后左侧目录正常、右侧空白。遇到这种,右键CHM文件,选择“属性”,在底部“解除锁定”上打勾,再重新打开就正常了。
2.2 快速定位API的检索技巧
很多新手打开CHM文档就懵了,几万条API怎么找?我的习惯是三步走:
第一,明确对象类型。比如我想知道墙的高度怎么取,先判断这是Wall类的问题,Wall继承自HostObject,再往上继承自Element。你在索引里搜“Wall”,能看到Wall构造函数、WallType、Location等,跟“取高度”直接相关的属性其实在LocationCurve里。
第二,看命名空间的规律。Revit API中,所有跟“收集”相关的类在Autodesk.Revit.DB,比如FilteredElementCollector;所有跟UI交互相关的在Autodesk.Revit.UI,比如ExternalCommand。这两个大命名空间能覆盖90%的开发需求,剩下的往子命名空间里找就行,比如MEP的在Autodesk.Revit.DB.Mechanical和Electrical。
第三,善用文档自带的“索引”和“搜索”。CHM文档的索引是带通配符的,比如你想查“所有以Get开头的几何方法”,直接在索引里输入“Get”,能拉出一串GetLocation、GetGeometry、GetMaterialIds等,配合Ctrl+F在当前页过滤,效率极高。
2.3 从文档到代码的转化方法
看文档时不光要复制方法签名,还要注意两点:
一是方法的返回值。比如Element.get_Geometry(Options)返回的是GeometryElement,你不往下展开根本拿不到Solid或Face。文档里每一个返回类型都能点进去,顺着几何树的层级去找数据,是写Revit二次开发的基本功。
二是标记为“Deprecated”的成员。2018版本里不少老API已经废弃了,比如Element.get_Parameter这种写法慢慢被Parameter.GetParam取代,虽然编译期可能不报错,但运行时有未知风险。所以查文档时优先选没有弃用标注的成员,能少踩很多坑。
3. Revit Lookup:剖析Revit内部对象的“透视镜”
3.1 什么是Revit Lookup及安装途径
Lookup不是Revit自带的,是Autodesk提供给开发者的一个调试插件。它最大的作用是:不写一行代码,直接在Revit界面里选中任意元素,然后查看这个元素在API层面的完整内部结构——参数、几何数据、属性、引用关系,全都以树形结构展现在你眼前。
安装Lookup有两个途径:一是直接用SDK里编译好的dll,二是用源码自己编译。2018的SDK中自带RevitLookup.sln,你可以用VS2015或2017打开,选择Release模式编译,生成RevitLookup.dll。编译之间记得先确认引用的RevitAPI.dll版本,如果你只装了2018,就在编译前把引用路径切到当前版本的安装目录,否则加载时会报版本不匹配。
编译完dll后,需要在Revit的“附加模块”选项卡下出现“External Tools”按钮,这涉及.addin文件的编写,下面第4节会细讲。这里先知道:Lookup的加载方式跟普通外部工具一样,通过.external tool方式注册即可。
3.2 Lookup的典型调试场景
Lookup最常用的几个场景,我实际开发中几乎天天用:
场景一:查元素参数。选中任意墙体后,用Lookup的Snoop Current Selection(透视当前选择),左侧是元素树,右侧列出该元素的所有Parameter对象,包括参数名、内置参数ID(ElementId)、存储类型、值单位。这样你在代码里想通过BuiltInParameter枚举取值时,先在Lookup里查到这个参数对应的参数名和存储格式,就不会写错枚举了。
场景二:查几何数据。Snoop元素后,依次展开Geometry→GeometryElement→Solid→Faces,你能直观看到墙体有哪几个面、边缘、顶点坐标。配合代码调试时,你就能知道自己写的遍历逻辑跟实际对象结构对不对得上,省去盲猜的环节。
场景三:查过滤器效果。写完一个FilteredElementCollector后,不确定筛选结果是否正确,可以在Lookup里用Snoop App(透视整个应用程序对象),展开ActiveDBDocument,查看当前收集器的Elements。如果结果跟预期不符,马上能定位是过滤条件的问题还是收集方式的问题。
3.3 Lookup与调试器的配合使用
一个容易忽略的技巧:Lookup窗口显示的属性树,跟VS调试器里对象属性面板是联动的。你可以把Lookup中看到的某个ElementId记下来,然后在VS里用document.GetElement(new ElementId(...))拿到对应对象,把对象拖到Watch窗口,双击展开各个成员,很多问题在“Lookup看到数据→VS里定位到同一对象”的过程中就被解决了。
这个思路在排查复杂BIM数据问题时特别有效。比如有次我写楼层平面视图的图框尺寸统计,发现统计结果和实际不符,不写一行日志,直接用Lookup点开视图对象,逐个属性排查,很快就发现是ViewSheet的Scale参数类型是整数类型,而我在代码里读出来直接强转字符串,导致精度丢失。没有Lookup的话,这种问题能调一下午。
4. 外部加载工具:AddInManager与.addin注册全流程
4.1 手动addin文件的结构和字段说明
Revit的外部工具逻辑其实很简单:Revit启动时扫描固定的.addin文件,根据文件里的配置,去加载dll里的类。这个.addin文件就是你把代码“接”进Revit的桥梁。
.addin文件本质上是一个UTF-8编码的XML,分ExternalApplication和ExternalCommand两种格式。ExternalCommand是命令型插件,点按钮触发;ExternalApplication是应用型插件,Revit启动和关闭时自动执行,比如自动加载功能区面板。
一个典型的ExternalCommand的.addin文件长这样:
<?xml version="1.0" encoding="utf-8"?> <RevitAddIns> <AddIn Type="Command"> <Name>批量导出DWG</Name> <Assembly>C:\MyAddins\BatchExport.dll</Assembly> <FullClassName>BatchExport.Command</FullClassName> <ClientId>1e0a8f9e-3d25-4e56-8d91-123456789abc</ClientId> <VendorId>MyCompany</VendorId> <VendorDescription>我的公司</VendorDescription> </AddIn> </RevitAddIns>几个关键字段逐个说明:
- Type:外部工具类型,Command或Application,二选一。
- Assembly:dll的绝对路径。路径写错了所有加载都白搭,最好用全路径,尽量不要写相对路径。
- FullClassName:dll中实现了IExternalCommand或IExternalApplication接口的完整类名,包括命名空间,比如MyNamespace.MyCommand。
- ClientId:一个GUID,用来标识这个工具的唯一性。VS里可以用“工具→创建GUID”快速生成一个。这个字段不是必填,但建议写上,尤其是多命令组合时,Revit用ClientId和名称来区分。
- VendorId和VendorDescription:开发者信息,可以不填,但参与Autodesk认证或者做插件分发时,这个信息会显示给用户,建议保持一致。
.addin文件的存放位置也有讲究,分两个层级:
- 系统级:C:\ProgramData\Autodesk\Revit\Addins\2018\,所有用户都能加载。
- 用户级:C:\Users<用户名>\AppData\Roaming\Autodesk\Revit\Addins\2018\,只对当前用户生效。
开发调试阶段建议用用户级,不会污染公共环境;发布测试时改用系统级,模拟真实用户安装场景。
4.2 用SDK自带AddInManager做热加载调试
手动写.addin文件的问题是:每改一次代码,你都得先在VS里重新生成dll,然后在Revit里卸载、重新加载插件,效率极低。
Autodesk也想到了这点,所以SDK里附带了一个叫AddInManager的工具。这个工具能让你在Revit运行状态下,动态加载、卸载dll,不用重启Revit,大幅提升调试效率。
AddInManager的安装方式跟普通ExternalApplication一样,它自己也是一个dll,需要被加载到Revit里。实际操作步骤:
- 用VS打开SDK里的AddInManager.sln工程,编译生成AddInManager.dll(以及对应的.addin文件)。
- 把编译出的.dll和.addin文件拷贝到用户级Addins目录。
- 重启Revit,会在“附加模块”选项卡下看到“External Tools”下拉按钮,点击后出现一个对话框,列表里有All Commands和Loaded Classes两个页面。
Loaded Classes页面会把当前能加载的所有外部命令都列出来,你可以直接选择某个dll文件,然后点Execute运行,不需要重启Revit,即时验证。这就是热加载的核心优势。
另外AddInManager还有一个“Edit”功能,可以修改当前加载项的Assembly路径和FullClassName,很适合调试多个命令跳转的场景。
4.3 快速写一个外部命令的完整Demo
光说不练假把式,我给你一个最简单的外部命令Demo,验证整个加载链路是否通顺。这个命令的功能是:弹出一个对话框,显示当前项目里墙的数量。
using System; using System.Linq; using System.Windows.Forms; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; namespace MyRevitPlugins { [Transaction(TransactionMode.Manual)] public class CountWallsCommand : IExternalCommand { public Result Execute( ExternalCommandData commandData, ref string message, ElementSet elements) { Document doc = commandData.Application.ActiveUIDocument.Document; FilteredElementCollector collector = new FilteredElementCollector(doc); int wallCount = collector.OfClass(typeof(Wall)).Count(); MessageBox.Show($"当前项目中有 {wallCount} 面墙。", "统计结果"); return Result.Succeeded; } } }编译时要注意两点:一是项目类型选“类库(.NET Framework)”,二是引用RevitAPI.dll和RevitAPIUI.dll时,把“复制本地”设为False,否则发布时会把Autodesk的dll文件复制到输出目录,容易造成版本冲突。
把编译生成的CountWallsCommand.dll放到一个固定目录,比如C:\MyAddins\,然后写一个对应的.addin文件,Type设为Command、Assembly指向上述路径、FullClassName填MyRevitPlugins.CountWallsCommand,放到用户级Addins目录,重启Revit,就能在“附加模块”的External Tools里看到并运行这个命令了。
如果你不想手动写.addin,也可以启动Revit后用AddInManager的Load按钮直接加载这个dll,效果一样。两条路都试一遍,你对Revit二次开发加载机制的理解就成型了。
5. 常见问题与排查技巧实录
5.1 高频报错排查速查表
实际开发中踩过的坑,我整理成了一份速查表,按“现象→原因→解决方案”的格式列出来,可以直接当手册用:
| 现象 | 常见原因 | 解决方案 |
|---|---|---|
| Revit启动时提示“无法加载外部工具” | .addin文件路径错误或者dll依赖缺失 | 检查Assembly绝对路径,确认dll在指定位置;用Dependency Walker或VS输出日志确认依赖dll是否存在 |
| AddInManager里能看到命令但点击后没反应 | FullClassName的命名空间或类名拼错 | 核对dll中的类名,确认实现了IExternalCommand接口,且事务属性[Transaction]已添加 |
| 命令运行时报“RevitAPI.dll版本不匹配” | 引用了其他版本的RevitAPI.dll | 在VS里移除引用,重新添加Revit 2018安装目录下的对应dll |
| Lookup窗口内容一片空白 | 没有正确选中目标元素或对象 | 先选中一个元素,再在Lookup里选择Snoop Current Selection;透视应用程序对象时选择Snoop App |
| 修改代码重新编译后,Revit里还是旧行为 | Revit缓存了未卸载的旧dll | 在AddInManager中先卸载旧模块,再重新加载新dll;或者重启Revit |
| .addin文件用记事本编辑后中文乱码 | 编码不是UTF-8 | 用带UTF-8编码的编辑器(比如VS Code、Notepad++)保存XML |
5.2 事务与刷新——最容易翻车的两类问题
Revit外部命令的很多问题不是编译报错,而是运行逻辑异常。最常见的就是没有加事务特性,或者在事务外修改了元素。注意,我上面Demo里的[Transaction(TransactionMode.Manual)]属性是必须的,哪怕你只是读数据不写数据,也建议加上。否则在某些情况下,Revit会把你的命令当成“无事务模式”,自动回滚写入操作,导致数据丢失。
第二种常见问题是界面刷新问题。修改完参数后,Revit不会自动在视图里刷新显示。你需要在代码里调用:
doc.Regenerate(); uiDoc.RefreshActiveView();否则你改完墙上参数,视图里看起来没变化,容易误判为命令没生效。这个坑我踩过好几次,尤其是批量修改参数后,明明API返回值显示成功,但视图就是不动,加上这两行代码立刻正常。
5.3 调试技巧:让VS和Revit高效联动
开发调试时,不要每次都手动启动Revit再加载dll。正确做法是:在VS里把Revit.exe设为启动外部程序,然后直接按F5,VS会启动Revit并自动附加调试器。
具体设置方式:项目属性→调试→启动外部程序,选择Revit 2018的安装路径下的Revit.exe。这样按F5之后Revit启动,你手动运行外部命令,命中断点后就能在VS里逐步查看变量、调用堆栈、监视对象。
另一个细节:在代码里用MessageBox.Show弹窗调试非常方便,但在批处理大量文档时,弹窗会卡住流程。建议调试阶段少量测试时用弹窗,成批跑时改用TaskDialog.Show或者输出到日志文件,避免无休止的点“确定”。
关于附加到进程,还有个进阶操作:把“启用本机代码调试”勾上,这样如果你后续做C++或P/Invoke相关开发,也能在混合模式下调试。纯C#开发的话,这个选项可以不用管,默认不勾反而启动更快。
写在最后
这三样工具——帮助文档、Lookup、外部加载工具,组合起来就是一套完整的Revit 2018开发工作台。文档负责告诉你“API长什么样”,Lookup负责告诉你“这个对象内部长什么样”,加载工具则负责把你的代码安全地塞进Revit并跑起来。三者缺一不可,顺手程度直接决定你的开发效率。
我个人经验是,刚开始接触二次开发时,别急着啃大而全的书架资料,先把这一套工具链跑通,再用“遇到需求→查API→用Lookup验证数据→写代码→热加载测试”这个循环去练手,比什么都快。等你在Revit 2018上把这个链路跑顺了,后面升级到更高版本、迁移到Revit 2020+的新框架,底层思路都是一脉相承的。
本文还有配套的精品资源,点击获取