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;  // 拿到文档引用,操作一般都在这个上面

    // 启动一个事务,删除文档中的元素。
    // 不要忘记了上一篇的TransactionAttribute
    using (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 相关的内容,比较简单,就先写了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/705858.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vite配置unocss

在vue3vitetseslintprettierstylelinthuskylint-stagedcommitlintcommitizencz-git介绍了关于vitevue工程化搭建&#xff0c;现在在这个基础上&#xff0c;我们增加一下unocss unocss官方文档 具体开发中使用遇到的问题可以参考不喜欢原子化CSS得我&#xff0c;还是在新项目中使…

NumPy和数组

1.NumPy是什么 NumPy&#xff08;Numerical Python的缩写&#xff09;是一个开源的Python科学计算模块&#xff0c;其中包含了许多实用的数学函数&#xff0c;用来处理数值型数据。NumPy中&#xff0c;最重要和使用最频繁的对象就是N维数组。 为什么要学习NumPy&#xff1f; …

Java高级技术探索:深入理解JVM内存分区与GC机制

文章目录 引言JVM内存分区概览垃圾回收机制&#xff08;GC&#xff09;GC算法基础常见垃圾回收器ParNew /Serial old 收集器运行示意图 优化实践结语 引言 Java作为一门广泛应用于企业级开发的编程语言&#xff0c;其背后的Java虚拟机&#xff08;JVM&#xff09;扮演着至关重…

TikTok Ads广告综合指南:竞价策略及效果建议

作为全球最受欢迎的应用程序之一&#xff0c;TikTok不仅为用户提供了记录分享生活中美好时刻、交流全球创意的平台&#xff0c;也给全球的企业提供了一个直接触达用户的平台。随着Z时代用户人群的购买力不断上升&#xff0c;出海广告主们也逐渐将目光放在TikTok方面的营销。 上…

【Linux系统编程】线程

Linux线程 文章目录 Linux线程1.进程与线程区别2.线程优点3.API概要4.线程1.线程的创建2.线程等待内存共享验证3.线程退出关于对void** &的理解拓展 4.互斥锁1.创建及销毁互斥锁2.加锁及解锁 5.什么情况下会造成死锁6.条件**1. 创建及销毁条件变量****2. 等待****3. 触发**…

基于大数据的主流电商平台获取商品详情数据SKU数据价格数据

主流电商平台&#xff1a;淘宝 1688 闲鱼 京东 唯品会 蘑菇街 一号店 阿里妈妈 阿里巴巴 苏宁 亚马逊 易贝 速卖通 电子元件 网易考拉 洋码头 VVIC MIC Lazada 拼多多 ​ ​​​​​​​关于电商大数据的介绍&#xff1a; 主流电商大数据的采集&#xff1a;电商API接口的接入…

潮玩宇宙大逃杀APP系统开发成品案例分享指南

这是一款多人游戏&#xff0c;玩家需要选择一个房间躲避杀手。满足人数后&#xff0c;杀手会随机挑选一个房间杀掉里面所有的参与者&#xff0c;其他房间的幸存者将平均瓜分被杀房间的元宝。玩家在选中房间后&#xff0c;倒计时结束前可以自由切换不同房间。 软件项目开发成品…

【Linux】进程控制3——进程程序替换

一&#xff0c;前言 创建子进程的目的之一就是为了代劳父进程执行父进程的部分代码&#xff0c;也就是说本质上来说父子进程都是执行的同一个代码段的数据&#xff0c;在子进程修改数据的时候进行写时拷贝修改数据段的部分数据。 但是还有一个目的——将子进程在运行时指向一个…

自动控制原理【期末复习】(二)

无人机上桨之后可以在调试架上先调试&#xff1a; 1.根轨迹的绘制 /// 前面针对的是时域分析&#xff0c;下面针对频域分析&#xff1a; 2.波特图 3.奈维斯特图绘制 1.奈氏稳定判据 2.对数稳定判据 3.相位裕度和幅值裕度

JavaScript的数组排序

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Sora和快手可灵背后的核心技术 | 3DVAE:通过小批量特征交换实现身体和面部的三维形状变分自动编码器

【摘要】学习3D脸部和身体生成模型中一个解开的、可解释的和结构化的潜在表示仍然是一个开放的问题。当需要控制身份特征时,这个问题尤其突出。在本文中,论文提出了一种直观而有效的自监督方法来训练一个3D形状变分自动编码器(VAE),以鼓励身份特征的解开潜在表示。通过交换不同…

自学网络安全的三个必经阶段(含路线图)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

Python:基础爬虫

Python爬虫学习&#xff08;网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字…

上海晋名室外危废品暂存柜助力储能电站行业危废品安全储存

近日又有一台SAVEST室外危废暂存柜项目成功验收交付使用&#xff0c;此次项目主要用于储能电站行业废油、废锂电池等危废品的安全储存。 用户单位在日常工作运营中涉及到废油、废锂电池等危废品的室外安全储存问题。4月中旬用户技术总工在寻找解决方案的过程中搜索到上海晋名的…

uniapp地图自定义文字和图标

这是我的结构&#xff1a; <map classmap id"map" :latitude"latitude" :longitude"longitude" markertap"handleMarkerClick" :show-location"true" :markers"covers" /> 记住别忘了在data中定义变量…

46.Python-web框架-Django - 多语言配置

目录 1.Django 多语言基础知识 1.1什么是Django国际化和本地化&#xff1f; 1.2Django LANGUAGE_CODE 1.3关于languages 1.4RequestContext对象针对翻译的变量 2.windows系统下的依赖 3.django多语言配置 3.1settings.py配置 引用gettext_lazy 配置多语言中间件&#x…

(代数:解一元二次方程)可以使用下面的公式求一元二次方程 ax2+bx+c0 的两个根:

(代数:解一元二次方程)可以使用下面的公式求一元二次方程 ax2bxc0 的两个根: b2-4ac 称作一元二次方程的判别式。如果它是正值,那么一元二次方程就有两个实数根。 如果它为 0&#xff0c;方程式就只有一个根。如果它是负值&#xff0c;方程式无实根。 编写程序&#xff0c;提示…

Linux结业测试题,旨在检测ip网络配置,文件权限等基础

Linux期末结业考试 一、评分方式&#xff08;总分100分&#xff0c;理论40分在职教云考试&#xff09; 主要涉及的知识和技能点*分值权重*Linux的最小安装10%激活网络&#xff0c;并正确设置ip地址10%克隆1台机器&#xff0c;并正确设置ip地址10%SSH免密互信服务10%文件和目录…

CNAS认证是什么?怎么做?

在全球化日益深入的今天&#xff0c;产品质量和安全已经成为企业生存和发展的重要基石。而在这个过程中&#xff0c;CNAS认证作为一种权威性的认可机制&#xff0c;发挥着不可替代的作用。那么&#xff0c;CNAS认证究竟是什么&#xff1f;我们又该如何进行这一认证过程呢&#…

LabVIEW水箱液位控制系统

介绍了如何使用LabVIEW软件和硬件工具开发水箱液位控制系统。系统集成了数据采集、实时控制和模拟仿真技术&#xff0c;展示了高精度和高可靠性的特点&#xff0c;适用于需要精细水位调节的工业应用。 项目背景 在制造和化工行业&#xff0c;液位控制是保证生产安全与效率的关…