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 = ; i < app.MenuGroups.Item().Menus.Count; i++)
{
if (app.MenuGroups.Item().Menus.Item(i).Name == "我的菜单Com") //判断菜单是否已存在,如果存在则不再创建
return;
}
AcadPopupMenu pmParnet = app.MenuGroups.Item().Menus.Add("我的菜单"); //添加根菜单
//多级
AcadPopupMenu pm = pmParnet.AddSubMenu(pmParnet.Count + , "打开");
AcadPopupMenuItem pmi0 = pm.AddMenuItem(pm.Count + , "文件 ", "OPEN1\n"); //第一个参数是在菜单项中的位置(第几项),第二个参数是显示的名称,第三个参数是点击之后执行的命令
AcadPopupMenuItem pmi1 = pm.AddMenuItem(pm.Count + , "模版 ", "OPEN2\n");
//单级
AcadPopupMenuItem pmi2 = pmParnet.AddMenuItem(pmParnet.Count + , "退出 ", "EXIT\n");
//将创建的菜单加入到CAD的菜单中
pmParnet.InsertInMenuBar(app.MenuBar.Count + );
}
将项目生成之后,启动CAD2008,输入命令:netload,然后找到我们生成的dll进行加载,加载完成之后,输入命令SMM,不出意外的话,就可以看到我们的菜单了(如果CAD提示找不到命令,可能是CAD出了问题,可以修复一下)。
以下是运行后的效果:

到了这里,也许你可以还有另一个要求:我不想每次都要输入命令才能加载菜单,我想让CAD启动时自动加载菜单。
这个是很好实现的:
1、写入注册表项
我们的自定义程序集有一种启动方式是注册表启动,让CAD根据注册表信息去加载我们的程序集。
在注册表项:LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD中记录了本机安装的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必须有。
完整的测试代码下载:点击这里
AutoCAD.NET二次开发:创建自定义菜单(COM)的更多相关文章
- 微信公众号开发——创建自定义菜单(PHP版)
<?php include "TokenUtil.php"; //TokenUtil::build_access_token(); $access_token = Token ...
- AutoCAD.NET二次开发:创建自定义菜单(AcCui)
从CAD2007之后,Autodesk提供了一个新的程序集AcCui.dll,使用这个程序集,我们可以方便地做一些界面方面的操作,比如创建自定义菜单. 下面介绍一下菜单的创建过程: 1.在项目中添加引 ...
- .NET微信公众号开发-2.0创建自定义菜单
一.前言 开发之前,我们需要阅读官方的接口说明文档,不得不吐槽一下,微信的这个官方文档真的很烂,但是,为了开发我们需要的功能,我们也不得不去看这些文档. 接口文档地址:http://mp.weixin ...
- .NET开发微信公众号之创建自定义菜单
一.简介 微信公众平台服务号以及之前成功申请内测资格的订阅号都具有自定义菜单的功能.开发者可利用该功能为公众账号的会话界面底部增加自定义菜单,用户点击菜单中的选项,可以调出相应的回复信息或网页链接.自 ...
- 利用C#进行AUTOCAD的二次开发
众所周知,对AutoCAD进行二次开发用到的主要工具有:ObjectArx,VBA,VLisp.但它们的优缺点是显而易见的:ObjectArx功能强大,编程效率高,但它的缺点是编程者必须掌握VC++, ...
- 2、Arx二次开发创建第一个应用程序
一.本节课程 Arx二次开发创建第一个应用程序 二.本节要讲解的知识点 1.手动创建ARX的应用的步骤. 2.应用向导创建ARX应用程序的步骤. 三.具体内容 1.需求:创建一个Hello World ...
- PHPCMS V9二次开发便捷自定义后台入口文件夹
phpcms v9二次开发便捷自定义后台入口文件夹 最新发布的phpcms v9由于采用了mvc的设计模式,所以它的后台访问地址是固定的,虽然可以通过修改路由配置文件来实现修改,但每次都修改路由配置文 ...
- 微信公众平台创建自定义菜单的PHP代码
授人以鱼不如授人以渔.在方倍工作室上问了一下,创建自定义菜单的代码多少钱,一张口就一百,好吧,那我就给你们一人省一百块钱吧,你们说该如何谢谢我?事先说明一下啊,你的PHP版本要高于4.0.2才支持cU ...
- 4、c++ Arx二次开发创建多段线
一.本节课程 c++ Arx二次开发创建多段线 二.本节要讲解的知识点 如何应用C++ ARX二次开发创建多段线(AcDbPolyline.AcDb2dPolyLine.AcDb3dPolyline的 ...
- 微信利用PHP创建自定义菜单的方法
在使用通用接口前,你需要做以下两步工作:1.拥有一个微信公众账号,并获取到appid和appsecret(在公众平台申请内测资格,审核通过后可获得)2.通过获取凭证接口获取到access_token注 ...
随机推荐
- MyBatis学习总结3-优化MyBatis配置文件
连接数据库配置优化 可以将数据库连接配置信息卸载conf.xml中,但是为了优化连接,专门写一个properties用于存数据库连接信息,然后在conf.xml中进行引用,里面包括数据库驱动,地址,用 ...
- BZOJ 1000: A+B Problem
问题:A + B问题 描述:http://acm.wust.edu.cn/problem.php?id=1000&soj=0 代码示例: import java.util.Scanner; p ...
- C#获取网页中某个元素的位置,并模拟点击
我们在开发中,往往要得到网页中某个元素的位置,并且点击它.要模拟一次鼠标点击并不难,只要调用一个API就行了,关键就是怎么样得到这个元素的位置,还有判断是否要滚动滚动条,要滚动多少行能让元素显示出来. ...
- Linux LiveCD 的制作
Knoppix,只需一张光盘, 就能够让我们在任何场所,随心所欲地使用 Linux1, 打破了操作系统只能先安装再使用的传统概念. Knoppix 最初的设计用途是教学,但由于这项技术很受欢迎,使得 ...
- asp.net的decimal保留两位小数
C#的decimal保留两位小数 方法一: decimal d = 46.28111; string dStr = Math.Round( d,2 ).ToString(); 结果:dStr = 46 ...
- 省常中模拟 Test2 Day2
two 模拟 大意:给你一个 N 位二进制数,有四种操作:加1.减1.乘2.整除2.给定一个操作序列,求最终结果.N <= 5*10^6.数据保证不会在最高位上进行进位或退位操作. 初步解法:由 ...
- h.264码流解析_一个SPS的nalu及获取视频的分辨率
00 00 00 01 67 42 00 28 E9 00 A0 0B 77 FE 00 02 00 03 C4 80 00 00 03 00 80 00 00 1A 4D 88 10 94 0 ...
- jvm内部现成运行
hi,all 最近抽时间把JVM运行过程中产生的一些线程进行了整理,主要是围绕着我们系统jstack生成的文件为参照依据. 前段时间因为系统代码问题,造成性能瓶颈,于是就dump了一份stack出来 ...
- 【转】开始iOS 7中自动布局教程(一)
原文网址:http://www.cocoachina.com/industry/20131203/7462.html 原文:Beginning Auto Layout Tutorial in iOS ...
- 基于Spring AOP实现对外接口的耗时监控
AOP是Spring的核心,Spring不但自身对多种框架的集成是基于AOP,并且以非常方便的形式暴露给普通使用者.以前用AOP不多,主要是因为它以横截面的方式插入到主流程中,担心导致主流程代码不够清 ...