CAD二次开发,有很多不同层次的语言和库可供选择。

首先是VisualLisp和AutoLisp。Lisp是一门历史悠久的函数式编程语言,很多概念和C这种过程式语言不一样,据说他在人工智能等方面有广泛的应用。

CAD引入了这种语言,给他添加相应的函数库,就成了命令行使用的AutoLisp。在此基础上再增加关于对话框和窗口界面的库,就是VisualLisp,简称VL。VL在CAD中可以视为CAD命令的整合,是脚本语言,而且由CAD程序提供了编写环境。因此上手相当容易,便于编写,调试也很方便。

不过由于是脚本语言,就有两大缺陷。第一是速度,当程序规模很大或是操作的对象数量过多时,你会明显感觉到迟钝。第二是功能。如果有什么功能是命令本身做不到的,那VL也做不到。譬如关于自定义对象、内存操作、数据传递之类,往往要通过别的方法解决。所以我个人认为Lisp适用于把现有命令组合成一个新命令来使用,尤其是存在大量重复操作的时候,用来做批处理非常好。唯一让人感到不适的是,由于Lisp语言本身的语法要使用大量的圆括弧,当嵌套层次较深时,往往会在括弧的配对上发生问题。

第二大类是使用ActiveX和VB。ActiveX是Microsoft提出的一组使用COM(Component Object Model,部件对象模型)使得软件部件在网络环境中进行交互的技术集。ACAD使用Acitvex把数据传送给ActiveX程序,程序处理后再传回ACAD。这个过程有点像浏览器浏览动态网站。AcitveX与具体的编程语言无关,因此理论上说可以用任何一种支持他的语言来编写,但通常大家选择VB语言。VBA是VB的特殊形式,他将VB植入到应用程序中。ACAD包含的VBA能够和CAD共享地址空间,而独立的VB则需要通过接口完成。这种方法在编写上比Lisp复杂,调试也困难。但速度快,功能更强劲。但是在某些对速度要求相当高的运算和涉及CAD内部的应用上仍然会显得力不从心。对于熟悉VB语言又不想学习Lisp奇怪语法的开发者来说,这是不错的选择。

此外,从目前的趋势来看,AutoDesk有全面转到.net平台的趋势,ActiveX和VB看来也将会被他的继任者取代,似乎是VB.net/C#和ObjectARX Managed wrapper classes的组合,具体情况观望中。

第三大类就是ADS ARX 和ObjectARX。ADS是AutoDesk从ACAD R11开始提供的C编程环境。它具有C的一切优点,又能操作CAD。但他和ActiveX类似是通过管道通讯的。ARX(AutoCAD Runtime eXtension)是在ADS基础上发展的面向对象的环境,使用C++语言。最终ARX进化为ObjectARX,他完全面向对象,并且是以dll(动态链接库)的形式共享CAD的地址空间。由于先前的ARX已被包含为子集,人们也就简称ObjectARX为ARX。在CAD2006以前,只能使用C++语言和VC编译器来生成ObjectARX程序。但目前已经可以使用VB.net C# C++等语言配合VisualStudio.net编译器来生成ARX程序了。

用ARX所编出的程序,在载入后就与ACAD在同一代码区,共享全部数据区,能够直接对CAD内部的数据做任何的操作,因此具有极高的执行效率和强大的功能。即使AutoCAD系列软件自身,在编制完成了程序的基本功能之后,其他大量的内部命令其实也是用ARX实现的。你可以通过察看安装好的CAD程序目录中的那些数目众多的arx文件来领会这一点。这就充分说明了ARX的彪悍,不需要再举例子。

天上不会掉馅饼,这个方式的代价就是难度提高了。首先C++语言本身就很复杂(VB.net和C#也不方便到哪里去),再配上复杂度不相上下的ObjectARX库,如果要写出切实可用的程序,还要深入了解CAD本身的结构。即使是开发很小的功能,也要有很多的工作要做。调试的工作,需要启动VC和CAD这两个大家伙,数据量大的时候会让你发狂的。丰厚的回报还有高风险相伴,由于已经和CAD融为一体,ARX程序的错误会直接影响到CAD。象内存泄漏这种常见而又高危的情况,很有可能会把CAD直接搞垮。所以对于程序的安全有着更高的要求。

除了语言、功能、编写和调试的难度之外,这三种方式还有CAD版本匹配的问题。Lisp程序的适合度最好,即使是为AutoCAD r12开发的程序,在CAD2007中仍然能够使用。而ARX则正相反,为CAD2002编写的程序就已经不能在2004下运行了。为旧版CAD编写的ARX程序的源代码可以不需要修改或修改较少,但必须连结新版本的ARX库重新编译,才能被新版本载入运行。而且,不同版本的ARX库还指定了不同版本的编译器。譬如,CAD2000/2002版应使用VC6,CAD2004/2005就需要使用VC.net 2002,而CAD2007则需要VC.net 2005。而VB则介于这两者之间。这个问题往往会把新手搞糊涂,必须参阅相关开发文档。

开发中使用什么语言,并不完全决定于我们。规模、资金、时间甚至用户的习惯才是考虑的关键。大型系统往往综合运用这三种方式,天正软件就是一个典型。我个人建议尝试搞CAD二次开发的人都该先好好看天正的那些东西。