![]() |
使用.net来创建一个局部cui文件并在autocad中装载它
使用.net来创建一个局部cui文件并在autocad中装载它
www.dimcax.com 使用.net来创建一个局部cui文件并在autocad中装载它 欢迎转载,但请注明出处,谢谢! 原文: 翻译:才鸟() 这一次我将使用不同的方法(在kean的另一篇文章里他使用了com的方法来加载菜单):利用autodesk.autocad.customization里的功能,通过编程来创建一个局部cui文件,把它保存到磁盘,并确保它在每一次autocad进程启动时被装载。我不准备把重点放在如何添加菜单等到autocad的列表——这留到下面的帖子——这篇帖子主要关心的是确保一个cui文件被创建和装载所需要的逻辑。下面是c#代码。俗话说得好,条条大路通罗马,但下面的代码可以确保我们的局部菜单被创建和加载。顺便说一句,为了使代码可以被编译,你必须把accui.dll作为一个引用项添加到你的项目中。 using autodesk.autocad.applicationservices; using autodesk.autocad.databaseservices; using autodesk.autocad.editorinput; using autodesk.autocad.runtime; using autodesk.autocad.geometry; using autodesk.autocad.customization; using system; using system.collections.specialized; namespace partialcui { public class commands : iextensionapplication { public void initialize() { buildmenucui(); } public void terminate() { } [commandmethod("bm")] public void buildmenucui() { const string mycuifile = "c:\\kean.cui"; const string mycuifiletosend = "c:/kean.cui"; const string mycuisecti; editor ed = application.documentmanager.mdiactivedocument.editor; string maincui = application.getsystemvariable("menuname") + ".cui"; customizationsection cs = new customizationsection(maincui); partialcuifilecollection pcfc = cs.partialcuifiles; if (pcfc.contains(mycuifile)) { ed.writemessage( "\ncustomization file \"" + mycuifile + "\" already loaded." ); } else{ if (system.io.file.exists(mycuifile)) { ed.writemessage( "\ncustomization file \"" + mycuifile + "\" exists - loading it." ); loadmycui(mycuifiletosend); } else { ed.writemessage( "\ncustomization file \"" + mycuifile + "\" does not exist - building it." ); // 为我们的局部菜单创建一个自定义区域(customization section) customizationsection pcs = new customizationsection(); pcs.menugroupname = mycuisectionname; // 添加一个带两个命令的菜单组 macrogroup mg = new macrogroup(mycuisectionname, pcs.menugroup); menumacro mm1 = new menumacro(mg, "cmd 1", "^c^ccmd1", "id_mycmd1"); menumacro mm2 = new menumacro(mg, "cmd 2", "^c^ccmd2", "id_mycmd2"); // 现在添加一个带两个项的下拉菜单 stringcollection sc = new stringcollection(); sc.add("pop15"); popmenu pm = new popmenu( mycuisectionname, sc, "id_mypop1", pcs.menugroup ); popmenuitem pmi1 = new popmenuitem(mm1, "pop cmd 1", pm, -1); popmenuitem pmi2 = new popmenuitem(mm2, "pop cmd 2", pm, -1); // 最后保存文件并重新载入它 pcs.saveas(mycuifile); loadmycui(mycuifiletosend); } } } private void loadmycui(string cuifile) { // 这个载入的技术是向命令行发送一个lisp字符串 // (这可以避免设置filedia为0) // 设置cmdecho为0后,尽量不显示回显信息。 // 我们要确保在最后重置lisp字符串的值 // (由于字符串的执行是非同步的,所以我们没有机会在调用的函数中来实现)。 document doc = application.documentmanager.mdiactivedocument; object oldcmdecho = application.getsystemvariable("cmdecho"); application.setsystemvariable("cmdecho", 0); doc.sendstringtoexecute( "(command \"_.cuiload\" \"" + cuifile + "\")(setvar \"cmdecho\" " + oldcmdecho + ")(princ) " , false, false, false ); } } } 下面是当我们第一次装载我们的模块时,发生的情况: command: netload customization file "c:\kean.cui" does not exist - building it. command: customization file loaded successfully. customization group: kean command: 下面是当我们再次手动运行命令"bm"(它会调用与上面相同的代码)时,发生的情况: command: bm customization file "c:\kean.cui" already loaded. command: 当局部菜单被创建和装载时,它应当在autocad启动时被自动装载——运行cuiload命令时可以看到: |
所有的时间均为北京时间。 现在的时间是 10:16 PM. |