养成良好的AutoLISP书写习惯_第1页
养成良好的AutoLISP书写习惯_第2页
养成良好的AutoLISP书写习惯_第3页
养成良好的AutoLISP书写习惯_第4页
养成良好的AutoLISP书写习惯_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、养成良好的AutoLISP书写习惯众所周知,Lisp是一种表结构语言,括号必须成对出现,在调试时往往为遗漏了一个括号大费周折,所以,养成一个好的编程习惯是学好Lisp所必须的。选择一个较好的编辑器,这是一个基本条件,建议使用VisualLisp编辑器或Lisplink等专用编辑器,此类编辑器可以对函数突出显示。按Lisp(DCL)专有格式书写,并经常对程序进行格式化”,及时发现语法错误,并有利于调试是查找错误。使用自定义函数,并辅助以适当得注释,在较大程序中按功能使用自定义函数可以使得程序条理化。autolisp的入门教程十autolisp函数!Lisp是一门历史悠久的语言,全名叫LIStPr

2、ocessor,也就是装处理语言”,它是由JohnMcCarthy于1958年就开始设计的一门语言。和Lisp同时期甚至更晚出现的许多语言如Algo等如今大多已经消亡,又或者仅仅在一些特定的场合有一些微不足道的用途,到现在还广为人知的恐怕只剩下了Fortran和COBOL。但唯独Lisp,不但没有随着时间而衰退,反倒是一次又一次的焕发出了青春,从Lisp分支出来的Scheme、ML等语言在很多场合的火爆程度甚至超过了许多老牌明星。那么这颗常青树永葆青春的奥秘究竟在哪里呢?如果你只接触过C/C+、Pascal这些过程式语言”的话,Lisp可能会让你觉得十分不同寻常,首先吸引你眼球(或者说让你觉得

3、混乱的)一定是Lisp程序中异常多的括号,当然从现在的角度来讲,这种设计的确对程序员不大友好,不过考虑到五六十年代的计算机处理能力,简化语言本身的设计在那时算得上是当务之急了。Lisp的基本语法很简单,它甚至没有保留字(有些语言学家可能对这一点有异议,另怕,我听你们的),它只有两种基本的数据,仅有一种基本的语法结构就是表达式,而这些表达式同时也就是程序结构,但是正如规则最简单的围棋却有着最为复杂的变化一样,Lisp使用最基本的语言结构定义却可以完成其它语言难于实现的、最复杂的功能。废话少说,现在我们就来看看Lisp语言中的基本元素。Lisp的表达式是一个原子(atom)或表(list),原子(

4、atom)是一个字母序列,如abc;表是由零个或多个表达式组成的序列,表达式之间用空格分隔开,放入一对括号中,如:abc()(abcxyz)(ab(c)d)最后一个表是由四个元素构成的,其中第三个元素本身也是一个表。正如算数表达式1+1有值2样,Lisp中的表达式也有值,如果表达式e得出值v,我们说e返回v。如果一个表达式是一个表,那么我们把表中的第一个元素叫做操作符,其余的元素叫做自变量。Lisp世界中的7个公理(基正如欧几里德的几何世界中有五个公理一样,我们在这里给出本操作符):(quotex)返回x,我们简记为x(atomx)当x是一个原子或者空表时返回原子t,否则返回空表()。在Lis

5、p中我们习惯用原子t表示真,而用空表()表示假。 (atoma)t (atom(abc)() (atom()t现在我们有了第一个需要求出自变量值的操作符,让我们来看看quote操作符的作用一一通过引用(quote)一个表,我们避免它被求值。一个未被引用的表达式作为自变量,atom将其视为代码,例如: (atom(atoma)t反之一个被引用的表仅仅被视为表 (atom(atoma)()引用看上去有些奇怪,因为你很难在其它语言中找到类似的概念,但正是这一特征构成了Lisp最为与众不同的特点一一代码和数据使用相同的结构来表示,而我们用quote来区分它们。(eqxy)当x和y的值相同或者同为空表时

6、返回t,否则返回空表() (eqaa)t (eqab)() (eq()()t例如:我们有时想捕捉任意两点的中点,而不只是一条线上的中点,用系统自己的捕捉中点(它要有辅助线)就不行了,我们可以参考辅捉虚中点.lsp程序来实现。除程序中的语句要学外,动画中的自动找到所有的全局变量并把它们改为局部变量的方法很有用!动画中先画了一个六边形,再画一个圆与它内接,圆心就是捕捉虚中点!AutoLisp概述AutoLisp的数据类型,它有10种数据类型,常见的有五种:整型INT实数型REAL符号型SYM字符串STR表LISP在AutoLisp中,最基本的数据类型称为符号表达式,也称为S-表达式,它是原子和点对

7、的总称,点对通常表示为表。原子是一个一般符号系列,有两种类型的原子,一种称为数子原子(简称数”),AutoLIsp可处理整数和实数,其它不是数”原子称为非数字原子,它包括符号原子(或称为文字原子)和串原子。注意:0.4不能写成.4。符号原子的大小写是等效的。符号原子可以包含下列字符以外的任何可打印字符。正反括号用于定义表句号用于作点对分号用于注释的开始,用作QUOTE函数的简写双引号用作字符串常数的定界符符号原子的长度没有限制,且所有的字符都是有意义的,但尽量不要超过6个字符。约束是一对符号和值,当将一个值赋给符号时,就说符号被约束到那个值。值(而不是符号)决定所代表信息的类型,故一个符号可以

8、接受任何类型的值,其初始值为nil.在AutoLisp中,有两个特殊的符号原子,即T和nil.字符串的个数(不包括定界符)称为字符串的长度。字符串可以是任意长度,它们的存储空间是动态分配的,但字符串常量的最大长度不超过100,长度为0字符串称为空串。可以用“nnn”的方式表示字符,其中nnn为八进制。eEscn换行r回车t制表符(Tab节)点对是由一个左括号,后接一个S-表达式和空格再接一个句点和空格和一个右括号。表是指放在一对相匹配的左右括号中的元素有序集合。表中的项称为表的元素,表中的元素可以是任意类型的S表达式,序号0到n1。如果嵌套,0层,1层.表的长度,顶层元素的个数。只有nil是表

9、(?()又是原子。表有两种类型:标准表,引用表。引用表是在表的前面冠以引用符号(域Quote)对该表不求值。标准表:第一个元素的值必须是一个合法的已经存在的AutoLisp函数定义,后跟调用该函数的参数。AutoLisp采用”前缀表示法即把运算符放在操作数之前,而不是中间,并把运算符(函数名)和操作数(调用函数的参数)用圆括号括起来,以表的方式表示。一个完整的AutoLisp程序往往是由一系列按顺序排列的S-表达式组成的。如:(defunplus(xy)(+(+xy)x)(SetQa2.0)(SetQb2.0)(plusab)一个S-表达式可以分多行写,一行也可以写多个表达式。注释以分号开始,

10、并在一行的末尾结束,AutoLisp的求值器忽略注释。AutoLisp是一种求值型语言,求值程序第一次碰到一个求值代码块时,整个块被转换成压宿代码,如果程序中再次碰到那个块,只是简单的运行它。求值过程:1,整形,实数,字符串,文件指针,系统内部函数,以及两个特殊的符号原子,对它们求值就是它们本身。2,符号原子是以当前的约束值作为它们的求值。3,表是根据它的第一个元素的数据类型进行求值的。(1)第一个元素的值为表,该表就假定为用户定义的函数。(2)如果表的第一个元素的求值结果为一个内部函数,则剩余元素作为参数传给该函数,并执行该函数的代码,由函数的类型确定是否对传给它的参数进行求值。输入距离Li

11、sp语言中输入距离的函数为getdist,但我们有时需要输入负值,有时需要在输入距离的同时得到角度,使用getdist函数就显得无能为力,这时,我们可以灵活使用其它交互输入函数如getpoint、getcorner等,通过计算得到我们所需要的值。例1是一段输入长度的同时得到默认角度的代码,使用getpoint函数。*;例1(setqpt1dstpt0(getpointn直线基点:)(getpointpt0n直线长度:)(distancept0pt1)ang(anglept0pt1)angl(getanglept0(strcatn;长度及角度可用键盘或鼠标定位;计算长度;计算默认角度直线方向:)

12、*例2是可以按阵列方式输入行列间距的代码,输入距离为正值,修改部分代码可输入负值,使用getcorner函数,同时使用initget的控制位128。*;例2(defunlc_dist()(initget128);允许任意输入(setqdisr(getpointn指定单位单元或输入行间距:)(if(=(typedisr),LIST)(progn;鼠标输入(initget1)(setqdis(getcornerdisrn指定对角点:);鼠标输入对角disc(abs(-(cardis)(cardisr)disr(abs(-(cadrdis)(cadrdisr)(if(=(typedisr),STR)

13、(if(setqdis(distofdisr);正值行距;正值列距;计算行列间距;键盘输入行距;判断输入的是否距离(progn(initget6)(setqdisc(getdistn输入列间距:)(progn(princn需要正数值或两个二维角点。;输入列距;键盘输入格式不符返回)(lc_dist))(progn;空输入返回(princn需要正数值或两个二维角点。)(lc_dist)AutoCAD中特定角度及长度捕捉的实现方法一、引言在AutoCAD中的角度捕捉只有当正交状态打开时的直和水平方向,对于其他特殊角度无能为力;另外,其网点捕捉也是相对于X轴和Y轴,无法实现其他方向的特殊长度捕捉,给

14、绘图带来极大的不方便。在应用AutoCAD进行设计制图白操作中,LINE和POLYLINE是使用频率最高的两个命令,经常要遇到在某些特定角度上绘制特定长度的简单线或复合线的情况,因而实现这两个捕捉对提高AutoCAD作图效率很有实用价值。二、方法原理所谓角度捕捉,是指当十字光标在某一角度”的一定范围内选取一点时,该点自动落在该a角度线上;当我们设定捕捉角度为a时,将会以基准点作为原点、自X轴正方向出发,将整个屏幕划分为360/a添区间,则NXz角度就是角度捕捉线,其中,0WN360/a360/速示不大于360/由勺整数。所谓长度捕捉,是在角度捕捉的基础上,在某一角度线上有一系列捕捉点,该系列点

15、离基准点的距离为捕捉长度的正整数倍,当选取直线上的一点时,落点自动落到离其最近的捕捉点上。实现特定角度和长度捕捉的关键点是:当十字光标(即十字交*线)移动时,程序要随时跟踪其交*点的位置,并将该位置与用户所设定的捕捉角度与长度对应起来,从而计算出在该角度上的落点。以下举例说明该两个捕捉的实现过程:假定捕捉角度为a=30。,捕捉长度为L。当十字光标在任意的某一区间内移动时,比如在第5区间(120150内移动时,此时,落点只能在120。或150。线上(该线在图中并不直接显示),该两根角度线的中心线为135。当十字光标的中心点处在120135之间时,则落点应在120线上,该落点的具体位置为由十字光标

16、的中心点向120。线作垂线来获得,其交点D(称为垂点)即为落点,为直观起见,此时由基准点(此处为。点)向落点作一橡筋拖曳线,该橡筋拖曳线随十字光标的移动而相应移动,显示出拖动过程(见图1);同样,当十字光标的中心点处在135150之间时,则落点应在150。线上,并显示相应的橡筋拖曳线。该橡筋拖曳线并不是真正的线段,只是用XOR墨水绘制的一个向量,当用XOR墨水重新绘制一遍该向量时,该向量将从屏幕上消失,这就是本程序实现光标拖动的原理。落点落在某一捕捉角度线上时,还得落在捕捉长度L的整数倍的点(称为捕捉点)上,还是针对图1,其垂点必然处于某两个捕捉点A与B之间,设A与B的中点为C,当D处于A与C

17、之间时,落点应为A;当D处于C与B之间时,落点应为B(见图1)。其中:OA=nXL;OB=(n+1)XLn:非负整数。L:捕捉长度。此时,程序通过一定的操作将在屏幕的最上面的坐标提示行准确地显示落点相对基准点的偏移长度和偏移角度。用户可以滑动鼠标准确捕捉到目标点。至此,已实现某些特定角度及长度的捕捉。为了满足在程序执行过程中能随时更改捕捉角度和捕捉长度的需要,本程序还增加了相应的模块;另外,本程序中嵌入了窗口放缩功能模块,通过点取下拉菜单中窗口及漫游子菜单,方便了各种作图的需要。三、源程序清单;OS.LSP源程序;err(),出错处理子程序(defunerr(msg)(if(/=msgFunc

18、tioncancelled)(princ(strcatnError:msg);打印错误内容);forif(setq*error*olderr)(setvarcmdechoscmd)(setvarosmodecosmode)(setvarcoordsccoords)(princnnt-多谢使用角度捕捉2.0版,程序非正常结束-!n)(princ);fordefunerr;ant(),设定捕捉角度子程序(defunant(/ang0angl)(setqang0(*an0(/180pi)(princ(strcatn请输入捕捉角度:_)(INITGET4)(setqang1(getreal)(if(n

19、ot(nullang1)(setqan0(*ang1(/pi180)(princnF2/F3/F4/F5/ESC/Return/下一点:);fordefunant;leng(),设定捕捉长度距离子程序(defunleng(/leng0leng1)(setqleng0len0)(princ(strcatn请输入捕捉长度距离:_)(INITGET4)(setqleng1(getreal)(if(not(nullleng1)(setqlen0leng1)(princnF2/F3/F4/F5/ESC/Return/下一点:”);fordefunlent;field(),判断十字光标所在区间,并投影到相

20、应的捕捉角度线上(defunfield(pspeang0/ang1n)(setqang1(anglepspe)(setqn(fix(+(/ang1ang0)0.5)(setqang2(*ang0n);fordefun;endp(),十字光标投影到相应的捕捉角度上后,以用户设定的长度;捕捉计算落点(defunendp(pspeang0/p1p2p3p4dis)(setqp1psp2(polarpsang01)p3pep4(polarpe(+ang0(/pi2)1)(setqpend(intersp1p2p3p4nil)(setqdis(distancepspe)(if(/=len00)(setq

21、dist(*(fix(+(/dislen0)0.5)len0);else(setqdistdis);forif(setqpend(polarpsang0dist);fordefunendp;drag(),对上一次显示的拖曳线进行或操作,使其从屏幕上消失;并绘制下一次拖曳线(defundrag(poldlpold2pold3/)(if(/=b24)(progn(grdrawpold1pold2-10)(grdrawpold2pold3-10);forif(grdrawpstartpend-10)(grdrawpendpframe-10);fordefundrag;coord(),在屏幕的最上一行

22、的坐标栏显示长度和角度(defuncoord(/strleng1leng0ang0)(setqang0(*ang2(/180pi)(setqstr(strcat(rtosdist)(rtosang0)(grtext-2str);fordefuncoord;init(),对程序进行初始化(defuninit(/)(setqscmd(getvarcmdecho);保留原命令回显方式(setqccoords(getvarcoords);保留原坐标显示方式(setqcosmode(getvarosmode)(setqolderr*error*error*err);出错处理(setvarcmdecho0

23、);不回显(setvarcoords0);不显示坐标(setvarosmode0);取消捕捉(setqb0b10c(00)(setqpstart(getpointn请输入直线第一点:)(if(or(nullan0)(an00)(not(numberpan0)(progn(setqan0(/pi6)(ant);forif(if(or(nulllen0)(=(distanceplastpframe)0.1)(progn(dragpstartpoldeplast)(setqplastpframepoldepend);forprogn);forif);forprogn);forcond1(=b3);用

24、鼠标在屏幕上点取一点时(progn(setqpframe(cadra)(fieldpstartpframean0)(endppstartpframeang2)(if(=(distanceplastpframe)0.1)(progn(grdrawpstartpolde-10)(setqplastpframepoldepend);forprogn);forif);forprogn);forcond1(=b2);键盘输入(progn(setqc1(cadra)(cond(=c1138)(ant);F2(=c1139)(leng);F3(=c1140);F4(progn(setqb24)(comman

25、dzoom0.7x);for(=c1140)(=c1141);F5(progn(setqb24)(commandzoom1.4x);for(=cl141)(=c113)(home)(=c127)(home)(T(princn未定义的键);forcond(princnF2/F3/F4/F5/ESC/Return/下一点:”);forprogn);for(cond(=b2)(=b4);点取下拉菜单时(progn(setqc1(cadra)(princn)(cond(=c16005)(progn(commandzoomw)(princn第一角点:)(commandpause)(princn第二角点:

26、)(commandpause);for(=cl6005)(=cl6007)(commandzoomp)(=cl6008)(commandzooma)(=cl6011)(progn(commandpan)(princn第一参考点:)(commandpause)(princn第二参考点:)commandpause);for(=c16011);else(T(princn未定义的菜单);forcond(princnF2/F3/F4/F5/ESC/Return/下一点:);FORPROGN);for(cond(=b4)(T(home);forelse);forcond);forprogn);forwhi

27、le);fordefunpull;draw(),绘制直线子程序(defundraw(/)(while(/=bl1)(progn(if(=b3)(progn(commandlinepstartpend)(princnF2/F3/F4/F5/ESC/Return/下一点:)(setqb0b11)(setqpstartpend);forprogn);forif(pull);forprogn);forwhile(grdrawpstartpend-10)(grdrawpendpframe-10);fordefundraw;主程序(defunc:os(/bblb2cpstartpendpframeplas

28、tang2distscmdccoordsolderrcosmode);an0len0aredefinedoutprogram(init)(draw)(princn)(commandredraw)(setq*error*olderr)(setvarcmdechoscmd)(setvarosmodecosmode)(setvarcoordsccoords)(princnnt角度捕捉2.0版n)(princnnt*宁波大学建筑设计研究院-程建华,1996*n)(princ);fordefunos四、程序的安装与使用1 .程序的安装以下三种装载方式,用户任选一种即可:在AutoCAD环境下,将OS.L

29、SP拷至当前目录,再执行(LOADOS)即可装载OS.LSP。也可先将OS.LSP拷至子目录下,再在ACADSUPPORTACADR12.LSP或ACADR13.LSP中加入下面一句语句实现启动AutoCAD时自动装载:(AUTOLOADOS(OS)也可将OS.LSP拷至子目录下,在子目录下的菜单文件ACAD.MNU中的合适位置加上下面的一句语句,即可直接在菜单中点取角度捕捉操作:角度捕捉AcAc(loadc:/acad/support/os.lsp)os2 .程序的使用在一幅图中第一次使用该程序时,需要用户输入捕捉角度和捕捉长度,第二次调用本程序时,程序可自动采用上一次最后设定的捕捉角度和长

30、度作为默认值。然后,程序需要用户选择输入一点作为基准点,此时命令行提示:F2/F3/F4/F5/ESC/Return/下一点:用户根据该提示可任选其中的一种操作,具体解释如下:按F2键重新设定捕捉角度;按F3键重新设定捕捉长度;按F4键窗口缩小0.7倍;按F5键窗口放大1.4倍;按ESC键、回车键、鼠标右键均可结束操作,退出程序;选取下一点,移动十字光标键,此时在屏幕的最上面的一行的坐标提示栏准确地显示出按用户设定的捕捉角度和长度所取得的落点相对于基准点的偏移角度和长度,滑动十字光标键直至用户寻找到所需要的下一点并按下鼠标左键,命令行重又出现上面的提示行,并进行下一轮循环;另外,用户还可以点取

31、View菜单下的Zoom菜单中的ZoomWindow、ZoomPrevious、ZoomAll等三个子项实现窗口放缩和Pan菜单实现屏幕漫游;对于其他操作,用户均可按屏幕命令行的中文提示方便地进行操作。在非汉化AutoCAD中运行本程序时,只需将程序中有关的中文提示行改成英文提示即可。另外,由于不同的机型在AutoCAD环境下键盘返回码可能稍有区别,所以要求用户在应用本程序之前对自己的机器键盘返回码按如下方法作一次核实:在AutoCAD命令状态下输入(grread)并回车,用户此时可按下F2或F3、F4、F5键:第一步:Command:(grread)回车第二步:按下F2键此时,屏幕上回显刚输入的键值,比如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论