滕州市龙泉金誉机床厂
摇臂钻 , 钻铣床 , 龙门式铣床 , 摇臂钻床 , 立卧式能升降台
组合机床CAD系统开发与研究

随着cad技术的发展,cad领域的支挣软件也越来越多,国内外许多公司相继推出了其主导产品,autodesk公司是目前世界上比较成功的cad领域的开发商,其开发的autocad一直是cad市场中的主流产品,随着autocad的日益普及,在其上进行二次开发的工具也相继由该公司推出。许多企业购进autocad软件,并非只是用作“代替图板”。只有真正地在其上实现了二次开发,才能充分发挥autocad作用。到目前为止,autodesk公司提供了4种主要的二次开发工具:autolisp(visualisp)、ads、objectarx及vba(vb)。本文就此向大家分别做一介绍。

1 autolisp语言

lisp语言是一种表处理语言,是广泛应用于人工智能的语言。autolisp语言完全嵌套在autocad内部,同autocad有机地结合成一体它既具备一般语言的基本结构和功能,又具备一般语言所没有的图形处理能力autolisp可直接调用几乎全部autocad的命令,从而进行autocad的二次开发。利用autolisp开发autocad的一个典型例子就是实现参数化绘图的程序设计。autolisp具有如下特点:

autolisp语言是一种以解释方式运行于autocad内部的解释性程序设计语言。 autolisp没有语句概念或其他语法结构,程序非常简明。它的所有成分都是以函数形式给出的。执行autolisp程序就是执行一些函数,然后再调用其他函数。 autolisp把数据和程序统一表达为表结构,故可把程序当作数据来处理,也可把数据当作程序来执行。 autolisp语言中的程序运行过程就是对函数的求值过程,在对函数求值的过程中实现函数的功能。 autolisp语言的主要控制结构采用递归方式。递归方式的使用,使程序简单易懂。

visualisp是autolisp的发展,它利用可视化的编程环境为学习减小难度。它的特点可以归纳出十几条,但基本上是可视化与autolisp的结合,不再列出。这里给出用autolisp绘制键槽的一个小程序,可以看出其简明性:

(defun c:lwx()
(setq a(getrcal "a="))
(setq b(getreal "b='))
(setq po(getpoint "enter start point:"))
(setq r(getreal "r="))
(setq x(car p0) y(cadr p0))
(setq xe(- x (/ a 2.0)))
(setq ye(+ y (sqrt(- (* r r) (*a a 0.25)))))
(sctq ce(list xe ye))
(setq p1(list(- x a) y))
(setq p2(list(- x a)(- y b)))
(setq p3(list x (- y b)))
(command "pline" p0 "a" "ce" ce p1 "1" p2 p3 "c")
)

执行这段程序,输入a,b,r的值,即可绘出键槽。

2 ads(autocad development system)开发系统

ads是从autocad r11开始引入的基于c语言开发应用程序的系统。ads不是c语言的一个子集,也不是基于c而编制的专用语言(如microstation的mdl),但它包括了c的全部功能。它对开发人员c语言要求较高,c是编译型语言,功能强大,因此ads很轻易地克服了autolisp所固有的许多缺点而具有速度快,安全性高的特点。ads不包含于autocad内部,而是作为一组autolisp外部函数由autolisp解释器装入、解释并请求autocad运行。其特点如下:

ads程序是一个可执行文件,需要通过autolisp和autocad进行通讯。 ads程序更“绝缘”,ads程序是一系列独立的过程,程序崩溃并不一定导致autocad系统崩溃(尽管并不总是如此)。 ads程序是不可重复加载的。 ads程序的运行过程类似于宏(macro)。ads中的函数(如ads_command)以及与autolisp的通讯使ads程序的工作过程类似于自动作用的宏。 ads仍然只能使用传统的c语言进行编程,只能采用传统的结构化编程方式。

早期国内常见的应用软件多是用ads进行开发的,但ads程序必须经过autolisp解释加载,因此ads的各方面性能受到限制。同时,随着网络技术的迅速发展,面向过程的ads己有些力不从心了,所以,在autocadr13中提供了面向对象的开发工具arx。有关ads的实例代码,因与arx类似(比如ads中的对象名称ads_name就和arx中的acdbobjectld是等价的)这里不再给出。

3 objectarx( autocad runtime extension)开发系统

近几年广为应用的objectarx是从autocadr13开始推出的一个全新的面向对象的开发环境,是autocad提供的第一个面向对象的开发工具。它提供了以c++为基础的面向对象的开发环境及应用程序接口,能真正快速访问autocad图形、数据库。objectarx支持面向对象编程方法,同时向下兼容ads。它的特点是很明显的:

arx程序在很多方面与ads程序和autolisp程序都不相同。Zui重要的一点是,arx程序实质上是一个动态链接库(dll),它和autocad共享地址空间并且直接和autocad进行通讯。在arx中,每个命令都有独立的入口。arx程序还可以创建新的类(class),这些类可以为其他程序所共享,从而充分利用面向对象的编程的优点.arx程序创建的实体和autocad的内在实体几乎是完全等同的。 对于需要经常和autocad通讯的应用程序来说,arx程序比ads程序运行速度更快,这里的运行速度主要指是访问autocad数据库的速度。但arx更“脆弱”,’arx程序和autocad共享进程空间,arx程序崩溃通常会导致autocad系统的崩溃. 相比之下,arx程序是比宏更基本的程序。主程序(autocad)可调用每个由arx程序注册的命令。 arx程序具有ads程序和autolisp程序所不具备的访问和控制autocad的能力。arx程序可以监控和处理autocad各种事件,可以定义autocad命令,包括可以透明执行的命令。这些命令可以像autocad自身的命令一样被autolisp和ads所调用. arx提供了面向对象的编程技术,面向对象的编程技术己经成为软件开发的主流技术。arx可充分支持c++,充分支持面向对象编程技术. 对于arx编程,autodesk公司建议使用visualc++4.2及以上版本的开发环境,这一点对于语言的学习要求较高。这里给出直线绘制函数的部分代码:
void myline(acgcpoint3d.acgepoint3d pt2)
{acdbline * pline=new acdbline(pt1,pt2):
acdbblocktable * pblocktable:
acdbcurdwg()->getblocktable(pblocktable.acdb::kforread);
acdbblocktablerecord * pblocktablerecord;
pblocktable->getat(acdb model_space pblocktablerecord,acdb::kforwrite);
pblocktable->close();
acdbobjectld lineld;
pblocktablerecord->appendacdbentity(lineld,pline):
pblocktablerecord->closc();
pline->close();}

4 vba (visual basic for application)和vb

作为从autocadr14之后提供的二次开发工具vba(vb),使渴望cad编程的人有一个更好的选择,用户不必学习ads,arx和autolisp就可以用vba(vb)来开发autocad,autodesk公司从r14开始内置了vba开发工具,同时提供了适于vba(vb)开发的activexautomation对象模型。vba(vb)的主要特点如下:

vbaZui早是内嵌在ofice97中的一种编程语言,它易学易用,功能强大。所以autodesk公司从rl4之后把它也嵌入了autocad中。 vba(vb)可以利用activex automation提供的接口访问和控制autocad所有图形对象和非图形对象,并且可以访问这些对象的方法和属性。 vba(vb)数据类型丰富、界面友好。 vba是内嵌在aulocad中的一种编程语言,对平台有依赖性,但vb对此有改善。 正如ads需要c语言做基础一样,vba(vb)开发autocad也必须以熟悉vb语言为前提。

这里同样给出一段直线的绘制程序。用vba编制如下:dim stpt, enpt as variantdim prompt1,prompt2 as stringdim startpoint (1 to 3) as doubledim endpoint (1 to 3) as doubledim lineobj as acadlineprompt1 = nl & “起点:”prompt2 = nl & “终点:”stpt = thisdrawing.utility.getpoint(,prompt1)enpt = thisdrawing.utility.getpoint(stpt, prompt2)startpoint(1) = stpt(0)startpoint(2) = sptt(1)startpoint(3) = stpt(2)endpoint(1) = enpt(0)endpoint(2) = enpt(1)endpoint(3) = enpt(2)set lineobj = thisdrawing.modelspace.addline(startpomt,endpoint)用vb对autocad开发与vba的主要区别是当前图形对象的引用方法不同。vb中对象的获得要使用getobject()和creatobject()函数,从而有效地启动和切换autocad窗口,具体代码如下:public acaddoc as objectpublic modspace as objectpublic acadapp as objecton error resume next '出错处理set acadlapp = get object(,"autocad.application")if err thenerr.clearset =cadlapp=createobject("autocad.application")if err thenmsgbox err.descriptionexit subend ifend ifacadapp.visible=trueset acaddoc = acadapp.activedocumentset modspace = acaddoc.modelspace
接下来绘制直线的代码与vba基本相同,只要把thisdrawing换成acaddoc即可。通过以上分析可以看出autolisp仍然是autocad的基本开发手段,它适十一般开发者用于较为简单交互性程序的开发。ads将逐步被更为完善的arx所取代。vba则成为autocad用户二次开发的另一支生力军。autocad提供的开发手段让各类开发者都能有适合于自己的开发工具。



发布时间:2012-03-31
展开全文