从AutoCAD 2006开始引入dotnet的二次开发。在dotnet API出来之前,AutoCAD主要使用Lisp, VBA和ObjectArx进行二次开发。VBA和LISP虽然简单,但效率奇差,并且由于微软对VB的抛弃,VBA也最终会随之淡出,ObjectArx虽然强大,且效率很好,但C++语言较复杂,难于掌握,从而让很多非计算机科班出身的工程技术人员望而却步。Dotnet API出现填补了这一空白,利用微软近年来大力推广的dotnet平台进行二次开发,既容易上手,效率也远远高于Lisp和VBA,实际应用中不会比C++的ObjectArx逊色。并且也不需要另外下载object arx安装包,直接使用autcad目录下的几个dll就可完成,环境配置非常简单。但由于出来时间不久,目前dotnet进行CAD二次开发的资料并不多,有一个Object Arx编程站(
http://www.objectarx.net/),有相关的版块,可以去看看。下面详细介绍一下如何开始使用dotnet开发CAD。
用VS2005或2008新建一个类库项目,语言可以是C#或VB,目录随便选。然后在引用上面右键->添加,点浏览选项卡,找到autcad安装目录,选中acdbmgd.dll和acmgd.dll,确定。在要用到AutoCAD类库的地方,添加以下程序集的引用:
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
给类添加一个成员函数,并在成员函数前面加上导出命令的代码,这样该函数就可以直接在CAD的命令行中调用。
[CommandMethod("Hellonet")]
public void helloNet()
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
ed.WriteMessage("hello net");
}
然后就可以编译了。编译后生成一个dll,在debug目录下。在cad命令行里输入netload,选中刚刚生成的dll,就把这个dll加载进来了。现在就可以直接调用已经导出为命令的函数了,比如在命令行中输入Hellonet,也就是刚才我们写的一个简单的命令,CAD会在命令行中输出“hello net”。
实际开发中,我们需要进行调试,只要把acad.exe设为调试的外部执行程序就可以了。在工程属性面板里选择“调试”选项,在启动外部程序上选择autocad的可执行文件,同时设置工程目录为安装目录下面的UserDataCache(隐藏的)文件夹,如下图所示:
设置之后,就可以直接像调试一般程序那样,直接点击调试按钮,autocad会自动启动。然后用netload加载dll并调用命令,如果遇到断点,VS2005会停在断点的地方。
有两个地方要注意一下:
1. 如果某个类中有导出为命令的函数,一定要把类声明为public的。这样才能在cad里调用。否则会出现找不到命令。
2. 如果出现“检测到LoaderLock,正试图在OS加载程序锁内执行托管代码,不要尝试在DllMain或映像初始化函数内运行托管代码,这样会导致应用程序挂起。”的异常,可以不必理会,点运行,让它继续。当然也可以把这个异常去掉,方法是:
在"Debug(调试)"菜单下----"Exceptions(异常)"----"Managed Debugging Assistants"中勾掉"LoaderLock"。这个东西在调试时太麻烦,每次都要点,不要也罢。