AutoLISP实用编程四例.docx
《AutoLISP实用编程四例.docx》由会员分享,可在线阅读,更多相关《AutoLISP实用编程四例.docx(17页珍藏版)》请在冰豆网上搜索。
AutoLISP实用编程四例
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程序如下,该程序已在Acadr13forwindows、中文Windows95环境下调试通过。
它适用于AutoCAD10(0以上的DOS和Windows版本。
;更改文本高度程序
(defunc:
cth(,sstxsizenindexenttypeoldsizen
ewsizeent1)
(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(assoc1
1ent)))
;找出离选择点最近的直线的端点
(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(,ospt1styetsizesizarctxtrlend
iahfintangcntssnangpttr)
(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
AutoCAD实用技巧
作者:
郑华上传:
yeguiren来源:
水利工程网2005-05-2300:
00
001.将地形图中非零高程对象转换为零高程对象
如果你从测绘院拷贝来的地形图上有一些图元(如直线和圆等)的Z坐标不为零,那么
有可能产生交点不易捕捉、使用dist命令量取的两点间距离值与实际不合等等问题,下面
我介绍两种解决这个难题的方法。
(1)命令法(中文为注释):
在命令行键入change
Command:
CHANGE
选择对象
Selectobjects:
all
键入p选择修改特性
Properties/:
p
键入e修改标高
Changewhatproperty(Color/Elev/LAyer/LType/ltScale/Thickness)e
输入新的Z坐标
Newelevation:
0
选择修改特性,回车结束。
Changewhatproperty(Color/Elev/LAyer/LType/ltScale/Thickness)
Commnd:
(2)移动法:
很简单,键入移动命令“move”,将所有实体移至点1,0,1E99,然后再重复“move”命令,将所有实体移至点0,0,-1E99即可。
该方法利用AutoLISP语言编程如下:
;;标高(Z坐标)归零实用程序
(defunC:
Z=0()
(setvar"cmdecho"0)
(princ"n正在处理图形数据,请稍候...")
(command"_.UCS""")
(command"_.move""_all"""'(001e99)"""_.move""_p"""'(00-1e99)"")
(princ"nOK,已将所有图元的标高值即Z坐标归零.")
(setvar"cmdecho"1)
(princ)
)end(defunC:
Z=0()
002.消除dwg文件中多余的图层和图块
对于绘制CAD图纸后残留的一些多余的图层、文字样式、线型和图块等,可以通过以下方法将它们清除:
(1)利用CAD文件菜单下的“输出”命令,填写输出图形文件名称,选择形式为block(*.dwg),图块名称不填,选择基本点为(0,0),然后选择要输出的图形内容,图形经过如此处理后不会再有多余的信息。
(2)利用CAD文件菜单下的“清理”命令,当命令行提示“Verifyeachnametobe
purged(验证每个要清理的名称)”时:
,键入“n”不用验证是否清理,可加快清理速度。
多重复几次PURGE命令后也不会再有多余的图形信息了。
(3)编制一个小巧的AutoLISP程序,可以减少手工操作。
(defunC:
QHTX()
(setvar"cmdecho"0);关闭命令回显
(repeat10
(command"purge""a""""n")
);重复执行purge命令10次
(princ)
);enddefunC:
QHTX()
将以上代码复制在新文本文件中,另存为QHTX.lsp,然后在“工具”菜单下加载运行,便能清除图形中的残余信息。
003.字体打印问题
有时我们用实心字体绘制的图形,打印时字体却全变成了空心字,这时只要在命令行键入“TEXTFILL”,按系统提示
NewvalueforTEXTFILL<1>:
键入数字1后就能恢复实心字体的打印了。
TEXTFILL是CAD中的一个不太常用的系统变量,其参数说明如下:
TEXTFILL
类型:
整数型
保存位置:
注册表
初始值:
1
控制打印、渲染以及使用PSOUT命令输出时TrueType字体的填充方式。
0以轮廓线形式输出文字
1以填充图像形式输出文字
004.一个被遗忘的CAD命令
命令“hatch”可用于图案填充时指定边界的区域。
它创建一个非关联的填充,可以填充由一个对象或能够完全封闭一块区域的多个对象组成的边界。
如果边界是由多个对象组成的,那么它们的端点必须符合创建图案填充的条件。
用户也可以用直接填充的选项为没有封闭边界的区域定义一个多段线填充边界,然后进行填充。
命令行:
hatch
输入图案名称或[/实体(S)/用户定义(U)]<当前值>:
输入预定义或自定义的图案名、输入s、输入u、输入或按ENTER键
005.测量直线、弧线和曲线的简易方法
利用“拉长对象”命令(lengthen)可以测量直线、弧线和曲线的长度值。
在命令行键入“len”或“lengthen”,按提示选择所需测量的直线、弧线和曲线即可得到它们的当前长度值。
006.关于explode命令无效的问题
如果在CAD使用过程中,不能炸开图块了,先试一试能否炸开别的实体(如多行文本、填充图案等),如果能,说明是你所选择的实体本身不能被炸开(也可以在命令前加上.来测试是否可以炸开图块);如果不能,可能是感染了一个基于AutoLISP语言的病毒程序acad.lsp。
它的主要表现特征为打开任意一张图纸均不能炸开图块,即explode命令无效,给我们的工作带来了不少麻烦。
该病毒运行时将在所有打开过CAD图纸的目录下,生成acad.lsp病毒程序,并在CAD的安装目录Support下,生成acadapp.lsp病毒程序。
下面是清除该病毒的方法:
(1)打开系统的查找“文件或文件夹”对话框;
(2)在“文件或文件夹名”数据框中输入:
acad.lsp;acadapp.lsp;
(3)在“包含文字”数据框中输入:
explode;
(4)在“搜索”数据框中选择:
所有硬盘驱动器;
(5)将搜索到的这两个文件全部删除后,问题就已经解决了。
注意:
一定要将硬盘是的所有目录都搜索一遍,这样才能将病毒清除干净。
我的个人主页里面有“CAD病毒查杀工具”下载。
007.R14中的线宽设置
在R14中如果是为多段线赋宽,可以用pedit命令为其赋予宽度值。
如果用line命令绘制的直线,也可以用pedit命令将其换为多段线后再为其赋予宽度值。
但如果是为用spline命令绘制的样条曲线赋宽,相对来说就要麻烦些了。
1.先将图形另存为“AutoCADR12/LT2Drawing(*.dwg)”格式;
2.打开刚才保存的R12格式文件(原样条曲线亦转换为多段线了);
3.用pedit命令为其赋予宽度值。
也可以在命令行键入“WMFOUT”命令,选择图形中需要赋予宽度值的样条曲线,将其保存为扩展名*.wmf的Windows图元文件,然后再用“WMFIN”命令插入刚才保存的图元文件,并把它炸开,就可以用pedit命令赋予宽度值了。
008.DWG错误文件的恢复
有时我们辛苦几天绘制的CAD图会因为停电或其它原因突然打不开了,而且没有备份文件,这时我们可以试试下面的方法恢复:
1.在“文件(File)”菜单中选择“绘图实用程序/修复(DrawingUtilities/Recover)”项,在弹出的“选择文件(SelectFile)”对话框中选择要恢复的文件后确认,系统开始执行恢复文件操作;
2.如果用“Recover”命令不能修复文件,则可以新建一个图形文件,然后把旧图用图块的形式插入在新图形中,也能解决问题;
3.如果有问题的图形文件是R14或R2000格式,也可在R2002或R2004下试一试上面的恢复操作;
4.在AutoCAD2002或2004中打开后另存为2002或2004的文件,然后重新打开文件,并选择采用局部打开方式,打开几个图层另存为一个文件,再打开剩下的图层,再另存为第二个文件,最后把两个文件复制重合在一起就会复原图了;
5.如果打开CAD图某一百数(如30%)时就停住没反映了,这说明图纸不一定被损坏,把电脑内的非AutoCAD提供的矢量字体文件删除(移到别的地方)后再试试(保留2,3个也可以),说不定文件就能正常打开了。
009.恢复失效的特性匹配命令
有时我们在AutoCADR14的使用过程中,其他命令都很正常,但特性匹配却不能用了,重装软件一时又找不到它的安装程序,下面介绍的方法就可以派上用场了。
方法1.在命令行键入menu命令,在弹出的"选择菜单文件"对话框中,选择acad.mnu
菜单文件,重新加载菜单;
方法2.在命令行键入appload命令,在弹出的"加载AutoLISPADS和ARX文件"对话框中,选择并加载AutoCADR14目录下的match.arx文件。
其实,对于其它命令失效的问题,也可以灵活运用以上方法。
010.无法打开“多行文字编辑器”
一般来说多行文字命令"MTEXT"不能用了,可以先手动加载一下“acmted.arx”文件,重新加载后"MTEXT"命令就能正常使用了。
“acmted.arx”位于AUTOCAD程序安装目录的根目录下。
当启动CAD后第一次使用"MTEXT"命令时系统才自动调入,并常驻内存。
所以有时候,当觉得CAD运行速度变慢,可以用“APPLOAD”命令将其从内存中卸载。
建议在加载“acmted.arx”前,还要查看一下系统变量"MTEXTED"的值是否为“Internal”。
(意思是AUTOCAD是不是使用内部多行文字编辑器来处理多行文字)。
如果不是,在命令行键入“MTEXTED”,然后按其提示将其值赋为“Internal”即可。
011.坐标的输入
在AutoCAD中,很多命令都需要在屏幕上选取两个相对的点以确认位置,如移动命令、复制命令等。
通常第二个点可以通过输入“,距离,角度”来确定相对于第一个点的位置,这时你可以使用更简捷的方法,将鼠标置于你所需要的相对于第一个点的方向,然后直接在命令行中输入距离的值,就可能确定第二个点。
在AutoCAD2000版中由于具有极向捕捉的功能,使用该项功能就更为方便。
相对坐标输入点时,在正交状态时,一般输入为:
@x,0或@0,y(例如输入相对坐标“@100,0”表示下一点相对上一点X方向增加100,又如输入相对坐标“@0,50”表示下一点相对上一点Y方向增加50),以上两种情况下,可以直接输入100或50即可实现相同的目的,从而节省输入时间。
AutoCAD是当今最为流行的计算机辅助设计软件,其实,除了我们平时使用的内核命令以外,AutoCAD还提供了许多非常实用的附加工具(bonustools),它们存放在bonus目录下(R14版),如果用户在自己的AutoCAD下没有发现该目录,可运行Setup程序,在SetupChoices对话框选择“Add”,添加Bonus。
另外对某些系统变量的重新设置,也可以让我们工作起来得心应手,达到事半功倍的效果。
下面向大家介绍几个较为实用的附加工具和系统变量。
系统变量:
访问系统变量一般有两种方法:
大多数系统变量可以通过下拉菜单或命令来访问(如:
用ddunits命令设置angbase变量);所有系统变量都能通过Autolisp程序或在命令行中直接键入该变量名来访问。
下面介绍的几个变量。
除特殊说明外,均针对R14版。
Angbase和Angdir:
分别控制当前坐标系零度角的方向和角度的旋转方向。
地质工作中常用测地坐标,我们可以改变这两个变量的值,使正北方向为零度,坐标按照顺时针方向旋转,符合我们的专业习惯,省去许多中间换算的麻烦。
cursorsize:
控制十字叉光标的大小。
用过R14以前各版本的用户,或许更习惯于全屏幕十字光标,或需要用全屏幕十字光标来大致对照实体。
该变量也正是为满足这这一需要。
dwgcodepage:
设置码页(R12版)。
许多用户也许正被一个问题困扰:
以前用R12版做的图形文件无法在R14版中打开,或者打开后汉字全为乱码。
试着在R12版打开该图,改变该变量的值为“iso8859-2”,存盘后再用R14版打开,你会惊喜:
一切如前(别忘了:
先用Preferences命令将该图所需要的字体文件目录加入到“surportfilesearchpath”)~Mirrtext:
控制文字实体镜向后的显示方向。
对文本镜向后,在缺省状态下,文字不具可读性,就象我们在镜子中看到的文字一样,是反写的。
将该变量的值改为0,文字镜向后仍然保持原书写方向。
Plinetype:
确定是否使用优化的轻便多义线。
优化多义线将大大减少存储空间;而为了涉及到Pline线码表的原Autolisp程序能依旧运行,有些用户更希望Pline线仍然为原来格式。
explmode:
非等比例插入的块能否炸开。
在缺省状态下,非等比例插入的块不会响应explode命令,改变explmode的值,可以炸开这种块。
Useri1-Useri5、Userr1-Userr5、Users1-users5:
分别为能存放5个整数、5个实数、5个字符窜的共15个系统变量,变量值随图形文件一起保存(笔者认为只有5个整数、5个实数变量的值才能保存)。
程序开发人员可能需要保存图形的某些参数以供程序访问,随图形文件一起保存在这些变量中,不失为一种非常安全、有效的方法。
此外,编程人员经常要用到的,例如:
当前图形文件名(包括路径)、当前时间、当前图形修改状态等许多数据或状态,都可以通告访问系统变量而获知。
详情请查阅有关资料。
附加工具:
由Autodesk公司免费提供给用户。
附加工具本身是程序(包括.lsp、.arx和.exe),这些程序由ac_bonus.lsp统一组织、装入。
在ac_bonus.lsp内部还定义了一些这些程序的公用程序。
可以用bonus菜单(菜单文件名为ac_bonus.mnc)、工具条或者人为装入后用命令来启动。
这些程序对AtuoCAd内核命令是个非常好的补充,也可以将其修改后加入到自己的lisp程序中。
这里简要介绍几个实用的程序的功能