• c# 自动生成 autocad cuix


    定义自定义类,用于表达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);
  • 相关阅读:
    php微信支付v3版签名生成,代金券、微信支付分、支付即服务等
    docker基本命令及搭建php环境
    Nginx 负载均衡搭建
    laravel4.2 union联合,join关联分组查询最新记录时,查询条件不对,解决方案
    抓取腾讯视频弹幕
    laravel4.2 Redis 使用
    201771010106-东文财 实验一 软件工程准备-<构建之法与博客首秀>
    东文财201771010106《面向对象程序设计(java)》.18
    东文财201771010106《面向对象程序设计(java)》17
    201771010106东文财《面向对象程序设计(java)》实验16
  • 原文地址:https://www.cnblogs.com/NanShengBlogs/p/13741611.html
Copyright © 2020-2023  润新知