AutoCAD二次开发三种添加插件按钮的方法之三

再之前两篇的介绍中,无论是第一篇还是第二篇都需要依赖于AutoCAD中的acad.cuix文件,这是写插件所不能容忍的啊!所以这一篇我们不依赖任何的配置,直接加载dll并输入相应的命令即可实现添加命令按钮的操作!这次我们需要使用的dll是AcWindows.dll!~

逻辑如下:

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还是要写的);第二种代码添加按钮写起来较为简便,条理也比较清晰;第三种完全基于代码实现,比较适合纯码农们!也比较适合插件开发的真正实施!亲们喜欢哪种就自己选吧!~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值