找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 510|回复: 1

[文章]:[文章]:[文章]:autolisp入门教程2

[复制链接]
发表于 2006-4-9 23:59:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
--------------------------------------------------------------------------------

单元二:AutoLISP的关键、基本结构及语法

一、学好 AutoLISP 的关键、 基本结构与语法:

1. AutoLISP 程序语言的特质

A.语法简单

B.功能函数强大

C.撰写的环境不挑剃

D.直译式程序,『即写即测、即测即用』

E.横跨 AutoCAD 各作业平台,悠然自得  (注:以上五点,读者可以参考上一章的剖析!!!)

2.学好 AutoLISP 的关键:充份掌握『语法结构』&『功能函数』的搭配!!!

3.重要的 AutoLISP 的基本语法结构

规则1: 以括号组成表达式,、相对称左右括号数一定要成双成对

规则2: 表达式型态:( 操作数运算子运算子 运算子)

1.1 操作数包括『功能函数』&『自定函式』

1.2 运算子(自变量)包括:

A.整数(Integer) 如 8,-17,500,9999 .....

B.实数(Real) 如 8.5,-17.456 .....

C.字符串(String) 如 "AutoCAD","123"

D.串行(List) 如 ("a" "b" "c"),(x y)

E.像素名称代码 如 <entity name: 6000f262>

F.档案代码 如 <file:#12438>.....

G.选择群集代码 如 <Selection set:1>

规则3:表达式中的『运算子』,可以是另一『表达式』或『子程序』

规则4: 多重的括号表达式,运算的先后顺序是『由内而外、由左而右』

规则5: 以档案型态存在的 AutoLISP 程序(ASCII 档案),其扩展名必须是.lsp

规则6: 撰写的环境,只要是一般的文书编辑软件、记事本,可编辑 ASCII 档案者都适用

规则7: 以 defun 功能函数定义新的指令或新的功能函式

规则8: 新定义的功能函式名称,若为『C:函式名』,则此函式可为 AutoCAD新指令

规则9: 加载 AutoLISP 程序的作法:=> 指令:后直接键入 (load "LISP主檔名")

规则10: AutoLISP 程序中,在『分号 ;』后的内容均为批注,程序不处理,适时的增加批注,将使程序更具可看性、学习性及完整性

规则11: AutoLISP 最常用的变量型态是『整数』、『实数』、『字符串』、『点串行』四种,变量的型态依据设定值而自动定义,变量会一直储存该值,直到被重新设定值或绘图结束自动消失

规则12:以 setq 功能函数设定变量值 (setq 变量名称 设定值)

规则13:欲在 AutoCAD 的环境中,查看一变量值,指令:下键入『!变量名』即可

规则14:以(defun C:函式名(自变量 / 变量) ........)程序中,程序中的变量若在『/』右边变量内,则称为『区域变量』,否则为『整体变量』


--------------------------------------------------------------------------------

二、学好 AutoLISP 的关键:

充份掌握『语法结构』&『功能函数』的搭配!!! 其时这个关键亦是学习其它程序语言的关键.

·     『语法结构』AutoLISP 的语法结构规定的并不多,变量不用事先定义及宣告,读者可熟记下一单元有关重要的 AutoLISP基本语法结构,十四条设计上要求的『规则』

·     『功能函数』AutoLISP 之所以能功能如此强大,都有赖功能函数,其成员共约200个:

1.       一般性函数170个

2.       ADS 定义特殊函数9个

3.       配合 DCL 交谈框设计函数 22个

各功能函数在使用上要求配合的运算子(自变量)型态,均有其规定,当然,您可不能乱给!

例如:

指令:(+ 1 2 3 "ABC")

传回:error : bad argument type (自变量型态错误)

因为『+』函数不接受字符串,而 "abc" 正是字符串

指令:(rtos "abc")

传回:error : bad argument type (自变量型态错误)

因为『rtos』函数只接受实数转字符串

详细内容可参考下一章『快速浏览 AutoLISP 功能函数』至于各功能函数详细的语法与实例应用,读者请参阅本书『第三篇AutoLISP功能函数详解』


--------------------------------------------------------------------------------

三、重要的 AutoLISP 的基本语法结构:

规则1:以括号组成表达式,左右括号数一定要成双成对、相对称

请依序在『指令:』列 (或指令:) 后面直接键入以下表达式

指令:(+ 1 2 3 4 5) 传回加总和15

指令:(max 14.5 8.9 35) 传回最大值35

指令:(menucmd "p1=*") 显示拉下POP1

指令:(getint "Enter Real:") 传回Enter Real:要求输入一个实数

指令:(setq a (* 12.5 4)) 传回相乘值 50,同时设定给『变量 a』

指令:!a 响应50 (注:! 号可用来查询变量值)

指令:(min 75 a 63) 响应最小值50 (因为变量值a代表50)

错误的范例:

指令:(setq a (* 12.5 4)

1> 传回1>表示少了一个括号

1> ) 此时,只要再补上一个 ) 即可

指令:(setq a (* 12.5 4

2> 传回2>表示少了二个括号

2> )) 此时,只要再补上二个 ) 即可

 

规则2:表达式型态 (操作数 运算子 运算子 运算子 ...)或 (函数(式) 自变量 自变量 自变量 ...)

或 (函数(式) 元素 元素 元素 ...)

1.1 操作数包括『功能函数』&『自定函式』

功能函数: 如上练习中的 +、max、menucmd、getint、 setq、*、min,详细内容可参考下一章『快速浏览 AutoLISP 功能函数』&『第三篇 AutoLISP功能函数详解』

自定函式: 由设计者自行定义的新函式或子程序

1.2 运算子(又称自变量或元素)包括:

A.整数(Integer): 如8,-17,500,9999…

正常范围: 2的16次方,介于-32768与+32767之间

特殊范围: 若以 float 函数将其转为实数,则范围2的32次方, 介于-2147483648与+2147483647之间

B.实数(Real): 如8.5,-17.456…

正常范围: 带有小数点的数,精度可达 14 位有效数字

C.字符串(String): 如 "AutoCAD","123","Enter Real:","7.5",…

正常范围: 以双引号内夹『字符』为认定,字符数不受限制

D.串行(List): 如 ("a" "b" "c"),(x y),(x y z),("a" 8 3.5),....

正常范围: 以左右括号内夹『元素』为认定,元素型态非常弹性

使用频率: 在 AutoLISP 程序设计中应用非常高

范例说明 : ("a" 8 3.5 kk (1 2))

表示此串行内有五个元素 "a"表示字符串a、8表示整数8、3.5表示实数3.5、kk表示变量kk、(1 2)表示串行(1 2)

 

2D 点坐标(x y) 表示法 => 以二实数形成串行

3D 点坐标(x y z) 表示法 => 以三实数形成串行

E.像素名称代码:如 <entity name: 6000f262> ...

使用范围: AutoCAD 会自动赋予像素指向代码,透过此代码可找到像素的数据库记录

范例说明: (setq en (entlast))   

传回 <entity name: 60000062>

(entget en) 可找到像素的数据库串行

F.档案代码: 如<file:#12438>…

使用范围: 开启(open)档案作读档(r)、写档(w)使用时,所产生的代码,如下:

范例说明:

(setq ffr (open "test.txt" "r"))  响应 <file:#24138>

(setq ffw (open "abc.txt" "w")) 响应 <file:#34812>

 

G.选择群集代码: 如<Selection set:1>、<Selection set:1>…

使用范围: 一个或数个像素所形成的选择集

范例说明:

(setq ss (ssget))

选取对象:  (可选择物体)

选取对象:  (可选择物体)

选取对象: (按 [ENTER] 键)   

响应 <Selection set:1>

规则3 :表达式中的『运算子』,可以是另一『表达式』或『子程序』功能函数使用语法:

(strcat 字符串1 字符串2 字符串3 ....) 字符串结合功能函数

(getstring 提示) 要求键入一个字符串

(rtos 实数) 将实数转换成字符串

范例说明1: (strcat "abc" "123" "LISP") 传回:"abc123LISP"

范例说明2: (strcat "abc" (getstring "Enter String:" ) (rtos 123.45))

执行结果: Enter String: 键入任一字符串,假设是键入 *HELLO*

响应 "abc*HELLO*123.45"

本例中的strcat函数在语法中要求的『运算子』必须是『字符串』型态

『运算子1』= "abc" 是正常的字符串运算子

『运算子2』= 表达式 (getstring "Enter String:") 传回结果是一字符串 "*HELLO*"

『运算子3』= 表达式 (rtos 123.45) 传回结果是一字符串 "123.45"

规则4:多重的括号表达式,运算的先后顺序是『由内而外、由左而右』

范例说明: 请将10.25 + 17 - 13.2 / 7的结果,设定给变量kk,并转换成AutoLISP 的表达式

解法技巧A:

1:运用『二分法、加括号』:(10.25 + 17) - (13.2 / 7)

2:操作数往前提: kk = (- (10.25 + 17) (13.2 / 7))

3:操作数再往前提:kk = (- (+ 10.25 17) (/ 13.2 7))

4:转换完成: (setq kk (- (+ 10.25 17) (/ 13.2 7)))

解法技巧B:

1:运用『二分法、加括号』:(10.25 + (17 - (13.2 / 7)))

2:操作数往前提: kk = (+ 10.25 (17 - (13.2 / 7)))

3:操作数再往前提:kk = (+ 10.25 (- 17 (/ 13.2 7)))

4:转换完成: (setq kk (+ 10.25 (- 17 (/ 13.2 7))))

 

规则5:以档案型态存在的AutoLISP程序(ASCII档案),其扩展名必须是.LSP

规则6:撰写的环境,只要是一般的文书编辑软件,可编辑 ASCII 档案者都适用

如:PE2、PE3、DW3、书中仙、汉书、EDIT、记事本....等

规则7:以 defun 功能函数定义新的指令或新的功能函式 (注:自变量及区域变量可省略)

程序结构型态:(defun 函式名称(自变量/区域变量)

: :

: : 程序内容

: :

)

规则8:新定义的功能函式名称,若为『C:函式名』,则此函式可为 AutoCAD 新指令

(注:自变量及区域变量可省略)

程序结构型态: (defun C:KK(自变量/区域变量)

: :程序内容

: :

: :

)

则加载此 LISP 程序后,可在 指令: 后直接键入新定义的 KK 指令

规则9:   加载AutoLISP程序的作法:指令:后直接键入 (load "LISP主檔名")

注:load 与字符串间的空格,可有可无

注:load 与双引号间的空格,可有可无 (load"LISP主檔名")

范例: 在 c:\lsptools 目录下有一LISP程序tt.lsp,而您目前的工作目录在c:\dwg下

·   若『环境设定』之『支持档案搜寻路径』有指定到c:\lsptools目录,则欲使用加载tt.lspà 指令:后键入 (load "tt") 即可

·   若『环境设定』之『支持档案搜寻路径』无指定到c:\lsptools目录,则键入 (load"tt") 后,会出现错误讯息如下:

无法开启「tt.lsp」做输入错误: 加载失败(LOAD "tt")*取消*

此时您可键入:     

指令:(load "c:\\lsptools\\tt") 或

指令:(load "c:"/lsptools/tt)

不可键入: (load "c:\lsptools\tt")

因为『\』在 AutoLISP 结构语法中已经用于『跳脱码控制』了

规则10:AutoLISP 程序中,在『分号 ;』后的内容均为批注,程序不处理,适时的增加批注,将使程序更具可看性、学习性及完整性

范例: pp.lsp 内容如下:

;本程序功能可快速画门、窗

;设计者:QQ博士

;版权所有,欢迎使用

(defun c:pp()

: :

; 以下为画门子程序

: :

; 以下为画窗子程序,

: :

: :

)

规则11:AutoLISP 最常用的变量型态是『整数』、『实数』、『字符串』、『点串行』四种,变量的型态依据设定值而自动定义,变量会一直储存该值,直到被重新设定值或绘图结束自动消失

规则12:以 setq 功能函数设定变量值 (setq 变量名称 设定值)

范例:

(setq a 100) ;变量 a 值设定成整数 100

(setq b 123.56) ;变量b值设定成实数123.56

(setq c "Good morning!!!") ;变量 c 值设定成字符串

(setq pt1 (getpoint "Enter POINT:")) ;变量 pt1 值设定成点串行

(setq pt2 (list a b))

;此时,a值是100,b值是123.56变量pt2值设定成点串行(100 123.56)

(setq pt3 '(297 210)) ;变量 pt3 值设定成点串行 (297 210)

注意: 直接设定成点串行时,不能省略单引号『'』否则会被误认 (297 210)又是一个表达式, 297是操作数而出错!

规则13:欲在 AutoCAD 的环境中,查看一变量值,指令:下键入『!变量名』即可

范例:

指令:(setq aa (+ 100 75)) 传回:175

指令:!aa 传回:175

指令:(setq pp (list 90 50)) 传回:(90 50)

指令:!pp 传回: (90 50)

指令:!ww 传回:nil 空值无设定

规则14:以(defun C:函式名(自变量 / 变量) ........)程序中,程序中的变量若在『/』右边变量内,则称为『区域变量』,否则为『整体变量』(注:在 AutoLISP 中,未赋予值的变量,其值皆响应 nil)

『区域变量』于此程序执行完毕后,其值自动消失

『整体变量』于此程序执行完毕后,其值仍然存在

范例: test.lsp 内容如下

(defun c:tt(/ sa sb sc)

(setq sa 100)

(setq sb 20)

(setq sc 10)

(setq sd (+ sa sb sc))

)

回到: 指令:键入(load"tt") 传回:c:tt

指令:tt 传回:130

指令:!sa 传回:nil (属区域变量)

指令:!sb 传回:nil (属区域变量)

指令:!sc 传回:nil  (属区域变量)

指令:!sd 传回:130 (属整体变量)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-4-13 15:25:40 | 显示全部楼层
还没有发完吧
170个命令怎么没有发啊?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-29 07:07 , Processed in 0.283789 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表