定义自定义类,用于表达cad netapi生成的命令
1 public class myAutoCADNetCmd 2 { 3 public string DllName { get; set; } 4 public string className { get; set; } 5 public string MethodName { get; set; } 6 public string cmdName { get; set; } 7 public string HelpString { get; set; } 8 public string IcoName { get; set; } 9 public myAutoCADNetCmd(string _dllName, string _clsName, string _meName, string _cmdName, string _helpStr, string _icoName) 10 { 11 this.DllName = _dllName; 12 this.className = _clsName; 13 this.MethodName = _meName; 14 this.cmdName = _cmdName; 15 this.HelpString = _helpStr; 16 this.IcoName = _icoName; 17 } 18 } 19 20 /// <summary> 21 /// 按程序集 22 /// </summary> 23 public class myAutoCADNetDll 24 { 25 public string DllName { get; set; } 26 public List<myAutoCADNetClass> ListsNetClass { get; set; } 27 public myAutoCADNetDll(Assembly ass, List<myAutoCADNetCmd> ListCmds) 28 { 29 this.ListsNetClass = new List<myAutoCADNetClass>(); 30 this.DllName = ass.ManifestModule.Name.Substring(0, ass.ManifestModule.Name.Length - 4); 31 var cmdsByDll = ListCmds.Where(c => c.DllName == this.DllName).ToList(); 32 List<string> clsNames = new List<string>(); 33 foreach (myAutoCADNetCmd item in cmdsByDll) if (!clsNames.Contains(item.className)) clsNames.Add(item.className); 34 35 foreach (string clsName in clsNames) 36 { 37 var netCls = new myAutoCADNetClass(this.DllName, clsName, cmdsByDll); 38 if (netCls.hasCmds) netCls.GetListCmds(cmdsByDll); 39 if (netCls.ListsNetcmds != null) ListsNetClass.Add(netCls); 40 } 41 } 42 } 43 44 /// <summary> 45 /// 程序集下按类分类命令 46 /// </summary> 47 public class myAutoCADNetClass 48 { 49 public string className { get; set; } 50 public string dllName { get; set; } 51 public List<myAutoCADNetCmd> ListsNetcmds { get; set; } 52 public bool hasCmds { get; set; } 53 public myAutoCADNetClass(string _dllName, string _clsName, List<myAutoCADNetCmd> ListCmds) 54 { 55 this.className = _clsName; 56 this.dllName = _dllName; 57 if (ListCmds.Count(c => c.DllName == this.dllName && c.className == this.className) > 0) hasCmds = true; else hasCmds = false; 58 } 59 public void GetListCmds(List<myAutoCADNetCmd> ListCmds) 60 { 61 if (this.hasCmds) 62 { 63 this.ListsNetcmds = ListCmds.Where(c => c.DllName == this.dllName && c.className == this.className).ToList(); 64 } 65 else this.ListsNetcmds = null; 66 } 67 }
导出dll文件的命令
1 List<myAutoCADNetDll> listDllcmd = GetACADNetDllCmd(localDlllist);
通过反射机制导出AutoCAD Net Dll的注册的命令
1 /// <summary> 2 /// 通过反射机制导出AutoCAD Net Dll的注册的命令 3 /// </summary> 4 /// <param name="ass">包含AutoCAD Net Dll的注册的命令的Dll</param> 5 /// <returns></returns> 6 public List<myAutoCADNetDll> GetACADNetDllCmd(List<string> dllFileNames) 7 { 8 List<myAutoCADNetDll> listDlls = new List<myAutoCADNetDll>(); 9 #region//收集自定义命令 10 try 11 { 12 foreach (var item in dllFileNames) 13 { 14 Assembly ass = Assembly.LoadFrom(item); 15 List<myAutoCADNetCmd> ListCmds = new List<myAutoCADNetCmd>(); 16 foreach (var t in ass.GetTypes()) 17 { 18 if (t.IsClass && t.IsPublic) 19 { 20 foreach (MethodInfo method in t.GetMethods()) 21 { 22 if (method.IsPublic && method.GetCustomAttributes(true).Length > 0) 23 { 24 CommandMethodAttribute cadAtt = null; myAutoCADcmdAttribute myAtt = null; 25 foreach (var att in method.GetCustomAttributes(true)) 26 { 27 if (att.GetType().Name == typeof(CommandMethodAttribute).Name) cadAtt = att as CommandMethodAttribute; 28 if (att.GetType().Name == typeof(myAutoCADcmdAttribute).Name) myAtt = att as myAutoCADcmdAttribute; 29 } 30 if (myAtt != null && cadAtt != null) 31 { 32 ListCmds.Add(new myAutoCADNetCmd(Path.GetFileNameWithoutExtension( 33 ass.ManifestModule.Name.Substring(0, ass.ManifestModule.Name.Length - 4)), 34 t.Name, method.Name, cadAtt.GlobalName, myAtt.HelpString, myAtt.IcoFileName)); 35 } 36 else 37 { 38 if (cadAtt != null && myAtt == null) 39 { 40 ListCmds.Add(new myAutoCADNetCmd(Path.GetFileNameWithoutExtension( 41 ass.ManifestModule.Name.Substring(0, ass.ManifestModule.Name.Length - 4)), 42 t.Name, method.Name, cadAtt.GlobalName, "", "")); 43 } 44 } 45 } 46 } 47 } 48 } 49 if (ListCmds.Count > 0) 50 { 51 listDlls.Add(new myAutoCADNetDll(ass, ListCmds)); 52 } 53 } 54 } 55 catch (System.Exception ex) 56 { 57 Application.ShowAlertDialog(ex.Message); 58 } 59 #endregion 60 return listDlls; 61 }
生成cuix文件
1 public void AddMenusToAutoCAD(List<myAutoCADNetDll> dicCmds) 2 { 3 string strCuiFileName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\KFWH_CMD.cuix"; 4 string strGpName = "KFWH_CMDGroup";//defined a group name 5 CustomizationSection myCsec = new CustomizationSection() { MenuGroupName = strGpName }; 6 MacroGroup mg = new MacroGroup("KFWH_CMD", myCsec.MenuGroup); 7 StringCollection scMyMenuAlias = new StringCollection(); 8 scMyMenuAlias.Add("KFWH_CMD_POP"); 9 PopMenu pmParent = new PopMenu("KFWH_CMD", scMyMenuAlias, "KFWH_CMD", myCsec.MenuGroup); 10 foreach (var dll in dicCmds)//each assembly commmands 11 { 12 PopMenu pmCurDll = new PopMenu(dll.DllName, new StringCollection(), "", myCsec.MenuGroup); 13 PopMenuRef pmrdll = new PopMenuRef(pmCurDll, pmParent, -1); 14 foreach (var cls in dll.ListsNetClass) 15 { 16 if (cls.hasCmds) 17 { 18 PopMenu pmCurcls = new PopMenu(cls.className, new StringCollection(), "", myCsec.MenuGroup); 19 PopMenuRef pmrcls = new PopMenuRef(pmCurcls, pmCurDll, -1); 20 foreach (var cmd in cls.ListsNetcmds) 21 { 22 MenuMacro mm = new MenuMacro(mg, cmd.MethodName, cmd.cmdName, cmd.DllName + "_" + cmd.className + "_" + cmd.cmdName, MacroType.Any); 23 //指定命令宏的说明信息,在状态栏中显示 24 if (cmd.HelpString != string.Empty) mm.macro.HelpString = cmd.HelpString; 25 if (cmd.IcoName != string.Empty) mm.macro.LargeImage = mm.macro.SmallImage = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\KFWH_CMD_ICON\" + cmd.IcoName; 26 //指定命令宏的大小图像的路径 27 PopMenuItem newPmi = new PopMenuItem(mm, cmd.MethodName, pmCurcls, -1); 28 //newPmi.MacroID = cmd.DllName + "_" + cmd.className + "_" + cmd.cmdName; 29 } 30 } 31 } 32 } 33 //myCsec.MenuGroup.AddToolbar("kfwh_cmd"); 34 if (myCsec.SaveAs(strCuiFileName)) this.mycuiFileName = strCuiFileName; 35 }
加载cuix
1 if (this.mycuiFileName != string.Empty) Application.LoadPartialMenu(this.mycuiFileName); 2 Application.SetSystemVariable("MENUBAR", 1);