AutoLisp编程入门Word格式.docx
- 文档编号:4910534
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:25
- 大小:772.54KB
AutoLisp编程入门Word格式.docx
《AutoLisp编程入门Word格式.docx》由会员分享,可在线阅读,更多相关《AutoLisp编程入门Word格式.docx(25页珍藏版)》请在冰点文库上搜索。
AutoLISP的角是弧度值而不是角度值。
例如:
45度的角的正弦值
(setqrad(*(/45180.0)pi))
2.几何函数
(setqp1'
(1.35.7))‘表示指定2个(3个)的坐标值,这样AutoLISP就不会计算这些值了
(setqp2'
(7.53.1))
(setqp3'
(94))
(setqp4'
(0.12.5))
(distancep1p2)
(anglep1p2)
(intersp1p2p3p4)
(osnapp1"
mid"
)
TEXTBOX(查找一行文字的矩形外框)POLAR(指定距离和角度返回一个3D点)
几何函数
功能
Angle
X轴和由2个点定义的直线间的(弧度)夹角
Distance
2点之间的3D距离
Polar
在某一个(弧度)角度上的3D点
Osnap
对某一个点应用对象捕捉模式后的3D点
Inters
4个点定义的3D交叉点
2.条件函数
例:
在一个绘制楼梯间的AutoLISP例程中,一部分程序检查层高是否大于8英寸:
如果大于,就绘制出14级台阶,如果小于就绘制13级台阶。
(if(>
height96)(setqsteps14)(setqsteps13))
条件函数
注释
=
等于
/=
不等于
<
小于
小于或等于
>
大于
大于或等于
If
如果——那么——否则
Cond
查找真的表达式
Repeat
重复n次表达式
While
重复验证表达式直到假命题出现
ForEach
计算表达式中所有数值的表达式值
3.字符串和转换函数
(strlen“UsingAutoCAD”)
STRLEN函数将报告UsingAutoCAD为13个字符,计算空格。
可以看到UsingAutoCAD被引号括起来表明它是字符串。
如果输入(strlenUsingAutoCAD),AutoLISP会试图查询变量Using和AutoCAD所包含字符串的长度。
(strlenautocad“Asoftwarepackage”)
(strlenusing“theplanetEarth”)
(strlenusingautocad)返回34
STRCAT函数通过混合变量和文字将字符串连接在一起并创建返回信息。
(strcatautocad“usedallover”using)返回“AsoftwarepackageusedallovertheplanetEarth”
字符串函数
功能
StrCase
把所有的文字转换成大写或小写
StrCat
连接所有的字符串
StrLen
返回字符串中的字符数
SubStr
返回字符串的一部分
WcMatch
在字符串中匹配通配符
如何把45度37分11秒即AutoCAD表示的45d37’11’’呢?
这就要用到一个名称为ANGTOF的转换函数。
它把包含格式化的角度的字符串转换为弧度(实数),如下例:
(angtof“45d37’11\’’”1)返回0.796214d表示度‘表示分\’’表示秒之所以这样用是为了不至于与后引号(”)混淆,后引号表示字符串的结束。
ANGTOF函数能完成几种AutoCAD支持的单位之间的转换,而用状态值来表示转换的类型,本例中的1是状态值。
几个用到模式值的AutoLISP函数如表:
模式
说明
示例
十进制度
45.3711
1
度-分-秒
45d37’11’’
2
分度
100.1234
3
弧度
0.3964
4
测绘单位
N45d37’11’’E
模式数值与AUNITS系统变量的数值一致。
当您不知道单位的设置时,可以用该系统变量求得模式的数值。
(angtof“45d37’11\’’”(getvar“aunits”))返回0.796214
GETVAR函数可获取系统变量的数值。
转换函数
字符串转换
AtoF
字符串转换为实数
AtoI
字符串转换为整数
RtoS
数字转换为字符串
ItoA
整数转换为字符串
Ascii
把首字符转换为ASCII
Chr
把ASCII码转换为字符
数值转换
CvUnit
基于acad.nut数值的单位转换
4.命令和系统变量
任何在命令提示行中完成的操作都可以很轻松地用COMMAND函数来完成。
(command“circle”“2,2”“D”“1.5”)该命令行的意思是创建以一个圆心坐标为(2,2)直径为1.5的圆其实这表示的意思都是我们平常画圆操作的顺序。
我们可以看到所有的文字都用引号括起来,所有的内容都被认为是字符串,即使是数字也是如此。
(command“text”“5,10”“1.5”“”“UsingAutoCAD”)其中那个红色引号的意思是旋转文字属性按enter键结束就是不旋转文字的意思。
另一方面通常代表ENTER来退出TEXT命令会以闭括号结束。
然而,对于那些自动回复的命令如LINE命令,
“”是需要的。
(command“line“1,2”“3,4”“”)当您最后忘记””时候,AutoCAD会留下下一点的信息不会结束命令。
要高效地应用CAMMAND函数,你必须知道AutoCAD的300条命提示顺序。
可以看下“参考书”
注意的是“任何在COMMAND函数提示下输入信息可用于CAOMMAND。
”注意“输入”这个词。
该函数不能对对话框和工具栏宏起作用。
用对话框的命令不能用在COMMAND中。
获取系统变量
AutoLSIP提供了2个更直接的函数:
GETVAR(获取一个系统变量的值)和SETVAR(设置或者修改这个值)
系统变量SPLFRAME用于确定样条多段线控制框是否显示。
默认值是0意思是不显示。
(getvar“splframe”)返回值为0
(setvar“splframe”1)就是设置splframe显示控制框
Get函数
GETSTRING函数提示用户输入文字,并把它保存在txtstr
(setqtxstr(getstringT“Whatdoyouwanttowrite?
”))
在命令行出现:
Whatdoyouwanttowrite?
然后输入UsingAutoCAD
返回UsingAutoCAD
注意这里附加的AutoLISP标识符T,它是一个AutoLISP操作,可允许GETSTRING中的字符串的包含空格。
如果省去T,GETSTRING只会接纳首空格之前的文字,在COMMAND:
提示下也是同样的情况(结尾只有Using而没有AutoCAD)
GETREAL函数提示用户输入一个高度值。
(setqtxtHt(getreal“Howbigdoyouwanttheletter?
”)
Howbigdoyouwanttheletter?
输入2
在命令行返回2.0
GETREAL函数会自动把2(整数)转化为实数2.0,你也可以不用输入数值,直接在工作窗口单击2点让AutoLISP自动读取2个点的距离。
如果你误输入了文字,AutoCAD会重新叫你输入。
(setqTxtAng(getangle“Tiltthetextbyhowmuch?
GETANGLE函数提示用户输入一个角度,并把它转换成弧度值。
与上面函数一样可以在工作窗口单机2点。
(setqTxtIns(getpoint“Wheredoyouwantthetexttostart?
”))
Wheredoyouwantthetexttostart?
这时你就选取一个点假如我选取的是(27,30,20)
GETPOINT函数提示用户输入文字的起点坐标:
可以输入一个值,一个二维坐标或者三维的,或者在制作窗口单击一点。
若只输入一个值则认为是0,0点到当前点的极轴距离。
若输入文字则会返回错误信息。
通过以上的变量参数可以执行TEXT命令:
(command“text”TxtInsTxtHtTxtStr)
会出现UsingAutoCAD
AutoLISP所有GET函数如下表:
GET函数
字符串、数值、角度
GetAngle
用户选取的(弧度)角
GetOrient
独立于ANGBASE和ANGDIR的角(弧度)
GetString
用户输入的文字
GetInt
用户输入的整型值
GetReal
用户输入的实型值
InitGet
限制用户输入数据
GetKWord
基于INITGET限制获取输入数据
选取的点
GetPoint
用户输入或单击点的x,y,z坐标
GetCorner
矩形的第二个角点
GetDist
两点之间的距离
5.选择集函数
AutoCAD的SELECT命令一次只可对一个选择集进行操作,但是AutoLISP的SSxxx命令却可对最多128个选择集操作。
AutoLISP创建和检验选择集函数如下表:
SS函数
SsGet
选择图形中的对象
SsAdd
将对象添加到选择集
SsDel
从选择集中删除对象
SsLength
报告选择集中对象的数目
SsMemb
检查一个对象是否在选择集中
SsName
报告选择集中第n个对象的名称
对象操作函数
大部分对象操作函数以ent开头,是entity的简写,是AutoCAD对象的原名。
要创建并操作对象,ENT函数要作用于DXF格式的变体。
该变体被称为“点对”。
比如,作用于一个名为RightOfWay的层,就要用以下的格式、
“2.RightOfWay”引号表明数据的开始与结束。
中间的点(.)用于分隔两个值:
2是层名的DXF代码:
而RightOfWay是层名。
要应用对象操作函数就需要对DXF格式有较好的理解。
AutoLISP的对象操作函数如表:
Ent函数
EntMake
新建对象
EntGet
获取描述对象数据
TblObjName
从符号表中获取对象名
HandEnt
返回对象的识别码(id)
EntNext
获取数据库中的下一个对象
EntLast
获取新建对象
EntSel
提示用户选择一个对象
NEntSel
提示用户选择一个对象并返回选取点的坐标
EntMod
修改对象
EntUpd
对象修改后刷新屏幕
EntDel
删除对象
高级AutoLISP函数
AutoDesk公司提供了差不多4打函数来控制AutoCAD图形中的对象与外部数据库中的记录之间的ASE(AutoCAD结构化查询语言扩展名)连接。
这些函数不难定位:
他们都以Ase_开头,如ASE_LSUNITE和ASE_DOCMP
还有2打AutoLISP函数用来载入和控制对话框。
如LOAD_DIALOGUE和NEW_DIALOGUE.有一组5个函数用来进行内存管理。
但它们用途很小,所以Autodesk公司建议不必使用。
6.编写AutoLISP函数
指南:
步骤1——选取点
在COMMAND函数中用ID命令,如(command“id”);
在GETVAR函数中用LASTPOINT系统变量,如(getvar“lastpoint”);
在GETPOINT函数,如(getpoint”Pickapoint”)
1.在command:
提示下输入:
(command"
id"
)选取一个点假如x=2.3y=3.0z=5.0然后输入(setqxyz(getvar“lastpoint”))则会出现(2.33.05.0)“LASTPOINT”是被引号括起来的系统变量名,因为他是字符串。
2.(setqxyz(getpoint“Point:
”))getpoint将显示提示文字point:
,并等待用户选取一个点。
假设x=2.3y=3.0z=5.0
步骤2——放置文字
要把文字放在图形中有一个简单的办法:
用COMMAND函数与text命令结合(高级手段是用ENTMAKE)
一个够格的AutoLISP程序:
(setqxyz(getpoint"
Pickpoint"
))
(command“text”xyz2000xyz)
程序命名
为了对程序命名,用DEFUN函数括起全部代码,如下所示:
(defunc:
label(/xyz)
(setqxyz(getpoint“Pickpoint:
DEFUN用来定义程序名(在AutoLISP中,函数,程序和例程这些词汇交替使用)
Label是给出的程序名。
可以给出任意名称,只要与AutoLISP内置数名和用户定义的全局函数名不冲突就行。
C:
是使是使AutoLISP例程与AutoCAD命令一致的前缀。
这使用户在COMMAND:
提示下简单的输入label就可以了。
如:
在命令行中输入:
label然后选取一个点
如果前缀c:
省略,那么程序必须作为一个AutoLISP函数来运行——用括号括起来。
(label)然后选取一个点
可以不用c:
而用其他前缀,以此来区分您编写的子程序。
如下例:
(defunzhg:
label)
(/xyz)给出了输入和局部变量的名称,斜线用于分隔两种类型的变量:
输入变量为AutoLISP例程提供数据,输入变量名出现在斜线前面,如:
(name/);
局部变量只在程序中应用,局部变量出现在斜线之后。
如(name/xyz)
闭括号”)”是程序开始时开括号的平衡符。
指南:
保存和载入程序
label(/xyz)
(setqxyz(getpoint"
text"
xyz2000xyz)
把该程序以文件名label.lsp存入AutoCAD的\support文件夹中。
所有的AutoLISP程序用.lsp后缀来识别。
要在AutoCAD中载入AutoLISP程序,使用LOAD函数(该函数区别于AutoCAD中用来载入图形文件的LOADA命令。
(1)在命令提示行中输入load函数,该函数包含载入AutoCAD的程序名称。
(load“label”)
(2)如果没有找到AutoLISP程序,会提示:
未能找到label文件。
在这种情况需要指定路径。
假设label.lsp保存在\mydocuments文件夹中,您应当输入如下信息:
(load“\\mydocuments\\label”)
注意双反斜线(\\)的使用。
也可以用一个正斜线:
(load“/mydocuments/label”)
(3)可以运行载入程序:
Label然后选取一个点
AutoCAD提供了一个自动载入AutoLISP程序的方法。
AutoCAD开始启动时会自动查找一个名为acaddoc.lsp的文件,并自动载入该文件列出的AutoLISP程序名。
要添加label.lsp并不难
(1)用文字编辑软件打开acaddoc.lsp文件。
(如果acaddoc.lsp不存在,则新建一个文件并把他保存在AutoCAD的\support文件夹中。
(2)添加AutoLISP程序的名称
(load“label.lsp”)
(3)存acddoc.lsp文件
(4)启动AutoCAD,label程序会自动载入。
使用CAR和CDR:
假设我们在cad中点击一下则出现点的坐标,假设某一个点的坐标是(6.1048098.14555510.332554)显然小数位比较多,有时候我们只需要保留一位或者两位的小数位。
下面我们就来编写一段减小小数位的程序:
首先给大家介绍一个系统变量LUPREC,他其实就是UNITS命令的一个设置精度的功能如图我们输入LUPREC也可以实现我们所需要的小数位如图
首先编写代码并保存为文件名label.lsp
(defunc:
label()
(Setqxyz(getpoint“Pickpoint:
题外话:
每次我在word文档编辑的时候复制代码到cad的命令行都会出现错误,因为双引号的问题,在word文档打入英文的双引号你一复制到记事本中就变成中文的双引号了。
可以运行试一试可以在命令行输入!
xyz就可以输出其xyz的坐标值
AUTOLISP有专门的函数用来查分列表。
假设一个点xyz的坐标是(3.221545.0268550.54552)我想取x坐标的值或者y,z。
CAR函数就是提取列表中的首项目。
在命令行输入(carxyz)则会显示xyz的x的坐标值3.22154
CDR函数是CAR函数的互补函数:
它从列表中剔除首选项目并选择余下的内容。
在命令行输入(cdrxyz)则会输出(5.0268550.54552)
AUTOLISP允许以多种方式组合a和d,以提取列表中其他位置的项目。
为了提取y的坐标,使用CADDR:
在命令行输入(cadrxyz)则会显示(5.02685)
用CADDR提取z坐标:
在命令行输入(caddrxyz)则会显示50.54552
用刚学的代码将每个坐标保存在独立的变量中:
在命令行输入(setqptx(carxyz)
Pty(cadrxyz)
Ptz(caddrxyz)
3个坐标已经分离,现在用来减少小数位的位数。
ROTS函数一次完成2个任务:
改变小数位数并把实数转换成字符串。
在命令行输入(rtosptx2uprec)就会显示你想保留小数位数的值。
不懂接着往下看。
RTOS函数用到3个参数
Ptx是包含实数值的变量名
2是转换类型,本例中是小数类型。
数字2基于系统变量LUNITS,该变量定义了5种单位类型,如下表:
类型
单位
1
科学
小数
工程
建筑
5
分数
Uprec是保存精度的变量名。
不懂下面接着看哦。
精度类型的含义依赖于单位的类型。
比如:
类型3对小数单位而言是“3个小数位”,而对建筑单位而是“8英寸”。
如果Uprec指定精度为1,那么RTOS函数会将6.10049显示为6.1
哎呀,就是保留几位小数啦。
对x,y,z坐标值截尾并保存,代码如下:
(setqptx(rtosptx2uprec)
Pty(rtospty2uprec)
Ptz(rtosptz2uprec)
可以设置与一个它本身等价的变量名,用RTOS获取后面的ptx值后,前面的ptx保存x坐标的新值。
变量名的再利用可以节省内存。
坐标截尾后用STRCAT函数把他们串接起来:
(strcatptxptyptz)
但是最终会显示“6.18.110.0”你分辨不出来是哪几个数字吧。
但是AUTOlisp又没有空格,所以代码要写成(setqxyz(strcatptx“,”pty“,”ptz))最终会显示“6.1,8.1,10.0”这样就比较像样了。
在这边我建议大家用记事本编写下面代码:
label(/xyzxyz1uprecptxptyptz)
(setquprec(getint“Labelprecision:
(setqptx(carxyz)
(setqxyz1(strcatptx“,”pty“,”ptz))
(command“text”xyz2000xyz1)
如果你把上面的代码复制粘贴到你的记事本并保存为label.lsp格式的文件,cad载入该文件时有可能会说有错误。
那是因为你复制的代码中的””英文输入法状态的双引号会变成中文状态的双引号。
把它改成英文状态的双引号就可以了。
我的电脑就是有这种问题,我是在word文档里写代码的,复制到记事本的。
(16)最后,在代码中添加注释,以便以后查看。
分号(;
)表示内容的开始:
;
Label.Lsplabelsapickedpointwithitsx,y,zcoordinates.
byChenPingfeng,10,September,2012.
;
Askuserforthenumberofdecimalplaces;
(setquprec(getint“Labelprecision”))
Asktheusertopickapointinthedrawing;
Separate3Dpointintoindividualx,y,z-values:
pty(cadrxyz)
ptz(caddrxyz)
Truncatevalues:
(setqptx(rtosptx2uprec)
pty(rtospty2uprec)
ptz(rtosptz2uprec)
)
Recombin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AutoLisp 编程 入门