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

CAD二次开发 添加按钮Ribbon

这篇文章是教大家怎样子创建自己的Ribbon按钮界面(如下图),以下示例代码在CAD2020中运行实现。
在这里插入图片描述

背景

  • 创建一个属于自己的Ribbon按钮(如下图)
    图

  • 理解Ribbon、Panel、Tab的关系(如下图),一个Tab包含多个Panel,一个Panel包含多个RibbonButton
    图

代码

using Autodesk.AutoCAD.Runtime;
using Autodesk.Windows;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Interop;
using System.Windows.Media.Imaging;[assembly:CommandClass(typeof(CADBlogDemo.Ribbon))]
namespace CADBlogDemo
{public class Ribbon{[CommandMethod("RibbonCmd")]public void RibbonCmd(){//得到所有的Ribbon选项卡列表集合RibbonControl ribbonCtrl = ComponentManager.Ribbon;if (ribbonCtrl == null) return;//加个判断,如果有了这个选项卡就不重复添加if (ribbonCtrl.Tabs.FirstOrDefault(x => x.Title == "MyRibbon") != null) return;//添加选项卡RibbonTab tab = AddTab(ribbonCtrl, "MyRibbon", "RibbonId1", true);//添加面板RibbonPanelSource panel = AddPanel(tab, "我就是我");//添加按钮RibbonButton button = CreateRibbonButton(panel, "点我\n点我", "Demo\n", $@"{Path.GetDirectoryName(typeof(Ribbon).Assembly.Location)}\Images\123.png");}/// <summary>/// 添加Ribbon选项卡/// </summary>/// <param name="ribbonCtrl">Ribbon控制器</param>/// <param name="title">选项卡标题</param>/// <param name="id">选项卡ID</param>/// <param name="isActive">是否置为当前</param>/// <returns>RibbonTab</returns>public RibbonTab AddTab( RibbonControl ribbonCtrl, string title, string id, bool isActive){RibbonTab tab = new RibbonTab();tab.Title = title;tab.Id = id;ribbonCtrl.Tabs.Add(tab);tab.IsActive = isActive;return tab;}/// <summary>/// 添加面板/// </summary>/// <param name="tab">Ribbon选项卡</param>/// <param name="title">面板标题</param>/// <returns>RibbonPanelSource</returns>public RibbonPanelSource AddPanel(RibbonTab tab, string title){RibbonPanelSource panelSource = new RibbonPanelSource();panelSource.Title = title;RibbonPanel ribbonPanel = new RibbonPanel();ribbonPanel.Source = panelSource;tab.Panels.Add(ribbonPanel);return panelSource;}/// <summary>/// 创建按钮/// </summary>/// <param name="panel">面板</param>/// <param name="name">按钮显示名字</param>/// <param name="cmd">需要绑定的命令</param>/// <param name="photoPath">图片路径</param>/// <returns></returns>public RibbonButton CreateRibbonButton(RibbonPanelSource panel, string name, string cmd, string photoPath){RibbonButton button = new RibbonButton();button.Text = name;button.ShowText = true;Bitmap bitmap = new Bitmap(photoPath);BitmapSource bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, System.Windows.Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());button.Image = bitmapSource; //按钮图片button.LargeImage = bitmapSource; //按钮大图片button.Size = RibbonItemSize.Large;button.Orientation = System.Windows.Controls.Orientation.Vertical;button.CommandHandler = new RibbonCommandHandler();button.CommandParameter = cmd;panel.Items.Add(button);return button;}}public class RibbonCommandHandler : System.Windows.Input.ICommand{public bool CanExecute(object parameter){return true;}public event EventHandler CanExecuteChanged;public void Execute(object parameter){//is from Ribbon ButtonRibbonButton ribBtn = parameter as RibbonButton;if (ribBtn != null){//execute the command Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.SendStringToExecute((string)ribBtn.CommandParameter, true, false, true);}}}
}

讲解

  • 先得到所有的Tab列表集合,判断是否已经存在自己的选项卡了
 			//得到所有的Ribbon选项卡列表集合RibbonControl ribbonCtrl = ComponentManager.Ribbon;if (ribbonCtrl == null) return;
  • 新建选项卡(Tab)
/// <summary>/// 添加Ribbon选项卡/// </summary>/// <param name="ribbonCtrl">Ribbon控制器</param>/// <param name="title">选项卡标题</param>/// <param name="id">选项卡ID</param>/// <param name="isActive">是否置为当前</param>/// <returns>RibbonTab</returns>public RibbonTab AddTab( RibbonControl ribbonCtrl, string title, string id, bool isActive){RibbonTab tab = new RibbonTab();tab.Title = title;tab.Id = id;ribbonCtrl.Tabs.Add(tab);tab.IsActive = isActive;return tab;}
  • 新建面板(panel)
/// <summary>/// 添加面板/// </summary>/// <param name="tab">Ribbon选项卡</param>/// <param name="title">面板标题</param>/// <returns>RibbonPanelSource</returns>public RibbonPanelSource AddPanel(RibbonTab tab, string title){RibbonPanelSource panelSource = new RibbonPanelSource();panelSource.Title = title;RibbonPanel ribbonPanel = new RibbonPanel();ribbonPanel.Source = panelSource;tab.Panels.Add(ribbonPanel);return panelSource;}
  • 新建按钮(Ribbon)
        /// <summary>/// 创建按钮/// </summary>/// <param name="panel">面板</param>/// <param name="name">按钮显示名字</param>/// <param name="cmd">需要绑定的命令</param>/// <param name="photoPath">图片路径</param>/// <returns></returns>public RibbonButton CreateRibbonButton(RibbonPanelSource panel, string name, string cmd, string photoPath){RibbonButton button = new RibbonButton();button.Text = name;button.ShowText = true;Bitmap bitmap = new Bitmap(photoPath);BitmapSource bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, System.Windows.Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());button.Image = bitmapSource; //按钮图片button.LargeImage = bitmapSource; //按钮大图片button.Size = RibbonItemSize.Large;button.Orientation = System.Windows.Controls.Orientation.Vertical;button.CommandHandler = new RibbonCommandHandler();button.CommandParameter = cmd;panel.Items.Add(button);return button;}
  • RibbonCommandHandler类
    继承于ICommand类,作用是控制按钮是否可用
    public class RibbonCommandHandler : System.Windows.Input.ICommand{public bool CanExecute(object parameter){return true;}public event EventHandler CanExecuteChanged;public void Execute(object parameter){//is from Ribbon ButtonRibbonButton ribBtn = parameter as RibbonButton;if (ribBtn != null){//execute the command Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.SendStringToExecute((string)ribBtn.CommandParameter, true, false, true);}}}
  • 最后在CAD中用Netload添加编译的Dll,运行“RibbonCmd”命令,就可以看到选项卡了
    在这里插入图片描述

最后

创建按钮的时候,传入的是相对地址,复制代码使用的时候,可以先换成绝对地址,实现效果后再换相对地址。赶紧去实现第一个按钮吧

相关文章:

CAD二次开发 添加按钮Ribbon

这篇文章是教大家怎样子创建自己的Ribbon按钮界面&#xff08;如下图&#xff09;&#xff0c;以下示例代码在CAD2020中运行实现。 背景 创建一个属于自己的Ribbon按钮&#xff08;如下图&#xff09; 理解Ribbon、Panel、Tab的关系&#xff08;如下图&#xff09;&#xff…...

[RK3568 Android12] 添加自定义启动脚本

1:定义添加的脚本 比如为displayn2k.sh #!/system/bin/sh log "displayn2k.sh begin running" sleep 5 log "displayn2k.sh sleep 8" sleep 5 log "================sleep finished==========================" #remount /system/bin/mount -o …...

API 体系构建

前言 API 是模块或者子系统之间交互的接口定义。好的系统架构离不开好的 API 设计&#xff0c;而一个设计不够完善的 API 则注定会导致系统的后续发展和维护非常困难。在关键环节制定明确的 API 规范有助于 Service 对内提高产品间互通的效率&#xff0c;对外提供一致的使用体…...

RMPE: Regional Multi-Person Pose Estimation (AlphaPose)阅读笔记

区域多人姿态估计 ICCV 2017 论文链接 代码链接 摘要&#xff1a; 野外多人姿态估计具有挑战性。sota人体检测器不可避免存在定位和识别误差&#xff0c;这些误差可能导致依赖人体检测器的单人姿态估计器&#xff08;SPPE&#xff09;的失败。本文提出了一种新的区域多人姿态估…...

2月16日昆明面试经历部分考题

2月16日昆明面试部分考题 1.说说em和rem的区别&#xff1f;rpx呢&#xff1f; rem是相对于根元素&#xff08;HTML&#xff09;进行计算&#xff0c;而em是相对于当前元素或父元素的字体大小&#xff0c;如果当前文本的字体尺寸没有设置&#xff0c;则相对于浏览器的默认字体…...

ARC140D One to One

ARC140D One to One 题目大意 对于一个长度为nnn的整数序列X(x1,x2,…xn)X(x_1,x_2,\dots x_n)X(x1​,x2​,…xn​)&#xff0c;每个元素都在111到nnn之间&#xff0c;令f(X)f(X)f(X)表示以下问题的答案&#xff1a; 有一个nnn个顶点nnn条边的无向图&#xff08;可能有重边和…...

联合身份验证与Cognito

Hello大家好&#xff0c;我们接下来讨论AWS联合身份验证的内容。 AWS联合身份验证 对于考试&#xff0c;联合身份验证部分是一块非常重要的内容。那什么是联合身份验证&#xff0c;它是做什么用的呢&#xff1f; 联合身份验证&#xff0c;是用来允许AWS外部用户&#xff0c;如…...

day18_常用API之String类丶Object类

String概述 java.lang.String 类代表字符串&#xff0c;String类定义的变量可以用于指向字符串对象&#xff0c;同时String类提供了很多操作字符串的功能&#xff0c;我们可以直接使用。Java 程序中的所有字符串文字&#xff08;例如“abc”&#xff09;都为此类的对象 特点:St…...

OSG三维渲染引擎编程学习之五十五:“第五章:OSG场景渲染” 之 “5.13 一维纹理”

目录 第五章 OSG场景渲染 5.13 一维纹理 5.13.1 一维纹理介绍 5.13.2 一维纹理示例 第五章 OSG场景渲染 OSG存在场景树和渲染树,“场景数”的构建在第三章“OSG场景组织”已详细阐明,本章开始...

RTOS随笔之FreeRTOS启动与同步方法

RTOS启动与同步机制RTOS启动任务切换场景任务同步机制队列信号量事件组任务通知任务延时RTOS启动 FreeRTOS在任务创建完成后调用函数vTaskStartScheduler()启动任务调度器。 vTaskStartScheduler()任务启动函数详解 void vTaskStartScheduler( void ) {BaseType_t xReturn;xR…...

【AI/NLP】InstructGPT数据标注问题

文章目录1 背景介绍2 标记员筛选2.1 标记员筛选标准3 数据集及其标注3.1 预训练3.2 微调3.2.1 SFT-demonstration data3.2.2 RM-comparison data3.3 数据集大小4 模型实现1 背景介绍 ChatGPT的训练过程与InstructGPT相近&#xff0c;大致分为三步&#xff1a; SFT&#xff1a…...

三次握手和四次挥手

文章目录TCP三次握手为什么要三次握手三次握手可以携带数据吗&#xff1f;三次握手失败&#xff0c;服务端会如何处理?ISN代表什么&#xff0c;意义&#xff0c;何要动态随机什么是半连接队列第2次握手传回了ACK&#xff0c;为什么还要传回SYN&#xff1f;为什么要四次挥手TCP…...

Jmeter常用断言之响应断言详解

响应断言是最常用的一种断言方法&#xff0c;主要是对响应结果中的文本内容进行断言&#xff0c;比如响应结果是否包含指定的值&#xff0c;或者是否等于指定的值。响应断言可以适用各种返回类型的响应结果&#xff0c;如&#xff1a;Test、html、application/json、applicatio…...

【Python学习笔记】36.Python3 MySQL - mysql-connector 驱动(1)

前言 MySQL 是最流行的关系型数据库管理系统&#xff0c;本章节为大家介绍使用 mysql-connector 来连接使用 MySQL&#xff0c; mysql-connector 是 MySQL 官方提供的驱动器。 Python3 MySQL - mysql-connector 驱动 我们可以使用 pip 命令来安装 mysql-connector&#xff1…...

计算机SCI论文课题设计需要注意什么? - 易智编译EaseEditing

课题设计就要本着严谨性和可行性来进行。实验设计的类型要选择准确&#xff0c;统计学的方法要运用合理&#xff0c;研究对象和观察指标的选择也要符合研究目的的要求&#xff0c;技术路线要清晰明了。 关于课题的设计的可行性也要综合考虑&#xff0c;比如前期的相关工作基础…...

Quartz入门教程

本文参考文章编写 Quartz 官网 Quartz 是 OpenSymphony 开源组织在 Job Scheduling 领域又一个开源项目&#xff0c;是完全由 Java 开发的一个开源任务日程管理系统&#xff0c;“任务进度管理器”就是一个在预先确定&#xff08;被纳入日程&#xff09;的时间到达时&#xff…...

TypeScript 学习之 function

函数可以实现抽象层&#xff0c;模拟类&#xff0c;信息隐藏和模块。 函数有&#xff1a;有名字的函数、匿名函数 在 JavaScript 中的函数 // 有名字的函数 function add(x, y) {return x y; }// 匿名函数 let myAdd function (x, y) {return x y; };函数类型 typescript 可…...

【云计算自学路线】

云计算包含的技术内容和涉及的方向比较多&#xff0c;一定要进行系统化的学习才能更好的掌握这门技术。 云计算作为互联网新技术领域&#xff0c;现阶段也是出于高速发展期&#xff0c;想学习加入云计算行业的小伙伴可以抓紧机会了&#xff0c;跟着小课一起来了解云计算以及它…...

code01 v2黑屏、花屏、死机、断电重启、休眠死机的进来

症状解决 长话简说&#xff0c;症状如下&#xff1a; 使用浏览器、播放视频等&#xff0c;遇到突然死机或花屏死机的情况 关闭硬件加速&#xff0c;如&#xff1a;浏览器中设置关闭硬件加速&#xff0c;出现这种症状的软件都需要设置 开机电流音、播放与暂停时喇叭吱吱想、打…...

分享107个HTML电子商务模板,总有一款适合您

分享107个HTML电子商务模板&#xff0c;总有一款适合您 107个HTML电子商务模板下载链接&#xff1a;https://pan.baidu.com/s/1VW67Wjso1BRpH7O3IlbZwg?pwd0d4s 提取码&#xff1a;0d4s Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 Aplustemplates 购物模板…...

Barra模型因子的构建及应用系列三之Momentum因子

一、摘要 在之前的Barra模型系列文章中&#xff0c;我们已经初步讲解、构建了Size因子和Beta因子&#xff0c;并分别创建了对应的单因子策略。通过回测发现&#xff0c;其中Size因子的小市值效应具有很强的收益能力。而本篇文章将在该系列下进一步构建Momentum因子。 二、模型…...

8.2.1.3 索引合并优化

索引合并访问方法检索具有多个范围扫描的行&#xff0c;并将其结果合并为一个。此访问方法仅合并来自单个表的索引扫描&#xff0c;而不是跨多个表的扫描。合并可以生成其基础扫描的合并、交叉或交叉的合并。 可以使用索引合并的查询示例&#xff1a; SELECT * FROM tbl_name…...

水雨情在线小能手-雨量水位报警站

雨量水位报警站由水位探测器、雨量传感器、报警灯、扩音器、太阳能板和采集传输控制器组成。实时采集水位等级&#xff0c;三个水位探测器对应3个水位等级&#xff0c;当现场水面浸没相应探测器时&#xff0c;本机会实时发出语音报警&#xff0c;同时可发送相应的预警/报警等级…...

【蓝桥杯集训4】双指针专题(6 / 6)

目录 3768. 字符串删减 - 滑动窗口ac 799. 最长连续不重复子序列 - 滑动窗口 800. 数组元素的目标和 - 二分ac 2816. 判断子序列 - 双指针 1238. 日志统计 - 滑动窗口 1240. 完全二叉树的权值 - 双指针 1、前缀和 - 通过了 5/12个数据 2、双指针 3768. 字符串删减 -…...

文件流,gzip解压,压缩

目录 文件画布 写入 &#xff08;空文件Foutnew File(Parent,entry.getName());&#xff09;FileOutputStream outnew FileOutputStream(Fout);BufferedOutputStream Boutnew BufferedOutputStream(out);其他流量基于基础包装文件--文件流---字节流 顺序pbf一般是形成后再压缩目…...

在线开会,来开开圆桌会议吧~

圆桌会议应用场景&#xff1a;适合内部培训、部门会议亦或是头脑风暴等较为轻松的场景&#xff0c;有兴趣的朋友可以联系我来测试哦~~ 上图&#xff1a; 图&#xff1a;圆桌会议应用截图 在圆桌布局之下&#xff0c;企业可以将每一位参会者和座位绑定&#xff0c;1:1模拟线下圆…...

使用营销自动化的 7 大主要优势

对于大多数企业家来说&#xff0c;自动化已成为在数字时代简化业务的必要条件。那么&#xff0c;您可以采取哪些步骤来实施营销自动化呢&#xff1f; 1. 社交媒体整合 拥有吸引人的社交媒体形象是成功的先决条件。您不可能完成所有社交媒体营销任务&#xff0c;使用自动化软件&…...

【图像分类】基于PyTorch搭建GRU实现MNIST手写数字体识别(单/双向GRU,附完整代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 在https://blog.csdn.net/AugustMe/article/details/128969138文章中,我们使用了基于PyTorch搭建LSTM实现MNIST手…...

day14_oop_抽象_接口

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、抽象 三、接口 零、 复习昨日 多态的好处: 扩展性强.加入新的功能,不需要改动代码降低代码耦合度(解耦合或者松耦合) 一、抽象类 1.1 抽象类…...

模式识别 | MATLAB实现DNN深度神经网络模式分类识别

分类预测 | MATLAB实现DNN全连接神经网络多特征分类预测 目录 分类预测 | MATLAB实现DNN全连接神经网络多特征分类预测基本介绍任务描述程序设计参考资料基本介绍 DNN的结构不固定,一般神经网络包括输入层、隐藏层和输出层,一个DNN结构只有一个输入层,一个输出层,输入层和输…...

wordpress仿seowhy模板/清理优化大师

在淘宝/萤石/乐橙/微吼/趣看等类型商业直播应用大规模开展的今天&#xff0c;高大上的直播形态似乎占据了主流&#xff0c;然而这些直播对于普通型的公司似乎成本有点高&#xff0c;而且不能够长线、无顾虑地进行&#xff0c;所谓无顾虑地进行直播&#xff0c;指的不是直播系统…...

wordpress get_the_tag_list/今日新闻快讯

一、 1、 2路CAN接口&#xff08;MCP2515的1路&#xff0c;STM32F103C8T6自带的1路CAN&#xff09;&#xff0c;可以实现两路CAN的通信&#xff1b; 2、供电范围宽&#xff08;7-28v&#xff09;&#xff0c;采用可插拔式4位数码管模块进行显示&#xff0c;数码管模块采用2线…...

百宝图建设工程电子网站/深圳百度seo优化

文章目录问题描述原因分析解决办法问题描述 系统是Windows 10 professional版本&#xff0c;在一次突然开机后&#xff0c;发现点开程序后&#xff0c;在任务栏什么都不显示&#xff0c;任务栏按钮和图标状态均不显示了&#xff0c;但是程序在运行。 当时兄弟们我心态直接蹦了…...

成都手机号码销售网站建设/北京seo公司工作

原文地址&#xff1a;Go-翻过的一些面试题目 1、以下代码会输出什么&#xff1f;请简要说明。 var c make(chan int) var a intfunc f() {a 1<-c }func main() {go f()c <- 0print(a) } 能正确输出1&#xff0c;不过主协程会阻塞 f() 函数的执行。 2、以下代码会输…...

wordpress4.2.15漏洞/网上开店如何推广自己的网店

数据从业者常在多种工具之间跳来跳去&#xff0c;这种碎片化导致了协作、共享和生产力方面的问题。 企业云数据量的增加以及数据转换、模型构建和可视化工具的出现&#xff0c;推动了现代数据堆栈的崛起。大部分公司都在加大对数据团队的投入&#xff0c;以适应不断变化的需求…...

中堂仿做网站/平面设计培训

1、加载父类&#xff0c;加载父类的静态属性和静态代码块 2、加载子类&#xff0c;加载子类的静态属性和静态代码块 3、初始化父类中的非静态属性并赋初值&#xff0c;执行父类非静态代码块&#xff0c;执行父类构造。 4、初始化子类中的非静态属性并赋初值&#xff0c;执行代码…...