對一款軟件進行二次開發,不可避免的要添加菜單或者功能欄,通過一些按鈕觸發命令。以下是對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菜單的基本過程應該就是這樣,如果你正在尋找這方面的資料,可以參考。