1、CAD 二次开发教程汇总选择 AutoLISP 还是 VBA?我听到许多关于这样的问题。AutoLISP 与 VBA 有什么不同呢?我要学习怎样二次开发 AutoCAD,但我不能确定先学哪一个工具。哪一个工具更好呢?简洁的回答是他们都好,你应当两者都学。分析我的回答,你可以知道这不是最快的解决办法,但在你做出一个完整的决定前,一个完整的回答需要时间和更多的问题。举个例子:你懂 BASIC 吗?如果你懂,那么 VBA 学起来会更快一些;如不懂 BASIC,那么你学过其它的编程语言吗?如果你学的正好是 FORTRAN 或 PASCAL 的话,那也很好。因为如果你已掌握了这两种语言,则 VBA 的学
2、习将十分简单。如果你一点儿也不懂程序设计语言,那么 AutoLISP 将会是适合你学习的语言。如果你正好没有程序设计的知识和经验,那么在 AutoCAD 里你应当学习什么语言?这个问题很难回答。这取决于你希望完成什么样的工作?每种语言都有其优点和缺点,AutoLISP 擅长建立新命令和产生已有命令的连接。VBA 擅长执行包括在其他应用程序中的组件,如 Microsoft 的 Excel 和 Access。AutoLISP 是基于表处理的编程体系,它允许程序员随意地存储和操作传送信息,然而 VBA 部件包括数据和对复杂情况的各种有效操作,这就是问题变得复杂的地方,除非你已真正懂得这些工具的好处,
3、否则,很难回答你应该选择哪一个,但你应当知道你想完成什么和允许完成什么,因为它将引导你向正确的解决方法前进。稍后,你会发现这一简洁的回答是恰当的,你将会学习两种语言,你要做的一些事,可以在 AutoLISP 中用十分简单的几行代码来解决。另一方面,你会发现 VBA 提供了一些最简捷的应用程序解决方案。例如,建立一个复杂的包括许多对话框的应用,AutoLISP 支持对话框,但是不如 VBA 支持的程度强,同时,在 AutoCAD 中一个任务的情况下,VBA提供在对象级别上访问 AutoCAD 系统,但它对 AutoCAD 的一些基本命令的支持性并不是很好,而 AutoLISP 在这一点上却做的很
4、好。这两种语言不具有很好的兼容性,这种情况是必然的,就是说,你不能把在 AutoLISP中写的东西放到 VBA 中随意使用,反之亦然。我并不是说这种情况不可能的,但却是很难以实现。最低限度是,一但你选择了一种语言来设计程序,你就不可能中途又用另一种语言来解决程序中的问题,你不得不继续使用你最初选择的语言。那么,让我们从学术角度讨论一些两种语言间的不同之处。前面提到的 AutoLISP 是综合了逻辑结构与传统 AutoLISP 命令的一个完美工具,你能组合 AutoCAD 命令并放在一个有条件的逻辑脚本里,而产生强有力的自定义命令,这些命令能被用于自动操作通常的任务,也能解决计算问题而得到一个结
5、果。基于命令种类的思想比目标角度的思想更简单,一个清楚直接指出不同点的例子:在一个多义线对象里打断编辑方法。如果你要打断一条多义线,你必须先计算并重新更新这个物体,Extend 和 Trim 命令也一样。这些命令现在还并不包含在 AutoCAD 对象系统的实体对象编辑方法中。在不久它们会随时出现,这就是对象的好处。在许多情况下,对象级的处理比命令方式更高级。当你执行一个命令时,你有可能可以也有可能不可以直接操作你所选取的对象。因为你必须依赖于 AutoCAD 的对象选择机制。对象不是模糊不清的。当你专门指定一个对象时,对你要操作的对象,它是很清楚的。对象级别的处理在 VisualLISP 也可
6、实现。使用 VisualLISP 中的(VL )扩展,你能改变对象的参数且在需要时调用对象的方法。你不得不使用对象引用,它可以从已有的实体名或直接产生的对象中生成,在大多数情况下,一个有经验的 AutoLISP 程序员不需要使用这些对象,但迟早它们会派上用场。/ E! m( |“ j! u“ C4 RVisualLISP 的另一优点是比 VBA 更接近 AutoCAD 系统。VBA 不是由 AutoCAD 产生的,它是在其它的环境下同样工作的一个附加的语言,象 Microsoft 的 Word 和 Excel 一样。它也类似于在 AutoCAD 中用 VB(Visualbasic )语言编制程
7、序的方法。 VisualLISP 仅在AutoCAD 里运行,它的优势是软件间有着密切的工作关系。当在命令行里提示用户时,你能发现一个不同点的例子。在 VisualLISP 里,你可以使用 PROMPT 或 PRINT 语句。在VBA 里,你必须使用 Prompt 方法,这是优化对象的一部分,也是绘制对象的一部分,下面的几行代码将对 AutoCAD 命令行发出一个提示。第一行为 VisualLISP 语言;第二行用的是 VBA。有两件事显而易见,在 VisualLISP 里,在命令行窗口中, “n”使光标跳到新的一行。VBA 使用 Chr$(10)功能,必需把它放在使用“ Q4 p0 Z9 6
8、 G在 AutoLISP 中,可使用 PRINT 语句,在生成值前, “n”使顺序转到新的一行开始。PRINT 的另一个特点是可以输出任何数据类型,而 PROMPT 功能只能处理字符串。在 VBA 里,对于优化对象的方法和 AutoLISP 里的“GET”函数一样,你必须一直使用字符串。AutoLISP 包括几种不同的把你要使用的数据类型转化成字符串型的函数。RTOS 把数值型转化成字符串型;ITOA 把数值型转化成整数型。 VBA 提供两个数据转换函数:STR 和 FORMAT。当转化一个非负数时, STR 函数返回一个精确的字符串,即在字符串前加上一个空格。这就是,str(-1.1)返回字
9、符串 “-1.1”,str(1.1)结果是“1.1” 。FORMAT 允许你设立特别的转换格式。对正在学习 VBA 的人,可利用在线帮助查看有关该函数的帮助,它提供了大量的例子来演示数据是怎样被转化产生的。对于 AutoCAD 的定制来说,由于 AutoLISP 语言是以命令的标准建立的,这促进了偏向于支持 AutoLISP 的尺度。你能使用 AutoLISP 中带“C :”作为新命令名称的头两个字符的方式来定义函数,该命令就像 AutoCAD 命令一样使用。 “C:”函数被叫做“命令函数” 。VBA 有宏,你必须从程序管理器里运行宏。从命令提示(或普通的 macro 菜单)里运行不了宏,这就
10、存在着一个重要问题。用户可以使用 AutoLISP 启动 VBA 程序管理,然后以相同的方式执行宏。使用命令行语句时,你应该确信在语句前加了“-” ,格式如下:command“-VBALOAD”“mymacros”“-VBARUN”“mymacro”如果你未用此负号,将会出现一个对话框,提示用户装载 VBA 和运行宏。在多数情况下用户并不想出现这个对话框。取而代之的是在命令行装载宏并用一个 VBA 模块来运行它,这样,首先出现的是在 AutoLISP 中很强列关注的东西,不再仅仅只是一个倾向。一但一个错误和漏洞发生,就会有其他相关问题出现,这在编程中并不寻常。另外一点,VBA 允许一个经由 A
11、utoLISP 启动的过程,VBA 还有一个反应绘图及同时处理多个图形的优良机制。在 VisualLISP 里,你能做这些工作,但在 VBA 里就不是如此容易了。其反应的事物与图形连系在一起,甚至嵌入图形模板中,有多种原因允许你所编程绘制图形。VisualLISP 没有一些灵活的运行程序或操作菜单,因此它没有这些能力。VBA 与 VisualLISP 争夺的另一领域为数据种类。VBA 的数据种类多于 VisualLISP,它包括了一些有用的如 Date、Time 的数据类型。在 VisualLISP 里日期和时间是用字符串或是数值存储的。在一张图形里,当你通过系统变量存取系统日期信息时,你会得
12、到纯数字而不是日历天数。在 VBA 中操作日期和时间是非常容易的,Format 函数可以产生几乎任一种描述的格式,你可以用基本的数值来完成比较和区别。你能以某种自定义的格式存储或操作时间信息,方法简单。我听说顽固的 AutoLISP 程序员声称 VBA 不支持表处理而 LISP 支持,这是事实。但 VBA 不支持 Variants 类型,Variants 与 LISP 库中的一些数据种类标志十分相似。Variants 允许 VBA 使用不同类型的数据和结构,但不如 LISP 中的表处理功能强大。表能存储许多种类型的数据且用几行基于 MAPCAR、FOREACH、APPLY 的代码就可以快速操作
13、它们。但是这些程序设计体系需要时间去掌握,许多程序设计的新手在使用 VBA时,将不会遗漏结构的存取。坦白的说,表处理进程并不像对象操作那样令人感兴趣。在 VBA(和 VisualLISP)中你能连接其它系统支持的对象。对程序员而言,ActiveX 是面向 Windows 的一个面向对象的过程到过程的通信编程系统,它允许你的 VBA 程序运行在 AutoCAD 里,并且可借用Excel 或其它一些支持自动操作的程序。因为 Excel 支持 VBA,所以你能在一个 Excel 工作表中驱动 AutoCAD。当你试着思考它时,多自动进程处理有着某些让人敬畏的潜力。一个是在 VBA(带有 DVB 扩展
14、)里的,另一个在 VisualLISP(带有 LSP 扩展)里,这些函数完成相同的事:他们提示用户输入一些定义一个铣槽的参数,并画出这个铣槽,这个铣槽可以放在任何角落且有一个 90的圆角或一个完整的半圆帽。这些例子表明了VBA 与 VisualLISP 运行程序的风格的几个不同点,或许这就是最明显的产生 lightweight多义线的的方法,在 VBA 里,该对象由一系列点确定,雏形产生后,拐点也相应产生了,VisualLISP 的例子简单使用 PLINE 命令去产生点和弧,因为他们可以从命令行提示中配置。从运行程序这一点而言,VisualLISP 版本很容易产生,因为你不必知道任何拐点和他们
15、怎样在多义线中使用,在 VisualLISP 我用 EntMake 语句,在一个实体列表中确定拐点,这个版本的基本命令很容易编译代码。如果你更深入地学习,你会发现 VisualLISP 和 VBA 是十分平衡的,这个的弱项正是另一个的强项。然而 VBA 支持一些新的理论,对于AutoLISP 程序员而然,他的缺点是把一个简单问题复杂化。在大多数情况下,我倾向于VisualLISP,因为它提供了更多的自由度。对于 AutoCAD 的定制我有许多经验,但有些时候,根据客户需求,我会用 VBA,因为对客户而言,其更容易维护。它提供了一些面向自动生成的模板。我的许多客户在定制 AutoCAD 时,并没
16、有广博的经验,但他们有 Basic 语言基础,因为这点,他们使用我推荐的 VBA。对于不久将需改变的元素的操作,他们感到很轻松。上面所有的原因,就是我为什么推荐 VisualLISP 和 VBA 二者都学的缘故。话又说回来,这还要依据你所使用的工具而定,学会其一,已可以了,但你会错过向另一个方向发展的时间,这是必然的冲突。第一步,你可能从 VBA 中学习怎样运行 LISP 语句或者从VisualLISP 中学习运行传统 VBA 的方法。谁知道下一个将会是什么?哪里开始为了决定先学哪一个语言,让我们做一些自我评价:如果你很好地了解了 AutoCAD的命令并希望自动使用它们,那么 VisualLI
17、SP 将是你的首选;如果你不懂 AutoCAD,但你是一名知道对象是如何工作的计算机程序员,你可以学习 VBA;如果你是一名 C+程序员,你可以通过学习 VBA 而了解对象集是怎么结合在一起的,然后花一点时间学习ObjectARX(一个 DLLs 结构的 C+库,运行于 AutoCAD 自身相同的内存映像) ,在这篇文章中没有讨论 ObjectARX,是因为你必须使用外部的 C+编译器,且必须从 Autodesk 公司获得开发工具包,而 AutoCAD2000 中直接配有 VisualLISP 和 VBA 编译器。2 . / - j! I# l t+ ?$ n给想学习 AutoCAD 的人最后一点建议:寻找那些有范例的书和杂志。上网查询这些内容,甚至是例子。VisualLISP 和 VBA 的在线帮助常令初学者感到困惑,因为一些函数从 VBA 中引证,而另一些从 VisualLISP 中引证。无论你使用哪一个语言,你都有可能有从其它语言里偶然得到帮助的好机遇,因为它们是相关的。因此我强烈推荐看一本或两本书。你有大量选择的自由,多存些好书。存在着许多选择,每一个都有其优点。无论你先学什么,在某一时间你应当学习所有的东西,为了去追寻更多的知识,这就意味着要不停的编制程序。BillCramer有着二十多年的运用 CAD/CAM/CAE 系统的经验,对于代码的更新,可到下载处下载。