AutoLisp编程入门.docx

上传人:b****1 文档编号:2644821 上传时间:2023-05-04 格式:DOCX 页数:25 大小:772.54KB
下载 相关 举报
AutoLisp编程入门.docx_第1页
第1页 / 共25页
AutoLisp编程入门.docx_第2页
第2页 / 共25页
AutoLisp编程入门.docx_第3页
第3页 / 共25页
AutoLisp编程入门.docx_第4页
第4页 / 共25页
AutoLisp编程入门.docx_第5页
第5页 / 共25页
AutoLisp编程入门.docx_第6页
第6页 / 共25页
AutoLisp编程入门.docx_第7页
第7页 / 共25页
AutoLisp编程入门.docx_第8页
第8页 / 共25页
AutoLisp编程入门.docx_第9页
第9页 / 共25页
AutoLisp编程入门.docx_第10页
第10页 / 共25页
AutoLisp编程入门.docx_第11页
第11页 / 共25页
AutoLisp编程入门.docx_第12页
第12页 / 共25页
AutoLisp编程入门.docx_第13页
第13页 / 共25页
AutoLisp编程入门.docx_第14页
第14页 / 共25页
AutoLisp编程入门.docx_第15页
第15页 / 共25页
AutoLisp编程入门.docx_第16页
第16页 / 共25页
AutoLisp编程入门.docx_第17页
第17页 / 共25页
AutoLisp编程入门.docx_第18页
第18页 / 共25页
AutoLisp编程入门.docx_第19页
第19页 / 共25页
AutoLisp编程入门.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

AutoLisp编程入门.docx

《AutoLisp编程入门.docx》由会员分享,可在线阅读,更多相关《AutoLisp编程入门.docx(25页珍藏版)》请在冰点文库上搜索。

AutoLisp编程入门.docx

AutoLisp编程入门

AutoLisp编程

基本指南:

两数求和

在命令行输入:

(+23)(-23)(*23)(/23)

如果直接输入(/23)则会显示0因为2和3是整型所以AutoLisp把这些数字译为整型(AutoLisp进行了四舍五入)所以输入(setqx(/2.03))就可得到0.666667六位小数

在命令行输入:

!

p则会显示p这个变量的值

SETQ和变量

Setq是来保存计算的结果的,相当于给一个变量赋值例:

(setqx(/2.03))这边x是变量就是把2.0/3的值赋给x

Setq能完成多项“设置相等”例如:

(setqx1.0y2.0z3.0)就是分别赋给xyz赋值

AutoLISP函数

1.数学函数

(min73511)就是取73511这四个数的最小值

(setqminbr(min73511))

(sinminbr)

数学函数

功能

+

-

*

/

1+

自增1

1-

自减1

FLX

截取实数的整数部分

FLOAT

整数变为实数

REM

返回除法的余数

EXPT

指数

SIN

求弧度角的正弦

COS

求弧度角的余弦

ATAN

求两个数字的反正切

注意:

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函数如表:

模式

说明

示例

0

十进制度

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:

”))

(command“text”xyz2000xyz)

DEFUN用来定义程序名(在AutoLISP中,函数,程序和例程这些词汇交替使用)

Label是给出的程序名。

可以给出任意名称,只要与AutoLISP内置数名和用户定义的全局函数名不冲突就行。

C:

是使是使AutoLISP例程与AutoCAD命令一致的前缀。

这使用户在COMMAND:

提示下简单的输入label就可以了。

如:

在命令行中输入:

label然后选取一个点

如果前缀c:

省略,那么程序必须作为一个AutoLISP函数来运行——用括号括起来。

如:

在命令行输入:

(label)然后选取一个点

注意:

可以不用c:

而用其他前缀,以此来区分您编写的子程序。

如下例:

(defunzhg:

label)

(/xyz)给出了输入和局部变量的名称,斜线用于分隔两种类型的变量:

输入变量为AutoLISP例程提供数据,输入变量名出现在斜线前面,如:

(name/);

局部变量只在程序中应用,局部变量出现在斜线之后。

如(name/xyz)

闭括号”)”是程序开始时开括号的平衡符。

指南:

保存和载入程序

(defunc:

label(/xyz)

(setqxyz(getpoint"Pickpoint"))

(command"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:

”))

(command“text”xyz2000xyz)

题外话:

每次我在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

科学

2

小数

3

工程

4

建筑

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”这样就比较像样了。

在这边我建议大家用记事本编写下面代码:

(defunc:

label(/xyzxyz1uprecptxptyptz)

(setquprec(getint“Labelprecision:

”))

(setqxyz(getpoint“Pickpoint:

”))

(setqptx(carxyz)

Pty(cadrxyz)

Ptz(caddrxyz)

(setqptx(rtosptx2uprec)

Pty(rtospty2uprec)

Ptz(rtosptz2uprec)

(setqxyz1(strcatptx“,”pty“,”ptz))

(command“text”xyz2000xyz1)

注意:

如果你把上面的代码复制粘贴到你的记事本并保存为label.lsp格式的文件,cad载入该文件时有可能会说有错误。

那是因为你复制的代码中的””英文输入法状态的双引号会变成中文状态的双引号。

把它改成英文状态的双引号就可以了。

我的电脑就是有这种问题,我是在word文档里写代码的,复制到记事本的。

(16)最后,在代码中添加注释,以便以后查看。

分号(;)表示内容的开始:

;Label.Lsplabelsapickedpointwithitsx,y,zcoordinates.

;byChenPingfeng,10,September,2012.

(defunc:

label(/xyzxyz1uprecptxptyptz)

;Askuserforthenumberofdecimalplaces;

(setquprec(getint“Labelprecision”))

;Asktheusertopickapointinthedrawing;

(setqxyz(getpoint“Pickpoint:

”))

;Separate3Dpointintoindividualx,y,z-values:

(setqptx(carxyz)

pty(cadrxyz)

ptz(caddrxyz)

;Truncatevalues:

(setqptx(rtosptx2uprec)

pty(rtospty2uprec)

ptz(rtosptz2uprec)

;Recombin

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2