从CAD2007之后,Autodesk提供了一个新的程序集AcCui.dll,使用这个程序集,我们可以方便地做一些界面方面的操作,比如创建自定义菜单。
下面介绍一下菜单的创建过程:
1、在项目中添加引用:AcCui.dll,这个DLL存放在CAD的安装目录中。但是,好像CAD2007之前的版本里没有这个DLL),我电脑上安装了CAD2004、CAD2005、CAD2008、CAD2010,其中,只有CAD2008和CAD2010中有这个DLL。
2、在代码中添加using:
using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Customization; using System.Collections.Specialized;
3、声明一个自定义组,在这个组中可以自定义我们的命令、菜单、工具栏等。
//自定义的组名 string strMyGroupName = "MyGroup"; //保存的CUI文件名(从CAD2010开始,后缀改为了cuix) string strCuiFileName = "MyMenu.cui"; //创建一个自定义组(这个组中将包含我们自定义的命令、菜单、工具栏、面板等) CustomizationSection myCSection = new CustomizationSection(); myCSection.MenuGroupName = strMyGroupName;
4、创建命令组,并添加菜单命令
//创建自定义命令组 MacroGroup mg = new MacroGroup("MyMethod", myCSection.MenuGroup); MenuMacro mm1 = new MenuMacro(mg, "打开文件", "OF", ""); MenuMacro mm2 = new MenuMacro(mg, "打开模板", "OM", ""); MenuMacro mm3 = new MenuMacro(mg, "保存", "SV", "");
5、创建菜单,如果菜单项是单级菜单,则直接声明为PopMenuItem即可;如果菜单项下有子级,则将其子级放到一个PopMenu中,然后将这个PopMenu放到PopMenuRef中,最后将PopMenuRef放到总菜单中。按照这个原理,可以创建多级菜单。
//声明菜单别名 StringCollection scMyMenuAlias = new StringCollection(); scMyMenuAlias.Add("MyPop1"); scMyMenuAlias.Add("MyTestPop"); //菜单项(将显示在项部菜单栏中) PopMenu pmParent = new PopMenu("我的菜单", scMyMenuAlias, "我的菜单", myCSection.MenuGroup); //子项的菜单(多级) PopMenu pm1 = new PopMenu("打开", new StringCollection(), "", myCSection.MenuGroup); PopMenuRef pmr1 = new PopMenuRef(pm1, pmParent, -1); PopMenuItem pmi1 = new PopMenuItem(mm1, "文件", pm1, -1); PopMenuItem pmi2 = new PopMenuItem(mm2, "模板", pm1, -1); //子项的菜单(单级) PopMenuItem pmi3 = new PopMenuItem(mm3, "保存(&S)", pmParent, -1);
6、保存菜单文件
// 最后保存文件 myCSection.SaveAs(strCuiFileName);
本来还想实现菜单的自动加载,但是CUI菜单必须用cuiload命令进行加载,在网上找到的方法都是向CAD发送lisp命令调用cuiload,但是我没有调用成功过。
下面是一个测试程序的源码,开发环境是:VS2005 + CAD2008