![5c0a7b1fada908ab32a21698904d8a60.png](https://i-blog.csdnimg.cn/blog_migrate/7a3d99fa47276cbbd1b48d5e03207842.png)
点击蓝字关注我
![5c0a7b1fada908ab32a21698904d8a60.png](https://i-blog.csdnimg.cn/blog_migrate/7a3d99fa47276cbbd1b48d5e03207842.png)
0 引言
![eeca7757b0b0394355c0078810bcc72c.gif](https://i-blog.csdnimg.cn/blog_migrate/5275399000829006ce3e214a9af82dcf.gif)
当你做了一些属于自己的小功能插件以后,你就可以把它们整合到菜单工具栏,然后直接调用就行了。就比如下面这样:
![6c51f6d304b3b97eb07387b89cd17f6e.png](https://i-blog.csdnimg.cn/blog_migrate/7f356c32cf622eb67fc8a7cf0f03d636.png)
不用每次都netload单独加载那个dll,然后才是输入命令调用它。
我们直接把所有的插件功能都整合到一个工程里面,编译生成一个属于菜单栏工具dll文件,用的时候加载这一个dll,直接把菜单栏加载进来,想用哪个用哪个。
1. 菜单栏实现
![eeca7757b0b0394355c0078810bcc72c.gif](https://i-blog.csdnimg.cn/blog_migrate/5275399000829006ce3e214a9af82dcf.gif)
菜单栏实现可以采用COM方式和CUI方式进行,COM有一点不好是要求运行CAD版本必须和编译的完全一致,也就是你每一个版本CAD都要编译一个对应的程序。
CUI原理:其实点击菜单栏按钮时,只是调用了该菜单按钮对应的CAD命令,也就是你需要把菜单栏按钮和你自己自定义的命令链接起来。
注意:要求CAD版本在2007及以上
首先
创建一个菜单栏对象
其中类 AcadApplication,需要添加引用 Autodesk.AutoCAD.Interop.dll
该 dll 在对应版本的 ObjectARX 包中,需要下载 ObjectARX 安装。
![a193dde26c15d966926db180e33c1c9f.png](https://i-blog.csdnimg.cn/blog_migrate/a0ac2bfadb952aa08f7be24f2ae40835.png)
![97a7444ca09e6654f8d3565790db744c.png](https://i-blog.csdnimg.cn/blog_migrate/a6015a810268880ed1729562b127d0ee.png)
设置菜单工具名称
然后把菜单子项加进来,用到AddMenuItem方法
![2fa372df5d94feaa89f80e8a0ef8dbb5.png](https://i-blog.csdnimg.cn/blog_migrate/04a1faa1edc55d92fc7a58f87addd1cb.png)
![bfca5e721a23a56cb982b03395cd111d.png](https://i-blog.csdnimg.cn/blog_migrate/4602c25930c83d2e4fb00f73d6f650dd.png)
这样就添加结束了,所对应的命令都是之前的一些例子,你可以把自己的加进去
就行了。
之后把菜单栏自动加载就行
2 完整代码
![eeca7757b0b0394355c0078810bcc72c.gif](https://i-blog.csdnimg.cn/blog_migrate/5275399000829006ce3e214a9af82dcf.gif)
这里把菜单栏和菜单栏加载都放在了一个MainClass.cs文件中
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Collections.Specialized;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.Geometry;using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.Runtime;using Autodesk.AutoCAD.EditorInput;using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;using Autodesk.AutoCAD.Interop; //引用需要添加 Autodesk.AutoCAD.Interop.dll CAD安装目录内using System.IO;[assembly: ExtensionApplication(typeof(MyMenuTools.AcadNetApp))] //启动时加载工具栏,注意typeof括号里的类库名namespace MyMenuTools{ //添加项目类引用 public class AcadNetApp : Autodesk.AutoCAD.Runtime.IExtensionApplication { //重写初始化 public void Initialize(){ //加载后初始化的程序放在这里 这样程序一加载DLL文件就会执行 Document doc = Application.DocumentManager.MdiActiveDocument; doc.Editor.WriteMessage("\n加载程序中...........\n"); //加载菜单栏需 AddMenu(); } //重写结束 public void Terminate(){ // do somehing to cleanup resource } //加载菜单栏 public void AddMenu(){ Document doc = Application.DocumentManager.MdiActiveDocument; doc.Editor.WriteMessage("添加菜单栏成功!>>>>>>>>>>>>>>"); AcadApplication acadApp = Application.AcadApplication as AcadApplication; //创建建菜单栏的对象 AcadPopupMenu myMenu = null; // 创建菜单 if (myMenu == null) { // 菜单名称 myMenu = acadApp.MenuGroups.Item(0).Menus.Add("个人专用菜单工具(2020.07)"); myMenu.AddMenuItem(myMenu.Count, "文字批量替换", "TBR "); //每个命令后面有一个空格,相当于咱们输入命令按空格 myMenu.AddMenuItem(myMenu.Count, "文字批量对齐", "TBA "); myMenu.AddMenuItem(myMenu.Count, "输出文本", "CTE "); //开始加子菜单栏 AcadPopupMenu subMenu = myMenu.AddSubMenu(myMenu.Count, "CADLinkToEXcel"); //子菜单对象 subMenu.AddMenuItem(myMenu.Count, "Excel表格导入", "CTES "); subMenu.AddMenuItem(myMenu.Count, "由Excel数据更新CAD表格数据", "UCTFE "); subMenu.AddMenuItem(myMenu.Count, "由CAD表格数据更新Excel表格数据", "UEFCT "); myMenu.AddSeparator(myMenu.Count); //加入分割符号 //结束加子菜单栏 } // 菜单是否显示 看看已经显示的菜单栏里面有没有这一栏 bool isShowed = false; //初始化没有显示 foreach (AcadPopupMenu menu in acadApp.MenuBar) //遍历现有所有菜单栏 { if (menu == myMenu) { isShowed = true; break; } } // 显示菜单 加载自定义的菜单栏 if (!isShowed) { myMenu.InsertInMenuBar(acadApp.MenuBar.Count); } } } }
将命令程序单独放置在myCommands.cs中
代码多,就不贴了,自己下载
程序代码自助:
https://gitee.com/yuzhaokai/CADExampleDemo.git
(文件夹:myMenuTools)