2. Revit API UI 之 IExternalCommand 和 IExternalApplication

news2024/12/27 9:37:28

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 相关的内容,比较简单,就先写了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cisco Packet Tracer实验(二)

二、用交换机构建 LAN 构建物件如下&#xff1a; 四个PC 两个交换机 一个Multi Switch多功能拓展控制器 连线必须是这个直线&#xff01;&#xff01;&#xff01;不是虚线 最后实现效果如下&#xff1a; 全部的线是绿的&#xff0c;就表示是通的。 尝试一下&#xff0c;看PC…

JVM性能优化案例:减少对象频繁创建

JVM性能优化案例&#xff1a;减少对象频繁创建 案例背景 某金融应用系统在处理大量并发交易时&#xff0c;响应时间过长&#xff0c;并且有时出现内存溢出&#xff08;OutOfMemoryError&#xff09;的问题。经过分析&#xff0c;发现问题主要出在频繁的对象创建和较差的内存管…

热门开源项目OpenHarmony

目录 1.概述 1.1.开源项目的意义 1.2.开源项目对软件行业的促进作用 1.3.小结 2.OpenHarmony 2.1.技术架构 2.2.分布式软总线 2.2.1.架构 2.2.2.代码介绍 2.2.2.1.代码目录 2.2.2.2.说明 2.2.2.3.发现组网和传输 2.2.2.3.1.发现 2.2.2.3.2.组网 2.2.2.3.3.传输…

力扣148. 排序链表

给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5] 示例 3&…

数据分析常用6种分析思路(下)

作为一名数据分析师&#xff0c;你又没有发现&#xff0c;自己经常碰到一些棘手的问题就没有思路&#xff0c;甚至怀疑自己究竟有没有好好学过分析&#xff1f; 在上篇文章里&#xff0c;我们讲到了数据分析中的流程、分类、对比三大块&#xff0c;今天&#xff0c;我们继续讲…

PHP地方门户分类信息网站源码讯客分类信息系统源码(含手机版)

源码介绍 1.上传程序到网站根目录,访问http://域名/install/index.php 进行安装,不要直接打开网址&#xff0c;先直接安装; 2.安装完成后 后台恢复数据即可 默认帐号密码都是admin http://域名/admin/ 3.不要删除任何文件&#xff0c;因为删除文件或者修改代码可能造成错误 运…

vuejs3 pinia持久化存储

插件地址&#xff1a; 快速开始 | pinia-plugin-persistedstate 安装插件&#xff1a; 安装pinia后&#xff0c;再安装这个插件 npm i pinia-plugin-persistedstate 引入插件&#xff1a; 在main.ts或者main.js里 //main.ts或者main.js里import { createPinia } from pi…

C++ | Leetcode C++题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; class Solution { public:int gcd(int a, int b) {return b ? gcd(b, a % b) : a;}int maxPoints(vector<vector<int>>& points) {int n points.size();if (n < 2) {return n;}int ret 0;for (int i 0; i < n; i…

94. 二叉树的中序遍历(Swift实现, 迭代)

题目描述 使用迭代方法解题 class TreeNode {var val: Intvar left: TreeNode?var right: TreeNode?init(_ val: Int) {self.val valself.left nilself.right nil} }func inorderTraversal(_ root: TreeNode?) -> [Int] {var result [Int]() // 用于存储中序遍历…

11.第十一章 字典

11. 字典 本章介绍另一种内置类型: 字典. 字典是Python最好的语言特性之一, 它是很多高效而优雅的算法的基本构建块.11.1 字典是一个映射 字典类似于列表, 但更加通用. 在列表中, 下标必须是整数. 而字典的下标(几乎)可以是任意类型. 字典包含下标(称为键)集合和值集合. 每个…

人工智能的前沿技术 博客 期刊 论文 推荐

在学习和关注人工智能的前沿技术时&#xff0c;有几个权威期刊和会议是非常重要的资源。以下是一些推荐的期刊和会议&#xff0c;涵盖了机器学习、深度学习、自然语言处理和生成式AI等领域的最新研究和进展&#xff1a; 博客 Andrej Karpathy’s blog - 深度学习领域知名专家…

在AI云原生时代应该如何应对复杂的算力环境

引言 随着在2019年ChatGPT4的爆火,AI这个之前常常被人觉得非常高深的技术渐渐的被越来越多的人们所了解,越来越多的公司、组织和开发者开始投入AI的使用和开发中来.随着AI和LLM的火热,算力资源也变的越来越紧缺,所以如何高效的管理和使用算力资源也变成了必须要面对的问题。 …

13. 第十三章 案例研究-选择数据结构

13. 案例研究-选择数据结构 到这里尼应该已经学会了Python的核心数据结构, 也见过了一些使用它们的算法. 如果你想要更多地了解算个发可以阅读第21章. 本章配合联系介绍一个案例分析, 帮你思考如何选择数据结构并如何使用它们.13.1 单词频率分析 1. 练习1 编写一个程序, 读入…

【C语言函数实现节选1】

前言&#xff1a; 通过前面的博客&#xff0c;C语言基本知识基本上我已给大家分享完成&#xff01;接下来我会通过两篇博客结 合前面的知识实现一下常见的函数。实现方式不唯一&#xff0c;大家只要大体思路符合都是可以的&#xff0c;在学习 的过程中尽量自己先实现&#xf…

安装VM虚拟机并创建一个Linux CentOS 7无桌面系统

一、安装vm虚拟机软件 1 下载vm压缩包 百度网盘链接 链接&#xff1a;https://pan.baidu.com/s/1ipiWatBr0wHKMt5c5nQirw?pwdwoy2 提取码&#xff1a;woy2 2.下载完毕后&#xff0c;先将杀毒软件关闭 全部关闭 3. 解压后按照步骤安装即可 按照按照步骤&#xff0c;观看…

C++240613

自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面 要求&#xff1a;每行代码都有注释 #include "my_widget.h"My_Widget::My_Widget(QWidget *parent): QWidget(parent) {//设置窗口的标题this->setWindowTitle("真爱生命&#xff0c;远离赌博&…

Vue31-生命周期的简介

一、需求&#xff1a;文字的透明度递减 示例&#xff1a; 对象的简写形式 new vue({ key:value, key:value, 。。。。。。 }) 二、代码的实现 注意&#xff1a;JS不擅长小数的计算&#xff01;&#xff01;&#xff01; 此写法不好&#xff01;&#xff01;&#xff01;追求…

借力AI,助力网络钓鱼(邮件)检测

引言 互联网时代&#xff0c;邮件系统依然是人们工作、生活中的很重要的一部分&#xff0c;与此同时&#xff0c;邮件系统的发展带来的钓鱼邮件问题也成为网络中的最大的安全隐患之一。本文将为大家解开网络钓鱼&#xff08;邮件&#xff09;的神秘面纱&#xff0c;一探究竟&a…

刚刚!彬川机器人社招校招入职Verify测评素质性格测评真题原题题库更新了【含答案】

一、测评环境 温馨提示 1.本次测评包含【素质性格测评】和【Verify测评】两部分&#xff0c;预计用时60min&#xff0c;请确保作答时周围环境无干扰、网络畅通&#xff1b; 2.请使用电脑完成作答&#xff0c;建议使用以下浏览器登录&#xff1a;IE9.0及以上版本&#xff0c;火…

笔记99:OSQP 求解器示例代码

注1&#xff1a;以下代码是 OSQP 的官方文档提供的示例&#xff0c;我加上了详细的注释&#xff1b; 注2&#xff1a;OSQP 库仅支持C语言&#xff0c;不支持C&#xff0c;所以下面的示例代码使用的是C语言&#xff1b;但是 OSQP 求解库提供了针对C的接口 OSQP-EIGEN&#xff1…