AutoCAD.Net自定义菜单及自动加载
首先要明确一点,在现阶段,.Net是无法添加自定义菜单的,所以只能借助其他方法。最常见的是通过COM的方式引入AcadApplication,从而调用菜单的相关功能。使用此类的时候,需要通过 添加引用->com->AutoCAD 2010 Type Library(或其它版本) 的方式引入Autodesk.AutoCAD.Interop这样一个命名空间。具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public void AddMenu() { //COM方式获取AutoCAD应用程序对象 AcadApplication acadApp = (AcadApplication)Application.AcadApplication; //为AutoCAD添加一个新的菜单,并设置标题为"MoKa插件" AcadPopupMenu MKMenu = acadApp.MenuGroups.Item(0).Menus.Add("MoKa插件"); //声明一个AutoCAD弹出菜单项,用于获取添加的菜单项对象 AcadPopupMenuItem MKMenuItem; //在新建的菜单中添加一个名为"横断面"的子菜单 AcadPopupMenu MKMenuItems = MKMenu.AddSubMenu(MKMenu.Count + 1, "横断面 "); //在"横断面"子菜单下添加子菜单 MKMenuItem = MKMenuItems.AddMenuItem(MKMenuItems.Count + 1, "创建高程", "KHDM "); MKMenuItem.HelpString = "在纬地生成的横断面基础上创建高程";//状态栏提示信息 MKMenuItem = MKMenuItems.AddMenuItem(MKMenuItems.Count + 1, "编辑高程", "KED "); MKMenuItem.HelpString = "编辑MoKa插件生成的横断面高程"; MKMenuItem = MKMenuItems.AddMenuItem(MKMenuItems.Count + 1, "删除高程", "KE "); MKMenuItem.HelpString = "删除MoKa插件生成的横断面高程"; //添加一个分隔条以区分不同类型的命令 MKMenu.AddSeparator(MKMenu.Count + 1); //将定义的菜单显示在AutoCAD菜单栏的最后 MKMenu.InsertInMenuBar(acadApp.MenuBar.Count + 1); } |
当然,如果仅仅这样,代码是不会看自动执行的。通过实现IExtensionApplication接口可以使在DLL加载和释放时自动执行一部分代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class Init : IExtensionApplication { //在DLL载入时执行 public void Initialize() { //启动菜单 AddMenu(); //do something else Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; ed.WriteMessage("MOKACAD插件初始化完成。"); } //在DLL释放时执行 public void Terminate() { } } |
可以看出,IExtensionApplication接口共包含两个函数,分别在DLL载入和释放时执行。
这样就可以实现在DLL载入时自动出现菜单了,但学有一个问题,此时我们需要使用NETLOAD命令将DLL载入AutoCAD中,当然也有方法让CAD启动时自动载入DLL。
让DLL自动加载,常见的有两种方法,第一种是用Lisp命令,自己对Lisp并不是很懂,所以并没有试用过,不过把代码和方法分享给大家。
写一个lsp文件内容如下:
1 2 |
(COMMAND "NETLOAD" "C://DCKit//DCKit.dll") (Command "Showpalette") |
第一句表示让autocad加载指定的dll,第二句表示执行名为”showpalette”的命令。此处的命令既可以是AutoCAD自带命令也可以是自己编写的命令。
启动Autocad ,工具->Autocadlisp->加载应用程序 在弹出的窗体的启动组中添加上述lsp文件路经。
经过实际验证,因为有很多AutoCAD病毒是通过此方法执行的,所以某些杀毒软件会提示甚至报病毒。
方法二,通过注册表来实现自动加载:
写一个reg文件内容如下:
1 2 3 4 5 6 7 |
[HKEY_LOCAL_MACHINE/SOFTWARE/Autodesk/AutoCAD/R17.0/ACAD-5001:804/Applications/yds] "DESCRIPTION"="加载自定义dll文件" "LOADCTRLS"=dword:0000000c "MANAGED"=dword:00000001 "LOADER"="F://C#//autocad二次开发//练习//AcdNextool//AcdNextool//bin//Debug//AcdNextool.dll" [HKEY_LOCAL_MACHINE/SOFTWARE/Autodesk/AutoCAD/R17.0/ACAD-5001:804/Applications/yds/Commands] "ShowPalette"="ShowPalette" |
将以上内容复制到txt文件中,并重命名为XXX.reg,然后双击就能将以上内容导入到注册表中。这个注册码文件和上面Lisp代码的意思差不多。但注册表还有一个好处就是我们可以通过C#来对注册表进行更个性化的读写,如下文:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
/// <summary> /// 设置注册表 /// </summary> /// <param name="dllpath">dll的路径</param> /// <param name="rev">版本号,例如1.2</param> /// <returns>是否成功</returns> public static bool setDCKitRegedit(string dllpath, string rev) { RegistryKey acadKey = null; bool acad2010Installed = false; try { acadKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Autodesk\\AutoCAD\\R18.0\\ACAD-8001:804\\Applications", true); acad2010Installed = true; } catch (System.Exception ex) { //do nothing } if (!acad2010Installed) { MessageBox.Show("尚未安装AutoCAD 2010,请安装后再试"); return false; } acadKey.DeleteSubKey("DCKit", false); //写入注册表 RegistryKey dc = acadKey.CreateSubKey("DCKit"); //设为Ox01,告诉CAD这是托管程序 dc.SetValue("MANAGED", 1, RegistryValueKind.DWord); //"LOADCTRLS":控制程序随CAD加载的方式,设为Ox02随CAD启动一起加载 dc.SetValue("LOADCTRLS", 2, RegistryValueKind.DWord); //告诉CAD所要加载的程序的路径 dc.SetValue("LOADER", dllpath, RegistryValueKind.String); dc.SetValue("DEION", "DCKit Rev" + rev); return true; } |
代码的意义在注释中已有说明,不再多说。
原创文章,文章首发于:Riley Ge (@rileyge) — Steemit
原创文章,转载请注明: 转载自TsonTec:测量解决方案提供者
本文链接地址: AutoCAD.Net自定义菜单及自动加载
‘[HKEY_LOCAL_MACHINE/SOFTWARE/Autodesk/AutoCAD/R17.1/ACAD-6001:804/Applications/yd/Commands] ‘”AddMenu”=”AddMenu” 这句还是无法自动运行,addmenu命令
你的意思是加了这句之后无法自动运行吗?没太看明白你什么意思。
这种方法还是无法自动运行”AddMenu”自定义的命令,为什么呀,很急用
你上面一段是写在注册表文件里的吗?再就是第一行最后一个斜杠和之前那些不一致啊!在注册表里面和C#代码里面的斜杠方向不一致,但前后要统一吧。最好的办法是你打开注册表看看你想加的项有没有加上去,如果加上去了就说明你的自动加载代码没有问题。
看来我们还是同行,以后多多交流。
‘[HKEY_LOCAL_MACHINE\Software\Autodesk\AutoCAD\R17.1\ACAD-6001:804\Applications/yds] ‘”DESCRIPTION”=”加载自定义dll文件” ‘”LOADCTRLS”=dword:0000000c ‘”MANAGED”=dword:00000001 ‘”LOADER”=”F://C#//autocad二次开发//练习//AcdNextool//AcdNextool//bin//Debug//AcdNextool.dll” ‘[HKEY_LOCAL_MACHINE/SOFTWARE/Autodesk/AutoCAD/R17.1/ACAD-6001:804/Applications/yd/Commands] ‘”AddMenu”=”AddMenu”
过来看看你的博客,希望每天都更新一些文章。
无论是Lisp的方法还是用注册表的方法,除了加载DLL,都有执行命令的方法。如果仅仅想要自己加载菜单,不使用IExtensionApplication接口也可以。只需要在加载DLL后执行一个类似于ADDMENU的命令也可以。