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

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中都长怎么个样子吧,先留下一个印象,后面再对各个类进行介绍。

  1. 按钮样式图
    在这里插入图片描述

  2. PushButton属性与方法效果图
    在这里插入图片描述


RibbonPanel

RibbonPanel没有构造函数,需要使用UIControlledApplicationCreateRibbonPanel(..)方法。该方法有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会多一些操作)。

对于那些一致的属性,在RibbonItemRibbonItemData上操作都可以。很好理解,后者就是前者的一个私有属性,并将后者的成员暴露出来了而已。

我们简单看看RibbonItem类成员吧。

各子类属性大差不差,效果请参阅上方 “PushButton属性与方法效果图”。

成员说明(可参阅上图)
SetContextualHelp(contextualHelp)设置帮助
Name控件名称
ToolTip控件详情的标题(最上方,大号字体)
LongDescription控件详情的详细内容
ToolTipImage控件详情中,插入的图片

在子类中,还可以设置控件的Icon,通过设置其属性ImageLargeImage来展示。区别在于控件是不是堆叠的,堆叠的用小图,非堆叠的用大图。

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打头的类了。


  1. 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&#xff08;界面&#xff09; 第二篇中&#xff0c;我们提到了IExternalApplication&#xff0c;该接口需要实现两个方法&#xff1a;Revit启动时调用的OnStartup 方法&#xff0c;和Revit关闭时调研的OnShutdown 方法。文中还给了个例子&#xff0…...

js数组方法

改变原始数组返回一个新数组添加元素push&#xff0c;unshiftconcat&#xff0c;[…arr] 展开语法删除元素pop&#xff0c;shift&#xff0c;splicefilter&#xff0c;slice替换元素splice&#xff0c;arr[i] … 赋值map排序reverse&#xff0c;sort先将数组复制一份...

PyTorch -- 最常见损失函数 LOSS 的选择

损失函数&#xff1a;度量模型的预测结果与真实值之间的差异&#xff1b;通过最小化 loss -> 最大化模型表现代码实现框架&#xff1a;设有 模型预测值 f (x), 真实值 y 方法一&#xff1a; 步骤 1. criterion torch.nn.某个Loss()&#xff1b;步骤 2. loss criterion(f(x…...

Prometheus 监控系统

一、Prometheus概述 是一个开源的服务监控系统和时序数据库&#xff0c;其提供了通用的数据模型和快捷数据采集、存储和査询接口。它的核心组件. 1.1 Prometheus server 会定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行拉取数据&#xff0c;新拉取到的数据会…...

Spring Boot中使用logback出现LOG_PATH_IS_UNDEFINED文件夹

1.首先查看&#xff0c;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)&#xff0c;多线程实现1.native线程的创建第一部分&#xff1a;android_thread模块第二部分&#xff1a;linux_thread模块 2.测试linux_thread模块3.Android native的Thread类3.1源码分析 4.native层堆栈调试方法 Android native层的线…...

计算机科学:2024年高考生的明智之选?兴趣与趋势并重的决策指南

站在2024年这个时间节点上&#xff0c;计算机相关专业依然保持着其“万金油”地位&#xff0c;尽管面临一定的挑战&#xff0c;但其长期发展前景和就业潜力仍然乐观。以下是从不同身份角度出发的观点分析&#xff1a; 高考生视角&#xff1a; 如果你是今年的高考生&#xff0…...

跨界合作机会:通过淘宝数据挖掘潜在的合作伙伴与市场拓展方向

淘宝平台汇聚了众多商家和消费者&#xff0c;生成了大量的交易数据&#xff0c;这些数据为商家提供了挖掘跨界合作机会和市场拓展方向的丰富线索。以下是如何利用淘宝数据来寻找潜在的合作伙伴和探索新的市场机会的一些策略&#xff1a; 消费者行为分析&#xff1a;通过跟踪消费…...

如何利用智能家居打造一个“会呼吸的家”?一体化电动窗帘

如何利用智能家居打造一个“会呼吸的家”&#xff1f;一体化电动窗帘 史新华 隐藏式一体化智能电动窗帘与市面上其他窗帘不同的是&#xff0c;电机内置于轨道之中&#xff0c;一体化&#xff0c;美观、安静、滑动顺畅。 每次都会自动打开和关闭&#xff0c;相当漂亮。 众多家庭…...

PyTorch -- 最常见激活函数的选择

首先&#xff0c;简单复习下什么是梯度&#xff1a;梯度是偏微分的集合 举例说明&#xff1a;对于 z y 2 − x 2 : ∇ z ( ∂ z ∂ x , ∂ z ∂ y ) &#xff08; 2 x , 2 y &#xff09; z y^2-x^2: \nabla z (\frac{\partial z}{\partial x}, \frac{\partial z}{\partia…...

人工智能--制造业和农业

欢迎来到 Papicatch的博客 文章目录 &#x1f349;人工智能在制造业中的应用 &#x1f348; 应用场景及便利 &#x1f34d;生产线自动化 &#x1f34d;质量控制 &#x1f34d;预测性维护 &#x1f34d;供应链优化 &#x1f348; 技术实现及核心 &#x1f34d;机器学习和…...

go语言,拼接字符串有哪些方式

目录 第一种方式&#xff1a; 使用加号"" 第二种方式&#xff1a; 使用fmt.Sprintf 第三种方式&#xff1a; 使用strings.Join 第四种方式&#xff1a; 使用strings.Builder 第五种方式&#xff1a; 使用bytes.Buffer go语言&#xff0c;拼接字符串的方式有…...

C++类型转换深度解析:从基础数据类型到字符串,再到基础数据类型的完美转换指南

前言 在 C 编程中&#xff0c;我们经常需要在基础数据类型&#xff08;如 int、double、float、long、unsigned int 等&#xff09;与 string 类型之间进行转换。这种转换对于处理用户输入、格式化输出、数据存储等场景至关重要。 本文将详细介绍如何在 C 中实现这些转换。 文…...

一文了解:渐进式web应用(PWA),原生应用还香吗?

前端开发是一个充满活力和不断演进的领域&#xff0c;各类技术层出不穷&#xff0c;PWA模式的出现就是想让web移动应用获得原生一样的体验&#xff0c;同时有大幅度降低开发成本&#xff0c;那么它到底能行吗&#xff1f;贝格前端工场带领大家了解一下。 一、什么是渐进式web应…...

SOLIDWORKS学生支持 可访问各种产品资源

你是不是一个热爱设计、追求创新的学生&#xff1f;你是不是在寻找一款能够帮助你实现设计梦想的工具&#xff1f;那么&#xff0c;SolidWorks学生支持是你的首要选择&#xff01; SOLIDWORKS作为三维CAD设计软件&#xff0c;一直致力于为广大学生提供全方面的支持。无论你是初…...

VCS基本仿真

这里记录三种仿真方式&#xff1a; 第一种是将verilog文件一个一个敲在终端上进行仿真&#xff1b; 第二种是将多个verilog文件的文件路径整理在一个文件中&#xff0c;然后进行仿真&#xff1b; 第三种是利用makefile文件进行仿真&#xff1b; 以8位加法器为例&#xff1a; …...

Hbase中Rowkey的设计方法

Hbase中Rowkey的设计方法 过去对于Rowkey设计方法缺乏理解&#xff0c;最近结合多篇博主的文章&#xff0c;进行了学习。有不少心得体会。总结下来供后续学习和回顾。 一、设计Rowkey的三个原则 1.长度原则&#xff1a;长度不能太长&#xff0c;小于100个字节。可以偏端一些…...

Python基础总结之functools.wraps介绍与应用

Python基础总结之functools.wraps介绍与应用 在Python编程中&#xff0c;装饰器&#xff08;decorator&#xff09;是一种非常强大的工具&#xff0c;它允许开发者在不改变函数本身的情况下&#xff0c;动态地增加函数的功能。使用装饰器时&#xff0c;常常会用到 functools.wr…...

UE5基础1-下载安装

目录 一.下载 二.安装 三.安装引擎 四.其他 简介: UE5&#xff08;Unreal Engine 5&#xff09;是一款功能极其强大的游戏引擎。 它具有以下显著特点&#xff1a; 先进的图形技术&#xff1a;能够呈现出令人惊叹的逼真视觉效果&#xff0c;包括高逼真的光影、材…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...