CAD二次开发(7)- 实现Ribbon选项卡,面板,功能按钮的添加

1. 创建工程

在这里插入图片描述

2. 需要引入的依赖

在这里插入图片描述

在这里插入图片描述
如图,去掉依赖复制到本地
在这里插入图片描述

3. 代码实现

RibbonTool.cs

实现添加Ribbon选项卡,添加面板,以及给面板添加下拉组合按钮。

using Autodesk.Windows;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;namespace _18Ribbon界面
{public static partial class RibbonTool{/// <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 static RibbonTab AddTab(this 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 static RibbonPanelSource AddPanel(this 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="panelSource"></param>/// <param name="text"></param>/// <param name="size"></param>/// <param name="orient"></param>/// <returns></returns>public static RibbonSplitButton AddSplitButton(this RibbonPanelSource panelSource,string text,RibbonItemSize size,Orientation orient){RibbonSplitButton splitBtn = new RibbonSplitButton();splitBtn.Text = text;splitBtn.ShowText = true;splitBtn.Size = size;splitBtn.ShowImage = true;splitBtn.Orientation = orient;panelSource.Items.Add(splitBtn);return splitBtn;}}
}

RibbonCommandHandler.cs

命令执行的拦截器

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.Windows;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace _18Ribbon界面
{public class RibbonCommandHandler:System.Windows.Input.ICommand{//定义用于确定此命令是否可以在其当前状态下执行的方法。public bool CanExecute(object parameter){return true;}public event EventHandler CanExecuteChanged;// 定义在调用此命令时调用的方法。public void Execute(object parameter){if (parameter is RibbonButton){RibbonButton btn = (RibbonButton)parameter;if (btn.CommandParameter != null){Document doc = Application.DocumentManager.MdiActiveDocument;doc.SendStringToExecute(btn.CommandParameter.ToString(), true, false, false);}}}}
}

RibbonButtonEX.cs

按钮的属性设置,鼠标事件设置。

using Autodesk.Windows;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media.Imaging;namespace _18Ribbon界面
{public class RibbonButtonEX:RibbonButton{//正常显示的图片private string imgFileName = "";public string ImgFileName{get { return imgFileName; }set { imgFileName = value; }}//鼠标进入时的图片private string imgHoverFileName = "";public string ImgHoverFileName{get { return imgHoverFileName; }set { imgHoverFileName = value; }}public RibbonButtonEX(string name,RibbonItemSize size,Orientation orient,string cmd): base(){this.Name = name;//按钮的名称this.Text = name;this.ShowText = true; //显示文字this.MouseEntered += this_MouseEntered;this.MouseLeft += this_MouseLeft;this.Size = size; //按钮尺寸this.Orientation = orient; //按钮排列方式this.CommandHandler = new RibbonCommandHandler(); //给按钮关联命令this.CommandParameter = cmd + " ";this.ShowImage = true; //显示图片}public void SetImg(string imgFileName){Uri uri = new Uri(imgFileName);BitmapImage bitmapImge = new BitmapImage(uri);this.Image = bitmapImge; //按钮图片this.LargeImage = bitmapImge; //按钮大图片this.imgFileName = imgFileName;}/// <summary>/// 鼠标离开事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void this_MouseLeft(object sender, EventArgs e){if (this.ImgFileName !=""){RibbonButton btn = (RibbonButton)sender;string imgFileName = this.ImgFileName;Uri uri = new Uri(imgFileName);BitmapImage bitmapImge = new BitmapImage(uri);btn.Image = bitmapImge; //按钮图片btn.LargeImage = bitmapImge; //按钮大图片}}/// <summary>/// 鼠标进入事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void this_MouseEntered(object sender, EventArgs e){if (this.ImgHoverFileName !=""){RibbonButton btn = (RibbonButton)sender;string imgFileName = this.ImgHoverFileName;Uri uri = new Uri(imgFileName);BitmapImage bitmapImge = new BitmapImage(uri);btn.Image = bitmapImge; //按钮图片btn.LargeImage = bitmapImge; //按钮大图片}}}
}

CurPath.cs

图片路径地址设置,一般设置为空,我们到时候会获取执行文件的加载路径来赋值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _18Ribbon界面
{public static class CurPath{public static string curPath = "";}
}

RibbonButtonInfos.cs

实现自定义的仿CAD的直线按钮功能,多段线按钮功能。

using Autodesk.Windows;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media.Imaging;namespace _18Ribbon界面
{public static class RibbonButtonInfos{//直线按钮private static RibbonButtonEX lineBtn;public static RibbonButtonEX LineBtn{get{lineBtn = new RibbonButtonEX("直线",RibbonItemSize.Large,Orientation.Vertical,"Line");lineBtn.SetImg(CurPath.curPath + "Images\\Line.PNG");//设置按钮图片//添加提示对象RibbonToolTip toolTip = new RibbonToolTip();toolTip.Title = "直线";toolTip.Content = "创建直线段";toolTip.Command = "LINE";toolTip.ExpandedContent = "是用LINE命令,可以创建一些列连续的直线段。每条线段都是可以单独进行编辑的直线对象。";string imgToolTipFileName = CurPath.curPath + "Images\\LineTooTip.PNG";Uri toolTipUri = new Uri(imgToolTipFileName);BitmapImage toolTipBitmapImge = new BitmapImage(toolTipUri);toolTip.ExpandedImage = toolTipBitmapImge;lineBtn.ToolTip = toolTip;//鼠标进入时的图片lineBtn.ImgHoverFileName = CurPath.curPath + "Images\\LineHover.PNG";return lineBtn;}}//多段线按钮private static RibbonButtonEX polylineBtn;public static RibbonButtonEX PolylineBtn{get{polylineBtn = new RibbonButtonEX("多段线", RibbonItemSize.Large, Orientation.Vertical, "Pline");polylineBtn.SetImg(CurPath.curPath + "Images\\Polyline.PNG");//设置按钮图片//添加提示对象RibbonToolTip toolTip = new RibbonToolTip();toolTip.Title = "多段线";toolTip.Content = "创建二维多段线";toolTip.Command = "PLINE";toolTip.ExpandedContent = "二维多段线是作为单个平面对象创建的相互连接的线段序列。可以创建直线段、圆弧段或者两者的组合线段。";string imgToolTipFileName = CurPath.curPath + "Images\\PolylineToolTip.PNG";Uri toolTipUri = new Uri(imgToolTipFileName);BitmapImage toolTipBitmapImge = new BitmapImage(toolTipUri);toolTip.ExpandedImage = toolTipBitmapImge;polylineBtn.ToolTip = toolTip;//鼠标进入时的图片polylineBtn.ImgHoverFileName = CurPath.curPath + "Images\\PolylineHover.PNG";return polylineBtn;}}//圆心半径按钮private static RibbonButtonEX circleCRBtn;public static RibbonButtonEX CircleCRBtn{get{circleCRBtn = new RibbonButtonEX("圆心,半径", RibbonItemSize.Large, Orientation.Horizontal, "Circle");circleCRBtn.SetImg(CurPath.curPath + "Images\\CircleCR.PNG");//设置按钮图片circleCRBtn.ShowText = false;//添加提示对象RibbonToolTip toolTip = new RibbonToolTip();toolTip.Title = "圆心,半径";toolTip.Content = "用圆心和半径创建圆";toolTip.Command = "CIRCLE";toolTip.ExpandedContent = "用圆心和半径创建圆。\n\n示例:";string imgToolTipFileName = CurPath.curPath + "Images\\CircleCDHover.PNG";Uri toolTipUri = new Uri(imgToolTipFileName);BitmapImage toolTipBitmapImge = new BitmapImage(toolTipUri);toolTip.ExpandedImage = toolTipBitmapImge;circleCRBtn.ToolTip = toolTip;//鼠标进入时的图片circleCRBtn.ImgHoverFileName = CurPath.curPath + "Images\\CircleToolTip.PNG";return circleCRBtn;}}}
}

测试

using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.Windows;
using System.Linq;
using System.Windows.Interop;
using System.Windows.Media.Imaging;
using System.IO;
using System.Windows.Shapes;
using _18Ribbon界面;
using Path = System.IO.Path;namespace RibbonTest01
{public class Class1{[CommandMethod("RibbonCmd")]public void RibbonCmd(){RibbonControl ribbonCtrl = ComponentManager.Ribbon; //获取cad的Ribbon界面RibbonTab tab = ribbonCtrl.AddTab("选项卡1", "Acad.RibbonId1", true); //给Ribbon界面添加一个选项卡CurPath.curPath = Path.GetDirectoryName(this.GetType().Assembly.Location) + "\\"; //获取程序集的加载路径RibbonPanelSource panelSource = tab.AddPanel("绘图"); //给选项卡添加面板panelSource.Items.Add(RibbonButtonInfos.LineBtn); //添加直线命令按钮panelSource.Items.Add(RibbonButtonInfos.PolylineBtn); //添加多段线命令按钮}}
}

结果

启动并自动加载CAD,输入netload,加载自定义执行文件,并输入RibbonCmd命令。

在这里插入图片描述

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

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

相关文章

Ubuntu18.04安装pwntools报错解决方案

报错1&#xff1a;ModuleNotFoundError: No module named ‘setuptools_rust’ 报错信息显示ModuleNotFoundError: No module named setuptools_rust&#xff0c;如下图所示 解决方案&#xff1a;pip install setuptools_rust 报错2&#xff1a;pip版本低 解决方案&#xff…

天气数据集-Jena Climate dataset

天气数据集-Jena Climate dataset 1.数据集基本信息 Dataset Name: mpi_saale_2021b.csv Size: 26495 rows; 1 year (2021), 10 min 气象学、农业、环境科学 开源机构: Max Planck Institute for Biogeochemistry 2.数据特征 2.1 特征简介 数据共有31个特征&#xff0c;…

LabVIEW与欧陆温控表通讯的实现与应用:厂商软件与自主开发的优缺点

本文探讨了LabVIEW与欧陆温控表通讯的具体实现方法&#xff0c;并对比了使用厂商提供的软件与自行开发LabVIEW程序的优缺点。通过综合分析&#xff0c;帮助用户在实际应用中选择最适合的方案&#xff0c;实现高效、灵活的温控系统。 LabVIEW与欧陆温控表通讯的实现与应用&#…

派生类中调用基类的__init__()方法

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在派生类中定义__init__()方法时&#xff0c;不会自动调用基类的__init__()方法。例如&#xff0c;定义一个Fruit类&#xff0c;在__init__()方法中创…

通过非欧几何体改变 AI 嵌入

目录 一、说明 二、LLM嵌入的形势 三、了解一些背景信息 3.1 什么是嵌入&#xff1f; 3.2 为什么嵌入在 NLP 中很重要&#xff1f; 3.3 复数Complex 几何的角色 3.4 C主动学习 3.5 角度嵌入 &#xff08;AE&#xff09;&#xff1a;解锁稳健排序 3.6 RotatE&#xff1a;将关系…

day-37 最大正方形

思路 动态规划&#xff0c;这题主要得弄明白状态转换方程&#xff0c;dp[i][j]表示以&#xff08;i,j&#xff09;为右下角的最大正方形 解题方法 1.首先将第一行和第一列初始化&#xff0c;当对应位置的matrix为’0’时&#xff0c;dp数组对应位置也为零&#xff0c;否则为1 …

【工具】探索 DOU:每用户数据使用量

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 &#x1f3b5; 邓紫棋《光年之外》 什么是 DOU…

重学java 55. 集合 Set接口

我救自己万万次&#xff0c;铮铮劲草&#xff0c;绝不动摇 —— 24.6.2 一、Set集合介绍 Set和Map密切相关的 Map的遍历需要先变成单列集合&#xff0c;只能变成set集合 二、HashSet集合的介绍和使用 1.概述 HashSet是Set接口的实现类 2.特点 a、元素唯一 b、元素无序 c、无索引…

开源VS闭源:大模型之争,究竟谁更胜一筹?

随着人工智能技术的快速发展&#xff0c;大模型作为其中的核心组件&#xff0c;已经引起了业界的广泛关注。在大模型的研发过程中&#xff0c;开源与闭源成为了两个备受争议的话题。究竟开源与闭源谁更好&#xff1f;本文将从多个角度进行深入分析&#xff0c;为大家揭示真相。…

重载运算符C++---学习笔记

一、笔记 1. 重载运算符基础知识 重载运算符进行的运算和普通数的加减运算不同之处在于重载运算符的操作数为一个一个自定义的对象&#xff0c;所以相应的要对普通的运算符如-*%/的调用方法进行重写&#xff0c;重载的本质还是函数调用 2. 重载运算符的语法 重载运算符的语…

Kubernetes-使用集群CA证书给用户颁发客户端证书访问Api-Server

一、官网地址 证书和证书签名请求 | Kubernetes 二、Demo 一、创建测试文件夹 cd ~ mkdir add_k8s_user_demo cd add_k8s_user_demo 二、创建符合X509标准的证书 openssl genrsa -out myuser.key 2048 openssl req -new -key myuser.key -out myuser.csr -subj "/CNmy…

自动微分技术在 AI for science 中的应用

本文简记我在学习自动微分相关技术时遇到的知识点。 反向传播和自动微分 以 NN 为代表的深度学习技术展现出了强大的参数拟合能力&#xff0c;人们通过堆叠固定的 layer 就能轻松设计出满足要求的参数拟合器。 例如&#xff0c;大部分图神经网络均基于消息传递的架构。在推理…

带交互的卡尔曼滤滤波|一维滤波|源代码

背景 一维卡尔曼滤波的MATLAB例程&#xff0c;​背景为温度估计。 代码介绍 运行程序后&#xff0c;可以自己输入温度真实值&#xff1a; 以20℃为例&#xff0c;得到如下的估计值​&#xff1a; 滤波前的值和滤波后的值分别于期望值&#xff08;真实值&#xff09;作差…

基于Jenkins+Kubernetes+GitLab+Harbor构建CICD平台

1. 实验环境 1.1 k8s环境 1&#xff09;Kubernetes 集群版本是 1.20.6 2&#xff09;k8s控制节点&#xff1a; IP&#xff1a;192.168.140.130 主机名&#xff1a;k8s-master 配置&#xff1a;4C6G 3&#xff09;k8s工作节点 节点1&#xff1a; IP&#xff1a;192.1…

【机器学习】基于OpenCV和TensorFlow的MobileNetV2模型的物种识别与个体相似度分析

在计算机视觉领域&#xff0c;物种识别和图像相似度比较是两个重要的研究方向。本文通过结合深度学习和图像处理技术&#xff0c;基于OpenCV和TensorFlow的MobileNetV2的预训练模型模&#xff0c;实现物种识别和个体相似度分析。本文详细介绍该实验过程并提供相关代码。 一、名…

JVM运行时数据区 - 程序计数器

运行时数据区 Java虚拟机在执行Java程序的过程中&#xff0c;会把它管理的内存划分成若干个不同的区域&#xff0c;这些区域有各自的用途、创建及销毁时间&#xff0c;有些区域随着虚拟机的启动一直存在&#xff0c;有些区域则随着用户线程的启动和结束而建立和销毁&#xff0…

前端组件业务数据选择功能优雅写法

1. 业务场景 后台管理在实际业务中&#xff0c;经常可见的功能为&#xff1a;在当前的页面中从其他列表中选择数据。 例如&#xff0c;在一个商品活动列表页面中 需要选择配置的商品。 2. 遇到问题 从代码划分的角度来说&#xff0c;每个业务列表代码首先分散开来&#xff0…

LeetCode刷题之HOT100之在排序数组中查找元素的第一个和最后一个位置

下午雨变小了&#xff0c;但我并未去实验室&#xff0c;难得的一天呆在宿舍。有些无聊&#xff0c;看看这个&#xff0c;弄弄那个&#xff0c;听听歌&#xff0c;消磨时间。不知觉中时间指针蹦到了九点&#xff0c;做题啦&#xff01;朋友推荐了 Eason 的 2010-DUO 演唱会&…

2024年06月数据库流行度最新排名

点击查看最新数据库流行度最新排名&#xff08;每月更新&#xff09; 2024年06月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多&#xff0c;这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

低代码是什么?开发系统更有什么优势?

低代码&#xff08;Low-Code&#xff09;是一种应用开发方法&#xff0c;它采用图形化界面和预构建的模块&#xff0c;使得开发者能够通过少量的手动编程来快速创建应用程序。这种方法显著减少了传统软件开发中的手动编码量&#xff0c;提高了开发效率&#xff0c;降低了技术门…