zoukankan      html  css  js  c++  java
  • AutoCAD.NET二次开发:创建自定义菜单(COM)

    当我们要在CAD中创建自定菜单时,可以引用COM组件来实现。

    下面是实现方式:

    1、新建类库项目,并引用CAD目录(我这里用的是CAD2008)下的acdbmgd.dll、acmgd.dll,并将引用属性中的“复制本地”设为False。

    2、添加Com引用:AutoCAD 2008 Type Library。

    3、创建类“Main.cs”,并在类头部命名空间上加上修饰:

    [assembly: CommandClass(typeof(AutoCAD_PopMenuTestCom.Main))]

      这样做是为了让CAD更空间找到我们的程序集。

    4、以下是实现代码:

    [CommandMethod("SMM")]
    public void ShowMyMenu()
    {
      //获取CAD应用程序   AcadApplication app = (AcadApplication)Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication;   for (int i = 0; i < app.MenuGroups.Item(0).Menus.Count; i++)   {     if (app.MenuGroups.Item(0).Menus.Item(i).Name == "我的菜单Com") //判断菜单是否已存在,如果存在则不再创建       return;   }   AcadPopupMenu pmParnet = app.MenuGroups.Item(0).Menus.Add("我的菜单"); //添加根菜单   //多级   AcadPopupMenu pm = pmParnet.AddSubMenu(pmParnet.Count + 1, "打开");   AcadPopupMenuItem pmi0 = pm.AddMenuItem(pm.Count + 1, "文件 ", "OPEN1 "); //第一个参数是在菜单项中的位置(第几项),第二个参数是显示的名称,第三个参数是点击之后执行的命令   AcadPopupMenuItem pmi1 = pm.AddMenuItem(pm.Count + 1, "模版 ", "OPEN2 ");   //单级   AcadPopupMenuItem pmi2 = pmParnet.AddMenuItem(pmParnet.Count + 1, "退出 ", "EXIT ");   //将创建的菜单加入到CAD的菜单中   pmParnet.InsertInMenuBar(app.MenuBar.Count + 1); }

      将项目生成之后,启动CAD2008,输入命令:netload,然后找到我们生成的dll进行加载,加载完成之后,输入命令SMM,不出意外的话,就可以看到我们的菜单了(如果CAD提示找不到命令,可能是CAD出了问题,可以修复一下)。

      以下是运行后的效果:

      

      

      到了这里,也许你可以还有另一个要求:我不想每次都要输入命令才能加载菜单,我想让CAD启动时自动加载菜单。

      这个是很好实现的:

      1、写入注册表项

      我们的自定义程序集有一种启动方式是注册表启动,让CAD根据注册表信息去加载我们的程序集。

      在注册表项:LOCAL_MACHINESOFTWAREAutodeskAutoCAD中记录了本机安装的CAD的信息,如下图:

        

      而展开RX.X项,下面的一级如果后缀是804表示的是中文版,409表示的是英文版:

      

      继续展开找到Applications项,我们要在Applications下面建一个属性我们自己的程序集的项,比如我这里建的是“MyMenuTestCom”。

      然后给我们新建的项添加四个值:

    类型
    DESCRIPTION REG_SZ(字符串) 简介说明
    LOADCTRLS REG_DWORD(数字)

    加载方式:

    0x01:当代理对象被检测到时加载程序

    0x02:当AutoCAD启动时加载程序

    0x04:当输入命令时加载程序

    0x08:当有用户或别的程序请求时加载程序

    0x10:从不加载该应用程序

    0x20:显式加载该应用程序

    LOADER REG_SZ(字符串) dll路径
    MANAGED REG_DWORD(数字) 是否是拖管程序集:1=是

      这样在CAD启动时就会自动加载我们的dll了,但是这还不够。

      2、实现IExtensionApplication接口

      CAD提供了一个IExtensionApplication接口,CAD在加载托管程序的时候,会调用实现了此接口的类进行初始化操作(在程序集被卸载时也会调用此类,即在CAD关闭时也会调用)。我们可以在这个类里调用我们创建菜单的方法,即可让我们的菜单在CAD启动时自动加载。

    public class Init : IExtensionApplication
    {
      #region IExtensionApplication 成员
      //在程序集初始化时
      public void Initialize()
      {
        //在程序集被初始化时,执行创建菜单操作,再配合注册表设置可以实现菜单的自动加载
        Main main = new Main();
        main.ShowMyMenu();
      }
      //在程序集被卸载时(也可以理解为CAD关闭时)
      public void Terminate()
      {
                
      }
    
      #endregion
    }

      关闭IExtensionApplication更多的介绍可以看这里,但是对于该文章中提到的一点经过实践并不正确,也可能是意思并不明确:

      2.[assembly: ExtensionApplication(typeof(ManagedApp.Init))]

      上面表示ExtensionApplication属性,CAD首先查找它标志的类来初始化,如果没有找到,就找如上面public class Init :IExtensionApplication 实现了IExtensionApplication的类,如果还是没有找到,就跳过初始化。所以上面[assembly:ExtensionApplication(typeof(ManagedApp.Init))]public class Init : IExtensionApplication后面的IExtensionApplication写上一处就可以了。

      经过实践证明,[assembly:ExtensionApplication(typeof(ManagedApp.Init))]可有可无,但是public class Init : IExtensionApplication后面的IExtensionApplication必须有。

     

      完整的测试代码下载:点击这里

     

  • 相关阅读:
    装饰器和迭代器
    闭包函数
    函数对象
    Python函数
    函数的基本使用
    文件处理
    量化策略
    Android--生命周期
    算法转AI平台工程师记录-0
    python3.6安装
  • 原文地址:https://www.cnblogs.com/bomb12138/p/3607929.html
Copyright © 2011-2022 走看看