C#在AutoCAD中创建按钮

1、引用

AcDbMgd.dll. 当使用图形文件中的对象时使用这个DLL文件。

AcMgd.dll. 当使用AutoCAD应用程序时使用这个DLL文件。

AcCui.dll. 当使用自定义文件时使用这个DLL文件。

DLL被引用后,必须设置引用DLL文件的“复制到本地”属性为False。

2、代码

namespace cadPlugin
{
    public class MainStart
    {
        static AcadPopupMenu testMenu = null;
        // 自定义命令
        [CommandMethod("loadButton")]
        public void MenuLoad()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;

            AcadApplication acadApp = Application.AcadApplication as AcadApplication;

            // 创建菜单栏按钮
            if (testMenu == null)
            {
                testMenu = acadApp.MenuGroups.Item(0).Menus.Add("cad插件");
                testMenu.AddMenuItem(testMenu.Count, "打开", "loadRibbon");
            }

            // 按钮是否显示
            bool isShowd = false;
            foreach (AcadPopupMenu menu in acadApp.MenuBar)
            {
                if (menu == testMenu)
                {
                    isShowd = true;
                    break;
                }
            }
            // 显示按钮
            if (!isShowd)
            {
                testMenu.InsertInMenuBar(acadApp.MenuBar.Count);
            }
        }

        [CommandMethod("loadRibbon")]
        public void doLogin()
        {
            // 创建工具栏RibbonTab页
            AddRibbon();
        }

        private static RibbonTab myRibbonTab = null;
        public void AddRibbon()
        {
            if (myRibbonTab == null && DataBuffer.user != null)
            {
                //==========创建Ribbon菜单按钮==========
                myRibbonTab = new RibbonTab();
                myRibbonTab.Title = "cad插件";
                myRibbonTab.Id = "CAD-Utils";
                //==========创建RibbonPanel窗口==========
                RibbonPanel panel = new RibbonPanel();
                RibbonPanelSource panelSrc = new RibbonPanelSource();
                panelSrc.Title = "功能菜单";
                panel.Source = panelSrc;
                myRibbonTab.Panels.Add(panel);
                //==========创建RibbonPanel菜单按钮==========
                RibbonButton jianzhuBtn = NewRibbonPBtn("建筑专业", "JZStart\n", Resource.jianzhu_B);
                panelSrc.Items.Add(jianzhuBtn);
                RibbonButton dianqiBtn = NewRibbonPBtn("电气专业", "DQStart\n", Resource.dianqi_B);
                panelSrc.Items.Add(dianqiBtn);

                // 在AutoCAD的Ribbon窗口中显示
                RibbonControl ribCntrl = RibbonServices.RibbonPaletteSet.RibbonControl;
                bool isShow = false;
                foreach (RibbonTab rbnTab in ribCntrl.Tabs)
                {
                    if (rbnTab == myRibbonTab)
                    {
                        isShow = true;
                        break;
                    }
                }
                if (!isShow)
                {
                    ribCntrl.Tabs.Add(myRibbonTab);
                    //优先展示此工具栏
                    myRibbonTab.IsActive = true;
                }
            }
        }

        [CommandMethod("DQStart")]
        public void bjcjDQStart()
        {
            // 打开WinForm窗体
            电气专业 nq = new 电气专业();
            nq.TopMost = false;
            Application.ShowModelessDialog(nq);
        }

        [CommandMethod("JZStart")]
        public void bjcjJZStart()
        {
            // 打开WinForm窗体
            建筑专业 nq = new 建筑专业();
            nq.TopMost = false;
            Application.ShowModelessDialog(nq);
        }

        //不带图标
        private static RibbonButton NewRibbonBtn(string text, string cmd)
        {
            RibbonButton button = new RibbonButton();
            button.Text = text;
            button.ShowText = true;
            button.CommandHandler = new AdskCommonHandler();
            button.CommandParameter = cmd;
            return button;
        }
        //带图标
        private static RibbonButton NewRibbonPBtn(string text, string cmd, Bitmap Picture)
        {
            RibbonButton button = new RibbonButton
            {
                Text = text,
                ShowText = true,
                Image = ImageSourceForBitmap(Picture),//存放小图片16x16
                LargeImage = ImageSourceForBitmap(Picture),//存放大图片32x32
                ShowImage = true,
                Size = RibbonItemSize.Large,//通过指定Size为Standard还是Large确定显示小图片还是大图片
                Orientation = System.Windows.Controls.Orientation.Vertical,//指定文字、图片的排布方式,Horizontal:水平方向;Vertical垂直方向
                CommandHandler = new AdskCommonHandler(),
                CommandParameter = cmd
            };
            return button;
        }

        [DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool DeleteObject([In] IntPtr hObject);
        public static System.Windows.Media.ImageSource ImageSourceForBitmap(Bitmap bmp)
        {
            var handle = bmp.GetHbitmap();
            try
            {
                return Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
            }
            finally { DeleteObject(handle); }
        }
    }
}

3、执行

启动 AutoCAD,在命令行输入 NETLOAD 命令,选择生成的DLL文件。

输入loadButton命令调出菜单栏按钮。

如果不需要在菜单展示按钮,可直接执行工具栏命令loadRibbon,调出工具栏按钮。