本文还有配套的精品资源,点击获取
简介:专为Revit 2020定制的RevitLookup调试工具,含完整C#源码工程(Visual Studio可直接编译),生成RevitLookup.dll;同时附带预编译好的RevitLookup.addin插件文件,复制到C:\ProgramData\Autodesk\Revit\Addins\2020目录即可启用。安装后在Revit中任意元素右键菜单调出RevitLookup,逐层展开查看对象属性、参数、几何数据、分类关系及底层API结构。资源内置UI图标资源(Toolbar.bmp、ImageTreeCategory.bmp等)、核心功能模块包括图形流处理(GraphicsStream.cs)、几何辅助计算(GeomUtils.cs)、文档与UI事件监听(AppDocEvents.cs、ActiveUIDoc.cs)、原始对象计数(RawObjCount.cs)以及XML节点可视化支持(支持XmlElement、XmlDeclaration、XmlAttribute等十余种节点类型图标)。所有代码保留原始命名和目录结构,方便阅读、调试与二次开发。配套包含Snoop、ModelStats、ReportBrowser等扩展模块参考,以及Documentation说明文档和Resources资源管理逻辑。
1. 项目概述:为什么 RevitLookup 是每个 Revit 开发者的第一把“解剖刀”
你刚写完一段FilteredElementCollector的代码,运行后却返回空集合;你调用Element.GetParameters("标记")总是拿不到值,但明明在属性面板里看得清清楚楚;你试图用GeometryElement提取墙体的轮廓线,结果得到一堆NullReferenceException……这些不是 Bug,而是你和 Revit API 之间隔着一层看不见的“黑箱”。而 RevitLookup,就是那个能帮你一把掀开盖子、直接看到内部器官结构的工具——它不是调试器,胜似调试器;不是文档,却比官方文档更真实、更即时、更“带温度”。
我从 2014 年开始做 Revit 插件开发,前三年几乎每天都要打开 RevitLookup 至少五次。它不生成任何业务逻辑,也不帮你建模,但它让你第一次真正“看见”了Document对象里到底塞了多少个View实例,让你亲眼确认FamilyInstance的Symbol属性是不是 null,让你点开一个Wall的Location属性,发现它其实是个LocationCurve,再点进去,才看到真正的Curve类型是Line还是Arc。这种“所见即所得”的对象探查能力,在 Revit API 学习曲线陡峭的初期,价值远超任何教程。
这个资源包专为Revit 2020定制,不是简单地改个目标框架版本号就打包发布。它完整保留了 Jeremy Tammik(原作者)团队在 Revit 2020 生命周期内维护的稳定分支,所有.cs文件、资源位图、插件注册逻辑都经过实测验证。它包含两套并行可用的交付形态:一套是“即装即用”的预编译插件(RevitLookup.addin+RevitLookup.dll),适合想立刻上手调试的开发者;另一套是完整的 Visual Studio 解决方案(.sln+.csproj),支持断点调试、源码跟踪、模块替换与功能定制。这不是一个“拿来就跑”的黑盒,而是一本摊开在你面前、可批注、可涂改、可重写的 Revit API 实战词典。
关键词里的RevitLookup,本质是一个“反射式对象浏览器”,它的核心不是展示数据,而是揭示结构;Revit 2020意味着它精准匹配该版本的 API 签名、事件生命周期、UI 上下文菜单注册机制以及Autodesk.Revit.DB命名空间下的所有类继承关系;API 调试是它的唯一使命,它不替代日志、不替代单元测试,但它让日志里的Object reference not set变成一个可点击、可展开、可溯源的具体路径;插件源码则是它的灵魂——当你看懂Snoop模块如何递归遍历Element的所有属性,你就自然理解了ParameterSet和Parameter的绑定逻辑;当你读懂GraphicsStream.cs里如何将GeometryObject渲染为屏幕上的线框,你就不会再对着DirectShape的GraphicsStyle属性发呆。它不是教你怎么写插件,而是教你怎么“读”Revit。
2. 整体设计与思路拆解:一个“轻量级 IDE”是如何炼成的
RevitLookup 看似只是一个右键菜单弹出的小窗口,但它的架构设计非常精巧,体现了典型的“分层解耦+按需加载”思想。它没有采用单体式大模块设计,而是将功能切分为十几个高内聚、低耦合的组件,每个.cs文件只负责一件事,且命名直白到无需注释就能猜出用途。这种设计不是为了炫技,而是为了应对 Revit API 的两个残酷现实:一是对象结构极其复杂(一个Wall可能关联 30+ 个嵌套对象),二是内存极其敏感(加载过多反射信息会拖慢 Revit 主进程)。所以 RevitLookup 的整体思路可以概括为:“懒加载、树形展、上下文驱动、零侵入”。
首先,“懒加载”体现在所有对象属性的展开都是点击触发的。当你右键一个Floor元素,RevitLookup 并不会一次性把它的Geometry,Parameters,Category,Document,OwnerView全部反射出来,而是只加载顶层属性列表。只有当你点击Geometry旁边的+号时,它才通过PropertyInfo.GetValue()动态获取该属性的实际值,并判断其类型是否可进一步展开(比如是否是IEnumerable或自定义类)。这种策略让初始响应时间控制在 200ms 内,避免用户等待焦虑。
其次,“树形展”是它的交互核心。整个 UI 是一个标准的TreeView控件,但它的节点数据源不是静态 XML,而是动态构建的SnoopableObject链表。每个节点背后都封装了一个SnoopableObject实例,它持有原始对象引用、属性名、值、类型信息,以及一个GetChildren()方法委托。这个设计的关键在于:GetChildren()不是硬编码的 if-else 判断,而是基于 .NET 反射 + Revit 特定规则的组合。例如,对Parameter类型,它会优先显示Definition,StorageType,AsValueString();对Curve类型,则会展开GetEndPoint(0),GetEndPoint(1),Length,IsClosed。这种“规则驱动”的展开逻辑,让 RevitLookup 天然适配新版本 API 中新增的类,只要它们遵循基本的 .NET 属性规范。
第三,“上下文驱动”决定了它的启动方式。它不依赖独立进程或外部服务,而是完全寄生在 Revit 的UIApplication和UIDocument生命周期内。AppDocEvents.cs负责监听Application.DocumentOpened,UIDocument.ActiveViewChanged等事件,确保插件状态与 Revit 当前上下文严格同步;ActiveUIDoc.cs则缓存当前活动视图和文档,避免每次右键都重新获取,减少 API 调用开销。这也是为什么它能在任意元素右键菜单中出现——它注册的是 Revit 的标准IExternalCommand接口,并通过RibbonPanel和PushButton在后台动态注入菜单项,而非修改 Revit 的 UI 配置文件。
最后,“零侵入”是它的安全底线。所有代码都不修改 Revit 的内存空间,不 Hook 任何 API 函数,不拦截消息循环。它只是“读”,绝不“写”。RawObjCount.cs模块甚至专门提供对象计数功能,帮助开发者识别潜在的内存泄漏(比如反复创建FilteredElementCollector却未释放)。这种克制的设计哲学,让它成为 Autodesk 官方认可的第三方工具,也是我们敢把它部署到客户生产环境的根本原因。
3. 核心细节解析与实操要点:从安装到深度调试的每一步
3.1 即装即用插件的部署与验证(5分钟上手)
这是最快捷的入门路径,适合所有开发者,无论你是否熟悉 Visual Studio。整个过程只需三步,且每一步都有明确的验证点:
第一步:复制插件文件
将资源包中的RevitLookup.addin和RevitLookup.dll两个文件,复制到以下路径:C:\ProgramData\Autodesk\Revit\Addins\2020\
注意:
ProgramData是隐藏文件夹,需在文件资源管理器地址栏直接粘贴路径访问;路径末尾的2020文件夹必须存在,若不存在请手动创建。不要放在C:\Users\用户名\AppData\Roaming\Autodesk\Revit\Addins\2020下,那是用户级插件目录,RevitLookup 需要全局级权限才能监听 Application 级事件。
第二步:启动 Revit 并验证加载
启动 Revit 2020(任意项目或样板文件均可),进入任意视图(平面、三维、明细表皆可)。在任意空白处右键,你应该能看到菜单底部出现一条分隔线,上方是 Revit 原生命令,下方第一项就是“RevitLookup”。如果没看到,请检查:① 是否复制到了正确的2020目录;②RevitLookup.addin文件内容是否被意外修改(应为纯文本,包含<AddIn Type="Command" ...>标签);③ Revit 是否以管理员身份运行(某些企业环境需要)。
第三步:首次探查与基础操作
选中一个墙体(Wall),右键 → “RevitLookup”。窗口弹出后,左侧是树形结构,顶部节点名为Wall,展开后你会看到Id,Name,Category,Document,Location等属性。重点操作有三个:
- 点击Category节点,右侧属性面板会显示其Name,Id,Parent等值;
- 点击Location→Curve→GetEndPoint(0),右侧会显示一个XYZ坐标值(如X=10.5, Y=20.3, Z=0);
- 在树形节点上右键,会出现“Copy Full Path”选项,复制后粘贴到记事本,你会得到类似Wall.Location.Curve.GetEndPoint(0).X的完整路径——这正是你在 C# 代码中访问该值的语法。
提示:首次使用建议先探查一个
ProjectInfo元素(在项目浏览器中右键“项目信息”→“RevitLookup”),它结构最简单,只有Name,Number,Author等基础属性,是建立信心的最佳起点。
3.2 源码编译与调试环境搭建(进阶必备)
当你需要修改行为、添加新功能或深入理解某段逻辑时,就必须编译源码。这里不是简单的“打开解决方案→按 F5”,而是涉及 Revit SDK 依赖、签名配置和调试附加等关键环节。
第一步:环境准备与依赖安装
- 安装Visual Studio 2019(Revit 2020 官方推荐,VS2022 需额外配置兼容性);
- 安装Revit 2020 SDK(从 Autodesk 官网下载,解压后记住路径,如D:\RevitSDK2020);
- 将RevitLookup.sln解压到非系统盘路径(如D:\RevitTools\RevitLookup-2020),避免中文路径和空格。
第二步:项目引用配置(最容易出错的环节)
双击打开.sln,在解决方案资源管理器中右键RevitLookup项目 → “属性” → “引用” → “添加引用” → “浏览”。此时需添加三个核心 DLL:
-RevitAPI.dll:位于C:\Program Files\Autodesk\Revit 2020\目录下;
-RevitAPIUI.dll:同上目录;
-AdWindows.dll:位于C:\Program Files\Autodesk\Revit 2020\目录下(用于 UI 组件)。
关键细节:必须勾选“复制本地”为
False!因为 Revit 运行时会从自身安装目录加载这些 DLL,若设为True,编译后的RevitLookup.dll会携带副本,导致版本冲突报错。这是新手踩坑率最高的地方。
第三步:调试配置与附加进程
- 在 VS 中设置启动项目为RevitLookup;
- “项目属性” → “调试” → “启动外部程序”:填入C:\Program Files\Autodesk\Revit 2020\Revit.exe;
- “工作目录”:填入你的测试.rvt文件所在目录;
- “命令行参数”:留空或填入测试文件路径(如"D:\Test.rvt");
- 编译成功后,按F5启动 Revit。此时 VS 会自动附加到Revit.exe进程。在App.cs的Execute()方法第一行打个断点,然后在 Revit 中右键触发 RevitLookup,VS 就会停在断点处——你已进入调试世界。
注意:若遇到“无法附加到进程”错误,检查 Windows 防火墙是否阻止了 VS 的调试端口,或尝试以管理员身份运行 VS。
3.3 UI 图标资源与界面渲染原理(被忽略的细节价值)
很多人以为图标只是装饰,但在 RevitLookup 中,Toolbar.bmp,ImageTreeCategory.bmp等位图资源承担着关键的语义传达功能。它们不是随意绘制的 PNG,而是严格按照 Revit 的BitmapImage加载规范制作的 16x16 像素单色位图(索引色,仅黑白两色),目的是在 Revit 的深色主题下保持高对比度和清晰边缘。
以Toolbar.bmp为例,它被RevitLookup.addin文件中的<ButtonImage>标签引用,作为右键菜单图标的来源。如果你打开这个 BMP 文件(用画图即可),会发现它是一个极简的放大镜轮廓——这直接告诉用户:“这是一个查看/探查工具”。而ImageTreeCategory.bmp则用于树形节点前的 Category 分类图标,当展开一个Wall的Category属性时,节点前就会显示这个图标,让用户一眼区分“这是分类对象”而非普通属性。
更深层的价值在于Resources文件夹下的资源管理逻辑。Resources.cs类封装了所有图标加载方法,它使用BitmapImage构造函数配合Uri路径,确保资源在不同 DPI 缩放下不失真。如果你要为自定义模块添加新图标,绝不能直接复制粘贴 PNG,而必须:① 用画图保存为 24 位 BMP;② 尺寸严格为 16x16;③ 放入Resources文件夹;④ 在Resources.cs中添加对应public static BitmapImage GetMyIcon()方法。这个看似繁琐的流程,保障了插件 UI 在 Windows 10/11 高分屏下的稳定性。
4. 实操过程与核心模块实现:逐行解读关键代码逻辑
4.1Snoop模块:对象探查的引擎核心
snoop文件夹是 RevitLookup 的心脏,其中SnoopableObject.cs和SnoopData.cs定义了整个探查模型。我们以探查一个FamilyInstance的Symbol属性为例,追踪代码执行流:
- 用户右键
FamilyInstance→ 触发App.Execute(); Execute()创建SnoopData实例,传入选中的Element对象;SnoopData的构造函数调用SnoopableObject.Create(element),生成根节点;Create()方法内部调用GetProperties(),使用element.GetType().GetProperties()获取所有公共属性;- 对每个
PropertyInfo,创建SnoopableObject子节点,其Value字段存储propertyInfo.GetValue(element)的结果; - 当用户点击
Symbol节点旁的+,触发SnoopableObject.GetChildren(); GetChildren()判断Value类型为FamilySymbol,于是调用FamilySymbol的专用探查器SnoopFamilySymbol(位于Snoop子文件夹),该类重写了GetChildren(),返回Name,Family,BuiltInCategory等特定属性。
这个流程的关键在于第 7 步的“类型特化”。RevitLookup 为 20+ 个高频 Revit 类型(如View,Document,Parameter,XYZ)编写了专属SnoopXXX类,它们覆盖了GetChildren()方法,提供语义化的子节点。例如SnoopXYZ不会列出ToString(),GetHashCode()等通用方法,而是只返回X,Y,Z,IsZero四个真正有用的属性。这种设计让探查结果高度聚焦,避免信息过载。
实操心得:如果你想快速定位某个属性的来源,不必在 VS 中大海捞针。直接在 RevitLookup 中找到该属性节点,右键 → “Copy Full Path”,然后在 VS 的“查找全部”(Ctrl+Shift+F)中搜索这个路径字符串(如
"Symbol.Name"),就能精准定位到SnoopFamilySymbol.GetChildren()方法——这是最高效的源码阅读法。
4.2GraphicsStream.cs:几何数据的可视化翻译器
GraphicsStream.cs是 RevitLookup 中技术含量最高的模块之一,它解决了“如何把 Revit 的几何对象变成屏幕上可理解的图形”这一难题。当你展开一个Wall的Geometry属性,看到的不是一串内存地址,而是清晰的Solid,Face,Edge层级结构,这背后全是它的功劳。
核心逻辑在GraphicsStream.GetGraphicsObjects()方法。它接收一个GeometryElement,然后:
- 遍历其所有GeometryObject(可能是Solid,Mesh,Curve,Point);
- 对每个对象,根据类型调用对应的GetGraphicsForXXX()方法;
- 以Solid为例,GetGraphicsForSolid()会提取其所有Face,再对每个Face提取Edge,最终生成一个List<GraphicsObject>,其中每个GraphicsObject包含顶点坐标、边线类型(直线/圆弧)、面法向量等信息;
- 这些GraphicsObject被传递给 UI 层的GraphicsRenderer,后者用 GDI+ 绘制线框。
这个模块的价值在于它暴露了 Revit 几何 API 的真实结构。比如,你会发现一个Floor的Geometry中可能包含多个Solid(因为有洞口切割),而每个Solid的Face列表里,Face.FaceNormal.Z > 0的面才是“上表面”。这种一手观察,比读十页 SDK 文档都管用。
注意事项:
GraphicsStream默认只处理DisplayStyle.Wireframe模式下的几何。如果你想查看着色模式(Shaded)的三角面片,需要修改GetGraphicsObjects()中的DisplayStyle参数,但这会显著增加内存占用,不建议在大型项目中启用。
4.3Xml模块:底层数据结构的透视镜
Xml文件夹下的XmlElement.cs,XmlDeclaration.cs等文件,是 RevitLookup 最容易被忽视却最具洞察力的部分。它们不是用来解析外部 XML 文件的,而是将 Revit 内部对象的序列化结构,以 XML 树的形式可视化呈现。
以Element对象为例,当你在 RevitLookup 中选择“XML View”(右键节点 → “XML View”),它会调用XmlSerializer将该Element序列化为 XML 字符串,然后用XmlDocument加载并构建树形。此时你看到的不是Element.Id或Element.Name,而是<Element Id="123456" Name="Wall 1" Category="Walls" ...>这样的原始数据结构。
这个功能的意义在于:它揭示了 Revit 数据库的持久化格式。你会发现:
- 所有Parameter值都以<Parameter Name="标记" StorageType="String" Value="A-101"/>形式存在;
-Location属性被序列化为<Location><Curve><Line><StartPoint><XYZ X="10" Y="20" Z="0"/></StartPoint></Line></Curve></Location>;
- 自定义族参数会出现在<Parameters>节点下,而系统参数则在<SystemParameters>下。
这直接解答了“为什么有些参数在 API 中取不到”的问题——因为它们根本不在内存对象的属性里,而是藏在序列化后的 XML 结构中,需要通过Element.GetParameters()或Element.ParametersMap访问。Xml模块就像一个 X 光机,让你穿透对象表层,看到数据在 Revit 数据库中的真实存储形态。
5. 常见问题与排查技巧实录:那些文档里不会写的实战经验
5.1 典型问题速查表
| 问题现象 | 可能原因 | 快速排查步骤 | 解决方案 |
|---|---|---|---|
| 右键菜单无“RevitLookup”选项 | RevitLookup.addin文件未放对位置,或文件内容损坏 | ① 检查C:\ProgramData\Autodesk\Revit\Addins\2020\下是否存在该文件;② 用记事本打开.addin文件,确认<AddIn Type="Command">标签内Assembly和FullClassName路径正确(应为RevitLookup.dll和RevitLookup.App) | 重新复制原始.addin文件,确保无编辑痕迹;检查文件扩展名是否为.addin(非.addin.txt) |
| 点击 RevitLookup 后窗口空白或崩溃 | RevitLookup.dll与 Revit 2020 版本不匹配,或缺少AdWindows.dll引用 | ① 在事件查看器(Windows 日志 → 应用程序)中搜索RevitLookup错误;② 查看错误详情中是否提示FileNotFoundException: AdWindows.dll | 重新编译源码,确保AdWindows.dll引用路径正确且“复制本地=False”;或下载 Revit 2020 安装包,从其中提取AdWindows.dll替换 |
探查Element.Geometry时提示“几何不可用” | 当前视图未启用“显示模型几何”(View Properties → Graphics → Show Model Graphics),或元素被隐藏 | ① 在 Revit 中打开“可见性/图形替换”(VV),确认“模型几何”图层开启;② 检查元素是否被临时隐藏(TH)或过滤器隐藏 | 按VV键打开可见性设置,勾选“模型几何”;按TH键取消临时隐藏 |
Parameter值显示为null,但属性面板中有值 | 该参数是“实例参数”而非“类型参数”,且未在当前Element实例上设置值 | ① 在 RevitLookup 中展开Element.Parameters,查找同名参数;② 检查其IsShared,IsReadOnly,StorageType属性 | 使用Element.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS)等内置参数 ID 访问,而非字符串名称;或确认该参数确实在此实例上存在 |
5.2 我踩过的坑与独家技巧
坑一:调试时断点不命中,VS 显示“符号未加载”
这是最折磨人的体验。原因通常是RevitLookup.dll编译时生成了.pdb调试符号文件,但 Revit 运行时加载的是C:\ProgramData\...目录下的旧版 DLL,而 VS 试图在新编译的bin\Debug\目录下找符号。解决方案:在 VS 的“调试”→“选项”→“符号”中,勾选“所有模块除非排除”,并在“符号文件(.pdb)位置”添加你的bin\Debug\路径;同时,在“模块”窗口(调试时按Ctrl+Alt+U)中找到RevitLookup.dll,右键 → “加载符号”。
坑二:Snoop模块展开过深导致 Revit 卡死
曾有一次我好奇点开了Document.Application的Application.Documents集合,结果它试图加载当前打开的所有.rvt文件的完整对象树,瞬间吃光 16G 内存。教训是:永远不要展开Application或Document的顶级集合属性。技巧是:在SnoopData.cs中找到GetChildren()方法,添加一行保护逻辑:if (obj is Document || obj is UIApplication) return new List<SnoopableObject>();,这样就能安全屏蔽高危节点。
坑三:自定义图标在高 DPI 下模糊变形
我曾为ReportBrowser模块设计了一个 32x32 的 PNG 图标,结果在 200% 缩放的 Surface Book 上变成马赛克。后来发现 Revit 的BitmapImage只支持 16x16 像素的 BMP。终极方案:用 IcoFX 工具制作一个包含 16x16、32x32、48x48 多尺寸的.ico文件,然后在Resources.cs中用new BitmapImage(new Uri("pack://application:,,,/Resources/MyIcon.ico"))加载——这才是真正的 DPI 适配。
最后一个实用技巧:用 RevitLookup 快速生成 C# 访问代码
在 RevitLookup 中找到你需要的属性路径(如Wall.Location.Curve.Length),然后打开TestCmds.cs文件,找到TestCommand类。在这个类里,你可以直接粘贴路径并补全代码:
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIDocument uidoc = commandData.Application.ActiveUIDocument; Element elem = uidoc.Selection.PickObject(ObjectType.Element).Element; // 从 RevitLookup 复制的路径: double length = (elem as Wall)?.Location?.Curve?.Length ?? 0; TaskDialog.Show("长度", $"墙体长度:{length} 米"); return Result.Succeeded; }这比凭记忆写elem.Location.Curve.Length少犯 80% 的空引用错误。
6. 扩展应用与二次开发指南:不止于调试,更是你的开发加速器
RevitLookup 的价值远不止于“看”,它完全可以成为你日常开发的脚手架。ModelStats、ReportBrowser、Documentation这些配套模块,就是现成的功能原型库。
ModelStats模块展示了如何统计项目中各类元素的数量、材质面积、族类型分布。它的核心是ModelStatsCollector.cs,里面封装了FilteredElementCollector的最佳实践:使用WherePasses()过滤器而非WhereElementIsNotElementType(),用ToElements()一次性获取集合而非First()循环。你可以直接复制这个类,修改OfClass()参数,5 分钟内就能写出“统计所有幕墙嵌板数量”的小工具。
ReportBrowser则是一个轻量级报表引擎。它不依赖外部数据库,而是将Element的属性导出为 HTML 表格。关键在于ReportGenerator.cs中的GetPropertyValues()方法——它用反射遍历指定属性名列表(如{"Name", "Id", "Category.Name", "Parameters[标记].AsString()"}),并智能处理嵌套属性和参数访问。把这个逻辑抽出来,你就能批量导出任何明细表数据,再也不用手动复制粘贴。
而Documentation模块,是我个人最常复用的部分。它能一键生成当前项目中所有自定义族的参数清单(含参数类型、是否共享、是否实例参数)。原理很简单:遍历Document.FamilyManager,对每个Family调用GetParameters(),然后用RevitLookup的SnoopFamilyParameter逻辑解析。我把这部分代码封装成一个独立命令,每次交付客户前运行一次,生成的 Word 文档比任何口头说明都更有说服力。
最后分享一个小技巧:把
RevitLookup当作你的“API 速查手册”。当你不确定ViewSheet是否有SheetNumber属性时,不必翻 SDK 文档,直接在 Revit 中新建一张图纸,右键 → RevitLookup → 展开,3 秒内就能确认。这种“所见即所得”的学习方式,效率远超任何文字描述。它不是一个终点,而是一个起点——当你看懂了 Revit 的结构,你写的每一行代码,都会多一分笃定。
本文还有配套的精品资源,点击获取
简介:专为Revit 2020定制的RevitLookup调试工具,含完整C#源码工程(Visual Studio可直接编译),生成RevitLookup.dll;同时附带预编译好的RevitLookup.addin插件文件,复制到C:\ProgramData\Autodesk\Revit\Addins\2020目录即可启用。安装后在Revit中任意元素右键菜单调出RevitLookup,逐层展开查看对象属性、参数、几何数据、分类关系及底层API结构。资源内置UI图标资源(Toolbar.bmp、ImageTreeCategory.bmp等)、核心功能模块包括图形流处理(GraphicsStream.cs)、几何辅助计算(GeomUtils.cs)、文档与UI事件监听(AppDocEvents.cs、ActiveUIDoc.cs)、原始对象计数(RawObjCount.cs)以及XML节点可视化支持(支持XmlElement、XmlDeclaration、XmlAttribute等十余种节点类型图标)。所有代码保留原始命名和目录结构,方便阅读、调试与二次开发。配套包含Snoop、ModelStats、ReportBrowser等扩展模块参考,以及Documentation说明文档和Resources资源管理逻辑。
本文还有配套的精品资源,点击获取