AUTOLISP实用编程四例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
autolisp实用编程四例
江苏崔华明
autocad是一个功能强大的通用图形设计软件,其内嵌的autolisp语言为用户进行二次开发提供了方便。
下面就介绍几则用autolisp编写的实用程序,这些程序相当于新增的autocad命令,可以弥补autocad本身的一些不足,为日常使用带来方便。
1.快速更改文本的大小
在标准的autocad中,要更改已有文本的大小,需要使用change命令。
该命令的缺陷是:即使只更改文本的大小,也要重新确认文本的插入点、字型、倾斜角等一系列参数。
也就是说,除输入文本的新高度值外,还需要按5次回车键才能完成一个文本的更改!而且每次只能修改一个文本。
这对于同时更改多个文本的大小非常不便。
本文的autolisp程序使这一工作变得十分方便和快捷。
使用方法如下:
在autocad的command提示下,打入命令:
cth
autocad将提示“selectobjects:”,这时可以使用autocad允许的任意方式选择目标。
对于有多个文本需要更改的情况,使用窗口选择比较方便,而且你不用担心选择窗口中包含了非文本目标,程序能够自动在选择的目标中查找出文本实体,并只对文本进行更改。
选择目标后,autocad提示“newtextheight:”,这时输入一个新的文本高度值然后回车,则所有选中的文本被更改成新设定的高度。
2.延伸直线的长度
在实际使用中,常常要将一条直线延伸指定的长度。
通常的做法是:在需要延伸的直线的端点画一个辅助圆,圆的半径等于直线要延伸的长度,然后使用extend命令将直线延伸到与圆相交,最后删除辅助圆。
本文的autolisp程序将使你非常容易地实现这一点。
你只需选择要延伸的直线并输入要延伸的长度即可,其余的工作由程序自动完成。
使用方法如下:
在autocad的command提示下,打入命令:
stl
然后根据提示选择要延伸的直线(选择点要靠近直线需要延伸的端点),并输入延伸的长度。
该程序将自动在离选择点较近的直线端点,按指定的长度延伸直线。
3.快速画直线
在画给定坐标点的直线时,需要通过键盘输入坐标值。
这样的情况下当然是利用右边的数字键盘输入
较为方便。
但若直接使用autocad的line命令画直线,在x和y两个坐标值之间需要输入一个逗号“,”作为分隔,而数字键盘区又没有该逗号,所以仍然不方便。
本文的autolisp画直线程序只要求用户输入坐标值,而由程序自动调用line命令画出直线,因此用户不用离开数字键盘区就能完成工作。
使用方法如下:
在autocad的command提示下,打入命令:
xlin
然后根据提示依次输入x和y坐标。
若要结束画线,在程序提示输入x坐标时直接打回车即可。
4.围绕圆弧写一段文本
有时为了美观的需要,希望能够围绕一段圆弧来写文本文字,本文的程序提供了这一功能。
使用方法如下(粗体字表示autocad的提示,尖括号“ΙΛ"中的部分是需要用户输入的内容):
command:atxt
startpointoftext:Ι指定文本的起点Λ
textheight:Ι指定文本的高度值Λ
selectarc:Ι选择圆弧Λ
text:Ι输入文本Λ
输入以上相关内容后,程序自动围绕指定的圆弧写文本。
如果当前的文本字型有固定高度,则程序不提示“textheight:”。
本文给出的程序只适合写英文文本,由于汉字是双字节,所以若要写汉字,需要对程序作一些修改。
需要修改的地方为程序中第二个if函数,用下面的代码替换原来的if函数:
(if(Κtsize0)
(command″text″″c″ptsiztr(substrtxtcnt2))
(command″text″″c″pttr(substrtxtcnt2))
)
紧接该函数,在其后再增加一行代码:
(setqcnt(+cnt1))
修改后的程序支持中文文本(不支持中、英文混合书写)。
5.程序使用说明
以上每个功能的autolisp程序既可以以独立的文本文件形式存放,也可以合并在一个文本文件中。
若以acad.lsp作为程序文件名,并将文件放在autocad支持文件所在的路径中,则在启动autocad时系统会自动加载该文件。
否则需要通过系统菜单或load函数加载autolisp程序文件,然后才能使用。
load函数的调用格式是:在autocad的command:命令提示状态下,打入:
(loadΙautolisp文件名Λ)
在Ιautolisp文件名Λ中可以包含dos路径,但需要注意的是:在autolisp中,反斜杠“ι”有特殊的定义,因此要使用正斜杠或连续两个反斜杠来表示dos路径中的反斜杠。
如:
(load″acadιιcad1.lsp″)
扩展名lsp可以省略。
6.autolisp程序
以上四个功能的autolisp程序如下,该程序已在a cadr13forwindows、中文windows95环境下调试通过。
它适用于autocad10.0以上的dos和windows版本。
;更改文本高度程序
(defunc:cth(/sstxsizenindexenttypeoldsizenewsizeent1)
(setqss(ssget))
(setqtxsize(getdist″ιnnewtextheight:″))
(setqn(sslengthss))
(setqindex0)
(repeatn
(setqent(entget(ssnamessindex)))
(setqindex(+1index))
(setqtype(assoc0ent))
;检查选择的实体是否为文本
(if(Κ″text″(cdrtype))(progn
(setqoldsize(assoc40ent))
(setqnewsize(cons(caroldsize)txsize))
(setqent1(substnewsizeoldsizeent))
(entmodent1))
)
)
(princ)
)
;延伸直线的长度程序
(defunc:stl(/eentpt1pt2madis)
(setqe(entsel″ιnselectline:″))
;取得选中实体的数据
(setqent(entget(care)))
(setqpt1(cdr(assoc10ent))pt2(cdr(assoc11ent)))
;找出离选择点最近的直线的端点
(if(ΙΚ(distance(cadre)pt1)(distance(cadre)pt2))(setqptpt1m10a(anglept2pt1))
(setqptpt2m11a(anglept1pt2))
)
(setqdis(getdistpt″ιnstretchlength:″))(setqpt(polarptadis))
(setqe(subst(consmpt)(assocment)ent))(entmode)
(princ)
)
;快速画直线程序
(defunc:xlin(/xy)
(setvar″cmdecho″0)
(command″line″)
(setqxt)
(while(/Κxnil)
(setqx(getreal″ιnenterx:″))
(if(/Κxnil)(progn
(setqy(getreal″entery:″))
(command(listxy)))
)
)
(commandλ)
(princ)
)
;围绕圆弧写文本程序
(defunc:atxt(/ospt1styetsizesizarctxtrlendiahfintangcntssnangpttr)(setqos(getvar″osmode″))
(setqpt1(getpoint″ιnstartpointoftext:″))
(setqsty(getvar″textstyle″))
(setqe(tblsearch″style″sty))
(setqtsize(cdr(assoc40e)))
(setqsiztsize)
;检查当前的文本字型是否为固定高度
(if(Κtsize0)
(setqsiz(getdistpt1″ιntextheight:″))
)
(setvar″osmode″4)
(setqarc(getpoint″ιnselectarc:″))
(setvar″osmode″os)
(setqtxt(getstring1″ιntext:″))
(setqr(distancearcpt1))
(setqlen(strlentxt))
(setqdia(*(/(*sizlen)(*2.0pir))360.0))
(setqhf(/(*diapi)180.0))
(setqint(/hflen))
(setqang(anglearcpt1))(setqcnt0)
(setqss(ssadd))(while(Ιcntlen)(setqnang。