LispLisp 基础知识基础知识 一.基本知识 . 1 二、数值资料 . 5 三、程序设计 . 11 四、流程控制 . 16 五、输入输出 . 23 六、字符串资料 . 31 七、串行资料 . 36 八、图元资料 . 42 九、选集资料 . 52 十、常用函数 1 58 十一常、用函数 2 67 十二、档案处理 . 78 十三、符号处理 . 85 十四、下拉式表 . 90 十五、影象功能 . 98 十六、工具列 . 106 十七、线性填充 . 113 十八、脚本档案 . 118 1 一一..基本知识基本知识 第 1 节 -------------------------------------------------------------------------------- 基本知识 AutoLISP 是一种针对扩充及自订 AutoCAD 函数机能而产生,以 LISP 为基础的程序设计语 言.LISP 本身于50 年代末期出现,是一种擅于处理串行文字(List of Processing),属第四代 「人 工智能(Artificial Intelligence)」的计算机语言. 目的是令使用者充份利用 AutoCAD 进行开发,直接增加及修改 AutoCAD 指令. AutoLisp语言建基于普通的LISP语言上,并扩充了许多适用于CAD的特殊功能而形成. 是一种能以直译方式(不须先行编译)亦可于 AutoCAD 内部执行的直译性程序语言. 程序容易学习及撰写,程序即使出错亦不会对操作系统(如 DOS,WINDOWS)有不良影响. 数据及程序均统一以串行 (List)结构表示. 可直接调用几乎全部的 AutoCAD 命令. 既具备一般高级语言的基本结构和功能,亦有一般高级语言没有的强大图形处理能力. 内建于 AutoCAD 应用程序,不须另行购买;亦不须使用特定的编辑器或开发环境. 可配合 AutoCAD 提供的 PDB,建立 DCL(Dialog Control Language)文件创建对话框. 缺点 : 执行速度较ObjectArx(旧称ARX,以C或C++程序开发,取代以前的ADS)程序慢; 原程序不易保护;对低阶的硬件数据不易存取. 第 2 节 -------------------------------------------------------------------------------- 函数 (Function) 在 AutoLISP 程序语言中所有的成份都是以函数的形式出现,AutoLISP 程序就是顺序执行 连串的函数.函数的运行过程就是对函数的求值(结果)过程;函数的基本语法如下: (函数名称 参数 1 参数 2) e.g. (PRINC “AutoLISP Programming“) 每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;如有若干 数量的开括号,则一定有同等数量的关括号对应. 左边开括号后紧随函数名称. 函数名称与参数之间,或参数与参数之间须最少留一个空格. 2 函数可有一个或多个参数(也可能没有参数),视该函数而定. 函数名称不分大小写,即大小写字母视为相同. 第 3 节 -------------------------------------------------------------------------------- 数据型态 (Data Type) 整数 (INT) 没有小数字的数值,32 位有号数,范围从+2,147,483,647 到-2,147,483,648 实数 (REAL) 带小数字的数值,以倍精度浮点格式储存(最少 14 位小数) e.g. 12.5 当数值在 1 与-1 之间时,必须加上前导零 e.g. 0.05 可以科学记号表示 : 在 E 或 e 后加上次方值 e.g. 4.1e-6 字符串 (STR) 一般文字,其前后必须加上双引号 “ e.g. “AutoCAD“ 控制字符或脱逸码必须为小写,且须在字符前加上反斜线 \ e.g. “\AutoCAD“ 像素名称 (ENAME) 是指定给图文件内对象的指针(Pointer,为 16 进位的数字卷标) e.g. 像素名称在图文件内是唯一的,不会重复 对象的像素名称只在目前作业中有效,再开启图档时,会指定新的像素名称予该对象 档案 (FILE) 以 OPEN 函数所开启档案的指针,作为其它函数(读写该档案)的自变量 选集 (PICKSET) 用 SSGET 等函数建立的一个或多个对象的集合或群组 转化 (VARIANT) 可将像素名称转换为可与 ActiveX 配搭使用的 VLA-Object 对象 符号 (SYM) 用以储存静态数据的名称;例如内建或使用者定义的函数 3 符号名称不分大小写,可由任意长度的可打印字符组成;但下列的字符除外: 左括号 ( 右括号 ) 句点 . 单引号 ' 双引号 “ 分号 ; 表 (LIST) 亦称为串行,是放在一对小括号 ( ) 内,一个或多个元素的有序集合 e.g. (1.0 “Lisp“ ( ) (5.6 7)) 元素可以是字符串,符号,整数或实数;也可以是另一个表 元素与元素之间要用空格隔开,但元素与小括号之间则可以不隔空格 为便于存取表内各元素,每个元素均有其序号;从表的左边开始,第一个元素序号为 0, 依此类推 表的大小即为其顶层元素的数量(内层嵌套式的表,视为单一元素) 点对(Dotted Pair)亦是表的一种;表内有 2 个元素,中间以一圆点分隔,且元素与圆点 之间亦须以空格分开 若表内没有任何元素,称为空串行或空表;以 ( ) 或 (NIL) 表示 第 4 节 -------------------------------------------------------------------------------- 变数 (Variable) 为程序执行中动态储存数据的符号名称;主要分为 2 类: 区域(Local)变量 又称为局部变量;该变量只在该程序段落中有效,不能为其它程序 使用 全域(Global)变量 又称为整体变量;变量在所有程序段落中均可使用 变量名称与符号的限制相同,使用时宜采用有意义及易于辨别的名称 变量在赋值或使用前无须先行设定 相同的变量可以储存不同型态的数据(但同一时间内只可储存一种型态) 在指定新的数据之前,变量储存的内容会保持不变 赋值 将数据给予指定的变量储存 以内建函数 SETQ 进行(可用于绘图模式的指令行或 AutoLISP 程序),其语法如下: (SETQ 变量名称 1 资料 1 [变量名称 2 资料 2 ] ) 4 e.g. (SETQ NAME “David“ AGE 37 WEIGHT 72.5 POINT (LIST 10 20)) 在函数名称之后,各参数以两个一组,每组左边为变量名称,右边为存入变量的数据 亦可将变量名称赋以空值(NIL) : e.g. (SETQ OCCUPATION NIL) 要显示变量所储存的数据,可以使用内建函数 PRINC(可用于绘图模式的指令行或 AutoLISP 程序),其语法如下 : (PRINC 变量名称 ) e.g. COMMAND : (PRINC NAME) Result : David“David“ 在绘图模式中,亦可于指令行中使用感叹号 ! 来显示变量内容,或作为指令选项的输 入值;语法如下 : !变量名称 e.g. COMMAND : !NAME Result : “David“ 在 Visual LISPVisual LISP 的主控台窗口中,于提示符号 _$ 后键入要显示的变量名称 _$变量名称 e.g. _$NAME 要检查变量所储存的数据型态,可使用内建函数 TYPE;语法如下: (TYPE 变量名称) e.g. COMMAND : (TYPE NAME) Result : STR 若检查的变量没有储存数据,则会传回 NIL 第 5 节 -------------------------------------------------------------------------------- 练习 (Exercises) 将四个坐标分别存入四个变量中,并以 LINE 或 PLINE 指令,配合四个坐标变量,画出正 四边形. COMMAND : (SETQ POINT1 (LIST 0 0) POINT2 (LIST 0 10) POINT3 (LIST 10 10) POINT4 (LIST 10 0)) COMMAND : LINE ;直线段指令 COMMAND : !POINT1 ;第一点(左下角起点) COMMAND : !POINT2 ;第二点(左上角) COMMAND : !POINT3 ;第三点(右上角) COMMAND : !POINT4 ;第四点(右下角) COMMAND : C ;自动联机至起点以关闭四边形 5 画圆 : 将圆心坐标及半径长度分别存入两个变量中(变量名称及数据型态自订) COMMAND : (SETQ CEN (LIST 0 0) RAD 20) ;将圆心点设为坐标 0,0;半径为 20 COMMAND : CIRCLE ;执行划圆指令 Specify center : !CEN ;在提示后以变量 CEN 响应输入 Specify radius : !RAD ;在提示后以变量 RAD 响应输入 将不同型态的数据,分多次存入相同的变数内;每次均以 PRINC 及 TYPE 函数显示变量内 容及其数据型态 COMMAND : (SETQ TEMP 1.2) ;将实数 1.2 存入变数 TEMP COMMAND : !TEMP Result : 1.2 COMMAND : (TYPE TEMP) Result : REAL COMMAND : (SETQ TEMP “AutoLISP“) ;将字符串存入变量 TEMP COMMAND : !TEMP Result : “AutoLISP“ COMMAND : (TYPE TEMP) Result : STR 二二、、数值资料数值资料 第 1 节 -------------------------------------------------------------------------------- 基本运算 加函数 (+ [数值参数 1 数值参数 2 ] ) e.g. (+ 2.5 4 6) Result : 12.5 函数的结果为各参数之总和 若仅提供一个参数,则以 0 加上此参数的结果为返回值 若没有提供任何参数则传回 0;各参数须为整数或实数型态 若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数 减函数 (- [数值参数 1 数值参数 2 ] ) e.g. (- 10 2 3) Result : 5 结果为第一个(最左边)参数减去其右边各参数的总和 若只提供一个参数,返回值为 0 减去该参数的结果 6 若没有提供任何参数则传回 0;各参数须为整数或实数型态 若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数 乘函数 (* [数值参数 1 数值参数 2 ] ) e.g. (* 2 3 4) Result : 24 结果为所有参数的乘积 若只提供一个参数,则返回值为该参数乘以 1 的结果 若没有提供任何参数则传回 0;各参数须为整数或实数型态 若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数 除函数 (/ [数值参数 1 数值参数 2 ] ) e.g. (/ 24 2 3) Result : 4 结果为第一个(最左边)参数除以其右边各参数的乘积 若仅提供一个参数,则返回值为该参数除以 1 的结果 若没有提供任何参数则传回 0;各参数须为整数或实数型态 若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数 注意 : 在本篇教程中,各函数的数值参数,均可以变量(储存值只可以是整数或实数,且不 可以是空值 nil)取代 第 2 节 -------------------------------------------------------------------------------- 练习 (Exercises) 计算式 (2+4)*3 COMMAND : (* 3 (+ 2 4)) Result : 18 计算式 (50-8*5)/4 COMMAND : (/ (- 50 (* 8 5)) 4) Result : 2 注意 : 上式的正确答案应是 2.5,因为函数中的各参数均为整数,所以传回的结果亦为整 数 递增及递减 递增 (1+ 数值参数 ) e.g. (1+ 2) Result : 3 7 递减 (1- 数值参数 ) e.g. (1- 4) Result : 3 三角函数 (Trinagular Function) 正弦值 (SIN 弧度参数) e.g. (SIN 1) Result : 0.841471 余弦值 (COS 弧度参数) e.g. (COS 1) Result : 0.540302 反正切值 (ATAN 弧度参数) e.g. (ATAN 1) Result : 0.785398 第 3 节 -------------------------------------------------------------------------------- 其它数值处理 次方值 (EXPT 数值参数 次方值 ) e.g. (EXPT 2 4) Result : 16 若参数及次方值两个均为整数,返回值亦是整数;若其中一个为实数,结果为实数 开方根 (SQRT 数值参数 ) e.g. (SQRT 30) Result : 5.47723 绝对值 (ABS 数值参数 ) e.g. (ABS -123) Result : 123 余数 (REM [数值参数 1 数值参数 2 ] ) e.g. (REM 50 26 5) = (REM (REM 50 26) 5) Result : 4 将参数 1 整除参数 2 的余数 若参数多于 2 个时,则会将余数再整除下一个参数,再得出余数;依此类推 8 若其中一个参数为实数时,则结果为实数;否则为整数 最大公约数 (GCD 数值参数 1 数值参数 2 ) e.g. (GCD 81 57) Result : 3 两个参数均必须为整数值型态 自然对数 (LOG 数值参数 ) e.g. (LOG 3.5) Result : 1.25276 是 EXP 函数的反函数;传回值为实数型态 自然反对数 (EXP 数值参数 ) e.g. (EXP 1.25276) Result : 3.49999 是 LOG 函数的反函数;传回值为实数型态 第 4 节 -------------------------------------------------------------------------------- 数值资料转型 实数转整数 (FIX 数值参数 ) e.g. (FIX 12.56) Result : 12 只会截去小数部份(小数字不会 4 舍 5 入) 整数转实数 (FLOAT 数值参数 ) e.g. (FLOAT 12) Result : 12.0 整数转字符串 (ITOA 数值参数 ) e.g. (ITOA -17) Result : “-17“ 数值转字符串 (RTOS 数值参数 [模式 [小数字] ] ) e.g. (RTOS 17.23333 2 3) Result : 12.266 若不设定模式,则依系统变量 LUNITS 的设定值转换数值为字符串 9 若不设定小数字,则依系统变量 LUPREC 的设定值转换 模式设定值可以是下列数值之一 : 1 = 科学记号 2 = 十进制 3 = 英呎及十进制英吋 4 = 英呎及分数位英吋 5 = 分数 当选用的模式为 3,4 或 5,则传回的字符串受系统变量 UNITMODE 影响 弪度转字符串 (ANGTOS 角度参数 [模式 [小数字] ] ) e.g. (ANGTOS 0.785398 0) Result : “45“ e.g. (ANGTOS 0.785398 4) Result : “N 45d E“ 若不设定模式,则依系统变量 AUNITS 的设定值转换数值为字符串 若不设定小数字,则依系统变量 AUPREC 的设定值转换 模式设定值可以是下列数值之一 : 0 = 度 1 = 度/分/秒 2 = 分度量 3 = 弪度 4 = 土地测量单位 当选用的模式为 4,则传回的字符串受系统变量 UNITMODE 影响 反函数为 ANGTOF;参阅第 5 篇教程 第 5 节 -------------------------------------------------------------------------------- 数值资料检查 数值 (NUMBERP 数值参数 ) e.g. (NUMBERP -3.45) Result : T e.g. (NUMBERP “AutoLISP“) Result : nil 注意 : 在范例的传回值中,T 表示函数的结果为真(成立),nil 表示结果为假(不成立) 负数值 10 (MINUSP 数值参数 ) e.g. (MINUSP -3.45) Result : T e.g. (MINUSP 0) Result : nil e.g. (MINUSP 3.45) Result : nil 零值 (ZEROP 数值参数 ) e.g. (ZEROP 0) Result : T e.g. (ZEROP 3.45) Result : nil 其它应用 最大值 (MAX [数值参数 1 数值参数 2 ] ) e.g. (MAX -88 5 2) Result : 5 若没有提供任何参数,则传回值为 0 最小值 (MIN [数值参数 1 数值参数 2 ] ) e.g. (MIN -88 5 2) Result : -88 若没有提供任何参数,则传回值为 0 第 6 节 -------------------------------------------------------------------------------- 练习 (Exercises) 计算下列算式 : (+ 1234567890 1234567890) Result : -1825831516 上式中两个数值参数均为整数,而结果值大于整数型态所能容许之范围;固导致发生溢位 问题,产生无效的结果.修正算式如下 : 只要将其中一个参数改为实数型态即可. (+ 1234567890.0 1234567890) Result : 2.46914e+009 计算下列算式 : (+ 9876543210 1234567890) Result : 1.11111e+010 上式中两个数值参数均为整数,但其中一个(第一个)参数巳大于整数型态所能容许之范围; 系统会自动将此参数先行转为实数型态才计算. 计算下列算式 : 11 (FIX (SQRT (+ 1 (MAX 20 10 40 30)))) Result : 6 ---- 最先执行的是最内层的算式 (MAX 20 10 40 30) ,求出最大值为 40 ---- 其次执行加函数,将 MAX 函数所得的最大值加 1,结果为 41 ---- 再利函数 SQRT,将 41 开方根,结果为 6.4031 ---- 最后使用 FIX 函数,截去其小数字,得到最后的结果为 6 三三、、程序设计程序设计 第 1 节 -------------------------------------------------------------------------------- 使用者定义函数 是将一群表示式组合成一个函数或指令 可应用于绘图模式的指令行提示,Visual LISP 主控台,或供其它自定义函数内的表示式 呼叫使用 AutoLISP 原始程序代码均以纯文字格式存盘,扩展名为 LSP(2000 版可编译成扩展名为 FAS 的档案 可以一般文字编辑器进行开发,如 DOS 的 EDIT,WINDOWS 的 WORD 或 WORDPAD 等 一个自定函数内最少要有一个表达式 在原程序文件(LSP)里,自定义函数以 DEFUN 函数开始;其语法如下 : (DEFUN [C:] 函数名称 ( [自变量串行 .] [/ 局部变数串行 .] ) 表达 式 .) 在呼叫带有自变量的自定函数时,必须同时提供与定义函数时,同等数量的参数,使各 参数传入自定函数的各自变量中 自变量被视为一种特殊类型的局部变量,无法用于该自定函数以外的其它函数 若自定函数中无须设定任何自变量,亦必须以空串行 ( )加在函数名称之后 若有提供局部变量,必须以斜线 / 加在局部变量的开头(即使前面没有自变量串行) 各自变量,斜线,局部变量之间要以空格分隔;但与左右小括号之间则不须以空格分开 若自变量串行中有相同名称的自变量出现,则会忽略第一个以后的相同自变量;变数亦 是一样 若在函数名称前加上 C:,表示该函数可以在绘图模式的指令行提示下,其执行方式与内 建函数相同;亦可以在任何内建命令(执行中)的提示后,以通透方式执行(但须将函数名称包在 12 一对小括号中) 若在函数名称前没有加上 C:,在指令行提示下,必须将函数名称包在一对小括号中才可 执行 不可以在执行一自定函数时,以通透方式执行另一自定函数 第 2 节 -------------------------------------------------------------------------------- 加载程序 自定函数在使用前,都要将其所在的程序文件(扩展名为 LSP)加载才可执行 ACAD.LSP 程序文件(预设在 SUPPORT 子目录内)会在启动 AutoCAD 时自动加载 (LOAD “程序文件名称“ [加载失败] ) e.g. (LOAD “TEST“) 若程序文件之文件名为 LSP,则在程序文件名称之后,可以不加上扩展名 若有需要,系统会顺序尝试其它的扩展名 : VLX FAS LSP 若程序文件不在系统的支持目录下,则需在文件名前加上目录路径 注意 : 必须以正斜线 / 或两个反斜线 \\ 作为目录的分隔符 可以在加载失败的参数中提供字符串,以供加载失败时显示;亦可提供有效的自定函数, 该函数在加载程序文件失败时会被执行 e.g. (LOAD “TEST“ “Load Fail“) 或 (LOAD “TEST“ (DOERROR)) 注意 : 在程序文件加载后,在提示行显示的返回值,一般是该程序文件中,最后被定义的函数 名称 或是在程序文件内没有包含在自定函数中,最后一个表达式的执行结果 第 3 节 -------------------------------------------------------------------------------- 练习 (Exercises) 启动文字编辑器,编写一 AutoLISP 程序作两个同心圆 (第 1个圆半径为 50,第2个圆半 径为 80),程序代码如下所示 : (DEFUN C: 2CIRCLE () (SETQ CEN (LIST 0 0) RAD 50) (COMMAND CIRCLE CEN RAD) (COMMAND CIRCLE CEN (+ RAD 30))) 13 ---- 输入后以纯文字格式存盘(C:\TEST.LSP) ---- 在 AutoCAD 绘图模式的指令行提示后,用 LOAD 函数将程序文件加载 COMMAND : (LOAD “C:/TEST“) ---- 在指令行提示后,输入程序(函数)名称执行 COMMAND : 2CIRCLE 程序说明 1 使用 DEFUN 建立自定函数的名称,并用 SETQ 函数将中心点(LIST 0 0)存入变数 CEN,半 径(50)存入变数 RAD 中 2 使用 COMMAND 函数执行 AutoCAD 内建指令 CIRCLE,并以变量 CEN(圆的中心点)及变数 RAD(圆的半径)回应 3 与第 2 行大致相同,但在指定其半径时,先将储存半径的变量加 30,使划出半径为 80 的 圆;注意最右边的关括号,与第 1 行 DEFUN 左边的开括号是一对的 启动文字编辑器,开启 TEST.LSP 程序文件,复制 2CIRCLE 至新程序 2C,并改为传入自变 量方式执行;程序代码如下 : (DEFUN 2C (CEN RAD) (COMMAND CIRCLE CEN RAD) (COMMAND CIRCLE CEN (+ RAD 30))) ---- 输入后以纯文字格式存盘 ---- 在 AutoCAD 绘图模式的指令行提示后,用 LOAD 函数将程序文件重新加载 ---- 在指令行提示后,输入程序(函数)名称执行 COMMAND : (2C (LIST 0 0) 50) 第 4 节 -------------------------------------------------------------------------------- 批注 单行批注 分号 ; 表示在分号右边(同一行)的字符均为批注,程序执行时会将其忽略 多行批注 ;| |; 表示在两个批注符号中间所有字符皆为批注,即使字符跨越多行 关系运算 在各个关系运算中,都会传回一逻辑值;若关系成立,传回 T,否则会传回 nil 各参数可以是字符串,整数或实数型态;若以字符串进行比较,则会以字符串的ASCII码 14 为准 若函数中只有一个参数,传回值恒为 T 等于函数 (= 参数 1 [参数 2 ] ) 会将参数 1 与其后各个参数比较,若全部相等则传回 T,否则传回 nil e.g. (= 2 2.0) Result : T e.g. (= “A“ CHR(65)) Result : T 不等于函数 (/= 参数 1 [参数 2 ] ) 若参数 1 不等于其后任何一个参数,即传回 T e.g. (/= 1 2.0) Result : T e.g. (/= “a“ CHR(65)) Result : T e.g. (/= 10 30 40 10 20) Result : T 小于函数 ( 参数 1 [参数 2 ] ) 各参数顺序以 2 个为一组比较,若各组左边的参数均大于右边的参数,即传回 T e.g. ( 1 2) Result : nil e.g. ( “a“ CHR(65)) Result : nil 小于或等于函数 (= 参数 1 [参数 2 ] ) 各参数顺序以 2 个为一组比较,若各组左边的参数均大于或等于右边的参数,即传回 T e.g. (= 1 2) Result : nil e.g. (= 2 2) Result : T e.g. (= “a“ CHR(65)) Result : nil 第 5 节 -------------------------------------------------------------------------------- 逻辑运算 且运算 (AND [表达式 ] ) 若各表达式的传回值均为 T,函数即返回 T 值;若其中一个传回值为 nil,函数传回 nil e.g. (AND ( 8 5)) Result : T 或运算 (OR [表达式 ] ) 若各表达式的传回值均为 nil,函数即返回 nil 值;若其中一个传回值为 T,函数传回 T e.g. (OR ( 1 2) ( 8 5)) Result : T 否定运算 (NOT 表达式 ) 若表达式的传回值为 T,函数即返回 nil 值;相反若表达式传回值为 nil,函数传回 T 可用于检查传回值是否为 nil 另有一 NULL 函数与 NOT 函数功能相似 e.g. (NOT ( NUM 200)) 16 ---- 输入后存盘(纯文字格式) ---- 在 AutoCAD 绘图模式的指令行提示符号后,使用 LOAD 函数重新加载程序文件 COMMAND : (LOAD “C:/TEST“) ---- 在 AutoCAD 绘图模式的指令行提示符号后,输入自定函数名称及参数执行 COMMAND : (AIR 175) Result : nil COMMAND : (AIR 215) Result : T 四四、、流程控制流程控制 第 1 节 -------------------------------------------------------------------------------- 条件判断 是利用条件函数,配合关系及逻辑运算所设定的一些准则,令程序自行分析,因应情况作出 适当行动. 单一条件 (IF 条件表达式 是表达式 [否表达式] ) 函数先检查条件表达式,若其传回值为 T,便会执行其后的是表达式 若有提供否表达式,且条件表达式的传回值为 nil,函数将不会执行(跳过)是表达式而 执行否表达式 若没有提供否表达式,且条件表达式的传回值为 nil 时,函数将不作任何事情 IF 函数可以巢状方式嵌套,即在是或否的表达式中加入另一个 IF 函数 练习 (Exercises) 判断空气污染指数 : 大于 100 = Very High, 51 至 100 = High, 26 至 50 = Medium, 25 或以下 = Low ---- 启动编辑器,开启 C:/TEST.LSP 程序文件;新增 AIR-1 自定函数,程序代码如下 : 17 (DEFUN AIR-1 (NUM) (IF ( NUM 100) (PRINC “Very High“)) (IF (AND ( NUM 50) ( NUM 25) ( NUM 50) (PRINC (IF ( NUM 100) “Very high“ “High“)) (PRINC (IF ( NUM 25) “Medium“ “Low“))) (PRINC)) 程序说明 1 设定函数名称,并将数据存入自变量 NUM 内;用 IF 函数判断变量 NUM 是否大于 50; 若条件成立(变量 NUM 大于 50)时,再用另一个 IF 函数判断变量是否大于 100; 若条件成立(变量 NUM 大于 100)时,使用 PRINC 函数显示字符串 Very High,否则显示 High 2 若在第 1 个 IF 函数判断中,条件不成立(变量 NUM 不大于 50)时; 再用另一个 IF 函数判断变量是否大于 25; 若条件成立(NUM 大于 25)时,显示字符串 Medium,否则显示字符串 Low 18 3 是一个没有提供任何自变量的 PRINC 函数;用以抑制显示答案时尾部符加的 nil 或重 复的传回值;而最右一个关括号,是用以对应第 1 行最左边的开括号 注意 : 第 1 行最后一个关括号是对应前面的 PRINC 函数,尾 2 的关括号则是对应 IF 函数 (判 断 NUM 是否大于 100) 第 2 行最后一个关括号是对应第 1 行的 IF函数 (判断 NUM 是否大于 50),尾2 的关括号 则是对应 PRINC 函数,尾 3 的关括号则是对应 IF 函数 (判断 NUM 是否大于 25) 最右边的关括号是对应第 1 行最左边的开括号 PROGN 函数 在以上各范例中,执行的表达式均为单一的函数运算;若要在表达式中顺序执行一连串 的函数,便要将各函数包含在一个PROGN函数内;函数的传回值会是该PROGN函数中,最后一个表 达式的运算结果 ---- 修改 TEST.LSP 程序文件的 AIR-1 程序,第 1 个 IF 函数如下,其余的 IF 函数请自行 修改 e.g. (IF ( NUM 100) (PROGN (SETQ DISP “Very High“) (PRINC DISP))) 注意 : 最后一个关括号是对应前面的 IF 函数 (判断变量 NUM 是否大于 100) 尾 2 的关括号是对应 PROGN 函数 (用以包含 SETQ 及 PRINC 函数) 尾 3 的关括号是对应 PRINC 函数的 第 2 节 -------------------------------------------------------------------------------- 条件判断 多重条件 (COND [ (条件表达式 是表达式) ] ) 19 函数会顺序检查各条件表达式;直到其中一个条件成立(传回 T),即执行该条件式所对 应的是表达式 每个条件表达式只对应一个是表达式,而没有否表达式 若条件式成立且执行对应的是表达式后,则不会再对余下的其它条件表达式进行检查 若只有条件表达式而没有对应之是表达式,则只会传回条件表达式的逻辑值 若没有提供任何条件表达式及是表达式,函数传回值恒为 nil 练习 (Exercises) 新增程序 AIR-3,以改善上一课 AIR-1 程序;用一个 COND 函数判断多个条件表达式 DEFUN AIR-3 (NUM) (COND (( NUM 200) (PRINC “Severe“)) (( NUM 100) (PRINC “Very High“)) (( NUM 50) (PRINC “High“)) (( NUM 25) (PRINC “Medium“)) (( NUM 0) (PRINC “Low“)) (T (PRINC “Cannot Check“))) (PRINC)) 程序说明 1 设定函数名称,并将数据存入自变量 NUM 内;用 COND 函数进行多重判断 2 判断变量 NUM 是否大于 200,若条件成立,则显示 Severe 讯息;第 3 至 6 行依此类推 7 注意条件式为一个 T 字母,表示条件式恒为真(成立),显示讯息 Cannot Check 作用是当以上各条件式均不成立时(变量小于或等于 0),即执行此一表达式 20 第 3 节 -------------------------------------------------------------------------------- 循环 (Loop) 配合条件判断,关系及逻辑运算,令程序不断重复一些动作,以提高效率及减少重复动 作时的人为错误 可以多个循环形成巢状(嵌套式)循环,即在一个循环内嵌套另一个(或多个)循环 指定的重复次数必须为正整数,亦可以是储存正整数的变量名称 重复指定次数 (REPEAT 重复次数 [表达式 ] ) e.g. (REPEAT 10 (PRINC “David“)) ;重复显示 David 字符串 10 次 重复 (WHILE 条件表达式 [是表达式 ] ) 若条件表达式的传回值为 T,即会顺序执行函数内各表达式 各表达式顺序执行完后,程序会返回函数的开头,重新检查条件表达式的传回值 若条件表达式的传回值为 nil,函数内各表达式将不会被执行 e.g. (SETQ COUNT 1) ;将 1 存入变数 COUNT (WHILE (“ 不等于 ““ 大于 “但不提供过滤条件 (SETQ GOP (SSGET “CP“ '((0 0) (0 6) (6 6) (6 0)))) 第 3 节 -------------------------------------------------------------------------------- 选集对象处理 SSADDSSADD 函数 (SSADD [像素名称 [选集] ] ) 若没有任何自变量,会建立新的空选集;若仅有像素名称,则建立含有该像素的新选集 若有提供两个自变量,则会将指定的像素加入指定的选集内 若指定的像素巳存在于指定的选集内,系统会不作任何处理,亦不会有任何讯息提示 55 SSDESSDEL L 函数 (SSDEL 像素名称 选集 ) 若指定的像素不存在于指定的选集内,函数会传回 nil 成功在选集内删除指定的像素后,会传回新的选集;应自行检查像素确实巳从该选集中 被删除 SSMEMBSSMEMB 函数 (SSMEMB 像素名称 选集 ) 检查所指定的像素是否包含在指定的选集内;若存在于指定的选集中,函数会传回该像 素名称,否则便传回 nil SSNAME SSNAME 函数 (SSNAME 选集 索引号 ) 索引号为整数或实数型态;选集中第一个元素其索引值为 0 若索引号大于 32767,则必须提供实数型态的索引值 函数会传回该索引号对应的像素名称;若索引号为负数,或大于选集中对象的总数量, 则传回 nil SSNAMEXSSNAMEX 函数 (SSNAMEX 选集 [索引号] ) 只有在目前图面的模式或图纸空间之像素选集,可以使用此函数 索引号为整数或实数型态;选集中第一个元素其索引值为 0 会传回在选集中,指定索引号所对应的像素名称,及如何选取该像素的说明 若不提供索引号,则传回整个选集内,所有像素的名称及选取说明 在传回的每个像素串行中,第 1 个元素是该像素的选取方式,第 2 个元素是像素名称,第 3 个元素为选取该像素时的特定数据 e.g. (选取方式 像素名称 (选取数据)) ---- 选取方式 : 0 = 不指定,全部 (X),最后一个 (L) 1 = 点选 2 = 窗选 (W),多边形窗选 (WP) 3 = 框选 (C),多边形框选 (CP) 4 = 篱选 (F) 56 ---- 选取数据 : 格式是在 0 之后跟随一个点叙述 e.g. (点编号 (点模式 点坐 标) ) 点模式 : 0 = 无限延伸线 1 = 射线 2 = 线段 若为多边形,则点编号从-1 开始,每个额外的多边形编号递增-1 练习 (Exercises) 建立选集,并抽取其中第 2 个像素的选取(点选)数据 ---- 执行如下的函数,并单选多个对象进入选集 COMMAND : (SETQ GOP (SSGET)) ---- 执行如下的函数,返回选集里第 2 个(索引号为 1)像素的选取数据 COMMAND : (SSNAMEX GOP 1) ---- 返回的数据串行格式如右 : ((1 0 (0 (坐标点)))) 建立选集,并抽取其中第 2 个像素的选取(框选)数据 ---- 执行如下的函数,以框选模式选取多个对象进入选集 COMMAND : (SETQ GOP (SSGET “CP“ '((0 0) (0 6) (6 6) (6 0)))) ---- 执行如下的函数,返回选集里第 2 个(索引号为 1)像素的选取数据 COMMAND : (SSNAMEX GOP 1) ---- 返回的数据串行格式如下 : ((2 0 -1) (-1 (0 (坐标点)) (0 (坐标点)) (0 (坐标点)) (0 (坐标点)))) 第 4 节 -------------------------------------------------------------------------------- 练习 (Exercises) 建立选集;新增程序 SEL-1,可选择将选取的像素新增至该选集,或从该选集中删除 COMMAND : (SETQ GOP (SSGET)) ;建立选取并选取对象 (DEFUN C:SLE-1 ( ) (INITGET 128 “ADD,A REMOVE,R“) (SETQ YESNO (GETKWORD “\nAdd or Remove Object (Y/N) : “)) (SETQ OBJ (ENTSEL)) (WHILE (/= OBJ NIL) (SETQ ENT (CAR OBJ)) (IF (= YESNO “ADD“) (SSADD ENT GOP) (SSDEL ENT GOP)) (PRINC “\nTotal Object : “) (PRINC (SSLENGTH GOP)) (SETQ OBJ (ENTSEL)) ) ) 57 程序说明程序说明 1 设定函数名称;以 INITGET 函数设定关键词 A=ADD R=REMOVE 2 使用 GETKWORD 函数取得使用者输入的选择,存入变量 YESNO 3 使用 ENTSEL 让使用者在屏幕选取对象,并存入变量 OBJ 4 使用 WHILE 循环函数,进入循环的条件式为 : 刚选取的不是空对象(即没有选取对象) 5 用 CAR 取得变量 OBJ(用 ENTSEL 选取的对象)里第一个元素(像素名称),存入变量 ENT 6 用 IF 判断变量 YESNO(之前使用 GETKWORD 取得);若为 ADD,将像素加进选集(若选集中 没有此像素);否则将所选的像素从选集中剔除(若像素巳存在于选集中) 7 用 SSLENGTH 取得选集(变量 GOP)现时包含的对象总数,并显示讯息 8 重新使用 ENTSEL 选取其它对象,返回循环的开始部份(第 4 行),再次检查条件式是否成 立 9 左边的关括号是与第 4 行的 WHILE 函数对应,右边的关括号是对应第 1 行的 DEFUN 函数 左边的开括号 新增程序 DISP,选取图面内所有对象,并以WHILE 循环,不断以 SSNAME及 ENTGET函数取 得及显示数据 (DEFUN C:DISP ( ) (SETQ GOP (SSGET “X“) COUNT 0 YESNO “NEXT“) (WHILE (/= YESNO “EXIT“) (SETQ ENT (ENTGET (SSNAME GOP COUNT))) (PRINC “\nEntity Name : “) (PRINC (CDR (ASSOC -1 ENT))) (PRINC “\nEntity Type : “) (PRINC (CDR (ASSOC 0 ENT))) (INITGET 128 “NEXT,N EXIT,X PREVIOUS,P“) (SETQ YESNO (GETKWORD “Exit,Next,Previous (N/X/P) : “)) (IF (= YESNO “NEXT“) (SETQ COUNT (1+ COUNT))) (IF (= YESNO “PREVIOUS“) (SETQ COUNT (1- COUNT))) (IF (= COUNT (SSLENGTH GOP)) (PROGN (SETQ COUNT (1- (SSLENGTH GOP))) (PRINC “\nCannot Next“))) ) ) 58 程序说明 1 设定函数名称;选取图面内所有对象存入变量 GOP;设定变量 COUNT 的初始值为 0(作为 SSNAME函数的索引号),变量YESNO设定为NEXT(用作显示选集内上一个或下一个对象,或离开循 环) 2 循环函数 WHILE;条件式为判断变量 YESNO 不等于 EXIT(离开),即可进入循环 3 用 SSNAME 提取选集 GOP 内第 COUNT 个对象的像素名称,并使用 ENTGET 取得像素数据, 再存入变量 ENT 中 4 以 ASSOC 提取像素数据(变量 ENT)中对应-1 码(像素名称)的串行,并以 CDR 取得串行中 第二个元素;再使用 PRINC 函数将取得的数据显示 5 以 ASSOC 提取像素数据(变量 ENT)中对应 0 码(像素型态)的串行,并以 CDR 取得串行中 第二个元素;再使用 PRINC 函数将取得的数据显示 6 用 INITGET 函数设定各关键词 (N=NEXT X=EXIT P=PREVIOUS) 7 用 GETKWORD 函数取得使用者输入的选择,并存入变量 YESNO 中 8 用IF判断使用者是否选择NEXT(变量YESNO);若是则将变量COUNT(索引号)用递增函数 1+加 1,并存回变量 COUNT 中覆盖原值 9 用 IF 判断使用者是否选择 PREVIOUS;若是则将变量 COUNT(索引号)用递减函数 1-减 1, 并存回变量 COUNT 中覆盖原值 10 用 IF 判断变量 COUNT(索引号)是否小于 0(0 是选集中第一个像素);若是则以 PROGN 包含第 11 行要执行的各个函数 11 将索引号(变量 COUNT)重设为 0(选集中第一个像素),并显示有关讯息 12 用 IF 判断变量 COUNT(索引号)是否大于或等于选集的像素总数(以 SSLENGTH 函数取 得);若是则以 PROGN 包含第 13 行要执行的各个函数 13 将索引号(变量 COUNT)重设为选集的对象总数(以 SSLENGTH 函数取得)减 1(因为索引 号是从 0 开始),并显示有关讯息 14 左边的关括号是对应第 2 行的 WHILE 函数;右边的关括号是对应第 1 行的 DEFUN 函数 十十、、常用函数常用函数 1 第 1 节 -------------------------------------------------------------------------------- 59 系统变量 GETVARGETVAR 函数 (GETVAR 系统变量名称 ) e.g. (GETVAR “TEXTSIZE“) 传回指定的系统变量现时储存的值 SETVAR 函数 (SETVAR 系统变量名称 值 ) e.g. (SETVAR “TEXTSIZE“ 2) 将指定的值存入指定的系统变量内 存入的数据型态要与该系统变量相同,否则不作任何处理并显示警告讯息 部份系统变量为只读的(如 DATE),不可以存入数据 屏幕显示 GRAPHSCR 函数 (GRAPHSCR) 无须提供参数;传回值恒为 nil;相当于执行 GRAPHSCR 指令,或按 F2 键切换至绘图屏幕 TEXTSCR 函数 (TEXTSCR) 无须提供参数;传回值恒为 nil;相当于执行 TEXTSCR 指令,或按 F2 键切换至绘图屏幕 TEXTPAGE 函数 60 (TEXTPAGE) 功能与 TEXTSCR 函数相同 LAYOUTLIST 函数 (LAYOUTLIST) e.g. (LAYOUTLIST) Result : (“Layout1“ “Layout2“) 传回目前图纸空间配臵的串行;无须提供任何参数 REDRAW 函数 (REDRAW [像素名称 [模式] ] ) 若没有提供任何参数,函数会重绘目前视埠;若有提供像素名称,则只重绘该像素 模式可设定为下列的整数值 : 1 = 显示像素 2 = 隐藏像素 3 = 高亮度显示像素 4 =

展开阅读全文

cad画正弦曲线lisp_cadlisp基础教程.pdf相关推荐

  1. python基础教程pdf百度云-《Python基础教程(第3版)》PDF高清版

    <python基础教程第3版>PDF高清版  百度云资源,内涵教材源代码 百度云链接:百度云盘 提取码:7r7o 编辑推荐 久负盛名的Python入门经典,是非常优秀的基础教程,深入浅出, ...

  2. lisp把选集转成表_cad_lisp基础教程.pdf

    cad_lisp基础教程 Lisp 基础知识 一.基本知识1 二.数值资料5 三.程序设计 11 四.流程控制 16 五.输入输出23 六.字符串资料31 七.串行资料36 八.图元资料42 九.选集 ...

  3. python基础教程 pdf github_Python极速入门的多本最佳书籍,不可错过的Python学习资料...

    Python作为现在很热门的一门编程语言,介于Python的友好,许多的初学者都将其作为首选,为了帮助大家更好的学习Python,我筛选了2年内优秀的python书籍,个别经典的书籍扩展到5年内. p ...

  4. python基础教程pdf刘浪_《Python基础教程(第3版)》 PDF高清完整版_初学者如何学习Python...

    <Python基础教程(第3版)> PDF高清完整版 初学者如何学习Python 内容简介 本书包括Python程序设计的方方面面:首先从Python的安装开始,随后介绍了Python的基 ...

  5. Android基础教程pdf

    下载地址:网盘下载 内容简介  · · · · · · <Android基础教程>内容完整丰富,具有较强的通用性,读者都能通过<Android基础教程>快速学习Android开 ...

  6. python twisted教程_twisted基础教程.pdf

    twisted基础教程 Twisted 网络编程必备(一) 0.1 为什么使用Twisted? 如果你并不准备使用Twisted,你可能有很多异议.为什么使用Twisted 而不是其他网络函数 库或框 ...

  7. c+语言基础教程pdf下载,C语言基础教程.PDF

    目錄 Introduction 1.1 入门教程 1.2 helloworld 1.2.1 数值 .字符与字符串 1.2.2 运算符及表达式 1.2.3 选择结构与循环结构 1.2.4 函数基本概念及 ...

  8. 新编计算机基础教程 pdf,《新编计算机公共基础教程(Windows-2000版)》.pdf

    高职高专计算机课程教材 本书编委会 编 [内容提要]本书是为计算机基础教学和广大电脑爱好者自学而编写的教材.它介绍了当今 流行的 Windows 98/Me/2000/XP 操作平台及 Word 20 ...

  9. 计算机基础知识办公自动化视频教程,计算机办公自动化应用基础教程.pdf

    中等职业学校计算机系列规划教材 计算机办公自动化 应用基础教程 高晓燕 张军涛 编 [内容提要]本书为中等职业学校计算机系列规划教材.主要内容包括办公自动化概述及计算机基础 知识.Windows XP ...

  10. oracle数据库的基本教程 pdf,Oracle数据库技术基础教程 PDF 下载

    相关截图: 资料简介: 本书主要介绍Oracle数据库的基本概念.知识和技术,注重培养Oracle数据库技术的基本操作技能.本书内容体系完整,覆盖了Oracle数据库技术的主要组成部分,设置有Orac ...

最新文章

  1. 混合开发的坑(7) ---输入文本时,键盘遮挡
  2. Java魔法堂:注解用法详解——@SuppressWarnings
  3. Solr 搭建搜索服务器
  4. 【Python】基本统计值计算
  5. 汽车行业持续亏损?奥迪:不存在的
  6. 函数防抖(debounce)和节流(throttle)以及lodash的debounce源码赏析
  7. 有没有四十多岁快五十的女人突然想逃离家庭?
  8. [其他]Ubuntu安装genymotion后unable to load VirtualBox engine
  9. 开发安卓app游戏_「安卓APP开发流程」安卓APP如何开发的?
  10. 求二叉树的深度(C++)
  11. JSON——JavaScript 中的使用
  12. Linux——虚拟机系统安装
  13. ubuntu上安装使用冰封王座
  14. 打印机经常遇到的一些问题
  15. sun服务器文件系统扩容,应用服务器侧扩容LUN(Solaris)
  16. android 清理缓存功能 的实现,android实现清理缓存功能
  17. 鲲鹏与江西才俊的七夕之约
  18. 解决电脑本地网络连接显示红叉又可上网问题
  19. 计算机网络局域网组建课程设计,计算机网络课程设计 组建校园局域网.doc
  20. SVM(二):对偶算法、SMO算法

热门文章

  1. mac os模拟器linux,Mac系统如何启动iOS模拟器 快速启动iOS模拟器教程
  2. IDEA实用插件推荐
  3. 缺陷管理工具(jira,禅道)
  4. linux卸载驱动命令,linux卸载驱动时 Resource temporarily unavailable
  5. GIS当中矢量数据、影像数据、地形数据等常见数据格式的介绍
  6. Kafka消息队列原理总结
  7. 单职业传奇私脱机辅助制作视频教程
  8. 计算机系统结构模拟试卷3,计算机系统结构全真模拟试卷.pdf
  9. 宿主机支持avx2指令集,为什么虚拟机cpu就不支持avx2指令集了
  10. Python机器视觉--OpenCV入门--机器视觉与OpencCV用途简介