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命令。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

悬剑武器库5.04版

工具介绍 悬剑5 基于“悬剑网盘”精选工具集悬剑5“飞廉”云武器库制作。 操作系统&#xff1a;Windows 10 专业版 锁屏密码&#xff1a;secquan.org 解压密码: 圈子社区secquan.org 镜像大小&#xff1a;33.1GB 系统占用空间63.0 GB 镜像导入 下载镜像&#xff0c;文末…

WordPress博客主题触屏版社区源码

下载地址&#xff1a;WordPress博客主题触屏版社区源码

【Unity之FGUI】黑神章Fairy GUI控件详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

python采集汽车价格数据

python采集汽车价格数据 一、项目简介二、完整代码一、项目简介 本次数据采集的目标是车主之家汽车价格数据,采集的流程包括寻找数据接口、发送请求获取响应、解析数据和持久化存储,先来看一下数据情况,完整代码附后: 二、完整代码 #输入请求页面url #返回html文档 imp…

6.3 Go 结构体(Struct)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

普华永道信任危机:上市公司解约风波与反思

在全球会计业界的星空中&#xff0c;普华永道无疑是那颗最为耀眼的星之一。然而&#xff0c;近日这颗星却遭遇了前所未有的信任危机。这家大名鼎鼎的四大会计师事务所之一&#xff0c;近期陷入了上市公司解约的风波之中&#xff0c;其声誉与地位正面临严峻挑战。 就在昨晚&…

Word2Vec模型的引入介绍与相关概念

一 、Word2Vec模型的背景引入 1.1 One-hot模型 One-hot模型是是用N位的状态寄存器对N个状态进行编码 如下所示&#xff0c;是有4个样本&#xff0c;每个样本都有三个特征&#xff0c;特征1表示当前样本的性别。 我们喂给算法怎么样的数据&#xff0c;算法就会给我们一个怎么…

学习笔记——IP地址网络协议——网络层(IP)协议

一、网络层(IP)协议 网络层(被称为IP层)但网络层协议并不只是IP协议&#xff0c;还包括ICMP(Internet Control Message Protocol)协议、IPX(Internet Packet Exchange)协议等。 1、IP协议 IP(Internet Protocol)本身是一个协议文件的名称&#xff0c;该协议文件的内容非常少&…

使用python统计word文档页数

使用python统计word文档页数 介绍效果代码 介绍 使用python统计word文档的页数 效果 代码 import os import comtypes.clientdef get_word_page_count(docx_path):try:# Initialize the COM objectword comtypes.client.CreateObject(Word.Application)word.Visible False…

【Qt】探索Qt绘图世界:自定义控件与视觉效果的全面指南

文章目录 前言&#xff1a;1. 绘图基本概念2. 绘制各种形状3. 绘制文字&#xff08;显示文字&#xff09;、设置画笔4. 画刷5. 绘制图片6. 特殊的绘图设备总结&#xff1a; 前言&#xff1a; 在软件开发中&#xff0c;图形用户界面&#xff08;GUI&#xff09;的设计是至关重要…

【面试题】CAP理论、BASE理论及其注册中心选型

1.CAP理论 CAP&#xff1a;指的是在一个分布式系统中&#xff0c;Consistency&#xff08;一致性&#xff09;、Availability&#xff08;可用性&#xff09;、Partition Tolerance&#xff08;分区容错性&#xff09;&#xff0c;三者不可同时获得 一致性&#xff08;C&#x…

成功解决“IndexError: pop index out of range”错误的全面指南

成功解决“IndexError: pop index out of range”错误的全面指南 引言 在Python编程中&#xff0c;处理列表&#xff08;list&#xff09;、双端队列&#xff08;deque&#xff09;或其他可迭代对象时&#xff0c;我们经常使用pop()方法来移除并返回指定索引处的元素。然而&am…

图解 Python 编程(10) | 错误与异常处理

&#x1f31e;欢迎来到Python的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年6月2日&…

图解 IPv6 地址范围

1、 IPv6 多播地址范围 2、1 - 接口本地&#xff1c;2 - 链路本地&#xff1c;5 - 站点本地&#xff1c;8 - 组织本地&#xff1c;E - 全局 3、Well-Known Multicast Addresses

TiDB-从0到1-部署篇

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇 一、TiUP TiUP是TiDB4.0版本引入的集群运维工具&#xff0c;通过TiUP可以进行TiDB的日常运维工作&#xff0c;包括部署、启动、关闭、销毁、弹性扩缩容…

U-boot、linux内核、根文件系统移植以及程序

终于这几天把这个移植的流程过了一遍&#xff0c;所以特此回来总结。 U-boot移植 首先是U-boot移植。Linux 系统要启动就必须需要一个 bootloader 程序&#xff0c;也就说芯片上电以后先运行一段bootloader 程序。这段bootloader程序会先初始化DDR等外设&#xff0c;然后将Li…

linux sed命令替换文件端口

1、需求描述&#xff1a;因sed -i ‘s/旧端口/新端口/g’ 文件&#xff0c;替换会直接增加端口导致端口直接追加后面&#xff0c;因此需要修改 要求&#xff1a;2300替换为23003&#xff0c;23001替换为23004 <value>192.168.1.133</value></constructor-arg>…

【学习Day4】计算机基础

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; ❤️学习和复习的过程是愉快嘚。 1.7.3 流水线 流水线&#xff08;pipeline&#xff09;技术…

考研数学考到110+分,到底有多难?

很难&#xff01; 大家平时在网上上看到很多人说自己考了130&#xff0c;其实这些人只占参加考研数学人数的极少部分&#xff0c;有个数据可以展示出来考研数学到底有多难&#xff1a; 在几百万考研大军中&#xff0c;能考到120分以上的考生只有2%。绝大多数人的分数集中在30…

数字经济中的哪些行业或领域最依赖云服务器?

数字经济是互联网发展的产物&#xff0c;近几年随着网络发展&#xff0c;有好些个行业或领域那可真是对云服务器“爱得深沉” 以电子商务为例&#xff0c;典型的如亚马逊、阿里巴巴等电商巨头&#xff0c;它们所面对的是海量且繁杂的商品信息&#xff0c;涵盖从商品的详细规格…