对一款软件进行二次开发,不可避免的要添加菜单或者功能栏,通过一些按钮触发命令。以下是对AutoCAD二次开发添加Ribbon菜单的代码编写:
本文参考的文章如下:
https://www.cnblogs.com/junqilian/archive/2012/06/18/2553662.html
https://blog.csdn.net/hisinwang/article/details/78797068
利用vs添加AutoCAD 的.net Plugin之后,找到解决方案中的myPlugin(在myCommands中写代码需要利用命令进行操作,在myPlugin中编写可以直接自动加载Ribbon),把代码写在Initialize()中。
1、声明需要添加的Ribbon Tab页:
1 Autodesk.Windows.RibbonControl ribbonControl = Autodesk.Windows.ComponentManager.Ribbon; 2 RibbonTab Tab = new RibbonTab(); 3 Tab.Title = "图层权限管理"; 4 Tab.Id = "RibbonSample_TAB_ID"; 5 6 ribbonControl.Tabs.Add(Tab);
2、 创建新的Panel:
1 // create Ribbon panels 2 Autodesk.Windows.RibbonPanelSource panel1Panel = new RibbonPanelSource(); 3 panel1Panel.Title = "图层管理"; 4 RibbonPanel Panel1 = new RibbonPanel(); 5 Panel1.Source = panel1Panel; 6 Tab.Panels.Add(Panel1);
3、 添加按钮到Panel中:(添加按钮时,在函数的参数中,输入cmd参数后加一个空格,可以直接触发命令,不加空格代表只是输入,还需要点击Enter键。)
1 RibbonButton pan1btnAddLayers = NewRibbonButton("添加图层", "ADDLAYER ",Resource1.AddLayer16x16,Resource1.AddLayer32x32); 2 RibbonButton pan1btnEraseLayers = NewRibbonButton("允许导出", "DelteObjects ", Resource1.AddLayer16x16, Resource1.AddLayer32x32); 3 4 RibbonRowPanel pan1row1 = new RibbonRowPanel(); 5 pan1row1.Items.Add(pan1btnEraseLayers); 6 pan1row1.Items.Add(new RibbonRowBreak()); 7 8 panel1Panel.Items.Add(pan1btnAddLayers); 9 //panel1Panel.Items.Add(new RibbonSeparator()); 10 panel1Panel.Items.Add(pan1row1);
4、创建一个按钮触发的自定义类commandHandlers:用来实现System.Windows.Input.ICommand接口,在Execute时把commandParameter发送到AutoCAD命令行窗口执行。
1 using System; 2 using System.Collections.Generic; 3 //using System.Linq; 4 //using System.Text; 5 using Autodesk.Windows; 6 7 8 namespace AutoCAD_Debugger 9 { 10 class RibbonCommandHandler : System.Windows.Input.ICommand 11 { 12 public bool CanExecute(object parameter) 13 { 14 return true; 15 } 16 17 public event EventHandler CanExecuteChanged; 18 19 public void Execute(object parameter) 20 { 21 //is from Ribbon Button 22 RibbonButton ribBtn = parameter as RibbonButton; 23 if (ribBtn != null) 24 { 25 //execute the command 26 Autodesk.AutoCAD.ApplicationServices.Application 27 .DocumentManager.MdiActiveDocument 28 .SendStringToExecute( 29 (string)ribBtn.CommandParameter, true, false, true); 30 } 31 } 32 } 33 }
5、 设置按钮属性的函数:参数分别代表按钮名称、触发命令(myCommands中编写命令)、显示小图片、显示大图片。
1 private static RibbonButton NewRibbonButton(string text, string cmd,Bitmap image, Bitmap largeimage) 2 { 3 RibbonButton button = new RibbonButton(); 4 button.Text = text; 5 button.ShowText = true; 6 button.Image = imagesourceForBitmap(image); 7 button.LargeImage = imagesourceForBitmap(largeimage); 8 button.ShowImage = true; 9 button.Size = RibbonItemSize.Large; 10 button.Orientation = System.Windows.Controls.Orientation.Vertical; 11 button.CommandHandler = new RibbonCommandHandler(); 12 button.CommandParameter = cmd; 13 14 return button; 15 }
6、在添加处理图片的函数之前需要把按钮图标添加到解决方案中:选择项目-添加-资源文件,添加一个资源文件夹之后,把32x32和16x16的png图片拖拽到资源文件夹中。
7、处理图片的函数:
1 [DllImport("gdi32.dll", EntryPoint = "DeleteObject")] 2 [return: MarshalAs(UnmanagedType.Bool)] 3 public static extern bool DeleteObject([In] IntPtr hObject); 4 5 public static ImageSource imagesourceForBitmap(Bitmap bmp) 6 { 7 var handle = bmp.GetHbitmap(); 8 try 9 { 10 return Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); 11 } 12 finally { DeleteObject(handle); } 13 }
至此,已完成AutoCAD的Ribbon菜单的编写工作。进行测试,打开AutoCAD—命令行输入netload—选择编译生成的.dll文件—确定加载一次或者永久加载或者取消,就可以看到自己设计的Ribbon菜单。
AutoCAD添加Ribbon菜单的基本过程应该就是这样,如果你正在寻找这方面的资料,可以参考。