当前位置: 首页 > news >正文

2. Revit API UI 之 IExternalCommand 和 IExternalApplication

2. Revit API UI 之 IExternalCommand 和 IExternalApplication

上一篇我们大致看了下 RevitAPI 的一级命名空间划分,再简单讲了一下Attributes命名空间下的3个类,并从一个代码样例,提到了AttributesIExternalCommand ,前者是指示外部命令要满足的要求或要执行的动作,后者呢,就是外部命令接口。和外部命令接口类似的接口,还有IExternalApplication(外部应用)和IExternalEventHandler(外部事件)

这一篇呢,如题目所说,讲的是UI命名空间的部分,讲其中的IExternalCommand IExternalApplication这两个接口

Revit UI Namespace

在讲外部命令和外部事件之前,我们得先了解一下UI命名空间下,都有哪些东西。

我在这儿贴了一个图,该导图使用FreeMind制作。

注:图中包含Autodesk.Revit.UI下的所有成员

在这里插入图片描述

IExternalCommand 外部命令

当一个类实现了IExternalCommand 接口,就可以通过官方插件Addin Manager加载运行测试。该插件可以在安装的 Revit SDK 目录下找到,具体就不多介绍了。

在这里插入图片描述

接口实现

IExternalCommand 接口需要实现一个Execute方法,该方法传入了3个参数:

  • commandData:包含应用程序、视图、日志映射的引用,这些是外部命令所需的;
  • message:如果命令失败,可以返回错误消息,这个字符串有1023个字符的限制;
  • elements:如果命令失败,可以指示问题元素的集合。

先看个示例代码,作用是删除项目中的所有元素。

public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{UIApplication uiApp = commandData.Application;  // 拿到当前活跃着的会话UIDocument uiDoc = uiApp.ActiveUIDocument;  // 拿到UI交互相关的引用Document doc = uiDoc.Document;  // 拿到文档引用,操作一般都在这个上面// 启动一个事务,删除文档中的元素。// 不要忘记了上一篇的TransactionAttributeusing (Transaction transaction = new Transaction(doc, "delete all element")){try{transaction.Start();  // 开始事务FilteredElementCollector collector = new FilteredElementCollector(doc);IList<Element> elementsToDelete = collector.ToElements();foreach (Element element in elementsToDelete){doc.Delete(element.Id);}transaction.Commit();  // 提交事务}catch (Exception ex){transaction.RollBack();  // 回滚事务message = ex.Message;return Result.Failed;⌈⌋}}return Result.Succeeded;
} 

好了,这个接口的使用就是这么的简单。


IExternalApplication 外部应用

同样的,实现IExternalApplication 接口,再通过.addin配置文件进行注册,就可以愉快得使用啦。

与外部命令不同的,是外部应用要实现的不在是⌈执行⌋方法,而是OnStartup OnShutdown

接口实现

OnStartup 方法会在Revit启动时调用,允许开发者执行初始化任务,比如添加界面、设置事件处理器等。

OnShutdown 就是在Revit关闭时调用。一般用于行清理工作,比如注销事件处理器、保存设置、释放资源等。

看一个例子,Revit启动的时候,在Revit最顶栏加一个叫“测试Tab”的选项,内部就一个叫“Panel”的面板,面板里就一个“Bottun”按钮。

还有呢,会启动一个空闲事件,作用是Revit有空的时候就打印一下。

using Autodesk.Revit.DB.Events;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Events;
using Nice3point.Revit.Toolkit.External;  // 一个三方库,封装了IExternalApplication接口// 基本没区别,需要实现的方法没参数了
namespace RevitDuctLoad
{[UsedImplicitly]public class Application : ExternalApplication{public override void OnStartup(){this.CreateRibbon(this.Application);  // 创建按钮this.Application.Idling += new EventHandler<IdlingEventArgs>(this.IdlingHandler);	// 开启空闲事件}public override void OnShutdown(){this.Application.Idling -= new EventHandler<IdlingEventArgs>(this.IdlingHandler);	// 关闭空闲事件}private void IdlingHandler(object sender, IdlingEventArgs e){TaskDialog.Show("提示", $"空闲事件:{DateTime.Now.ToString("mm:ss")}");}private void CreateRibbon(UIControlledApplication application){string tabName = "测试Tab";application.CreateRibbonTab(tabName);  // 再RibbonPanel panel = application.CreateRibbonPanel(tabName, "Panel");PushButton button = panel.AddItem(new PushButtonData("Bottun", "Bottun", AddInPath, "XXX.TestCommand")) as PushButton;button.ToolTip = "这是一个测试按钮,执行测试命令";}}
}

结尾

就一丢丢内容,也没什么好说的。

这一节我们提到了DocumentUIDocumentTransaction(事务),还有 Ribbon(界面相关)和 Idling(空闲事件),这些我们后面讲。

噢,还提到了一个同样是“外部”东西 IExternalEventHandler,这个要到再后面一些了。

下一篇南北,讲一下 Dialog 相关的内容,比较简单,就先写了。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • c++中main(int argc, char* argv[])参数详解
  • PaddleDetection快速体验quick_start
  • 云南区块链商户平台发票助手成品
  • 【数据结构】排序(上)
  • 编程不行?解锁求职新路径的七大策略
  • java使用websocket遇到的问题
  • pdf转图片,pdf转图片在线转
  • Ubuntu 网络重置
  • Scapy使用报错Interface is invalid (no pcap match found) 解决办法
  • 【环境搭建】2.阿里云ECS服务器 安装MySQL
  • 必刷!!软考【系统分析师】100道高频考题(含知识点解析),轻松45+
  • 《玫瑰的故事》打响暑期档,“三连爆”的新丽领跑剧集市场
  • 【算法与数据结构】【数组篇】【题11-题15】
  • 2025广州眼博会,2025广东省眼睛健康及眼科产业展览会
  • 达梦8 开启物理逻辑日志对系统的影响
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 2019.2.20 c++ 知识梳理
  • Asm.js的简单介绍
  • canvas 五子棋游戏
  • Consul Config 使用Git做版本控制的实现
  • egg(89)--egg之redis的发布和订阅
  • go append函数以及写入
  • rabbitmq延迟消息示例
  • Sass 快速入门教程
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • VUE es6技巧写法(持续更新中~~~)
  • vue--为什么data属性必须是一个函数
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 搞机器学习要哪些技能
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 聊聊flink的BlobWriter
  • 微信开源mars源码分析1—上层samples分析
  • 温故知新之javascript面向对象
  • 用 Swift 编写面向协议的视图
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (ros//EnvironmentVariables)ros环境变量
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (七)Java对象在Hibernate持久化层的状态
  • (一)认识微服务
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)人的集合论——移山之道
  • .net 流——流的类型体系简单介绍
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET企业级应用架构设计系列之应用服务器
  • /proc/stat文件详解(翻译)
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • [000-01-022].第03节:RabbitMQ环境搭建
  • [04]Web前端进阶—JS伪数组
  • [1181]linux两台服务器之间传输文件和文件夹