如何选择AutoCAD的二次开发工具

上传人:woxinch****an2018 文档编号:38980889 上传时间:2018-05-10 格式:DOC 页数:6 大小:24KB
返回 下载 相关 举报
如何选择AutoCAD的二次开发工具_第1页
第1页 / 共6页
如何选择AutoCAD的二次开发工具_第2页
第2页 / 共6页
如何选择AutoCAD的二次开发工具_第3页
第3页 / 共6页
如何选择AutoCAD的二次开发工具_第4页
第4页 / 共6页
如何选择AutoCAD的二次开发工具_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《如何选择AutoCAD的二次开发工具》由会员分享,可在线阅读,更多相关《如何选择AutoCAD的二次开发工具(6页珍藏版)》请在金锄头文库上搜索。

1、如何选择如何选择 AutoCADAutoCAD 的二次开发工具的二次开发工具以下为引用的内容:AutoCAD 提供了三种主要的开发工具,分别是:使用C/C+的 ObjectARX,VB/VBA 的 ActiveX 开发,以及 AutoLISP/VisualLISP 开发工具。每一个开发者都有自己的爱好,但是抛开所有的偏爱,人们经常想知道哪一种最好,我到底应该选择哪种工具?给这些人的答案是:“它取决于你要完成什么工作。 ”每一种开发工具都有不同的东西,在某谢情况下都有不可比拟的优点。当决定究竟使用什么开发工具时,你可以问自己四个问题:哪种语言让我感觉最顺手(舒服)?我有多少时间?谁是我的目标用户

2、,他们有多少使用 AutoCAD 的经验?我到底需要对 AutoCAD 控制到什么程度,需要多少可能的窗口类型来尽快完成工作?当我介绍不同开发工具所具有的不同功能时,你可能会明白为什么这四个问题是重要的。在谈及这几种开发工具时,我仅仅将它们看作在 AutoCAD 中使用的功能,而不将它们看作独立的应用程序。 在三种开发工具中,这种工具拥有对 AutoCAD 最深入的控制能力,能够提供最多类型的窗体。使用 ARX 可以向 AutoCAD 注册自己的命令,用户运行你的程序时无需了解关于 AutoCAD 更多的知识。这种便利的代价就是编制 ARX 程序比 VBA 和 LISP 程序需要花费更多的时间

3、,因此用来编制简单的绘图工具有点浪费了。要掌握 ARX 的前提是你对 C 和 C+非常熟悉,从个人观点来说,我最喜欢这种工具,但那是因为我做的 99的程序都是用 C 和 C+语言,选择 ARX 意味着我不用学习一门新语言。对我来说,回答“哪种语言让我感觉最顺手?”就足够了。ARX 能够访问很多的 AutoCAD 底层工具(这些东西可能 VBA 和 LISP并不能访问) ,这是大多数开发者选择 ARX 的主要原因,他们需要作一些用其他两种开发工具不能完成的工作。此外,这也是唯一一种能够确保你的代码安全(不被别人阅读或非法复制)的开发工具。如果你需要开发自定义实体,使用空间过滤,扩展一个使用其他开

4、发工具的应用程序的功能,正在开发用于销售的第三方工具,或者用到一大堆用 VBA 和 LISP 不能访问的东西(或者费很大力气去实现的东西) ,那么 ObjectARX 是你的最佳选择。 VBA: 如果你是第一次开发 AutoCAD 应用程序,那么这就是最适合你的工具!这种工具对初学者来说非常友好,Visual Basic 的代码阅读起来非常容易,很多初学者仅读了函数的名称就能理解一个问题。无论如何创建或者执行 LISP 命令来扩充你的访问手段,这种开发工具没有 ARX 和 LISP 那么多对 AutoCAD 访问的方式(译者注:这也有情可原,毕竟 VBA 和另外两种开发工具比起来年轻得多!)如

5、果你对 VBA 非常精通,可以通过再对 AutoCAD 命令行进行仔细研究和分类(这句话可能不太通顺,原文是:you can subclass the AutoCAD command line) ,这样你就能实现 LISP 所能完成的所有功能!对 VBA 来说,最大的遗憾就是不能向 AutoCAD 注册命令,必须先用各种加在应用程序的方法将其对应的dvb 文件加载,然后通过“工具宏宏”菜单项执行,或者在菜单项和自定义的工具栏按钮中执行,如果你的用户的基础知识实在有限,这对你来说是个不小的问题(译者注:已有合适的解决方案) 。我曾经研究过很多合同,许多制图者喜欢直接在命令行执行命令,这对 VBA

6、(开发工具)的销售不是个好消息(译者注:已经有合适的方法实现这种功能) ,如果用户组不会在这个问题上纠缠,那么 VBA 通常是很好的商品,特别是当他们看到你能使用它多么迅速地创建应用程序。和 LISP 结合起来,VBA 首先是一个开发公司内部使用的程序的利器,或者在你已经包工并且需要在现场编写自定义的工具时使用它。在所有的开发工具中,这是一种开发速度最快的工具,特别是在开发需要图形界面(对话框)的程序时。使用这种工具,你同样能从 AutoDesk 获得最好的技术支持! LISP: 当我谈到 LISP 的时候,一般是专指 AutoLISP 和 VisualLISP,而不是在讨论 ANSI 的通用

7、 LISP 语言。首先简单描述一下 AutoLISP,AutoLISP 兼备快速开发工具的特点和 COBOL 语言的灵活性,很多开发者选择 LISP 的主要原因是它符合他们对“什么语言让我感到很顺手?”问题的答案,对很多人来说,这是他们第一次开发 AutoCAD 所使用的语言,并且很快使用该语言进行开发。另一个使用这种开发工具的原因是,你所工作的环境可能已经具有很多 LISP 程序(的确,AutoLISP 的使用历史最为悠久) 。学习 LISP 比 VBA 难,却又比 C 和C+简单。直到 AutoCAD 2000,VBA 还不能很好的在 AutoCAD 内部执行,并且留下很多开发者希望解决的

8、问题。LISP 是快速编写应用程序的最初的开发工具,大量的 LISP 程序库存在于世界各地在短时间内用 VBA 重写这些东西不值得,也不容易。如果是这种情况,那么 LISP 就是为你而打造的开发工具,也许是上帝可怜你,呵呵,开个玩笑。这些年来使用 LISP 的人大大减少了,如果你是AutoCAD 二次开发的初学者,并且你的程序可能要和其他的 Windows 程序交换数据,你最好去看看 VBA。总体来说,如果你正在创建和一个用 ARX 编写的程序交换数据的程序,对 ARX 程序员来说,为 LISP 程序员预留接口比为 VBA 预留接口要简单一些,但是一个好的程序员应该两者都能做,因此究竟为哪种语

9、言预留接口实际上取决于写 C+方面的东西的人。 下面就是一个简单的清单,用于决定到底哪种开发工具对你的项目最合适: ObjectARX: 你必须感到用 C 和 C+最为顺手(译者注:顺手是对一种语言无缘故的喜欢) ; 你需要大量的对 AutoCAD 的控制和多种类型的窗体; 你需要自定义对象; 你需要访问一些用 VBA 和 LISP 无法访问的东西; 你的程序需要更高的效率(VBA 和 LISP 无法达到) ; 你的工作环境需要使用 C 或者 C+开发的程序; 你需要使用一些 AutoCAD 外部的库函数,这些库函数仅能在 C 和 C+中调用。 VBA: 你感觉用 VBA 编程最顺手; 你需要

10、使用对话框; 你需要和 Windows 或者一种 Office 应用程序(例如 Excel)交换数据; 你初学 AutoCAD 二次开发,或者初学编程; 你需要尽快完成一个程序的开发,而程序的效率不是那么重要; 你知道在开发过程中你需要从 Autodesk 获得大量的帮助。 LISP: 世界末日,没有其他的工具可选(译者注:就是你觉得 VBA 和 ARX 都不适合你) ; 你感觉用 LISP 编程很顺手; 你要开发的程序在 AutoCAD 2000 以前的版本上运行; 你的工作涉及到一些特殊的东西,这些东西用 LISP 可以直接实现,但是如果用VBA 来实现要花费很大的力气; 你的工作环境需要

11、它; 你的工作环境需要使用已经存在的 LISP 函数库; 你喜欢享受痛苦(译者注:可能有作者的一些个人感情色彩) ; 在你的程序中除了命令行和图形对象之外不需要任何对话框或者图形用户界面;Parens 让你快乐(译者注:不理解这句话的意思,估计 Parens 是个熟悉 LISP开发的人的名字) ,哦,看这边,那个穿白大衣的人来找你了。 现在我将提供一些你们来这里的所有人都想要的东西:免费的代码(译者注:作者仍然是在开玩笑)!当然,我们直到这也是你读这一篇文章的原因,不是吗?因此,既然你费尽千辛万苦读完了上面的文字,我想我应该给你一些免费的代码,这样说不定下次你还会来这里。在每种开发工具的示例代

12、码中,我都给出了一种编辑一个块参照中第一个可编辑的属性的方法,在代码中不会看到使用命令行的语句,因为我不喜欢使用那些东西。如果你使用“Command” (译者注:LISP 中的 command 函数,VBA 中的 SendCommand 方法,ARX 中的acedCommand 函数) ,你不是在编程,顶多算是在写脚本(译者注:脚本在这里泛指那些解释执行的语言,从某种意义上讲,使用“Command”确实是要求命令行解释并且执行你所提供的语句) ,这是两码事。 ObjectARX 的代码: void chngAtt() ads_name entres; ads_point ptres; AcDb

13、ObjectId _Id, _attId; AcDbObjectIterator *pIttr = NULL; if(acedEntSel(“Select a Block Reference“, entres, ptres) != RTNORM ) /Selection failed return; acdbGetObjectId(_Id, entres); AcDbObjectPointer pRef(_Id,AcDb:kForRead); if(pRef.openStatus()!=Acad:eOk) /Open failed return; pIttr = pRef-attributeI

14、terator(); while(!pIttr-done() _attId = pIttr-objectId(); AcDbObjectPointer pAtt(_attId,AcDb:kForWrite); if(pAtt.openStatus()=Acad:eOk) pAtt-setTextString(“We changed this“); break; pIttr-step(); delete pIttr; VBA 代码: Option Explicit Sub chngAtt() Dim objEnt As AcadObject Dim objRef As AcadBlockRefe

15、rence Dim varAtts As Variant Dim objAtt As AcadAttributeReference Dim emptyPt As Variant ThisDrawing.Utility.GetEntity objEnt, emptyPt, “Select Block: “ If objEnt.ObjectName = “AcDbBlockReference“ Then Set objRef = objEnt If objRef.HasAttributes Then varAtts = objRef.GetAttributes Set objAtt = varAt

16、ts(0) objAtt.TextString = “We changed this“ End If End If End Sub LISP 代码: (defun C:chngAtt () (setq Mainent (entsel) (setq entList (entget (car Mainent) (setq entAtt (entget (entnext (cdr (assoc -1 entList) (setq entNewAttVal (subst (cons 1 “We changed this“) (assoc 1 entAtt) entAtt) (entmod entNewAttVal) (entupd (car Mainent) (princ)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号