AutoCAD二次开发三种添加插件按钮的方法之三
2015-12-14 21:28
691 查看
再之前两篇的介绍中,无论是第一篇还是第二篇都需要依赖于AutoCAD中的acad.cuix文件,这是写插件所不能容忍的啊!所以这一篇我们不依赖任何的配置,直接加载dll并输入相应的命令即可实现添加命令按钮的操作!这次我们需要使用的dll是AcWindows.dll!~
逻辑如下:
1.如果没有打开Ribbon,控制命令行打开
2.判断当前的Tabs中是否存在同title的Tab,初次加载不会存在的
3.添加Panel并在panel中添加button
每个button都有一个CommandHandler属性,这个就是我们写我们自定义的触发按钮事件的类,继承于System.Windows.Input.ICommand!
至此,三种方式都写完了,这里小结一下。
总体来说这三种方式前两种依赖性较强,依赖于acad.cuix文件,第三种非要说依赖性的话,依赖于Ribbon一定要是打开状态的;第一种的配置文件做好了的话,甚至可以不写代码添加按钮代码就可以实现按钮(但是自定义CommandMethod还是要写的);第二种代码添加按钮写起来较为简便,条理也比较清晰;第三种完全基于代码实现,比较适合纯码农们!也比较适合插件开发的真正实施!亲们喜欢哪种就自己选吧!~
逻辑如下:
1.如果没有打开Ribbon,控制命令行打开
2.判断当前的Tabs中是否存在同title的Tab,初次加载不会存在的
3.添加Panel并在panel中添加button
private const string New_Tab_ID = "New_Tab_ID"; private bool PluginAdded = false;//是否已经加载了插件--读取配置文件判断 [CommandMethod("addplugin")] public void AddPlugIn() { if (Autodesk.Windows.ComponentManager.Ribbon == null) {//如果Ribbon没有打开,直接操作命令行打开 Application.DocumentManager.MdiActiveDocument.SendStringToExecute("_.ribbon\r", true, false, false); } if (PluginAdded) { System.Windows.Forms.MessageBox.Show("自定义插件已加载!"); return; } bool TabExist = false;//名称为自定义插件的tab是否存在 Autodesk.Windows.RibbonControl pRibbonControl = Autodesk.Windows.ComponentManager.Ribbon; foreach (RibbonTab itemTab in pRibbonControl.Tabs) { if (itemTab.Title == "自定义插件Tab") { AddNewPanel(itemTab); TabExist = true; } } if (!TabExist) { RibbonTab newTab = new RibbonTab(); newTab.Title = "自定义插件Tab"; newTab.Id = New_Tab_ID; pRibbonControl.Tabs.Add(newTab); AddNewPanel(newTab); newTab.IsActive = true; } } //添加新的panel private void AddNewPanel(RibbonTab newTab) { try { Autodesk.Windows.RibbonPanelSource panelSource = new Autodesk.Windows.RibbonPanelSource(); panelSource.Title = "自定义插件Panel"; RibbonPanel newRibbonPanel = new RibbonPanel(); newRibbonPanel.Source = panelSource; newTab.Panels.Add(newRibbonPanel); Autodesk.Windows.RibbonButton pButton = new Autodesk.Windows.RibbonButton(); pButton.Text = "自定义插件button"; pButton.ToolTip = "自定义的button1测试"; pButton.ShowToolTipOnDisabled = true; pButton.IsToolTipEnabled = true; pButton.Size = RibbonItemSize.Large; pButton.LargeImage = LoadImage(AutoCAD_CSharp_plug_in1_2010.Resource1.test32); pButton.Image = LoadImage(AutoCAD_CSharp_plug_in1_2010.Resource1.test16); pButton.Orientation = System.Windows.Controls.Orientation.Vertical; pButton.ShowText = true; pButton.ShowImage = true; pButton.CommandParameter = "plugincommand "; pButton.CommandHandler = new TestCommandHandler(); Autodesk.Windows.RibbonButton pRemovePluginButton = new Autodesk.Windows.RibbonButton(); pRemovePluginButton.Text = "删除插件按钮"; pRemovePluginButton.ToolTip = "自定义的button2测试"; pRemovePluginButton.ShowToolTipOnDisabled = true; pRemovePluginButton.IsToolTipEnabled = true; pRemovePluginButton.Size = RibbonItemSize.Standard; pRemovePluginButton.LargeImage = LoadImage(AutoCAD_CSharp_plug_in1_2010.Resource1.test32); pRemovePluginButton.Image = LoadImage(AutoCAD_CSharp_plug_in1_2010.Resource1.test16); pButton.Orientation = System.Windows.Controls.Orientation.Vertical;//小按钮都是横向的,即使设置纵向 pRemovePluginButton.ShowImage = true; pRemovePluginButton.ShowText = true; pRemovePluginButton.CommandParameter = "removeplugin "; pRemovePluginButton.CommandHandler = new RemovePluginCommandHandler(); panelSource.Items.Add(pButton); panelSource.Items.Add(pRemovePluginButton); } catch (System.Exception ex) { Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage( Environment.NewLine,ex.Message); } } //--配置图片 private System.Windows.Media.Imaging.BitmapImage LoadImage(System.Drawing.Bitmap bitmap) { System.IO.MemoryStream ms = new System.IO.MemoryStream (); bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png); System.Windows.Media.Imaging.BitmapImage bitImage = new BitmapImage(); bitImage.BeginInit(); bitImage.StreamSource = ms; bitImage.EndInit(); return bitImage; }
每个button都有一个CommandHandler属性,这个就是我们写我们自定义的触发按钮事件的类,继承于System.Windows.Input.ICommand!
至此,三种方式都写完了,这里小结一下。
总体来说这三种方式前两种依赖性较强,依赖于acad.cuix文件,第三种非要说依赖性的话,依赖于Ribbon一定要是打开状态的;第一种的配置文件做好了的话,甚至可以不写代码添加按钮代码就可以实现按钮(但是自定义CommandMethod还是要写的);第二种代码添加按钮写起来较为简便,条理也比较清晰;第三种完全基于代码实现,比较适合纯码农们!也比较适合插件开发的真正实施!亲们喜欢哪种就自己选吧!~
相关文章推荐
- B+树的几点总结
- chrome支持本地ajax
- Dalvik和JVM的区别
- tinyXML(1)认识xml
- ZZULIOJ--1798
- 简单矩阵 数据个数的计数
- linux使用VNC服务轻松远程安装oracle
- linux使用VNC服务轻松远程安装oracle
- MySQL临时表
- WebService (一) WebService概念
- OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()
- 合并两个排序的链表---递归实现
- Linux centOS下安装配置openfire
- 各种数据结构的访问优缺点
- js window.open() 父窗口与子窗口的互相调用(未必有用)
- 第三天
- DDuilib入门-XML布局【二】
- Android:AsyncTask 随记
- 1013. 数素数 (20)
- 黑马程序员——java 集合