Advertisement

cass二次开发vba和lisp_选择AutoLISP还是VBA

阅读量:

我听到诸多相关的问题。想了解如何进行基于AutoCAD的二次开发?但不清楚先学习哪个工具,请问哪一个是更好的选择?

两者的优点都很突出,请考虑同时掌握它们。从我的回答中可以看出,并非最快捷的方式,在完成全面解答之前需投入时间和处理更多问题等细节。举个例子:比如,请问您是否熟悉BASIC语言?如果您的意思是熟悉该语言家族中的某个成员(如VBA),则学习起来会相对便捷些;但如果您的意思是已经掌握了FORTRAN或PASCAL等其他编程语言基础,则VBA的学习将更加简单直接。如果您完全不了解程序设计的基本概念与方法,则在此情况下,默认推荐学习AutoLISP更为合适。

如果你缺乏程序设计知识与实践经验,则在AutoCAD环境中学习哪门编程语言最为合适?这一问题确实很难给出一个明确的答案。这取决于你希望实现的目标是什么?每种编程语言都有其独特的优势与局限性:AutoLISP擅长创建新命令及其与现有命令之间的关联;而VBA则擅长处理诸如Microsoft Excel和Access等其他应用程序中的组件。需要注意的是:AutoLISP基于表处理编程体系,并允许程序员自由地存储、管理和操作传输信息;相比之下,VBA则包括数据管理与对复杂情况的有效操作等内容,因此问题本身会因此变得更为复杂,除非你对这些工具的实际效果有深刻的理解,否则很难给出一个明确的选择建议;但无论如何,你需要清楚自己的目标以及能够达到的效果,因为这些因素将指引你选择最合适的解决方案

随后你将意识到这个简洁的答案是恰当的。你将学会这两种语言,并且会完成一些事情。在AutoLISP中只需用非常简单的几行代码就能解决这个问题。另一方面地讲VBA提供了一些最简捷的应用程序解决方案。例如创建一个包含多个对话框的应用程序AutoLISP能够支持对话框功能但不如VBA那样强大另一方面地讲在AutoCAD中完成一个任务的情况下VBA能够在对象级别上访问AutoCAD系统但它对一些基本命令的支持并不如 AutoLISP完善 AutoLisp在这方面表现得更加出色。

由于这两种语言之间存在较好的兼容性问题, 因此这种现象是不可逆转的, 即使你试图将AutoLISP语言中的某些功能应用到VBA环境中也会遇到困难, 反之亦然. 我并非说这种情况完全不可能发生, 但实现起来却非常困难. 最小限度内, 一旦选定了一种编程语言来开发软件系统, 就不允许中途切换到另一种语言来解决程序中的具体问题.

创建一个词汇表

通常情况下,在某种程度上更为高级别的是基于对象的操作方式而非简单的命令驱动模式。当您启动并执行一个命令时;有可能您可以也有可能不可以直接操作您所选取的对象;这是因为AutoCAD采用了基于对象的选择机制;而这种机制赋予了操作者更高的灵活性与精确性;使得在某些复杂场景下能够实现更为精准的操作指令;由于AutoCAD具有高度的智能化特征;其系统设计确保了各类操作指令都能得到可靠执行;因此;当您明确指定目标对象时;系统会自动识别并定位到该特定物体;对您所操作的目标对象来说就非常清晰了

通过VisualLISP平台进行对象级别的处理也是可行的。借助VL扩展功能,在VisualLISP环境中你可以灵活地调整对象属性,并根据需求调用相关方法。为了提高效率和灵活性,在大多数情况下,默认情况下不会自动引入对象引用;然而,在经验丰富的AutoLISP程序员手中,则可能无需频繁使用这类机制。

另一个优点是与VB(Visualbasic)语言相比更接近AutoCAD系统。
它并不是由AutoCAD产生的一种语言。
它是在其他环境中同样工作的一个附加语言。
类似于Microsoft Word和Excel这样的程序。
类似于在AutoCAD中使用VB(Visualbasic)编程的方法。
VisualLISP仅限于在AutoCAD环境中运行。
其优势在于各软件之间有着密切的工作关系。
当在命令行提示用户时,请举例说明一个不同点。
在 VisualLISP 中可以使用 PROMPT 或 PRINT 语句。
而在 VBA 中,则必须使用 Prompt 方法作为其一部分。

(Prompt“\nstarting.”)

thisDrawing.Utility.PromptCh$(10)&“starting”

明显有两项关键点需要说明:第一,在VisualLISP环境中打开命令行窗口后,“\n”能够让光标移动至下一行;第二,在VBA编程中要调用Chr$(10)这个函数,则必须将其放置在与":"连接符配合使用的提示字符串之前才能使其正常运行;此外还需要指出的是,在实体对象所需属性数量与其类型数量较为接近的情况下才会采用这种处理方式

在AutoLisp系统中可以调用PRINTF指令用于打印数值内容。当在打印数值之前插入\n时会导致输出内容转移至下一行起始位置。值得注意的是PRINTF命令支持多种数据格式

在VBA中,在优化对象的方法与AutoLisp中的'GET×××'等价时,请始终要求使用字符串。AutoLisp涉及多种将所选用的数据类型转换为字符串类型的函数;RTOS则将数值类型转换为字符串类型;ITOA则专门用于将数值转换为整数类型。VBA提供了两个数据转换函数:STR与FORMAT。当处理非负数时,在这种情况下使用STR函数会返回一个精确的字符串表示法,在其前面会添加一个空格;例如:str(-1.1)返回" -1.1"而str(1.1)则返回" 1.1"(注意这里前面带有空格)。FORMAT功能则允许用户设定特定的转换格式;对于正在学习VBA的人来说,请通过在线帮助获取详细指导信息以了解这些数据转换的具体操作流程以及示例说明。

评估标准 在AutoCAD定制中 ,由于AutoLISP语言基于命令的标准构建 ,这增强了支持AutoLISP的功能 。允许通过在新函数名称前使用"C:"作为前缀来创建函数 ,这种功能类似于AutoCAD内置命令 。然而 ,VBA宏必须通过程序管理器启动才能运行 ,不能直接从命令行或其他宏菜单中执行 。为了实现相同功能 ,用户可以选择通过启动VBA程序管理器来执行宏 。当采用批处理方式时 ,应在语句前添加"- "符 ,具体格式如下:

command“-VBALOAD”“mymacros”“-VBARUN”“mymacro”

如果你未使用此负号,则会弹出一个提示对话框指导用户加载VBA并执行宏操作。通常情况下,用户希望避免这一情况的发生,因此相反地,在命令行窗口中加载宏并通过VBA模块执行相应的操作,这样一来,在AutoLisp环境中将会有更加突出的关注点不再仅仅是一个次要关注的内容,一旦出现问题或漏洞被发现,则会触发一系列相关的后续问题,在编程逻辑中这种情况较为少见

另外一点,在VBA中可以通过AutoLISP启动一个过程,并且它还具备同时处理图形的能力以及支持多图形操作的优良机制。相比之下,在VisualLISP中你可以进行这些操作,在VBA中则相对较为复杂。其关联性在于事件与图形之间的紧密联系甚至被嵌入到模板中等多方面因素使得你能够通过编程绘制图形。然而VisualLISP缺乏一些灵活的功能和操作菜单选项因而无法实现这些高级功能。在争夺数据种类这一领域上VBA更具优势因为它提供了更多的数据类型如Date、Time等非常实用的数据类型而VisualLISP仅使用字符串或数值来存储日期与时间信息因此当你通过系统变量获取系统日期时会得到纯数字而非日历天数的形式

在VBA中进行日期与时间的操作非常简便易行,Format函数能够生成几乎任意一种显示格式,通过基本数值即可实现对比与区分.采用自定义格式存储或处理时间信息的方法较为简便.有 reports 称 AutoLisp 程序员坚称 VBA 无法处理表结构而 Lisp 可以实现这一功能.然而 Vba 并不具备 Variants 类型,而 Variants 与 Lisp 库中的某些数据标志极为相似.通过 Variants 类型,Vba 可以灵活地使用不同类型的变量与数据结构,但其表处理功能较 Lisp 弱小得多.表作为数据存储的一种形式,能够整合多种类型的信息,并且仅需借助 MAPCAR、FOREACH、APPLY 等函数便可高效完成相关操作.然而这些编程体系的学习过程较为漫长,许多编程新手在运用 Vba 时往往会对各种数据结构的存在意义感到好奇并加以深入掌握.

直率地说,在我看来,表处理过程并没有象对象操作那样引人入胜。你能在VBA(包括VisualLISP)中连接其他支持的对象系统。从程序员的角度来看, ActiveX是一种面向Windows的操作系统的面向对象通信编程框架,它允许你在AutoCAD环境中运行你的程序,并通过使用诸如Excel这样的应用程序获取数据并进行自动化操作。由于Excel本身具备强大的VBA功能,所以你可以通过从一个Excel工作表中控制AutoCAD的操作来实现数据交换。当试图深入理解这一技术时,你会发现多自动进程处理具有不容小觑的魅力

在下载部分的链接里,你会发现两个程序:

在一个VBA环境中(带有DVB扩展),另一个则采用VisualLISP(带有LSP扩展)。这些函数均执行相同功能:它们引导用户输入铣槽所需的一些参数,并绘制相应的铣槽图形;该铣槽可放置于任意角落,并可配置90°圆角或完整半圆顶面。这些实例凸显了VBA与VisualLISP程序风格的不同之处——或许这就是实现轻量级多义线最明显的方式之一:在VBA中,默认情况下由一系列点定义该对象,在对象生成后也会随之产生拐点;而VisualLISP则更为简便地使用PLINE命令创建点与弧——因为它们可以从命令行参数配置中设置属性值。从程序运行角度来看,在VisualLISP版本中实现起来更为便捷——无需深入了解拐点及其在多义线中的应用方式;在VisualLISP中使用EntMake语句即可在一个实体列表中指定拐点位置——这一版本的基本命令相对容易编写并生成代码;如果你深入研究这两个编程环境会发现它们之间存在相互弥补的关系:VBA的优势在于支持一些新理论(尤其是对AutoLisp程序员而言),而其不足之处正是另一个的强项;同样地,在VisualLisp方面也存在类似的特性差异——但总体而言,VBA提供了一定的优势:它提供了更多的自由度;对于AutoCAD定制开发,我的经验和技能较为丰富——但有时根据客户需求,我倾向于选择VBA而非其他语言——因为从客户角度来看,VBA更具易用性和维护性;它提供了一些面向自动生成的模板文件;大多数客户在进行AutoCAD定制开发时缺乏广博的经验,但他们具备一定的Basic语言基础——基于这一点,我推荐使用VBA来完成项目;对于需要进一步修改元素的场景,他们往往能够轻松应对

这些原因促使我建议学习VisualLISP与VBA两种技能。换言之,在你使用的特定工具下,请权衡利弊后决定是否专攻其中一项技术即可。第一步可能需要从VBA入手学习运行LISP语句的方式或者通过VisualLISP来掌握传统VBA的操作方法。不过无论选择哪种方式开始探索第二条路径时都可能会遇到一些障碍

从哪里开始

在选择学习哪种编程语言之前,请考虑以下自我评估:如果你熟悉AutoCAD的基本命令并希望无需手动输入这些命令,则学习VisualLISP将是最佳选择;对于那些不熟悉AutoCAD的人来说(即计算机编程人员),学习VBA是一种合适的选择;而如果目标是成为掌握对象程序设计(OOPD)的专家,则建议先学习VBA以便理解对象是如何运行的,并花一定时间研究ObjectARX(一个基于DLLs的C++库,在与AutoCAD相同的内存映像下运行)。由于本文未涉及ObjectARX相关内容,则是因为它需要依赖外部C++编译器,并且必须从Autodesk公司获取特定开发工具包;而AutoCAD2000版本则内置了VisualLISP和VBA这两种强大的开发工具包。

给想学习AutoCAD的人最后一点建议:

寻找那些有范例的书和杂志。

查阅相关资料和示例,尤其是函数来源方面的例子。由于VisualLISP和VBA的在线帮助存在一定的混乱现象,在线帮助常常让初学者感到困惑。因为它们之间存在函数来源的差异性问题。无论是使用VisualLISP还是VBA,你都可能从其他编程语言中获得意外的帮助。因此我强烈推荐您阅读一本或两本相关的书籍。拥有大量选择的情况下,请务必收藏几本优秀的书籍。

编者注:关于这部分内容,推荐了两本优秀书籍。其中一本是由BillKramer所著的《AutoLispTreasureChest》,另一本则由BillKramer与JohnGibb合著的《UsingVisualBasicwithAutoCAD》(第二版)。

存在着多种选择可供考虑,并且每个选项都具有其独特的优势。
不论你先开始学习什么课程,在某个时候你都应当系统地掌握各种基础知识和专业知识。
为了探索和获取更多的知识储备,
这也就意味着必须不断地编写代码来实现这一目标。

全部评论 (0)

还没有任何评论哟~