AutoCAD自动加载.NET二次开发程序研究
2015-06-28万晓鸽
万晓鸽
(中色科技股份有限公司,河南洛阳471039)
AutoCAD自动加载.NET二次开发程序研究
万晓鸽
(中色科技股份有限公司,河南洛阳471039)
文章对如何自动加载.NET二次开发程序进行了研究,重点介绍了程序集、用户自定义菜单自动加载以及支持文件路径设置的设计思路和实现方法,实现了.NET二次开发程序自动加载,提高了工作效率,提升了用户体验。
AutoCAD;.NET;二次开发;自动加载
随着我公司AutoCAD二次开发的逐步深入和二次开发成果的推广,以前通过手动方式进行程序和菜单文件加载的部署方式,越来越无法满足实际需求。目前开发的AutoCAD应用程序不仅只包含dll(程序集)文件,还涉及到其它文件,如菜单文件、字体文件、绘图仪文件、图形文件、帮助文件等,而这些文件在dll程序调用的过程中,如果不能放到正确位置,程序将无法正确调用。
为了可靠、完整的交付应用程序,就需要制作安装程序,使得二次开发的dll文件能够被AutoCAD调用,同时自动加载自定义菜单,并将其它附属文件拷贝到指定位置以便二次开发程序能正常工作。通过Windows Installer可以方便的完成以上工作。本文结合实际阐述如何了制作AutoCAD二次开发软件安装程序,实现二次开发程序的自动加载。
1 实现原理
实现AutoCAD二次开发程序自动加载需要做如下工作:
1)使AutoCAD自动加载二次开发程序生成的dll文件;
2)加载自定义菜单,使用户可以方便使用二次开发程序。可以通过两种方法实现,一是在二次开发程序中通过COM的方式引入AcadApplication,从而调用菜单的相关功能实现菜单定义;二是建立符合自己要求的菜单文件,安装时在AutoCAD中使用“menuload”命令完成加载;
3) 添加和修改AutoCAD支持文件路径,通过修改注册表来设置和添加二次开发文件的支持路径;
4) 将二次开发程序包含的文件,如菜单、绘图仪、图元、线性和字体等拷贝到相应的位置。
通过Windows Installer可以方便的完成文件拷贝、注册表的修改工作(可参阅此工具软件的帮助文件)。下面将重点介绍完成二次开发程序自动加载主要需要解决的三个问题,dll自动加载、菜单文件的自动加载以及设置AutoCAD支持文件路径。
2 关键技术及实现方法
2.1 dll自动加载
自动加载.NET开发的DLL程序库需要修改注册表信息HKEY_LOCAL_MACHINE下的AutoCAD相应版本下的Application项,在其下面创建一个新项,设四个键值:
1)“DESCRIPTION”(应用程序描述),简单描述应用程序名称和功能等;
2)“LOADCTRLS”(加载控制),控制程序随AutoCAD加载的方式,设为0x02随AutoCAD启动一起加载。其它值,0x01为检测到代理对象后加载程序;0x02为当AutoCAD启动时加载序;0x04为当输入命令时加载程序;0x08为当有用户或其它程序请求时加载程序;0xl0为从不加载该程序;0x20为显式加载程序;
3)“LOADER”(应用程序路径),设置dll所在路径;
4)“MANAGED”(程序形式) ,对于托管的.NET程序需要将值设为0x01[1]。
以AutoCAD 2010下开发的图档管理程序(CNPTTD)为例,在HKEY_LOCAL_MACHINESOFTWAREAutodeskAutoCADR18.0ACAD-8001∶804Applications下创建CNPTTD项,并在该项下创建上述四个键值(如图1所示),重新启动AutoCAD时dll程序集会自动加载。
图1 注册表示例
2.2 菜单自动加载
AutoCAD.NET下常用的菜单加载方式有两种。
2.2.1 通过程序定义菜单
通过COM的方式引入AcadApplication,从而调用菜单的相关功能,在程序中添加自定义菜单。AutoCAD提供了一个IExtensionApplication接口,AutoCAD在加载托管程序的时候,会调用实现了此接口的类进行初始化操作(在程序集被卸载时也会调用此类,即在AutoCAD关闭时也会调用)。在此类里调用创建菜单的方法,即可让菜单在AutoCAD启动时自动加载。
2.2.2 利用lsp文件自动加载菜单
AutoLISP语言作为嵌入在AutoCAD内部的具有智能特点的编程语言,是开发应用AutoCAD不可缺少的工具。AutoLISP嵌入AutoCAD使用户充分利用AutoCAD进行二次开发,实现直接增加、修改AutoCAD的命令,随意扩大图形编辑功能,建立图形库和数据库并对当前图形进行直接访问和修改,开发CAD软件包等[2]。
通过lsp程序调用AutoCAD的menuload命令可以实现菜单加载,因此在编写好自定义菜单文件(.mns)和lsp程序之后,安装程序通过修改注册表的方式使lsp文件随AutoCAD启动自动加载即可实现菜单自动加载。
以上两种方式均可实现菜单自动加载,但第一种方法缺乏灵活性,一旦菜单需要修改时则需要修改应用程序,并且菜单在切换工作空间后会消失,第二种方法则不存在上述问题,因此采用第二种方法实现菜单自动加载。实现步骤如下:
(1)编写自定义菜单文件,定义图档管理系统的下拉菜单和工具条,如图2所示。其中***MENUGROUP定义的是自定义菜单的名称。
图2 菜单文件示例
菜单文件中的下拉菜单部分用“***POP1”~“***POP499”标签进行标识;而快捷菜单部分用“***POP0”和“***POP500”~“***POP999”进行标识。其中,POP0菜单部分定义缺省的对象捕捉快捷菜单,POP500~POP999菜单部分用来定义上下文相关快捷菜单。
下拉菜单项的定义中,标签项包含了该菜单项的菜单栏标题,以及定义菜单和子菜单项。
菜单文件中的工具栏部分用“***TOOLBARS”标签进行标识,该部分定义了工具栏的缺省布局和内容,以及每个菜单所定义工具栏的子菜单;
(2)编写lsp程序,加载自定义菜单文件,主要程序如下:
(if (not (menugroup "CNPTTDGLMENU"))
(command "menuload" "CNPTTDGL.mns")
)
判断自定义菜单是否已加载,如果未加载,执行“menuload”命令加载;
(3)通过修改注册表,使lsp文件在AutoCAD启动时自动加载并执行。首先,找到HKEY_CURRENT_USERSoftwareAutodeskAutoCADR18.0ACAD-8001∶804 Profiles的所有子项,循环遍历每个子项,找到键DialogsApploadStartup(如果键不存在,可以创建之),下面有两个值NumStartup和Startup,NumStartup表示一共有几个开始时自动加载的程序,然后是第一个程序1Startup,第二个程序2Startup,第三个程序……依次类推。把NumStartup增加1,然后自己添加一项NStartup(N表示lsp文件的NumStartup值);
其次,为了保证lsp程序能加载,还需要通知AutoCAD启动时加载lsp文件。找到,读取HKEY_CURRENT_USERSSoftwareAutodeskAutoCADR18.0ACAD-8001∶8004ApplicationAcadApploadLoadCtrls的值,将这个值与2作“或”运算,再写回。这样可以保证AutoCAD启动时会加载lsp文件,从而自动加载自定义菜单。
2.3 设置支持文件路径
为了保证自定义菜单能正常加载,且所有菜单功能正常使用,还必须在AutoCAD系统设置的支持文件路径下添加用户自定义文件的路径。找到HKEY_CURRENT_USERSoftwareAutodeskAutoCADR18.0ACAD-8001∶804Profiles的所有子项,循环遍历每个子项,找到键General,在值ACAD中添加菜单文件所在路径即可。
添加支持文件的路径关键是如何保留原来系统的支持文件路径不变的情况下,加入自定义文件路径。要先获取AutoCAD当前支持路径并保存下来,添加支持文件路径后,再写回,这样可以保证原来的路径不丢失。
3 结束语
通过本文的方法可以实现AutoCAD启动后自动加载程序集、菜单文件并且保证其它用户自定义文件被程序正常调用。使用本方法制作的“图档管理”安装软件经过公司多部门实践检验,完全可以实现AutoCAD二次开发程序的自动安装,使原本繁琐的人工配置操作在很短的时间内即可自动完成,简化了安装步骤,提高了工作效率。
[1] 李冠亿.深入浅出AutoCAD.NET二次开发[M].中国建筑工业出版社,2012:
[2]李保风,郭建林,郭安.AutoCAD 自动加载.NET程序集新探[J].安阳工学院学报,2012,11(4):57-60.
Study of Autoloading .NET Secondary Development Program into AutoCAD
WAN Xiaoge
(China Nonferrous Metals Processing Technology Co., Ltd., Luoyang 471039, China)
The paper studied the method of autoloading .NET secondary development program; it presented the design and implementation of autoloading assembly and user-defined menu, as well as setting support file path, enabling .NET secondary development program to autoload so as to improve operational efficiency and users’ experience.
AutoCAD; .NET; secondary development; autoloading
2014-12-02
万晓鸽(1983-),女,硕士,工程师,主要从事计算机软件开发工作。
TP311.52
B
1671-6795(2015)05-0057-03