4. Revit API UI 之 Ribbon(界面)
4. Revit API UI 之 Ribbon(界面)
第二篇中,我们提到了IExternalApplication
,该接口需要实现两个方法:Revit启动时调用的OnStartup
方法,和Revit关闭时调研的OnShutdown
方法。文中还给了个例子,在工具栏绘制了个简单的按钮,加了一个空闲事件。
回到这里,这一篇呢,就来讲一下Ribbon
(界面)相关的类。
Ribbon
Revit API 中并没有叫"Ribbon"的类,而是一系列与界面相关的基本都以Ribbon开头。
RibbonPanel
:在Revit Tab上添加一个面板RibbonItem
:面板上的功能按钮,有一些子类RibbonItemData
:包含构造RibbonItem所需的信息。基本就是后面加一个Data
。ContextualHelp
:用于给功能按钮添加一个帮助链接。注意,该类不在UI命名空间中。
在Revit中展示
我们先来了解一下这些控件在Revit中都长怎么个样子吧,先留下一个印象,后面再对各个类进行介绍。
-
按钮样式图
-
PushButton属性与方法效果图
RibbonPanel
RibbonPanel
没有构造函数,需要使用UIControlledApplication
的CreateRibbonPanel(..)
方法。该方法有3种重载。
// 默认在"附加模块"下创建
public virtual RibbonPanel CreateRibbonPanel(string panelName);// 在自定义的Tab下创建。Tab名称不可为空,不可重复
public virtual RibbonPanel CreateRibbonPanel(string tabName,string panelName);// 在可选的Tab(附加模型、分析)下创建
public virtual RibbonPanel CreateRibbonPanel(Tab tab,string panelName);
在使用自定义Tab下创建Panel时,需要先创建一个Tab,使用CreateRibbonTab()
方法。
如果问,要是我要在其它已有的Tab下创建面板呢?
嘿!这是个问题,现在还做不到,我们得引入一个叫AdWindows.dll
的库才行,后面有空再讲。
创建Panel后,就要向其中添加控件,我们看看它的方法:
方法 | 说明 |
---|---|
AddItem(RibbonItemData) | 向Panel中添加一个控件,占一列 |
AddStackedItems(data,data) AddStackedItems(data,data,data) | 向Panel中多个控件,堆叠在一起,共同占一列 |
AddSeparator() | 添加一个分隔符 |
AddSlideOut() | 调用后,后续添加的控件,将被放在下滑框中 |
Ribbon
RibbonItem 与 RibbonItemData
RibbonItem
可以理解为是控件的实体,一些操作都在这上面,是一众控件的基类。
RibbonItemData
则是控件的数据信息,一些样式在这里填。
对比这两个类的子类,可以看到是一一对应的,不光如此,类内部的方法和属性也基本一致(当然,RibbonItem会多一些操作)。
对于那些一致的属性,在
RibbonItem
或RibbonItemData
上操作都可以。很好理解,后者就是前者的一个私有属性,并将后者的成员暴露出来了而已。
我们简单看看RibbonItem类成员吧。
各子类属性大差不差,效果请参阅上方 “PushButton属性与方法效果图”。
成员 | 说明(可参阅上图) |
---|---|
SetContextualHelp(contextualHelp) | 设置帮助 |
Name | 控件名称 |
ToolTip | 控件详情的标题(最上方,大号字体) |
LongDescription | 控件详情的详细内容 |
ToolTipImage | 控件详情中,插入的图片 |
… | 略 |
在子类中,还可以设置控件的Icon,通过设置其属性Image
和LargeImage
来展示。区别在于控件是不是堆叠的,堆叠的用小图,非堆叠的用大图。
ComboBox 与 ConboBoxMember
ComboBox
表示下拉框控件,而ConboBoxMember
则是下拉框成员。
ComboBox comboBox = panel.AddItem(comboBoxData) as ComboBox;ComboBoxMemberData memberData1 = new ComboBoxMemberData("选项1", "选项1");ComboBoxMemberData memberData2 = new ComboBoxMemberData("选项2", "选项2");comboBox.AddItem(memberData1);comboBox.AddItem(memberData2);panel.AddSeparator();
RadioButtonGroup 与 ToggleButton
这两者也是一个组合,ToggleButton
是单选按钮,RadioButtonGroup
是单选按钮的容器,保证在容器中,只能选中一个。
ToggleButtonData
需要的构造器中,需要传入外部命令的地址(第四个参数),创建一个空的命令,将地址传入即可。
RadioButtonGroupData radioButtonGroupData = new RadioButtonGroupData("单选组合");
RadioButtonGroup radioButtonGroup = panel.AddItem(radioButtonGroupData) as RadioButtonGroup;
radioButtonGroup.AddItem(new ToggleButtonData("单选1", "单选1", addInPath, "xxx.nothing"));
radioButtonGroup.AddItem(new ToggleButtonData("单选2", "单选2", addInPath, "xxx.nothing"));
RibbonButton
该类表示的是按钮控件,其子类(的子类)包括PushButton、PulldownButton、SplitButton,还有上面的ToggleButton。
PushButton
:普通按钮,最为常用,可以到处组合PulldownButton
:一个容器,需要向其中添加PushButton,下拉选取,但默认按钮是不变的。SplitButton
:一个容器,需要向其中添加PushButton,下拉选取,但是默认按钮为最近一次选取的按钮。
在使用Revit时,我们发现有的按钮有时只有在特定的状态下才能使用,比如“建筑”Tab下的大部分功能,在处于“图纸”视图时,都是不可用的。这是怎么做到的呢?
我们注意到
RibbonButton
有个叫AvailabilityClassName
1的属性。
AvailabilityClassName :
该属性和一般按钮的构造函数里的addInPath
参数一样,不同的是这里传入一个实现了接口IExternalCommandAvailability
的类的地址。返回True
表示控件可用(即Enable
=True),False
则不可以。
public class Availability: IExternalCommandAvailability
{public bool IsCommandAvailable( UIApplication a, CategorySet b ){return true;}
}
当一个组合控件中的按钮全部不可用时,该组合控件将不可用。
TextBox
文本框,没啥内容,只是需要注意属性ShowImageAsButton
和事件EnterPressed
。
// 伪代码
TextBoxData testBoxData = new TextBoxData("TextBox");
TextBox textBox = (TextBox)(panel.AddItem(testBoxData));
textBox.PromptText = "Set value"
textBox.Image = new BitmapImage(new Uri(Path.Combine(ButtonIconsFolder, "xxx.png"), UriKind.Absolute));
textBox.ToolTip = "Set the mark for new wall";
textBox.ShowImageAsButton = true;
textBox.EnterPressed += new EventHandler<Autodesk.Revit.UI.Events.TextBoxEnterPressedEventArgs>(SetTextBoxValue);// 事件
public void SetTextBoxValue(object sender, TextBoxEnterPressedEventArgs args)
{TaskDialog.Show("TextBox EnterPressed Event", "value changed.");
}
结尾
OK,这一篇就写到这里了,基础的界面API差不多就讲完了,至于其它的,后面再讲吧。
下一篇,大概得写那几个UI
打头的类了。
https://thebuildingcoder.typepad.com/blog/2011/02/enable-ribbon-items-in-zero-document-state.html ↩︎
相关文章:
4. Revit API UI 之 Ribbon(界面)
4. Revit API UI 之 Ribbon(界面) 第二篇中,我们提到了IExternalApplication,该接口需要实现两个方法:Revit启动时调用的OnStartup 方法,和Revit关闭时调研的OnShutdown 方法。文中还给了个例子࿰…...
js数组方法
改变原始数组返回一个新数组添加元素push,unshiftconcat,[…arr] 展开语法删除元素pop,shift,splicefilter,slice替换元素splice,arr[i] … 赋值map排序reverse,sort先将数组复制一份...
PyTorch -- 最常见损失函数 LOSS 的选择
损失函数:度量模型的预测结果与真实值之间的差异;通过最小化 loss -> 最大化模型表现代码实现框架:设有 模型预测值 f (x), 真实值 y 方法一: 步骤 1. criterion torch.nn.某个Loss();步骤 2. loss criterion(f(x…...
Prometheus 监控系统
一、Prometheus概述 是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型和快捷数据采集、存储和査询接口。它的核心组件. 1.1 Prometheus server 会定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行拉取数据,新拉取到的数据会…...
Spring Boot中使用logback出现LOG_PATH_IS_UNDEFINED文件夹
1.首先查看,application.properties 文件是否按格式编写 logging.pathmylogs logging.configclasspath:logback-spring.xml2.查看 logback-spring.xml <springProperty scope"context" name"LOG_HOME" source"logging.path"/> …...
代码随想录——组合总数Ⅲ(Leetcode216)
题目链接 回溯 class Solution {List<List<Integer>> res new ArrayList<List<Integer>>();List<Integer> list new ArrayList<Integer>();public List<List<Integer>> combinationSum3(int k, int n) {backtracking(k, …...
Android native层的线程分析(C++),以及堆栈打印调试
文章目录 Android native层的线程分析(C),多线程实现1.native线程的创建第一部分:android_thread模块第二部分:linux_thread模块 2.测试linux_thread模块3.Android native的Thread类3.1源码分析 4.native层堆栈调试方法 Android native层的线…...
计算机科学:2024年高考生的明智之选?兴趣与趋势并重的决策指南
站在2024年这个时间节点上,计算机相关专业依然保持着其“万金油”地位,尽管面临一定的挑战,但其长期发展前景和就业潜力仍然乐观。以下是从不同身份角度出发的观点分析: 高考生视角: 如果你是今年的高考生࿰…...
跨界合作机会:通过淘宝数据挖掘潜在的合作伙伴与市场拓展方向
淘宝平台汇聚了众多商家和消费者,生成了大量的交易数据,这些数据为商家提供了挖掘跨界合作机会和市场拓展方向的丰富线索。以下是如何利用淘宝数据来寻找潜在的合作伙伴和探索新的市场机会的一些策略: 消费者行为分析:通过跟踪消费…...
如何利用智能家居打造一个“会呼吸的家”?一体化电动窗帘
如何利用智能家居打造一个“会呼吸的家”?一体化电动窗帘 史新华 隐藏式一体化智能电动窗帘与市面上其他窗帘不同的是,电机内置于轨道之中,一体化,美观、安静、滑动顺畅。 每次都会自动打开和关闭,相当漂亮。 众多家庭…...
PyTorch -- 最常见激活函数的选择
首先,简单复习下什么是梯度:梯度是偏微分的集合 举例说明:对于 z y 2 − x 2 : ∇ z ( ∂ z ∂ x , ∂ z ∂ y ) ( 2 x , 2 y ) z y^2-x^2: \nabla z (\frac{\partial z}{\partial x}, \frac{\partial z}{\partia…...
人工智能--制造业和农业
欢迎来到 Papicatch的博客 文章目录 🍉人工智能在制造业中的应用 🍈 应用场景及便利 🍍生产线自动化 🍍质量控制 🍍预测性维护 🍍供应链优化 🍈 技术实现及核心 🍍机器学习和…...
go语言,拼接字符串有哪些方式
目录 第一种方式: 使用加号"" 第二种方式: 使用fmt.Sprintf 第三种方式: 使用strings.Join 第四种方式: 使用strings.Builder 第五种方式: 使用bytes.Buffer go语言,拼接字符串的方式有…...
C++类型转换深度解析:从基础数据类型到字符串,再到基础数据类型的完美转换指南
前言 在 C 编程中,我们经常需要在基础数据类型(如 int、double、float、long、unsigned int 等)与 string 类型之间进行转换。这种转换对于处理用户输入、格式化输出、数据存储等场景至关重要。 本文将详细介绍如何在 C 中实现这些转换。 文…...
一文了解:渐进式web应用(PWA),原生应用还香吗?
前端开发是一个充满活力和不断演进的领域,各类技术层出不穷,PWA模式的出现就是想让web移动应用获得原生一样的体验,同时有大幅度降低开发成本,那么它到底能行吗?贝格前端工场带领大家了解一下。 一、什么是渐进式web应…...
SOLIDWORKS学生支持 可访问各种产品资源
你是不是一个热爱设计、追求创新的学生?你是不是在寻找一款能够帮助你实现设计梦想的工具?那么,SolidWorks学生支持是你的首要选择! SOLIDWORKS作为三维CAD设计软件,一直致力于为广大学生提供全方面的支持。无论你是初…...
VCS基本仿真
这里记录三种仿真方式: 第一种是将verilog文件一个一个敲在终端上进行仿真; 第二种是将多个verilog文件的文件路径整理在一个文件中,然后进行仿真; 第三种是利用makefile文件进行仿真; 以8位加法器为例: …...
Hbase中Rowkey的设计方法
Hbase中Rowkey的设计方法 过去对于Rowkey设计方法缺乏理解,最近结合多篇博主的文章,进行了学习。有不少心得体会。总结下来供后续学习和回顾。 一、设计Rowkey的三个原则 1.长度原则:长度不能太长,小于100个字节。可以偏端一些…...
Python基础总结之functools.wraps介绍与应用
Python基础总结之functools.wraps介绍与应用 在Python编程中,装饰器(decorator)是一种非常强大的工具,它允许开发者在不改变函数本身的情况下,动态地增加函数的功能。使用装饰器时,常常会用到 functools.wr…...
UE5基础1-下载安装
目录 一.下载 二.安装 三.安装引擎 四.其他 简介: UE5(Unreal Engine 5)是一款功能极其强大的游戏引擎。 它具有以下显著特点: 先进的图形技术:能够呈现出令人惊叹的逼真视觉效果,包括高逼真的光影、材…...
前端实现获取后端返回的文件流并下载
前端实现获取后端返回的文件流并下载 方法一:使用Axios实现文件流下载优点缺点 方法二:使用封装的Request工具实现文件流下载优点缺点 方法三:直接通过URL跳转下载优点缺点 结论 在前端开发中,有时需要从后端获取文件流࿰…...
Windows下对于Qt中带 / 的路径的处理
在Windows下,如果你想使用操作系统的分隔符显示用户的路径,请使用 toNativeSeparators()。 请看以下代码: void Player::on_playBtn_clicked() {if (this->m_url.isEmpty()) {openMedia();if (this->m_url.isEmpty())return;}qDebug(…...
[leetcode]swap-nodes-in-pairs
. - 力扣(LeetCode) class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode* dummyHead new ListNode(0);dummyHead->next head;ListNode* temp dummyHead;while (temp->next ! nullptr && temp->next->next !…...
国思RDIF.vNext全新低代码快速开发框架平台6.1版本发布(支持vue2、vue3)
1、平台介绍 RDIF.vNext,全新低代码快速开发集成框架平台,给用户和开发者最佳的.Net框架平台方案,为企业快速构建跨平台、企业级的应用提供强大支持。 RDIF.vNext的前身是RDIFramework框架,RDIF(Rapid develop Integrate Framewor…...
中国地市分布图
原文链接https://mp.weixin.qq.com/s?__bizMzUyNzczMTI4Mg&mid2247693904&idx1&snb54884975272eaecb1d0564cafc128d3&chksmfa76a96dcd01207b939b8852a08eea9852eeffa8cc51a3af055dfca5c999e93301237e95901b&token1851596113&langzh_CN#rd...
HCIA11 网络安全之本地 AAA 配置实验
AAA 提供 Authentication(认证)、Authorization(授权)和 Accounting(计费)三种安全功能。 • 认证:验证用户是否可以获得网络访问权。 • 授权:授权用户可以使用哪些服务。 •…...
用Python处理Excel的资源
用Python处理Excel的资源 python-excel 读写Excel文件 openpyxl openpyx文档l 读写Excel2010文件(即xlsx) openpyxl示例: from openpyxl import Workbook wb Workbook()# 获取active worksheet ws wb.active# 给单元格赋值 ws[A1] 4…...
2024年中国移动游戏市场研究报告
来源:点点数据: 近期历史回顾: 面向水泥行业的5G虚拟专网技术要求(2024).pdf 2024年F5G-A绿色万兆全光园区白皮书.pdf 2024年全球废物管理展望报告.pdf 内容管理系统 2024-2025中国羊奶粉市场消费趋势洞察报告.pdf 20…...
JS-12-es6常用知识-async
目录 1. 定义与概述 2. 使用方法 3. 注意事项 4. 应用场景 5. 示例代码 6.总结 async 是 JavaScript(包括 TypeScript)中的一个关键字,用于声明一个函数为异步函数。async其实是一个promise的语法糖,以下是关于 async 的详细…...
使用winscp 通过中转机器(跳板机、堡垒机)密钥远程连接服务器,保姆级别教程
1.winscp下载地址 winscp下载 2.安装自己选择位置 3.连接服务器 到这里,基本就是没有壁垒机的就可直接连接,传递文件 4.配置中转服务器(壁垒机、跳板机) 选择高级选项 配置utf-8的编码格式 配置中转服务器(壁垒机、跳板机) 设置中专机的密码或者私钥 配置私钥...
图片网站源码asp/基本营销策略有哪些
本文会提到52条SQL语句性能优化策略。 1、对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引。 2、应尽量避免在where子句中对字段进行null值判断,创建表时NULL是默认值,但大多数时候应该使用N…...
广州一起做网站批发/北京营销网站制作
▎前言 看到这个标题,你是不是倍感疑惑,为什么会是搜索,而不是搜索,会不会是小编打错的,其实本篇博客将会让你看到搜索的各种玩法。 ▎前置技能 ☞『基础知识』 搜索:dfs和bfs(戳这里迅速上手&a…...
个人 做自媒体 建网站/站长统计app下载大全
★前一章讲了 OSI 参考模型,这里我们会讲 TCP/IP 协议,那两个之间有啥关系?为啥 OSI 协议并未得到普及,而 TCP/IP 协议缺被广泛使用呢?”1.TCP/IP 的标准化《图解 TCP/IP》一书中是这样描述 OSI 和 TCP/IP 协议的关系的…...
化妆品网站建设策略/竞价推广
移动端图片上传方法 实现效果 文件下载 http://files.cnblogs.com/files/sntetwt/%E7%A7%BB%E5%8A%A8%E7%AB%AF%E5%9B%BE%E7%89%87%E4%B8%8A%E4%BC%A0.rar 实现步骤 一、隐藏<input type"file" id"file" name"Filedata" style"display:…...
优质高职院校建设网站/上海站群优化
一、使用DataReader读取为对象List /// <summary>/// 获得数据列表List<>,DataReader 使用参数的/// </summary>/// <param name"strWhere">条件</param>/// <param name"ht">HashTable,保存参数名及参数对应的值<…...
网站建设wang1314/云推广
创建一个名为Dog的类,包含两个String域:name和says。在main()方法中创建两个Dog对象,一个名为spot(叫声为“Ruff!”),另一个名为scruff(叫声为“Wurf!”)。然…...