ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Revit二次开发入门:帮助文档、Lookup与外部加载工具全攻略

Revit二次开发入门:帮助文档、Lookup与外部加载工具全攻略 简介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 5Revit 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等配合CtrlF在当前页过滤效率极高。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对象包括参数名、内置参数IDElementId、存储类型、值单位。这样你在代码里想通过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 version1.0 encodingutf-8? RevitAddIns AddIn TypeCommand Name批量导出DWG/Name AssemblyC:\MyAddins\BatchExport.dll/Assembly FullClassNameBatchExport.Command/FullClassName ClientId1e0a8f9e-3d25-4e56-8d91-123456789abc/ClientId VendorIdMyCompany/VendorId VendorDescription我的公司/VendorDescription /AddIn /RevitAddIns几个关键字段逐个说明Type外部工具类型Command或Application二选一。Assemblydll的绝对路径。路径写错了所有加载都白搭最好用全路径尽量不要写相对路径。FullClassNamedll中实现了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安装目录下的对应dllLookup窗口内容一片空白没有正确选中目标元素或对象先选中一个元素再在Lookup里选择Snoop Current Selection透视应用程序对象时选择Snoop App修改代码重新编译后Revit里还是旧行为Revit缓存了未卸载的旧dll在AddInManager中先卸载旧模块再重新加载新dll或者重启Revit.addin文件用记事本编辑后中文乱码编码不是UTF-8用带UTF-8编码的编辑器比如VS Code、Notepad保存XML5.2 事务与刷新——最容易翻车的两类问题Revit外部命令的很多问题不是编译报错而是运行逻辑异常。最常见的就是没有加事务特性或者在事务外修改了元素。注意我上面Demo里的[Transaction(TransactionMode.Manual)]属性是必须的哪怕你只是读数据不写数据也建议加上。否则在某些情况下Revit会把你的命令当成“无事务模式”自动回滚写入操作导致数据丢失。第二种常见问题是界面刷新问题。修改完参数后Revit不会自动在视图里刷新显示。你需要在代码里调用doc.Regenerate(); uiDoc.RefreshActiveView();否则你改完墙上参数视图里看起来没变化容易误判为命令没生效。这个坑我踩过好几次尤其是批量修改参数后明明API返回值显示成功但视图就是不动加上这两行代码立刻正常。5.3 调试技巧让VS和Revit高效联动开发调试时不要每次都手动启动Revit再加载dll。正确做法是在VS里把Revit.exe设为启动外部程序然后直接按F5VS会启动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的新框架底层思路都是一脉相承的。本文还有配套的精品资源点击获取
返回列表