Lisp教程
一.Lisp基础知识
二.对话框基础
一.基本知识 第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\")
每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;如有若干数量的开括号,则一定有同等数量的关括号对应.
左边开括号后紧随函数名称.
函数名称与参数之间,或参数与参数之间须最少留一个空格. 函数可有一个或多个参数(也可能没有参数),视该函数而定. 函数名称不分大小写,即大小写字母视为相同. 第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) 用以储存静态数据的名称;例如内建或使用者定义的函数 符号名称不分大小写,可由任意长度的可打印字符组成;但下列的字符除外: 左括号 ( 右括号 ) 句点 . 单引号 ' 双引号 \" 分号 ; 表 (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 ....] ) 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 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 ;自动联机至起点以关闭四边形 画圆 : 将圆心坐标及半径长度分别存入两个变量中(变量名称及数据型态自订) 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减去该参数的结果 若没有提供任何参数则传回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 递减 (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个时,则会将余数再整除下一个参数,再得出余数;依此类推 若其中一个参数为实数时,则结果为实数;否则为整数 最大公约数 (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 的设定值转换数值为字符串 若不设定小数字,则依系统变量 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表示结果为假(不成立) 负数值 (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 上式中两个数值参数均为整数,但其中一个(第一个)参数巳大于整数型态所能容许之范围;系统会自动将此参数先行转为实数型态才计算. 计算下列算式 : (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:,表示该函数可以在绘图模式的指令行提示下,其执行方式与内建函数相同;亦可以在任何内建命令(执行中)的提示后,以通透方式执行(但须将函数名称包在一对小括号中) 若在函数名称前没有加上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))) ---- 输入后以纯文字格式存盘(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码为准 若函数中只有一个参数,传回值恒为 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 : T e.g. (< \"a\" CHR(65)) 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 : T e.g. (<= 2 2) Result : T e.g. (<= \"a\" CHR(65)) Result : T 大于或等于函数 (>= 参数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 (< 1 2) (> 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 (< 1 2)) Result : nil 练习 (Exercises) 试求出50减25,与625的开方根值是否相等 COMMAND : (= (- 50 25) (SQRT 625)) Result : T 设计一简单程序(名称为AIR),在呼叫程序时,检查传入的数值自变量(为空气污染指数)是否大于200(即严重空气污染) ---- 启动文字编辑器,开启TEST.LSP程序文件,输入下列程序代码 : (DEFUN AIR (NUM) (> NUM 200)) ---- 输入后存盘(纯文字格式) ---- 在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自定函数,程序代码如下 : (DEFUN AIR-1 (NUM) (IF (> NUM 100) (PRINC \"Very High\")) (IF (AND (> NUM 50) (<= NUM 100)) (PRINC \"High\")) (IF (AND (> NUM 25) (<= NUM 50)) (PRINC \"Medium\")) (IF (<= NUM 25)) (PRINC \"Low\")) (PRINC)) 程序说明 1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于100;若是则显示字符串Very High响应 2 用IF函数判断变量NUM是否大于50且(AND)小于或等于100;若是则显示High响应 3 用IF函数判断变量NUM是否大于25且(AND)小于或等于50;若是则显示Medium 4 用IF函数判断变量NUM是否小于或等于25;若是则显示Low 5 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的 nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号 IF函数的巢状练习 : 修改上一课的程序练习,将多个IF函数合并成巢状嵌套 ---- 启动文字编辑器,开启C:/TEST.LSP程序文件 ---- 新增程序AIR-2,其程序代码如下 : (DEFUN AIR-2 (NUM) (IF (> 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 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 [ (条件表达式 是表达式) ....] ) 函数会顺序检查各条件表达式;直到其中一个条件成立(传回 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),即执行此一表达式 第3节 -------------------------------------------------------------------------------- 循环 (Loop) 配合条件判断,关系及逻辑运算,令程序不断重复一些动作,以提高效率及减少重复动作时的人为错误 可以多个循环形成巢状(嵌套式)循环,即在一个循环内嵌套另一个(或多个)循环 指定的重复次数必须为正整数,亦可以是储存正整数的变量名称 重复指定次数 (REPEAT 重复次数 [表达式 ....] ) e.g. (REPEAT 10 (PRINC \"David\")) ;重复显示David字符串10次 重复 (WHILE 条件表达式 [是表达式 ....] ) 若条件表达式的传回值为 T,即会顺序执行函数内各表达式 各表达式顺序执行完后,程序会返回函数的开头,重新检查条件表达式的传回值 若条件表达式的传回值为 nil,函数内各表达式将不会被执行 e.g. (SETQ COUNT 1) ;将1存入变数COUNT (WHILE (<= COUNT 10) ;WHILE函数并检查变量COUNT是否<=10 (PRINC \"David\") ;若条件成立则以PRINC函数显示David字符串 (SETQ COUNT (1+ COUNT))) ;变量COUNT递增1,并将新值重新存入变量COUNT中取代原值 注意 : 第4行最右边的关括号,是对应第2行WHILE函数的开括号 无限循环 又称为死循环,即循环的条件判断式传回值恒为 T,令循环不断重复而无法结束;在上例中 : ---- 若WHILE函数的条件表达式设定为 (T) ;即条件永远成立 ---- 不作SETQ函数,或不将变量COUNT递增 ;变量COUNT储存值恒久不变,导致条件式永远成立 第4节 -------------------------------------------------------------------------------- 练习 (Exercises) 编写一程序SUM并将自变量存在NUM变量内,计算1+2+3+4 ....至变数NUM的总和 (DEFUN SUM (NUM) (SETQ COUNT 1 TOTAL 0) (WHILE (<= COUNT NUM) (SETQ TOTAL (+ TOTAL COUNT) COUNT (1+ COUNT)) ) (PRINC TOTAL) (PRINC)) 程序说明 1 设定函数SUM并将自变量存入变量NUM,设定变量COUNT以将数目由1开始递增,变量TOTAL(储存总和)初始值为0 2 WHILE循环函数,并设定进入循环的条件式(变量COUNT小于或等于变量NUM) 3 若条件成立即进入循环内部,先将变量TOTAL加上变量COUNT,再用SETQ函数存回变量TOTAL中,覆盖原值 4 将变量COUNT递增1,存回变数COUNT并覆盖原值 5 关括号与第2行的WHILE函数左边的开括号对应 6 循环结束后,用PRINC函数显示变量TOTAL(总和)的内容 程序流程 假设执行程序时传入变量NUM的数值为10 ---- 变数初始值 COUNT = 1 TOTAL = 0 ---- 判断变量COUNT是否<=变量NUM COUNT = 1 TOTAL = 0 ---- 变量COUNT(现值1)小于NUM,进入循环;将TOTAL(现值0)加上COUNT,存回变数TOTAL COUNT = 1 TOTAL = 1 ---- 变数COUNT(现值1)递增1变为2,存回变数COUNT COUNT = 2 TOTAL = 1 ---- 返回WHILE函数的开头,重新判断条件式 ---- 变量COUNT(现值2)小于NUM,进入循环;将TOTAL(现值1)加上COUNT,存回变数TOTAL COUNT = 2 TOTAL = 3 ---- 变数COUNT(现值2)递增1变为3,存回变数COUNT COUNT = 3 TOTAL = 3 ---- 返回WHILE函数的开头,重新判断条件式 ---- 变量COUNT(现值3)小于NUM,进入循环;将TOTAL(现值3)加上COUNT,存回变数TOTAL COUNT = 3 TOTAL = 6 部 份 过 程 省 略 ---- 返回WHILE函数的开头,重新判断条件式 ---- 变量COUNT(现值10)仍等于NUM,进入循环;将TOTAL(现值45)加上COUNT,存回变数TOTAL COUNT = 10 TOTAL = 55 ---- 变数COUNT(现值10)递增1变为11,存回变数COUNT COUNT = 11 TOTAL = 55 ---- 返回WHILE函数的开头,重新判断条件式 ---- 变量COUNT(现值11)巳大于NUM(本范例假设为10),条件判断不成立,循环结束 COUNT = 11 TOTAL = 55 ---- 显示变量TOTAL的现存值,程序结束 尝试用IF函数检查输入的自变量是否小于或等于0;若条件成立则不执行余下的程序 (DEFUN SUM (NUM) (IF (<= NIM 0) (PRINC \"Input Error\") (PROGN 略 过 WHILE 及 PRINC 函数 ) ) (PRINC)) 程序说明 1 设定函数SUM并将自变量存入变量NUM,并用IF函数判断是否<=0,若条件成立则显示错误讯息 2 若条件不成立,即以PROGN函数包含上例中的循环及显示答案部份 3 尾3行的关括号是对应第2行的PROGN函数 4 尾2行的关括号是对应第1行的IF函数 5 最后一行最右边的关括号是对应第1行的DEFUN函数 五输入输出 第1节 -------------------------------------------------------------------------------- 输入函数 让AutoCAD应用程序可以提示使用者输入程序所需的数据;这些输入函数一般都是以GET开头;当程序执行至输入函数时,程序便会暂停,等待使用者输入指定类型的数据后,程序即会继续执行.亦可在函数内指定要显示的提示字符串,若不提供则没有任何提示. 输入整数 (GETINT [提示字符串] ) e.g. (GETINT \"Input Number : \") 输入的范围从-32,768到+32,767之间;若超出范围,会有警告讯息 若输入的数据不是整数型态,如文字或是实数,会显示警告讯息 若输入空格或按下ENTER键响应,输入值为 nil 输入实数 (GETREAL [提示字符串] ) e.g. (GETREAL \"Input Number : \") 若输入的数据是字符串型态,会显示警告讯息;若输入整数,则会自动转为实数 若输入空格或按下ENTER键响应,输入值为 nil 输入字符串 (GETSTRING [模式] [提示字符串] ) e.g. (GETSTRING T \"Input Name : \") 若有提供模式参数且不是 nil 值,使用者即可在输入的字符串中包含空格;但此时必须按ENTER键结束输入 若没有提供模式参数或该参数为 nil 值,要在字符串中包含空格时,必须在字符串的前后加上双引号 \" 输入时不须在字符串的前后加上双引号(上述的情况例外) 若输入空格(没有模式参数或为 nil 值时)或按ENTER键响应时,输入值为\"\即空字符串 输入选取点 (GETPOINT [基准点] [提示字符串] ) e.g. (GETPOINT (LIST 0 0) \"Select Point : \") 可以在屏幕以指向设备(一般是鼠标)选取,或以键盘直接输入坐标值亦可 若有提供基准点(目前UCS的2D或3D坐标),会从基准点出现伸缩线到十字光标所在位置 可接受单一整数或实数作为长度,代替基准点参数;此时会以系统变量LASTPOINT为基准点,以目前十字光标的位置与LASTPOINT的角度为方向,以长度为距离,求出新的输入点 传回值为目前UCS的三维坐标;若输入空格或按下ENTER键响应,输入值为 nil 输入角度 (GETANGLE [基准点] [提示字符串] ) e.g. (GETANGLE (LIST 0 0) \"Select Point : \") 若有提供基准点(目前UCS的2D坐标),会从基准点出现伸缩线到十字光标所在位置 若没有提供基准点,可以在屏幕以指向设备(一般是鼠标)选取两点,以第一点作为基准点 可从键盘直接输入角度值;不论是用指向设备选取或键盘输入,均自动转为弪度传回 弪度以0弪度方向(由系统变量ANGBASE设定)算起,沿反时钟方向增加 输入角度 (GETORIENT [基准点] [提示字符串] ) e.g. (GETORIENT (LIST 0 0) \"Select Point : \") 唯一不同于GETANGLE函数的是 : 以正右方为0弪度,不受 ANGDIR 及 ANGBASE 系统变量影响 输入对角点 (GETCORNER 基准点 [提示字符串] ) e.g. (GETCORNER (LIST 0 0) \"Select Point : \") 必须提供以目前UCS为准的基准点参数;与目前十字光标位置构成伸缩的矩形 传回值为目前UCS的三维坐标;若输入空格或按下ENTER键响应,输入值为 nil 可直接从键盘输入坐标值,以代替从屏幕点选 输入距离 (GETDIST [基准点] [提示字符串] ) e.g. (GETDIST (LIST 0 0) \"Select Point : \") 会从基准点(目前UCS的2D坐标)出现伸缩线到十字光标所在位置 若没有提供基准点,可以在屏幕以指向设备(一般是鼠标)选取两点,以第一选取点作为基准点 若提供3D的点坐标,则传回值是3D的距离;但若设定了INITGET函数第64位,则会忽略Z坐标而传回2D距离 输入关键词 (GETKWORD [提示字符串] ) e.g. (GETKWORD \"Yes or No (Y/N)\") 有效的关键词必须在此函数使用前,先行以INITGET函数来设定 若输入一个无效的关键词时,系统会显示警告讯息并提示再次输入 输入关键词后,会传回输入的关键词的字符串;若按ENTER键则传回 nil 标准档案对话框 (GETFILED 标题 预设档名 预设扩展名 模式) e.g. (GETFILED \"Select file\" \"C:/TEST\" \"DWG\" 8) 预设文件名可包含目录路径,若为空字符串\"\则会是AutoCAD启动目录的全部档案 若预设扩展名为空字符串,则显示所有类型的档案;若扩展名为DWG,会在对话框中显示预览影像 若对话框取得文件名称,函数会传回指定的文件名称及目录路径,否则传回 nil 模式是控制对话框行为的整数值;若要一次过设定多种模式,可将其模式对应的数值累加 1 (0位) 建立新的档案;若是要开启旧档则切勿使用;若档案巳存在会显示错误讯息 4 (2位) 此位若未设定,则只会接受指定的预设扩展名,若档案不加扩展名,则自动加上预设的扩展名 8 (3位) 若设定此位且未设定0位,档案会依支持路径搜寻;若找到则只会传回文件名称,不会传回路径.若未设定此位,则会传回完整的目录路径文件名 16 (4位) 若设定此位,或是预设文件名以路径分隔元结尾,则仅显示该目录路径的档案,且文件名称输入框会变为空白 32 (5位) 若设定此位及0位,若指定的档案巳经存在则会被覆盖,且覆盖前不会有警告讯息 64 (6位) 若指定了URL,则请勿传输远程档案 128 (7位) 完全不允许使用URL 第2节 -------------------------------------------------------------------------------- 设定关键词 (INITGET 模式 关键词串 ) e.g. (INITGET 7 \"Yes No\") 若使用者的输入符合某个关键词,则会传回整个关键词串;否则会显示提示重试< 每个关键词仅可以含有字母,数字及连字符号 (-);有以下两种方式缩写关键词 : ---- 关键词的必要部份用大写,其余用小写 e.g. \"Yes No\" ---- 整个关键词全部为大写,以逗号分隔,再重复简写的部份 e.g. \"YES,Y NO,N\" 若关键词全部为小写或大写,且没有逗号及缩写部份,则使用者必须输入整个关键词才能辨析 每个关键词之间必须以空格分开 本函数适用于除GETSTRING以外的其它输入函数(但各函数可设定的模式略有不同) 模式的作用为控制使用者的输入,为整数值;若要一次过设定多个模式,可将该模式对应的数值累加 1 (0位) 不接受使用者按下ENTER键作为响应 2 (1位) 不接受使用者输入0作为响应 4 (2位) 不接受使用者输入负数作为响应 8 (3位) 允许输入超出图面范围以外的坐标点(即使目前系统数数LIMCHECK设定为ON) 16 (4位) 目前并未使用 32 (5位) 使用虚线绘制伸缩线或方框;但如果POPUPS系统变量设定为0,则会忽略此位的设定 64 (6位) 若设定此位,则各输入函数只传回2D的坐标;否则会传回3D的坐标 128 (7位) 允许任意的输入;这位优先于0位的设定值;若输入时按ENTER响应,则会传回空字符串 第3节 -------------------------------------------------------------------------------- 输出函数 显示或写入档案 (PRIN1 字符串 / 表达式 [档案指标] ) e.g. (PRIN1 \"David\") 所有包含在字符串中的控制字符会当为普通字符显示 若没有提供字符串或表达式,则函数将不作任何事情 结果会在屏幕显示两次,第一次为函数功能所显示的,第二次为系统的传回值 档案指针必须是以OPEN函数,开启档案后传回的指标;若没有提供,所有传回值均显示在屏幕上;若有提供,字符串将写入该档案内 e.g. (PRIN1 \"David\" FILE_ID) 显示或写入档案 (PRINC 字符串 / 表达式 [档案指标] ) e.g. (PRINC \"David\") 所有包含在字符串中的控制字符会正常运作 其它与PRIN1函数相同 显示 (PROMPT 字符串参数 ) e.g. (PROMPT \"David\") 在双屏幕规划中,可将字符串显示在两个屏幕上 字符串显示后,传回值恒为 nil 显示 (ALERT 字符串参数 ) e.g. (ALERT \"David\") 字符串参数会显示在对话框中 可配合换行控制字符 显示多行文字 在对话框中,可显示的列数量及每列可显示的字符数量,受平台设备,窗口大小及解像度影响 第4节 -------------------------------------------------------------------------------- 练习 (Exercises) 在TEST.LSP程序文件中,新增程序2C-1,以修改第三篇课程的2C程序 : 在新增的程序中,使用输入函数取得使用者输入,取代在呼叫旧程序时同时传入自变量的做法 (DEFUN C:2C-1 ( ) (SETQ CEN (GETPOINT \"Select center point : \")) (COMMAND \"CIRCLE\" CEN (GETDIST CEN \"Input radius : \")) (PRINC)) 程序说明 1 设定函数2C-1,并用GETPOINT函数取得使用者选取的坐标点(圆心)再用SETQ函数将坐标存入变量CEN中 2 用COMMAND函数执行CIRCLE指令,随即以变量CEN响应以设定圆心点位置,再使用GETDIST函数,取得使用者输入的长度作为半径响应CIRCLE指令 在TEST.LSP程序文件中,新增程序RECT,以对角的两点建立矩形(聚合线),再询问是否在矩形中加上对角线,最后将图形以输入的角度旋转.在程序中要等别注意如何将坐标分解及重组(第3,4行的程序代码) (DEFUN C:RECT ( ) (SETQ PT_START (GETPOINT \"Select first point\") PT_END (GETCORNER PT_START \"Select second point\") PT_TMP1 (LIST (CAR PT_START) (CADR PT_END)) PT_TMP2 (LIST (CAR PT_END) (CADR PT_START))) (COMMAND \"PLINE\" PT_START PT_TMP1 PT_END PT_TMP2 \"C\") (COMMAND \"SELECT\" \"L\" \"\") (INITGET 128 \"Yes No\") (SETQ YESNO (GETKWORD \"Diagonal Line (Y/N) : \")) (IF (= YESNO \"Yes\") (PROGN (COMMAND \"LINE\" PT_START PT_END \"\") (COMMAND \"SELECT\" \"P\" \"L\" \"\") (COMMAND \"LINE\" PT_TMP1 PT_TMP2 \"\") (COMMAND \"SELECT\" \"P\" \"L\" \"\") ) ) (COMMAND \"ROTATE\" \"P\" \"\" PT_START (* (GETANGLE PT_START \"Rotate Angle : \") (/ 180 PI))) (PRINC)) 程序说明 1 设定函数名称,并用GETPOINT函数取得第1点坐标,存入变量PT_START 2 使用GETCORNER函数取得第2点(矩形对角点)坐标,存入变数PT_END 3 抽出变数PT_START的X坐标,及PT_END的Y坐标,结合成新坐标并存入变数PT_TMP1 4 抽出变数PT_END的X坐标,及PT_START的Y坐标,结合成新坐标并存入变数PT_TMP2 5 用COMMAND函数执行PLINE指令,顺序设定四个角点位置,最后以\"C\"选项将聚合线封闭 6 用COMMAND函数执行SELECT指令,并选用Last模式,将刚建立的聚合线选取 7 以INITGET函数设定关键词Yes及No 8 用GETKWORD函数询问使用者是否要在矩形中加上对角线,并将传回值存入变数YESNO中 9 用IF函数判断变量YESNO,若使用者输入Y,则以PROGN函数包含各顺序执行的指令 10 以COMMAND函数执行LINE指令划出第1条对角线 11 用COMMAND函数执行SELECT指令,用Previous模式选取对上一个选集的对象(聚合线),再选用Last模式,将刚建立的对角线选取并加入新选集中 12 以COMMAND函数执行LINE指令划出第2条对角线 13 用COMMAND函数执行SELECT指令,用Previous模式选取对上一个选集的对象(聚合线和直线段),再选用Last模式,将刚建立的对角线选取并加入新选集中 14 右边的关括号是对应IF函数,左边的关括号则是对应PROGN函数 15 以COMMAND函数执行ROTATE指令,将对上一个选集(以Previous模式响应),绕变量PT_START为基准点转旋 16 旋转的角度以GETANGLE函数取得;因为函数的传回值是弪度,所以要乘以180除PI(弪度3.14159等于180度),使弪度转换为角度值 新增程序AIR-4,并将第4篇课程的AIR-3程序修改为 : 在程序中直接要求使用者输入空气污染指数(只可输入正整数或实数,但不可以是0,负数或以ENTER响应),而不是在呼叫程序时以自变量的方式传入 (DEFUN C:AIR-4 ( ) (INITGET 7) (SETQ NUM (GETINT \"Input number\")) COND函数及其余程序省略 程序说明 1 设定函数名称,并用INITGET函数,设定输入模式为7,没有任何关键词 (1 = 不可以ENTER 2 = 不可以是 0 4 = 不可以是负数 所以设定值为1+2+4 = 7) 2 用GETINT函数(或GETREAL)函数取得使用者输入的数值并存入变量NUM中,以便进行后续的判断程序 六字符串资料 第1节 -------------------------------------------------------------------------------- 字符串函数 字符串连结 (STRCAT [字符串参数1 [字符串参数2]....] ) e.g. (STRCAT \"David and \" \"Katy\") Result : \"David and Katy\" 如果仅有一个参数,则传回该参数 若没有提供任何参数,则传回零长度的字符串(空字符串) e.g. (STRCAT) Result : \"\" 字符串长度 (STRLEN [字符串参数1 [字符串参数2]....] ) e.g. (STRLEN \"David\") Result : 5 如果有多个参数,会传回所有字符串参数的长度总和 e.g. (STRLEN \"David\" \"Katy\") Result : 9 如果没有提供参数,或字符串参数为空字符串,则传回值为0 e.g. (STRLEN) 或 (STRLEN \"\") Result : 0 截取字符串 (SUBSTR 字符串参数 开始位置数值 [截取长度] ) e.g. (SUBSTR \"David and Katy\" 7 3) Result : and 字符串参数中第一个字符(最左边)的位置编号为1,依此类推 空格亦占一个字符位置及编号 起始位置数值必须为正整数;若其数值大于整个字符串的长度,则传回空字符串\"\" e.g. (SUBSTR \"David and katy\" 100) Result : \"\" 截取长度亦必须为正整数;若没有提供此参数,则传回起始位置及其右边的全部字符 e.g. (SUBSTR \"David and katy\" 11) Result : \"Katy\" 若不提供任何参数,或仅提供字符串参数,系统即会显示警告讯息 第2节 -------------------------------------------------------------------------------- 字符串数据转型 大小写转换 (STRCASE 字符串参数 [转换模式] ) e.g. (STRCASE \"David and Katy\") Result : \"DAVID AND KATY\" 如果不指定转换模式,或转换模式为 nil,会将字符串参数全部转为大写字母 如果指定了转换模式,且转换模式为不是 nil,会将字符串参数全部转为小大写字母 e.g. (SUBSTR \"DAVID\" T) Result : \"david\" 字符转ASCII码 (ASCII 字符串参数 ) e.g. (ASCII \"David\") Result : 68 若字符串参数多于一个字符,则只会传回该字符串中第1个字符的ASCII码 反函数是CHR 若不提供任何参数,或该参数不是字符串型态,系统会显示警告讯息 ASCII码转字符 (CHR 整数参数 ) e.g. (CHR 65) Result : \"A\" 整数参数必须在1至255的范围内,否则传回值无法预测 若不提供任何参数,或该参数不是整数型态,系统亦会显示警告讯息 字符串转整数 (ATOI 字符串参数 ) e.g. (ATOI \"123\") Result : 123 若字符串参数内的数字包含有小数点及小数字,转换后将会被截去 若不提供字符串参数,则系统会发出警告讯息 若字符串参数内的数字包含有非数值字符(如英文字母),则函数只会将第1个非数值字符,前面(左边)的数值字符转元为整数 若字符串参数内的第1个字符为非数值字符(如英文字母),则函数会传回 0 字符串转实数 (ATOF 字符串参数 ) e.g. (ATOI \"123.45\") Result : 123.45 e.g. (ATOI \"123\") Result : 123.0 若字符串参数内的数字没有包含小数点及小数字,转换后将会自动加上小数点及补 0 若不提供字符串参数,则系统会发出警告讯息 若字符串参数内的数字包含有非数值字符(如英文字母),则函数只会将第1个非数值字符,前面(左边)的数值字符转为实数 若字符串参数内的第1个字符为非数值字符(如英文字母),则函数会传回 0 角度字符串转弪度实数 (ANGTOF 字符串参数 [转换模式] ) e.g. (ANGTOF \"45\" 0) Result : 0.785398 e.g. (ANGTOF \"45\" 3) Result : 1.0177 提供的字符串参数格式必须配合所设定之模式需求 反函数为ANGTOS,请参阅第二篇课程 模式设定值可以是下列数字之一 : 0 = 度 1 = 度/分/秒 2 = 分度量 3 = 弪度 4 = 土地测量单位 若不提供任何参数,系统会显示警告讯息 若仅提供字符串参数而不提供转换模式,会使用系统预设模式0将字符串转为度 若提供的字符串参数不能转换为指定模式的实数,函数将传回 nil 实数字符串转实数 (DISTOF 字符串参数 [转换模式] ) e.g. (DISTOF \"123.45\" 0) Result : 123.45 提供的字符串参数格式必须配合所设定之模式需求 模式设定值可以是下列数字之一 : 1 = 科学记号 2 = 十进制 3 = 英呎,十进制英吋 4 = 英呎,分数英吋 5 = 分数 若不提供任何参数,系统会显示警告讯息 若仅提供字符串参数而不提供转换模式,会使用系统预设模式1将字符串转为科学记号 若提供的字符串参数不能转换为指定模式的实数,函数将传回 nil 练习 (Exercises) 将字符串\"David and Katy\"存入变量中,分别截取字符串\"David\及\"Katy\再重新将字符串连结且对调位置 COMMAND : (SETQ TEXT \"David and Katy\") Result : \"David and Katy\" COMMAND : (STRCAT (SUBSTR TEXT 11) (SUBSTR TEXT 6 5) (SUBSTR TEXT 1 5)) Result : \"Katy and David\" 说明 1 用SETQ函数将字符串存入变量TEXT中 2 用STRCAT函数将随后的三个截取字符串重新连结 ---- 第一个截取函数起始位置11(K字母),截取其右边所有字符(没有设定截取长度) ---- 第二个截取函数起始位置6(第1个空格)开始,截取其右边5个字符长度 ( and ) ---- 第三个截取函数起始位置1(D字母)开始,截取其右边5个字符长度 (David) 第3节 -------------------------------------------------------------------------------- 控制字符 在双引号的字符串内,反斜线 \\ 字符是用以表示包含的控制子元或脱逸码;各控制字符如下 : 反斜线 \\\\ e.g. (PRINC \"C:\\\\WINDOWS\") Result : \"C:\\WINDOWS\" 双引号 \\\" e.g. (PRINC \"\\\"David\\\"\") 脱逸(Escape) \\e 新行(Newline) \\n e.g. (PRINC \"\\nDavid\") 返回(Return) \\r 定位(Tab) \ e.g. (PRINC \"\David\") 8进位码 \\nnn e.g. (PRINC \"\\104avid\") Result : \"David\" 新行控制字符 ,与使用TERPRI函数相同 在反斜线后的字母必须为小写 在计算字符长度(STRLEN函数)时,不会将字符前的反斜线计算在内 练习 (Exercises) 使用一个PRINC函数,配合各控制字符,显示下列数据 : NAME AGE Mary 25 Tony 37 COMMAND : (PRINC \"NAME\AGE\\nMary\25\\nTony\37\") 第4节 -------------------------------------------------------------------------------- 万用对比字符 (WCMATCH 字符串参数 对比样式 ) 字符串的对比要区分大小写 对比样式中可以使用逗号分隔,输入一个以上的样式条件;只要其中一个样式符合即传回 T 字符串参数及对比样式,大约只有前500个字符会作比较;过长的字符会被忽略 对比样式字符 # 井字号 任何单一数字 @ at符号 任何单一字母 . 句号 任何单一非英数字元 * 星号 任何字符序列(包括空格) ? 问号 任何单一字符 ~ 波浪符号 如果它是样式中第一个字符,会对比除了该样式以外的任何符号 [ ] 中括号 任何包含在中括号内的字符 [~ ] 任何不包含在中括号内的单一字符 - 连字号 使用在中括号内,以指定单一字符的范围(若连字号是中括号内第一个或最后一个宇元时,将不作连字功能处理) , 逗号 将两个样式分隔, ' 反引号 避开特殊字符,在单一反引号之后的字符,不读为万用字符(例如'*) e.g. (WCMATCH \"David\" \"D*\") Result : T e.g. (WCMATCH \"David\" \"Da[a-z]id\") Result : T e.g. (WCMATCH \"David\" \"Da[~va-z]id\") Result : nil 范例说明 ---- 在第1行的范例中,是对比字符串参数是否以字母D开头(注意大小写) ---- 第2行的范例,是对比字符串参数中,第3个字符(v)是否在a至z的范围内 ---- 第3行的范例,是对比字符串参数中,第3个字符(v)是否在a至z的范围内(但不包括字母v) 练习 (Exercises) 以自己的英文名称作为字符串参数,检查当中是否包含A,B或C其中任何一个字母 COMMAND : (WCMATCH \"英文名称\" \"*A*,*B*,*C*\") 七串行资料 第1节 -------------------------------------------------------------------------------- QUOTE函数 直接传回其后的表达式而不予计算 e.g. (QUOTE (+ 1 2)) Result : (+ 1 2) e.g. (QUOTE (A B)) Result : (A B) 当在其它函数中使用QUOTE时,可将其写成为单引号 ' e.g. (SETQ DATA '(\"1234\" \"David\")) Result : (\"1234\" \"David\") 建立串行 (LIST [表达式 ....] ) 如果串行中没有变量,或末定义的项目,则可直接以QUOTE取代LIST函数 e.g. (SETQ NAME \"David\") ;将字符串存入变量NAME中 (SETQ DATA (LIST NAME \"Katy\")) Result : (\"David\" \"Katy\") e.g. (SETQ DATA '(NAME \"Katy\")) Result : (NAME \"Katy\") 各表达式要以空格分开;若未提供任何表达式,函数传回 nil 通常以LIST函数来定义2D或3D的点坐标(即由2至3个实数或整数组成的串行) e.g. (LIST 10.5 25.3 20.5) Result : (10.5 25.3 20.5) 可以建立嵌套式的串行,即在串行包含另一个串行 e.g. (LIST \"1234\" (LIST \"David\" \"Katy\")) Result : (\"1234\" (\"David\" \"Katy\")) 或 (LIST \"1234\" (LIST DATA)) 点对 (Dotted Pair) 是一种特殊形式的串行;它有两元素,在两个元素中间以一个圆点.分隔,而元素与圆点之间要以空格分开 e.g. (8 . \"0\") 在AutoCAD的像素数据中,数据常以点对形式出现 第2节 -------------------------------------------------------------------------------- 型态检查 (LISTP 参数 ) 若参数是一个串行或是 nil,函数即传回 T,否则传回 nil e.g. (LISTP DATA) Result : T ;参数是一个储存串行的变量 e.g. (LISTP (LIST \"David\")) Result : T ;参数是串行 e.g. (LISTP NIL) Result : T ;参数是 nil e.g. (LISTP \"David\") Result : nil ;参数是字符串型态 亦可使用TYPE函数,检查传回值是否为LIST型态(请参阅第一篇课程) 串行连结 APPEND函数 (APPEND [串行 ....] ) 若提供不是串行型态的数据参数,系统会显示错误讯息 将各串行顺序连结并传回;若不提供任何串行参数,函数则返回 nil 值 e.g. (APPEND '(\"1234\") DATA) Result : (\"1234\" \"David\" \"Katy\") e.g. (APPEND '(\"1234\") (LIST DATA)) Result : (\"1234\" (\"David\" \"Katy\")) CONS函数 (CONS 元素 串行参数 ) 将元素(亦可以是串行)加到串行参数的开端 e.g. (CONS '\"1234\" '(\"David\" \"Katy\")) Result : (\"1234\" \"David\" \"Katy\") 可用此函数建立点对(Dotted Pair)形式的串行 e.g. (CONS '8 '\"0\") Result : (8 . \"0\") 第3节 -------------------------------------------------------------------------------- 练习 (Exercises) 建立员工数据的串行并存入变量中;串行中包括下列各元素 : (\"员工编号\" (\"姓\" \"名\") 年龄 \"职位\") (SETQ DATA (LIST \"1234\" (LIST \"Chen\" \"Katy\") 24 \"Draftsman\")) 将3个坐标(由左至右,分别为X,Y,Z坐标)以串行形式存入变数内 : (SETQ PT (LIST 50.5 25.5 0)) 串行分离 CAR函数 (CAR 串行参数 ) 传回串行参数中的第一个元素(该元素可能是一个串行) e.g. (CAR DATA) Result : \"1234\" 若串行参数为一空串行,则函数传回 nil e.g. (CAR (LIST nil)) Result : nil e.g. (CAR '( )) Result : nil CDR函数 (CDR 串行参数 ) 传回串行中,除第一个元素以外,所有其余的元素串行 e.g. (CDR DATA) Result : ((\"Chen\" \"Katy\") 24 \"Draftsman\") 若串行为一空中列,函数则传回 nil 若串行为点对(Dotted Pari)形式,则传回圆点以后的串行数据 e.g. (CDR '(8 . \"Layer\")) Result : \"Layer\" 注意 : CAR及CDR函数可互相组合,以提取串行中的各项数据 组合以 C 字母开头及 R 字母结尾,中间可提供最多4个 A 字母(提取串行中第一个元素)或 D 字母(提取串行中的其余元素)的任意组合 e.g. (CADDR DATA) Result : 24 ;提取员工的年龄数据 等于 (CAR (CDR (CDR DATA))) ---- 除了开头的 C 字母及结尾的 R 字母外,中间的ADD分别等于3个分离串行函数,最右边的字母所代表的函数优先执行 (CDR DATA) ;第1元素以外的其余元素 Result : ((\"Chen\" \"Katy\") 24 \"Draftsman\") (CDR ;第1元素以外的其余元素 Result : (24 \"Draftsman\") (CAR ;抽取第1个元素 Result : 24 坐标通常会以2个或3个的实数(或整数)以串行形式出现,可用以下方式抽取各轴坐标的元素数据 X坐标 = CAR Y坐标 = CADR Z坐标 = CADDR ---- 实际应用可参考第五篇课程的练习程序RECT LAST函数 (LAST 串行参数 ) e.g. (LAST DATA) Result : \"Draftsman\" 传回串行参数中的最后一个元素 若参数为空串行则传回 nil;若不提供串行参数,系统会显示错误讯息 NTH函数 (NTH 元素序数 串行参数 ) e.g. (NTH 2 DATA) Result : 38 传回串行参数中指定位置(以元素序数设定)的元素 序数必须为整数型态,串行中第一个元素(最左边)的序号为 0,依此类推 若不提供任何参数,或仅提供元素序数,则系统会显示错误讯息 若序数大于整个串行的元素总数量,函数会传回 nil 第4节 -------------------------------------------------------------------------------- 搜寻及取代 ASSOC函数 (ASSOC 搜寻元素 串行参数 ) 会在串行参数中搜寻有否该元素;若找到则传回该元素所在的串行;否则传回 nil e.g. (SETQ INFO '((NO \"1234\") (NAME \"Katy Chen\") (AG4 24) (POST \"Draftsman\"))) (ASSOC 'NAME INFO) Result : (NAME \"Katy Chen\") (ASSOC 'SALARY INFO) Result : nil SUBST函数 (SUBST 取代元素 搜寻元素 串行参数 ) 会在串行参数中搜寻有否该元素;若找到则以取代元素替换 若找不到则传回原来的串行参数 e.g. (SUBST '25 '24 DATA) Result : (\"1234 (\"Katy\" \"Chen\") 25 \"Draftsman\") 其它串行处理 REVERSE函数 (REVERSE 串行参数 ) 传回值为串行参数中,各元素反向顺序的复本 e.g. (REVERSE DATA) Result : (\"Draftsman\" 25 (\"Katy\" \"Chen\") \"1234\") 注意 : ---- 若串行内包括其它串行,则该内嵌串行被视为单一元素(其中的元素不会被反向处理) MAPCAR函数 (MAPCAR 功能参数 串行参数 ) 传回值为一串行,串行中各元素为原来串行参数中,各元素执行功能参数后的新值 e.g. (MAPCAR '1+ (LIST 10 20 30)) Result : (11 21 31) FOREACH函数 (FOREACH 变数 串行参数 [表达式 ....] ) 串行中每个元素会顺序代入变量中,并执行指定的表达式 传回值为最后一个表达式的执行结果;若没有提供表达式,传回值为 nil e.g. (FOREACH TEMP (LIST 10 20 30) (PRINC (+ 2 TEMP))) Result : 12223232 APPLY函数 (APPLY 功能参数 串行参数 ) 将串行参数中各元素,传递给指定的功能函数,并执行该功能函数 e.g. (APPLY '+ (LIST 20 20 30)) Result : 60 e.g. (APPLY 'STRCAT (LIST \"Katy\" \"Chen\")) Result : \"Katy Chen\" LENGTH函数 (LENGTH 串行参数 ) 传回值为一正整数,代表串行参数的元素数量;若提供空串行,则传回值为 0 e.g. (LENGTH '(A B C D)) Result : 4 e.g. (LENGTH '(A B (C D))) Result : 3 e.g. (LENGTH '()) Result : 0 注意 : 在第2行的范例中,串行参数中内的嵌套串行 (C D) 被视为单一元素 MEMBER函数 (MEMBER 搜寻串行 串行参数 ) 在串行参数中,检查有否搜寻串行出现 若有即传回在搜寻到的位置开始,及其右边的所有元素;若搜寻不到则传回 nil e.g. (MEMBER '12 '(10 11 12 13 14 15)) Result : (12 13 14 15) 其它应用 LAMBDA函数 (LAMBDA 自变量 表达式 .... ) 定义非正式的函数(匿名函数);通常配合MAPCAR或APPLY等串行函数使用 自变量会传递给表达式执;传回值为最后一个表达式的执行结果 e.g. (MAPCAR '(LAMBDA (TEMP) (+ TEMP 10)) '(LIST 10 20 30)) Result : (20 30 40) 注意 : 上例中使用LAMBDA函数定义一个非正式函数,并设定将参数传入变量TEMP内,表达式则将变数TEMP加10;MAPCAR将其后的串行中各个元素顺序传入匿名函数中执行 第5节 -------------------------------------------------------------------------------- 练习 (Exercises) 将最少2个员工的数据存入一串行中;每个员工数据包括下列各元素 : (编号 (姓 名) 年龄 职位 性别) (SETQ DATA (LIST (LIST \"1234\" (LIST \"Lee\" \"Nelison\") 34 \"Manager\" \"M\") (LIST \"4567\" (LIST \"Fung\" \"Hazel\") 30 \"Secretary\" \"F\"))) ---- 在第2行中,最后(最右)的关括号是对应SETQ函数的,尾2的关括号则是对应第一个LIST函数的 将员工的数据存入一串行中;串行的格式如下 : ((NO 编号) (F_BAME 姓) (L_NAME 名) (AGE 年龄) (POST 职位) (SEX 性别)) ((SETQ DATA '((NO \"1234\") (F_NAME \"Katy\") (L_NAME \"Chen\") (AGE 24) (POST \"Draftsman\") (SEX \"F\"))) 用SUBST函数,配合CONS及ASSOC函数,将上例中的职位改为Manager,再存回变数中 (SETQ DATA (SUBST (CONS 'POST \"Manager\") (ASSOC 'POST DATA) DATA)) ---- 搜寻串行 : (POST \"Draftsman\") (ASSOC 'POST DATA)传回DATA串行中符合POST的串行 ---- 替换串行 : (POST \"Manager\") (CONS 'POST \"Manager\")将POST加在Manager的前端形成新串行,再以SUBST函数替换用ASSOC寻找到的串行 新增程序HL,用非正交模式选取两点,以第1点为起点划出一水平线 (DEFUN C:HL ( ) (SETQ PT_START (GETPOINT \"\\nFirst Point : \") PT_END (GETPOINT PT_START \"\\nSecond Point : \")) (SETQ PT_TMP1 (CADR PT_START) PT_TMP2 (CAR PT_END)) (SETQ PT_END (LIST PT_TMP2 PT_TMP1)) (COMMAND \"LINE\" PT_START PT_END \"\")) 程序说明 1 设定函数名称,用GETPOINT函数取得第1点(直线的起点),存入变数PT_START 2 再用GETPOINT函数,以第1选取点为基准,选取第2点(直线的终点),存入变数PT_END 3 抽取起点(变量PT_START)的Y坐标值(因为是水平线,所以起点及终点的Y坐标值相同)存入变数PT_TMP1;再抽取终点(变数PT_END)的X坐标值,存入变数PT_TMP2 4 将变量PT_TMP2(X坐标值)及变量PT_TMP1(Y坐标值)作为LIST的参数,以建立新的坐标位置;存入并覆盖原有的终点坐标变数PT_END 5 用COMMAND函数执行LINE指令,划出直线由变量PT_START至变量PT_END(坐标位置巳被修改);最右边的关括号是对应DEFUN函数的 八图元资料 第1节 -------------------------------------------------------------------------------- 基本概念 像素 (Entity) 或称为对象(Object),是一些AutoCAD预先定义的基本图形,例如圆,直线或弧等 像素名称 (Entity Name) 图文件中每一个像素都有对应的像素名称,它只是一个指标(Pointer),用以指向有关该像素的数据 像素名称在同一作业阶段内是唯一的;但存盘后再开启时,系统会指定新的像素名称给该对象 利用像素名称,即可取得该对象的有关数据,并作进一步处理 选取对象 ENTSEL 函数 (ENTSEL [提示字符串] ) e.g. (ENTSEL \"\\nSelect Circle : \") 程序会暂停,并提示使用者以指定点选取单一对象 若省略提示字符串,系统会显示预设的提示 Select Object : 传回值为一串行,内有2个元素 : 第1个元素是被选取对象的像素名称,第2个元素是选取该对象时的选取 点之坐标位置(目前的UCS) 选取点并不代表选取对象上的某一点,传回的只是十字光标在选取对象时的位置 选取点与对象的关系将根据选取框的大小,及目前图面的缩放比例而不同 若要在选取对象时,同时指定该对象上的某一点,可以在选取对象时,使用锁点模式(Object Snap) ENTLAST 函数 (ENTLAST) 取得图面中,最后一个(最新建立)对象;该对象并非一定要在屏幕显示范围内,或解冻的图层上 若图面内没有任何对象,函数会传回 nil;否则传回值为该像素的名称 SSGET 函数 选取对象形成选集;将在下一篇课程中详细说明 第2节 -------------------------------------------------------------------------------- 取出对象数据 (ENTGET 像素名称 [应用程序串行] ) 传回指定像素的有关数据串行,其中每一个项目都是以DXF群码所指定 : e.g. (DXF码 资料) 或 (DXF码 . 资料) 相同的DXF群码,在不同的像素中,可能表示不同的资料 练习 (Exercises) 在指令行提示后,输入以下函数,并在屏幕选取像素,观看传回的像素数据 COMMAND : (SETQ TEMP (ENTGET (CAR (ENTSEL)))) 说明 1 2 3 4 使用ENTSEL函数选取对象,并传回一串行(若有选取对象的话) 使用CAR函数,取出传回的串行中第一个元素(像素名称) 将取得的像素名称,作为ENTGET函数的参数,取得该像素的有关数据 将取得的像素数据,用SETQ函数存入一变量内储存 新增程序SEL,以ENTSEL配合ENTGET函数选取并取得像素数据,再显示数据中的像素型态及选取点位置 (DEFUN C:SEL ( ) (SETQ OBJ (ENTSEL \"Please Select Object : \")) (IF (= OBJ NIL) (PRINC \"\\nNone Object Select\") (PROGN (SETQ ENG (ENTGET (CAR OBJ)) PT (CDR OBJ)) (PRINC \"\\nObject Type : \") (PRINC (CADR (ASSOC 0 ENT))) (PRINC \"\\nSelect Point : \") (PRINC PT) ) ) (PRINC)) 说式说明 1 设定函数名称,用ENTSEL函数,提示选取对象并存入变量OBJ中 2 用IF函数作条件判断 : 若变量OBJ等于NIL,即没有选取对象,在显示提示讯息后即跳过IF函数 3 若变量OBJ不是NIL(即有选取对象),便以PROGN函数包含下列各顺序执行的程序 4 将选取的对象(变量OBJ),以CAR函数取出其第1个元素(像素名称),再以像素名称作为ENTGET函数的参数,取得像素数据并存入变量ENT;另外使用CDR函数,取出变量OBJ里第2个元素(选取点位置),存入变量PT中 5 用PRINC函数显示讯息;并用ASSOC函数搜寻(DXF码 0,表示对象的型态串行)变量ENT串行,在传回搜寻到的串行后,再以CADR函数抽出该串行第2个(最右边)的元素(表示对象型态的字符串)并显示 5 用PRINC函数显示讯息及变量PT(选取点位置) 5 使用无参数的PRINC函数以抑制多余的传回值显示;最右边的关括号是对应第1行DEFUN函数左边的开 括号 第3节 -------------------------------------------------------------------------------- 删除及挽回 (ENTDEL 像素名称 ) 若指定名称的像素仍在图面上(未被删除),会将其删除;若像素巳被删除,则会将其救回 被ENTDEL删除的对象,会在离开图面编辑时才会真正清除;在离开前被删除的对象仍可救回 若删除或挽救成功,会传回该像素的名称 无法删除图块定义内的像素,但可以使用ENTMAKE,重新定义一个减去要删除像素的图块定义 函数只处理主像素,属性及聚合线顶点均无法在主像素以外被单独删除 建立像素 (ENTMAKE [像素数据串行] ) 提供的数据串行,其格式与ENTGET函数的传回值类似,且入须包含建立该像素的必要信息 如果缺漏了建立该像素的必要定义信息,函数会传回 nil,并拒绝建立该像素 若省缺了选择性的定义信息(如图层数据),则会使用默认值 像素类型(如CIRCLE,LINE)必须在数据串行的第1或第2个字段;若在第2个字段,则前面只可以是像素名称 对于实数型态的像素数据(如坐标,厚度),亦可接受整数值(会自动转为实数) 对于整数型态的像素数据(如颜色编号),若提供的是实数值,会自动除去小数字部份 当建立像素时,函数会忽略像素名称及像素处理码 如果成立建立像素,函数会传回该像素的定义数据串行;无法建立则传回 nil 若成功建立图块定义,只会传回图块名称,而不是像素数据串行 不能以此函数建立视端口对象(VPORTS指令) DXF码66只对插入对象有影响(表示有属性数据);对于聚合线,66码强制为1(表示有顶点资料) 第4节 -------------------------------------------------------------------------------- 练习 (Exercises) 新增一圆对象,并取得其像素数据,再修改其图层,圆心坐标及半径 ---- 开新图档,建立新图层(例如\"TEMP\黄色);在\"0\"图层上,以坐标50,50划一半径为50的圆 ---- 以ENTSEL选取该像素,用CAD抽出第1个元素(像素名称),作为ENTGET的参数以取得像素数据,存入变量ENT (SETQ ENT (ENTGET (CAR (ENTSEL \"Select Object : \")))) ---- 分三次修改像素数据的圆心坐标(DXF码10),图层(DXF码8)及半径(DXF码40),并存入新变数NEW (SETQ NEW (SUBST (CONS '10 (LIST 75.0 75.0 0)) (ASSOC 10 ENT) ENT)) (SETQ NEW (SUBST (CONS '8 \"TEMP\") (ASSOC 8 NEW) NEW)) (SETQ NEW (SUBST (CONS '40 '75) (ASSOC 40 NEW) NEW)) ---- 以新变量NEW为像素串行数据,作为ENTMAKE函数的自变量,建立新的圆对象 (ENTMAKE NEW) 注意 : 在修改的过程中,第1行是修改ENT变量并存入新变量NEW中,其余两行均是修改新增的变量NEW,变量ENT储存的内容保持不变 更新像素 ENTMOD 函数 (ENTMOD 像素数据串行 ) 会更新以 -1 群组所指定像素名称的像素(主像素,若要更新子像素数据,应用ENTUPD函数) 像素的类型,名称及处理码均无法变更;否则应将像素删除后再重新建立 函数无法变更内部字段 : 如-2群组中的像素名称(如SEQEND);亦无法修改视端口像素(VPORTS) 其它相关数据请参阅ENTMAKE函数,最顶五行的说明 ENTUPD 函数 (ENTUPD 像素名称 ) 当修改3D(或旧式2D)聚合线顶点,或图块属性,以ENTMOD函数更新子像素数据后(屏幕上不会将复合像素立即更新),须再执行此函数才能将整个复合像素更新 像素名称可以是聚合线或图块中任何一个组成部份的像素名称,不一定要是主像素名称 图块中有些像素可能不会重新产生(特别是巢状式图块),必要时可执行REGEN指令 练习 (Exercises) 重新执行上一个练习,但在最后的步骤里,以ENTMOD函数取代ENTMAKE,更新修改后的像素数据,而不是另外新建像素 第5节 -------------------------------------------------------------------------------- 取出对象子数据 ENTNEXT 函数 (ENTNEXT 像素名称 ) 若不提供像素名称,会传回数据库中第一个未被删除的像素名称 若有提供像素名称,则传回数据库中,该像素之后,第一个未被删除的像素名称 若数据库中没有下一个像素数据,则函数传回 nil 可以用此函数,取得复合像素中的子像素数据;如图块的属性定义,或聚合线(3D或旧式2D)的内部顶点结构 内部各子像素的名称为VERTEX,而SEQEND则表示子像素的结束(随后再没有其它的子像素数据) 练习 (Exercises) 建立一条由5个顶点组成的3D聚合线,抽出第四个子像素(顶点)并修改其顶点坐标 ---- 用3DPOLY指令,依下列各坐标建立一3D聚合线(最后以\"C\"选项封闭聚合线) 10,10,0 10,40,0 40,40,0 30,25,0 40,10,0 ---- 用ENTSEL选取该图形;将传回的串行,以CAR函数抽出第1个元素(像素名称)存入变量ENT中 (SETQ ENT (CAR (ENTSEL))) ---- 将取得的像素名称(变量ENT),作为ENTNEXT函数的参数,传回主像素(整个聚合线)中,第一个子像素的像素名称,存入变量TEMP中 (SETQ TEMP (ENTNEXT ENT)) ---- 再执行ENTNEXT函数三次,取得下一个子像素名称,并存入相同的变量TEMP中,直至传回第4个子像素(第4个顶点)的名称为止 (SETQ TEMP (ENTNEXT TEMP)) ---- 用第4个的子像素名称,作为ENTGET函数的自变量,并将传回的像素串行数据存入变量PT中 (SETQ PT (ENTGET TEMP)) ---- 用SUBST函数,配合CONS及ASSOC函数,修改像素串行的顶点(DXF码10)数据 (SETQ PT (SUBST (CONS '10 (LIST 50.0 25.0 0)) (ASSOC 10 PT) PT)) ---- 用ENTMOD函数更新子像素的数据 (ENTMOD PT) ---- 用ENTUPD函数更新主像素的数据 (ENTUPD ENT) 以上一练习中的3D聚合线为对象,顺序抽出各子像素及其像素数据 ---- 执行上例中第2及第3步骤,取得子像素名称,并存入变量TEMP中 ---- 用ENTGET函数取得第1个子像素的数据串行 (ENTGET TEMP) 注意 : 像素型态是VERTEX(DXF码 0),顶点坐标(DXF码10) ---- 重复执行ENTNEXT函数,并存入相同的变量TEMP中 (SETQ TEMP (ENTNEXT TEMP)) ---- 重复执行上一步骤,取得其后各个子像素的数据串行 注意 : i. 在经过5次后,第6次取得的像素数据串行中,没有顶点数据(DXF码10);其像素型态为SEQEND,表示其后巳没有其它的子像素;此时若续继执行第3步骤则会传回 nil ii. 在图块定义中,最后的一个像素数据,其像素型态为ENDBLK,表示其后巳没有其它的子像素 像素处理码 (Handle) 像素处理码与像素名称,在该图档中都是唯一的,但不同的是,处理码在不同的作业阶段都是保持不变的,但像素名称在不同的作业阶段会不相同;因为在开启图文件时,系统会重新指定像素名称给予各对象 像素处理码储存在像素数据串行中,以DXF群码 5 表示;可用下列方式取得 : ---- 选取像素,并取得像素数据串行,存入变量 (SETQ ENT (ENTGET (CAR (ENTSEL)))) ---- 在数据串行中,抽取像素处理码(DXF码 5) (SETQ TEMP (CDR (ASSOC 5 ENT))) HANDENT 函数 (HANDENT 像素处理码 ) 传回与处理码对应的像素名称;若处理码无效,或不为任何现阶段像素所使用,函数传回 nil 函数能传回目前编辑作业中巳被删除的像素 练习 (Exercises) 在新文件内划一图形,观看在两个不同的作业阶段中,该对象的处理码及像素名称 ---- 开新档,以坐标50,50为圆心,划一半径为50的圆 ---- 用ENTSEL或ENTLAST函数选取该圆对象,并记下传回的像素名称 (SETQ NAME (CAR (ENTSEL))) ---- 以ENTGET函数取得像素数据,再用ASSOC配合CDR函数取得像素处理码并记下 (SETQ CODE (CDR (ASSOC 5 (ENTGET NAME)))) ---- 存档后再开启;重复第2及第3步骤,比较新的像素名称及其处理码是否相同 第6节 -------------------------------------------------------------------------------- 图形常用DXF群码 共享DXF群码 -1 = 像素名称 (Entity Name) 0 = 像素类型 (Entity Type) 5 = 像素处理码 (Handle) 6 = 线型 (Line Type) 8 = 图层名称 (Layer Name) 48 = 线型比例 (Line Type Scale) 62 = 颜色号码 (Color Number) 67 = 绘图空间 (1 = 图纸空间) 弧 (ARC) 10 = 圆心点 40 = 半径 50 = 起点角度 51 = 终点角度 圆 (CIRCLE) 10 = 圆心点 40 = 半径 注标 (DIMENSION) 1 = 注标文字 2 = 图块名称 3 = 文字字型 10 = 定义点坐标 11 = 文字中间点坐标 13 = 第1定义点坐标 14 = 第2定义点坐标 15 = 第3定义点坐标 50 = 注标线旋转角度 53 = 文字旋转角度 70 = 注标形式 (0=线性 1=对齐式 2=角度 3=直径 4=半径 6=坐标式 70=坐标式 128=文字巳被修改) 椭圆 (ELLIPSE) 10 = 圆心点 11 = 长轴端点相对于圆心的相对坐标 40 = 长短轴百份比 41 = 椭圆弧起点角度 42 = 椭圆弧终点角度 填涂 (HATCH) 2 = 图样名称 41 = 填涂比例 5 = 角度 71 = 是否为关系型 插入图块 (INSERT) 2 = 图块名称 10 = 插入点 41 = X方向比例 42 = Y方向比例 43 = Z方向比例 44 = 行间距 45 = 列间距 50 = 旋转角度 70 = 行数量 72 = 列数量 引线 (LEADER) 3 = 形式名称 7 = 字型 10 = 箭头起点坐标 40 = 文字高度 41 = 文字宽度 76 = 引线顶点数目 73 = 文字字型 (0=一般 1=公差 2=图块 3=没有) 线 (LINE) 10 = 起点 11 = 终点 细聚合线 (LWPOLYLINE) 10 = 顶点坐标 40 = 区段起点宽度 11 = 区段终点宽度 42 = 弯曲系数(即凸度,直线为0) 43 = 是否单一线宽 70 = 断续线模式 90 = 顶点数目 (SOLID) 10 = 第1点坐标 11 = 第2点坐标 12 = 第3点坐标 14 = 第4点坐标 文字 (TEXT) 1 = 文字内容 7 = 字型 10 = 插入点 11 = 对齐点 40 = 文字高度 50 = 旋转角度 41 = X方向比例系数 51 = 倾斜角度 71 = 显示模式 (1=正常 2=左右颠倒 3=上下颠倒) 72 = 水平对齐模式 (0=靠左 1=中央 2=靠右 3=Align 4=Middle 5=Fit) 73 = 垂直对齐模式 (0=基线 1=底部 2=中央 3=顶部) 第7节 -------------------------------------------------------------------------------- 非图形常用DXF群码 共享DXF群码 -1 = 像素名称 0 = 像素类型 5 = 像素处理码 70 = 位旗标 图块 (BLOCK) 1 = 外部参考路径 2 = 图块名称 10 = 插入点 70 = 旗标 (1=匿名 2=外部从属 4=外部参考 16=巳并入外部参考 32=巳贴附外部参考 64=巳参考) 图层 (LAYER) 2 = 图层名称 6 = 线型名称 62 = 颜色号号 70 = 旗标 (1=冻结 4=锁护) 线型 (LINETYPE) 2 = 线型名称 3 = 描述文句 40 = 图样总长度 73 =图样元素数目 74 = 模式 (0=一般 2=包含文字 4=包含造形) 文字样式 (STYLE) 2 = 样式名称 3 = 英文字檔名 4 = 大字体文件名 42 = 宽度系数 50 = 倾斜角度 40 = 高度模式 (0=指定 1=不指定) 71 = 显示模式 (0=正常 2=左右颠倒 4=上下颠倒 使用者坐标系统 (UCS) 2 = UCS名称 10 = 原点坐标(WCS) 11 = X轴方向(WCS) 12 = Y轴方向(WCS) 九选集资料 第1节 -------------------------------------------------------------------------------- 取得选集 SSGET 函数 (SSGET [选取模式] [选取点] [选取点] [点串行] [过滤条件] ) 在AutoLISP程序中,最多可同时开启128个选集;当巳到达上限时,会拒绝建立新的选集 在选集使用完后,最好将它设定为 nil以释放内存 选集中可包含图纸及模型空间中的对象,但在运作时会除去不在目前空间中的对象 选取模式可以是下列各设定值 : C = 框选 (Crossing) CP = 多边形框选 (Cpolygon) F = 篱选 (Fence) L = 最后可见对象 (Last) P = 最后建立的选集 (Previous) W = 窗选 (Window) WP = 多边形窗选 (Wpolygon) X = 全部 (包括关闭及冻结的图层) :E = 光标选取框内所有对象 :S = 只允许单选 (Single) 若不提供任何参数,则以一般对象选取方式进行 若不设定选取模式,并仅提供一个选取点,则假设为点选单一对象 复合对象(如图块或聚合线)只有其主像素名称会包含于选集中 若选取模式为多边形窗选或框选,篱选,应提供点串行作为各选取点 若成功建立选集,函数会传回选集名称;若未选取对象则传回 nil 过滤条件 过滤条件使用类似ENTGET函数传回的DXF码串行格式 函数可辨识像素名称 (-1码),处理码 (5码)及XDATA码 (大于1000码) 以外的所有群组 过滤条件若指定多于一个的性质,则只有完全符合所有条件的像素,才会被加入选集 过滤条件可使用与WCMATCH函数相同的通配字符(参阅第6篇课程) 过滤未具名图块(匿名图块)时,必须在*字符前加一反向引号';原因是*字符在过滤时当作万用字符使用 除非另行指定,否则会对过滤条件进行等值搜寻 如果是数值群组(整数,实数,点及向量),可以并入指定关系运算的特殊 -4 群组码;包括以下的关系运算子 : \"*\" 全部适用 \"=\" 等于 \"!=\" \"/=\" \"< >\" 不等于 \"<\" 小于 \">\" 大于 \"&\" 位AND(不适用于数值群组) \"<=\" 小于或等于 \">=\" 大于或等于 逻辑运算子 : \" -------------------------------------------------------------------------------- 选集物件数量 SSLENGTH 函数 (SSLENGTH 选集 ) 传回值为整数,表示选集内的对象数量 练习 (Exercises) 注意 : 在每次取得选集后,应立即显示选集内的对象总数并核对 COMMAND : (SSLENGTH GOP) 不设定选取模式及过滤条件,以一般方式选取对象,并将选集储存在变量中 (SETQ GOP (SSGET)) 不设定选取模式,但只将选取的文字对象加入选集,并将选集储存在变量中 (SETQ GOP (SSGET '((0 . \"TEXT\")))) 从上个选集中,选取所有圆对象形成新选集,并将选集储存在变量中 (SETQ GOP (SSGET \"P\" '((0. \"CIRCLE\")))) 用窗选模式,选取在指定范围内且图层为\"DIM2\"的所有对象 (SETQ GOP (SSGET \"W\" '(0 0) '(1000 1000) '((8 . \"DIM2\")))) 选取图面内所有在图层\"0\"的线对象 (SETQ GOP (SSGET \"X\" '((-4 . \" 选取图面内所有半径大于0.75的圆对象 (SETQ GOP (SSGET \"X\" '((0 . \"CIRCLE\") (-4 . \">\") (40 . 0.75)))) 选取图面内所有包含有 S 字母的文字对象 (SETQ GOP (SSGET \"X\" '((0 . \"TEXT\") (1 . \"*S*\")))) 以多边形框选模式,并提供点串行参数作为框选时的各选取点;但不提供过滤条件 (SETQ GOP (SSGET \"CP\" '((0 0) (0 6) (6 6) (6 0)))) 第3节 -------------------------------------------------------------------------------- 选集对象处理 SSADD 函数 (SSADD [像素名称 [选集] ] ) 若没有任何自变量,会建立新的空选集;若仅有像素名称,则建立含有该像素的新选集 若有提供两个自变量,则会将指定的像素加入指定的选集内 若指定的像素巳存在于指定的选集内,系统会不作任何处理,亦不会有任何讯息提示 SSDEL 函数 (SSDEL 像素名称 选集 ) 若指定的像素不存在于指定的选集内,函数会传回 nil 成功在选集内删除指定的像素后,会传回新的选集;应自行检查像素确实巳从该选集中被删除 SSMEMB 函数 (SSMEMB 像素名称 选集 ) 检查所指定的像素是否包含在指定的选集内;若存在于指定的选集中,函数会传回该像素名称,否则便传回 nil SSNAME 函数 (SSNAME 选集 索引号 ) 索引号为整数或实数型态;选集中第一个元素其索引值为 0 若索引号大于32767,则必须提供实数型态的索引值 函数会传回该索引号对应的像素名称;若索引号为负数,或大于选集中对象的总数量,则传回 nil SSNAMEX 函数 (SSNAMEX 选集 [索引号] ) 只有在目前图面的模式或图纸空间之像素选集,可以使用此函数 索引号为整数或实数型态;选集中第一个元素其索引值为 0 会传回在选集中,指定索引号所对应的像素名称,及如何选取该像素的说明 若不提供索引号,则传回整个选集内,所有像素的名称及选取说明 在传回的每个像素串行中,第1个元素是该像素的选取方式,第2个元素是像素名称,第3个元素为选取该像素时的特定数据 e.g. (选取方式 像素名称 (选取数据)) ---- 选取方式 : 0 = 不指定,全部 (X),最后一个 (L) 1 = 点选 2 = 窗选 (W),多边形窗选 (WP) 3 = 框选 (C),多边形框选 (CP) 4 = 篱选 (F) ---- 选取数据 : 格式是在 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)) ) ) 程序说明 1 2 3 4 设定函数名称;以INITGET函数设定关键词 A=ADD R=REMOVE 使用GETKWORD函数取得使用者输入的选择,存入变量YESNO 使用ENTSEL让使用者在屏幕选取对象,并存入变量OBJ 使用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 0) (PROGN (SETQ COUNT 0) (PRINC \"\\nCannot Previous\"))) (IF (>= COUNT (SSLENGTH GOP)) (PROGN (SETQ COUNT (1- (SSLENGTH GOP))) (PRINC \"\\nCannot Next\"))) ) ) 程序说明 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节 -------------------------------------------------------------------------------- 系统变量 GETVAR 函数 (GETVAR 系统变量名称 ) e.g. (GETVAR \"TEXTSIZE\") 传回指定的系统变量现时储存的值 SETVAR 函数 (SETVAR 系统变量名称 值 ) e.g. (SETVAR \"TEXTSIZE\" 2) 将指定的值存入指定的系统变量内 存入的数据型态要与该系统变量相同,否则不作任何处理并显示警告讯息 部份系统变量为只读的(如DATE),不可以存入数据 屏幕显示 GRAPHSCR 函数 (GRAPHSCR) 无须提供参数;传回值恒为 nil;相当于执行GRAPHSCR指令,或按F2键切换至绘图屏幕 TEXTSCR 函数 (TEXTSCR) 无须提供参数;传回值恒为 nil;相当于执行TEXTSCR指令,或按F2键切换至绘图屏幕 TEXTPAGE 函数 (TEXTPAGE) 功能与TEXTSCR函数相同 LAYOUTLIST 函数 (LAYOUTLIST) e.g. (LAYOUTLIST) Result : (\"Layout1\" \"Layout2\") 传回目前图纸空间配置的串行;无须提供任何参数 REDRAW 函数 (REDRAW [像素名称 [模式] ] ) 若没有提供任何参数,函数会重绘目前视埠;若有提供像素名称,则只重绘该像素 模式可设定为下列的整数值 : 1 = 显示像素 2 = 隐藏像素 3 = 高亮度显示像素 4 = 取消高亮度显示像素 GRDRAW 函数 (GRDRAW 起点坐标 终点坐标 颜色号码 [高亮度显示] ) 在目前视埠内,于两坐标点间绘制一向量;它并非正式的对象,在REDRAW或REGEN后会自动消失 可提供2D或3D的坐标点(目前的UCS) 颜色号码须是整数型态,若是 -1 则代表XOR ink,可绘出任何底色之互补色,当重绘时会将向量删除 若提供的高亮度显示为非 0 值之整数,表示使用显示设备预设之高亮度显示方式(通常是虚线)绘出向量;若省略或为 0 值,则以正常模式显示 坐标点 POLAR 函数 (POLAR 坐标点 方向 距离 ) e.g. (POLAR '(0 0 ) (/ PI 4) 100) Result : (70.7107 70.7107) 在提供的坐标点开始,以指定的方向及距离,取得新坐标点位置 可提供2D或3D的坐标点;方向则以目前建构平面,与X轴反时针方向增加的弪度表示 传回值为2D或3D的坐标点,视乎提供的坐标点参数的类型而定 INTERS 函数 (INTERS 坐标点1 坐标点2 坐标点3 坐标点4 [模式] ) e.g. (INTERS '(0 0 ) '(0 10) '(20 10) '(20 20) NIL) Result : (10.0 10.0) e.g. (INTERS '(0 0 ) '(0 10) '(20 10) '(20 20)) Result : nil 取得两直线段的交点位置坐标,或检查两直线段是否相交 坐标点1及2,分别为第一条线的两个端点;坐标点3及4,分别为第二条线的两个端点 函数会传回两条线的交点位置坐标;若两条线没有交点(例如两条线互相平行)则传回 nil值 所有坐标点均以目前的UCS表示 若所有坐标点均为3D坐标,函数会传回3D的交点坐标;若其中任何一个坐标点为2D,则只会传回2D的交点坐标 若模式设定为 nil,即使两条线没有真正的交点,但有延伸交点(即假设两条线无限延长)时,仍会传回两条线的虚拟交点坐标 若不提供模式参数,或该参数不是 nil值,则只会传回两条线的真正交点坐标(若有交点的话) 第2节 -------------------------------------------------------------------------------- 逻辑位 LOGAND 函数 (LOGAND [整数参数 ....] ) e.g. (LOGAND 2 3 31) Result : 2 e.g. (LOGAND 2 16 3) Result : 0 函数会将各参数进行逻辑位的AND运算 传回值为整数;若没有提供任何参数,传回值为 0;若仅提供一个参数,则传回该参数 LOGIOR 函数 (LOGIOR [整数参数 ....] ) e.g. (LOGAND 1 2 5) Result : 7 函数会将各参数进行逻辑位的OR运算 传回值为整数;若没有提供任何参数,传回值为 0;若仅提供一个参数,则传回该参数 LSH 函数 (LSH [整数参数 位移数] ) e.g. (LSH 2 2) Result : 8 位移数必须是整数;若是正值,就向左移动指定数量的位;若是负值,则向右移动指定数量的位 在左移时,最左边的位会被移出(舍弃),右边则补加 0 位;右移则相反,最右边的位移出,最左边的位补 0 若不提供任何参数,则不作任何处理;若仅有位移数,没有数值参数,则只传回该位移数 ~ 函数 (~ 整数参数 ) e.g. (~ 3) Result : 4 e.g. (~ 100) Result : -101 传回值为 : 整数参数逐位 NOT(1的补码) 的运算结果 第3节 -------------------------------------------------------------------------------- 离开 EXIT 函数 (EXIT) QUIT 函数 (QUIT) 以上两个函数均不须提供参数 无条件强制退出目前执行中的程序,并传回错误讯息,回到指令行提示 内存 GC 函数 (GC) 无须提供参数;传回值恒为 nil;用以强制收集不用的内存,并释放不使用的内存 MEM 函数 (MEM) 无须提供参数;函数传回内存使用统计值,其相关信息如下 : GC calls AutoLISP启动后,呼叫收集不用内存的次数 GC run time 用于收集内存的时间(毫秒) PgSz 动态内存分页的大小(KB) Used 巳使用分页的数量 Free 未使用的分页数量 FMCL 未使用的分页中最大的连续区域 Segs 配置的分段数量 Type 配置在区段中对象的类型描述 Segment size 最小区段大小 Total used 配置区段的数量 ALLOC 函数 (ALLOC 整数参数 ) 整数参数为指定要配置的内存区段大小;函数将传回设定值 EXPAND 函数 (EXPAND 整数参数 ) 整数参数为AutoLISP配置额外的内存区段数量 第4节 -------------------------------------------------------------------------------- 练习 (Exercises) 先后选取两条直线段,分别取得其起点及终点,并作为INTERS的参数以求出交点坐标,以该交点作为另一线段(或其它图形)的起点 (DEFUN C:INT_L ( ) (SETQ OBJ1 (ENTSEL \"\\nSelect first line : \") OBJ2 (ENTSEL \"\\nSelect second line : \")) (IF (OR (= OBJ1 NIL) (= OBJ2 NIL)) (PRINC \"\\nNone object select\") (PRONG (SETQ ENT1 (ENTGET (CAR OBJ1)) ENT2 (ENTGET (CAR OBJ2))) (IF (OR (/= (CDR (ASSOC 0 ENT1)) \"LINE\") (/= CDR (ASSOC 0 ENT2)) \"LINE\")) (PRINC \"\\nObject type is not a Line\") (PROGN (SETQ PT1 (CDR (ASSOC 10 ENT1)) PT2 (CDR (ASSOC 11 ENT1)) PT3 (CDR (ASSOC 10 ENT2) PT4 (CDR (ASSOC 11 ENT2))) (SETQ PT_INT (INTERS PT1 PT2 PT3 PT4 NIL)) (IF (= PT_NIT NIL) (PRINC \"\\nNone Intersection Point\") (COMMAND \"LINE\" PT_INT) ) )) )) (PRINC)) 程序说明 1 设定函数名称 2,3 用ENTSEL函数选取对象,并分别存入变量OBJ1及OBJ2中 4 用IF判断变量OBJ1及OBJ2,其中一个(OR)是否没有选取对象(等于NIL) 5 若其中一个(变量OBJ1,OBJ2)没有选取对象,则显示错误讯息;若两个变量均有选取对象,则以PROGN函数包含各后续执行的程序 6 用CAR取得串行中第1个元素(像素名称),作为ENTGET的参数;取得变量OBJ1的像素数据,存入变量ENT1;以同样方式,取得变量OBJ2的像素数据,存入变量ENT2 7,8 用ASSOC及CDR函数分别取得变量OBJ1及OBJ2的像素型态(DXF码0),并用OR连结,使用IF函数判断两个对象的型态是否不等于LINE 9 若其中一个(OR)像素不是LINE型态,则显示错误讯息;若两个像素均是LINE型态,则以PROGN函数包含各后续执行的程序 10 用ASSOC及CDR函数,抽取ENT1(变量)像素数据的起点(DXF码10)及终点(DXF码11)坐标,分别存入变数PT1及PT2 11 以同样方式,抽取ENT2(变量)像素数据的起点及终点坐标,分别存入变数PT3及PT4 12 以各坐标点为参数,用INTERS函数取得两条线的交点位置坐标存入变量PT_INT中;注意最后一个参数为NIL,以求出虚拟交点 13 用IF函数判断变量PT_INT是否为NIL,以确定两条线有否交点 14 若两条线没有交点,则显示讯息提示 15 若两条线有交点,则以COMMAND函数执行LINE指令(或其它指令),并以交点位置作为线段的起点 16 关括号是对应第13行的IF函数 17 左边的关括号是对应第9行的PROGN函数;右边的关括号是对应第7行的IF函数 18 左边的关括号是对应第5行的PROGN函数;右边的关括号是对应第4行的IF函数 19 用一个没有参数的PRINC函数,以抑制多余的讯息显示;最右边的关括号是对应第1行的DEFUN函数 在使用者的选取点为左下角划一矩形;长度,高度及圆倒角均须使用者输入 (DEFUN C:RECT_1 ( ) (SETQ PT_BASE (GETPOINT \"\\nSelect Low Left Point : \") TEMP_W (ABS (GETDIST PT_BASE \"\\nInput Width : \")) TEMP_H (ABS (GETDIST PT_BASE \"\\nInput Height : \")) TEMP_R (ABS (GETDIST PT_BASE \"\\nInput Corner Radius : \"))) (COMMAND \"PLINE\" PT_BASE (SETQ PT_TEMP (POLAR PT_BASE 0 TEMP_W)) (SETQ PT_TEMP (POLAR PT_TEMP (/ PI 2) TEMP_H)) (SETQ PT_TEMP (POLAR PT_TEMP PI TEMP_W)) \"C\") (SETVAR \"FILLETRAD\" TEMP_R) (COMMAND \"FILLET\" \"P\" \"L\") ) 程序说明 1 设定函数名称 2 用GETPOINT函数取得使用者选取的坐标点(矩形的左下角),存入变数PT_BASE 3 用GETDIST函数取得使用者输入(选取点或键盘)的长度,存入变数TEMP_W中;为防止使用者可能输入负数,先以ABS函数取得距离的绝对值 4 5 6 7 以同样方式,取得使用者输入(选取点或键盘)的高度,存入变数TEMP_H中 以同样方式,取得使用者输入(选取点或键盘)的圆倒角半径,存入变数TEMP_R中 用COMMAND函数执行PLINE指令,划出聚合线;第一点为矩形的左下角(变数PT_BASE) 存入变量PT_TEMP中的第2点坐标位置,是用POLAR函数取得 : 从变数PT_BASE起,向右方(弪度 0),长度为矩形的阔度(变数TEMP_W) 8 存入变量PT_TEMP中的第3点坐标位置,是用POLAR函数取得 : 从上一个坐标点(变数PT_TEMP)起,向上方(90度角=圆周率除2),长度为矩形的高度(变数TEMP_H) 9 存入变量PT_TEMP中的第4点坐标位置,是用POLAR函数取得 : 从上一个坐标点(变数PT_TEMP)起,向左方(180度角=圆周率),长度为矩形的阔度(变数TEMP_W) 10 以\"C\"选项封闭聚合线,并结束第6行的PLINE指令;最右边的关括号是对应第6行的COMMAND指令 11 用SETVAR函数,将使用者输入的圆倒角半径数值,存入系统变量FILLETRAD 12 以COMMAND函数执行FILLET指令;模式为P (POLYLINE),并使用L(Last)模式选取刚建立的矩形执行 13 关括号是对应第1行的DEFUN函数 十一常用函数2 第1节 -------------------------------------------------------------------------------- 加载程序文件 LOAD 函数 参阅第三篇课程 AUTOLOAD 函数 (AUTOLOAD 程序文件名称 指令串行 ) e.g. (AUTOLOAD \"C:/TEST\" '(\"RECT\" \"SEL\")) 当使用者第一次输入包含在指令串行中的指令时,会自动加载相关的程序文件(若该程序文件尚未加载),再继续执行该指令 若指令串行中的指令,未定义在相关的程序文件中,系统会有警告讯息提示 程序文件要存于AutoCAD的支持目录路径;否则要在程序文件前加上目录路径 取得资料 ANGLE 函数 (ANGLE 坐标点1 坐标点2 ) e.g. ANGLE '(10 10) '(30 30)) Result : 0.785398 (等于45度) 取得从坐标点1至坐标点2的方向径度 角度以目前建构平面的X轴算起,反时针方向增加的角度值 传回值以弪度表示 若提供3D的坐标点,系统会先投影在目前的建构平面上 DISTANCE 函数 (DISTANCE 坐标点1 坐标点2 ) e.g. DISTANCE '(10 10) '(30 30)) Result : 28.2843 取得坐标点1与坐标点2间的距离 可以提供称2D或3D的坐标;若其中一个为2D坐标,则会先将两个坐标投影在目前的建构平面上,再传回两点间之距离 第2节 -------------------------------------------------------------------------------- 判断表达式 EQ 函数 (EQ 表达式1 表达2 ) 判断两个表达式是否为同一表达式;如果相同,函数传回 T,否则传回 nil e.g. COMMAND : (SETQ LIST1 '(A B C)) COMMAND : (SETQ LIST2 '(A B C)) COMMAND : (SETQ LIST3 LIST2) COMMAND : (EQ LIST1 LIST3) Result : nil COMMAND : (EQ LIST2 LIST3) Result : T 注意 : 在第4行中,虽然变量LIST1与LIST3的内容完全相同,但两者不是参考同一个串行,所以传回 nil 值 EQUAL 函数 (EQUAL 表达式1 表达2 [最大误差量] ) 判断两个表达式是否包含相同的内容;相同会传回 T,否则传回 nil e.g. COMMAND : (EQUAL LIST1 LIST3) Result : T 注意 : 虽然变量LIST1及LIST3分别参考到不同的串行,但其内容完全相同 当比较两个实数(或实数组成的串行)时,因可能使用不同的计算方式,导致数值稍有差异时,即可以最大误差量来补偿 e.g. (SETQ NUM1 1.123456 NUM2 1.1234567) (EQUAL NUM1 NUM2) Result : nil (EQUAL NUM1 NUM2 0.000001) Result : T 注意 : 当提供最大误差量后,只要比较的数据在最大误差范围内,即视为相等 第3节 -------------------------------------------------------------------------------- 其它函数 EVAL 函数 (EVAL 表达式 ) e.g. (EVAL (ABS -10)) Result : 10 函数传回AutoLISP表达式的执行结果 OSNAP 函数 (OSNAP 坐标点 锁点模式 ) 若坐标选取点的位置没有像素,或设定的锁点模式不适用于该像素(例如以END模式选取圆,或以CEN模式选取直线),函数传回 nil 选取点与对象的关系将根据选取框的大小及目前图形的缩放比例而不同 若坐标选取点能锁定像素,则传回该模式所选取的3D坐标点 e.g. 划一条直线从 -10,0 到 50,0 COMMAND : (OSNAP '(0 0) \"END\") Result : (-10.0 0.0 0.0) STARTAPP 函数 (STARTAPP 应用程序名称 [开启文件名称 ) 应用程序名称为字符串型态的参数;如果不含目录路径,则只会搜寻PATH环境变量所设定的路径 若成功启动指定的应用程序,函数会传回大于 0 的整数,否则传回 nil ---- 启动记事本(NOTEPAD)应用程序并开启指定的文字文件 e.g. (STARTAPP \"NOTEPAD\" \"C:/TEST.LSP\") ---- 启动小算盘应用程序 e.g. (STARTAPP \"CALC.EXE\") TEXTBOX 函数 (TEXTBOX 定义文字串行 ) e.g. (TEXTBOX '((1 . \"David\"))) 计算指定的文字对象,并传回包含该文字的方框的对角坐标值串行 文字串行格式类似ENTGET函数的传回值 若不提供定义文字的非必要数据,则会使用目前系统的设定值 函数能接受的最小串行为 : 只包含文字本身的串行(DXF码1) 传回的坐标串行中,第一个元素通常是(0.0 0.0 0.0),除非文字对象是倾斜,垂直或是有部份文字超出了底部的基线 传回的坐标串行中,第一个元素是包含文字矩形的左下角坐标点,第二个元素是右上角坐标点 第4节 -------------------------------------------------------------------------------- 其它函数 BOUNDP 函数 (BOUNDP 变量或符号名称 ) 若变量巳储存有某个值,则函数传回 T;若变量没有储存任何值(nil),传回 nil 若变量未被定义,系统会自动建立并指定 nil 值给新的变量 VER 函数 (VER) Result : Visual LISP 版本号码 (语言) 无须任何参数;传回目前AutoLISP的版本号码(字符串),可用作检查程序的兼容性 语言 : de = 德语 en = 英语 es = 西班牙语 fr = 法语 it = 意大利语 COMMAND 函数 (COMMAND [指令或其选项] .... ) 指令要以字符串形式提供(在前后加上双引号\");选项则视乎需要提供不同型态的参数 空字符串\"\"等于在键盘按ENTER键 不提供任何自变量等于按下ESC键,可用以取消大部份的指令执行 若系统变量CMDECHO设定为 0,从函数执行的指令并不会响应在指令行上 小部份AuotCAD指令要放在程序的最后一个表达中(例如SCRIPT,FILLET) HELP 函数 (HELP [说明档名称 [求助题目 [起始状态]]] ) e.g. (HELP \"\" \"CIRCLE\") ;显示AutoCAD的说明文件及有关圆的资料 若省略说明档名称,或以一空字符串表示,系统会使用预设的AutoCAD说明档 若不提供说明文件名称的扩展名,系统会自动加上HLP为扩展名 求助题目是指定说明功能起始显示的主题;若不提供或是为空字符串,则只显示说明文件的简介部份 若成功会传回说明档名称,否则传回 nil;若没有任何参数而成功的话,则传回空字符串 起始状态为字符串形式,可为下列几种 : HELP_CONTENTS 显示说明文件内第一个说明主题 HELP_HELPONHELP 显示说明文件的使用说明 HELP_PARTIALKEY 显示搜寻文字主题的搜寻对话框 第5节 -------------------------------------------------------------------------------- 其它函数 *ERROR* 函数 (*ERROR* 字符串 ) 由使用者自行定义的错误处理函数 在程序发生错误时,会被当作函数执行;系统并传递一个自变量(为描述错误的字符串)给此函数 在函数中可包含不提供自变量的COMMAND函数;如此即可取消先前执行中的指令 e.g. (DEFUN *ERROR* (MSG) (COMMAND) (COMMAND) (PRINC (STRCAT \"\\nSystem Error : \" MSG)) (PRINC)) ---- 第1行 : 设定函数,并将系统传递来的自变量存入变数MSG;使用两个没有任何参数的COMMAND,等于按下两次ESC键,即可终止大部份执行中的指令 ---- 第2行 : 用STRCAT将字符串连结,并用PRINC函数显示在屏幕上 ---- 第3行 : 用一个没有任何参数的PRINC函数,抑制多余的传回值或讯息显示 GRTEXT 函数 (GRTEXT 位置 文字 [高亮度显示] ) e.g. (GRTEXT -1 \"Wishing Star Ltd.\") 在菜单区域或状态列,显示指定的文字,但它并不会改变各菜单项目 若不提供任何参数,会将全部文字区域还原成标准值;若仅提供一个自变量,系统会产生错误讯息 若文字过长则会被截短;若成功的话,会传回该字符串参数,不成功则传回 nil 位置必须为整数,用以指定屏幕菜单项目的位置;有效数值从 0 到最大屏幕菜单项目编号减 1 可利用SCREENBOXES系统变量,传回屏幕菜单项目的最大值 如果高亮度显示为 0,会取消菜单项目的高亮度显示;若为负值则会被忽略 若位置为 -1,则文字会显示在状态列上;可显示的文字数量依显示器不同而有差别 若位置为 -2,则文字会显示在坐标状态列上 当位置参数使用 -1 或 -2值时,会忽略高亮度显示值(若有提供的话) GRREAD 函数 (GRREAD [位置模式] [指向设备模式] [光标显示模式] ) 传回值为串行型态;第一个元素是输入的类型,第二个元素是整数或一个点串行(依输入类型而定) 若提供位置模式且不为 nil,函数会从移动中的指向设备,传回目前坐标值 指向设备模式为整数值,若要同时设定多于一项功能,可将各对应值累加;各设定值如下 : 1 (0位) 传回拖曳模式坐标值;若设定此位,且移动指向设备而非按下按钮或按键,会传回一串行 : 第一个元素是类型 5,第二个元素是指向设备的位置 (X,Y坐标) 2 (1位) 传回所有关键值 4 (2位) 使用在光标显示模式中的设定值,以控制光标显示 8 (3位) 当使用者按下ESC键时,不显示错误讯息 光标显示模式为整数值,必须同时设定指向设备模式的第2位;各整数值表示如下 : 0 = 正常十字光标 1 = 不显示光标 2 = 显示对象选取框光标 GRREAD函数传回值类型码 串行中第一个元素 串行中第二个元素 值 输入类型 值 描述 2 键盘输入 不定 字符码 3 选取点 3D点 点坐标值 4 屏幕或下拉式菜单项目 (来自指向设备) 0 - 999 1001 - 1999 2001 - 2999 3001 - 3999 < 略 过 > 16001 - 16999 屏幕菜单项目编号 POP1 菜单项目编号 POP2 菜单项目编号 POP3 菜单项目编号 < 略 过 > POP16 菜单项目编号 5 指向设备 (仅在启用追踪时传回) 3D点 拖曳模式坐标 6 BUTTONS 菜单项目 0 - 999 1001 - 1999 2001 - 2999 3001 - 3999 BUTTON1 菜单按钮编号 BUTTON2 菜单按钮编号 BUTTON3 菜单按钮编号 BUTTON4 菜单按钮编号 7 TABLET1 菜单项目 0 - 32767 数字化输入板第 1 区项目编号 8 TABLET2 菜单项目 0 - 32767 数字化输入板第 2 区项目编号 9 TABLET3 菜单项目 0 - 32767 数字化输入板第 3 区项目编号 10 TABLET4 菜单项目 0 - 32767 数字化输入板第 4 区项目编号 11 AUX 菜单项目 0 - 999 1001 - 1999 2001 - 2999 3001 - 3999 AUX1 菜单按钮编号 AUX2 菜单按钮编号 AUX3 菜单按钮编号 AUX4 菜单按钮编号 12 指针按钮 (随同类型 6 或 11 传回) 3D点 点坐标值 第6节 -------------------------------------------------------------------------------- 练习 (Exercises) 新增程序TEXT_F;可将选取的文字对象围上边线(聚合线) (DEFUN C:TEXT_F ( ) (SETQ OBJ (ENTSEL \"\\nSelect Text : \")) (IF (= OBJ NIL) (PRINC \"\\nNone Object Select\") (PROGN (SETQ ENT (ENTGET (CAR OBJ))) (IF (/= CDR (ASSOC 0 ENT)) \"TEXT\") (PRINC \"\\nObject Type Error\") (PROGN (SETQ TEMP (CADR (TEXTBOX (LIST (ASSOC 1 ENT)))) TEMP_W (CAR TEMP) TEMP_H (CADR TEMP) PT_BASE (CDR (ASSOC 10 ENT))) (COMMAND \"PLINE\" PT_BASE (SETQ PT_TEMP (POLAR PT_BASE 0 TEMP_W)) (SETQ PT_TEMP (POLAR PT_TEMP (/ PI 2) TEMP_H)) (SETQ PT_TEMP (POLAR PT_TEMP PI TEMP_W)) \"C\") ) ) ) ) (PRINC)) 程序说明 1 设定函数名称;使用ENTSEL选取对象并存入变量OBJ中 2 用IF判断是否有选取对象(变量OBJ);若没有选取对象,会显示讯息提示;若有选取对象则以PROGN函数包含各后续执行的程序 3 用CAR函数取得变量OBJ串行里,第一个元素(像素名称);作为ENTGET函数的参数,取得对象的像素数据,并存入变量ENT中 4 用ASSOC及CDR函数取得对象(变量ENT)DXF码为 0 的值(像素型态);并用IF判断其是否为文字型态 5 若选取的对象不是文字型态,会显示讯息;否则以PROGN函数包含各后续执行的程序 6 先以ASSOC取得变量ENT中,DXF码为 1 (文字内容)的串行;再用LIST将传回值包含在串行中,作为TEXTBOX函数的参数,取得文字的对角坐标串行;最后以CADR取得串行中第二个元素(文字右上角坐标),存入变量TEMP 7 以CAR取得坐标(变量TEMP)的X轴位置(长度)存入变量TEMP_W;以CADR取得Y轴位置(高度)存入变量TEMP_H; 8 用ASSOC及CDR函数取得像素数据中的文字插入点(DXF码10),存入变数PT_BASE中 9 以COMMAND函数执行PLINE指令,并以变量PT_BASE(文字的插入点)为聚合线的起点(矩形的左下角) 10 用POLAR函数,求取新的坐标点,存入变数PT_TEMP中 : 以变量PT_BASE为起点,向右方(弪度 0),距离为文字的阔度(变量TEMP_W) 11 用POLAR函数,求取新的坐标点,存入变数PT_TEMP中 : 以对上一点(变数PT_TEMP)为起点,向上(弪度PI除2等于90度),距离为文字的高度(变量TEMP_H) 12 用POLAR函数,求取新的坐标点,存入变数PT_TEMP中 : 以对上一点(变数PT_TEMP)为起点,向左方(弪度PI等于180度),距离为文字的阔度(变量TEMP_W);最后以\"C\"选项将聚合线封闭,并结束PLINE指令 13 左边的关括号是对应第5行的PROGN函数;右边的关括号是对应第4行的IF函数 14 左边的关括号是对应第2行的PROGN函数;右边的关括号是对应第2行的IF函数 15 以一个没有任何参数的PRINC,抑制多余的传回值及讯息提示 新增程序POST,以取得指向设备(鼠标)的坐标位置;并在选取一点后,显示该点坐标且结束程序 (DEFUN C:POST ( ) (SETQ CHECK 0) (WHILE (= CHECK 0) (SETQ TEMP (GRREAD T 1 0)) (IF (= (CAR TEMP) 5) (PROGN (PRINC \"\\n\") (PRINC (CDR TEMP)) )) (IF (= (CAR TEMP) 3) (PROGN (PRINC \"\\n\") (PRINC (CDR TEMP)) (SETQ CHECK 1) )) ) (PRINC)) 程序说明 1 设定函数名称;变量CHECK的初始值设定为 0 2 使用WHILE循环函数,并设定进入循环的条件式 : 变数CHECK等于 0 3 使用GRREAD函数,取得指向设备的数据串行,并存入变量TEMP中 4 用IF函数判断变量TEMP,其第一个元素(用CAR取得)是否为第5类型;若是则以PROGN函数包含各后续执行的程序 5 用PRINC函数,并使用控制字符换行;再用PRINC函数,显示变量TEMP中的第二个示素(指向设备的3D坐标,以CDR取得) 6 左边的关括号是对应第4行的PROGN函数;右边的关括号是对应第4行的IF函数 7 用IF函数判断变量TEMP,其第一个元素(用CAR取得)是否为第3类型;若是则以PROGN函数包含各后续执行的程序 8 用PRINC函数,并使用控制字符换行;再用PRINC函数,显示变量TEMP中的第二个示素(选取点的3D坐标,以CDR取得) 9 将变量CHECK设为 1(作用是令循环的条件判断传回 nil 值,以结束循环的执行) 10 左边的关括号是对应第7行的PROGN函数;右边的关括号是对应第7行的IF函数 11 关括号是对应第2行的WHILE函数; 12 以一个没有任何参数的PRINC,抑制多余的传回值及讯息提示 十二档案处理 第1节 -------------------------------------------------------------------------------- 开关档案 OPEN 函数 (OPEN 文件名称 模式 ) 只可开始纯文字格式的档案 若成功开启档案,函数会传回指向该档案的描述子,供其它档案函数使用 文件名称要包含扩展名及完整路径;若不提供路径,则预设为AutoCAD的启动目录 模式可为下列其中一种(必须为小写字母) : r 只读模式 ---- 开启的档案仅供读取数据 w 写入模式 ---- 将数据写入指定的档案;若档案不存在,会自行建立并开启新档,若巳存在则会覆盖原有数据;传递给档案的数据并不会立即写入档案内,而是直至档案以CLOSE函数关闭后才真正写入 a 附加模式 ---- 将数据附加到指定档案的末端;若档案不存在,会自行建立并开启新档 CLOSE 函数 (CLOSE 档案描述子 ) 若成功关闭指定的档案,函数会传回 nil,否则为错误讯息 档案描述子必须经OPEN函数取得;在档案关闭后,档案描述子虽不会改变但巳无效 读取数据 READ-CHAR 函数 (READ-CHAR [档案描述子] ) 若有提供档案描述子,会顺序读取(每执行函数一次,读取一个字符)档案中的字符,并以ASCII码传回整数值 若侦测到一个行结尾字符,函数会传回一新行字符(ASCII码10) 档案描述子必须经OPEN函数(设定为读取模式\"r\")取得 若巳读取至档案的结尾,则函数传回 nil 若没有提供档案描述子,则会从键盘输入暂存区内,逐次读取使用者的输入,并以ASCII码传回整数值 e.g. (READ-CHAR) ;从键盘输入ABC后按ENTER Result : 65 (READ-CHAR) Result : 66 (READ-CHAR) Result : 67 (READ-CHAR) Result : 10 READ-LINE 函数 (READ-LINE [档案描述子] ) 若有提供档案描述子,会顺序读取档案中的一段字符串(在行结尾标记之前),并传回该字符串 档案描述子必须经OPEN函数(设定为读取模式\"r\")取得 若巳读取至档案的结尾,则函数传回 nil 若没有提供档案描述子,则会从键盘输入暂存区内,读取使用者的输入,并以字符串型态传回 e.g. (READ-LINE) ;从键盘输入ABC后按ENTER Result : \"ABC\" 第2节 -------------------------------------------------------------------------------- 存入(写入)资料 WRITE-CHAR 函数 (WRITE-CHAR ASCII码 [档案描述子] ) 档案描述子必须经OPEN函数(设定为写入\"w\"或附加\"a\"模式)取得 每次写入一个以ASCII码表示的字符;可存入ASCII码10以表示行结尾标记 若不提供档案描述子,则ASCII码所表示的字符会写到指令窗口,并传回ASCII码 e.g. (WRITE-CHAR 65) Result : A65 WRITE-LINE 函数 (WRITE-LINE 字符串参数 [档案描述子] ) 档案描述子必须经OPEN函数(设定为写入\"w\"或附加\"a\"模式)取得 每次写入一行字符串 字符串一般包含在双引号\"内,但字符串前后的双引号在写入档案时会被忽略 若不提供档案描述子,则字符串会写到指令窗口,并在下一行传回字符串参数 e.g. (WRITE-LINE \"ABC\") Result : ABC 标准档案对话框 GETFILED 函数 开启AutoCAD的标准档案对话框以选取所需档案;请参阅第5篇课程 检查档案 FINDFILE 函数 (FINDFILE 文件名称 ) 文件名称须自行设定扩展名及路径;若不提供路径,则只会搜寻AutoCAD的支持目录 若找到该档案,会传回包含完整路径及文件名的字符串;否则传回 nil 第3节 -------------------------------------------------------------------------------- 练习 (Exercises) 新增程序TEXT-OUT : 可选取指定的文字对象,并将其文字内容写入一纯文字文件中 (DEFUN C:TEXT-OUT ( ) (SETQ OBJ (ENTSEL \"\\nSelect Text Object : \")) (SETQ FILE_ID (OPEN \"C:/TEXT-IO.TXT\" \"w\")) (WHILE (/= OBJ NIL) (SETQ ENT (ENTGET (CAR OBJ))) (IF (/= (CDR (ASSOC 0 ENT)) \"TEXT\") (RPINC \"\\nObject is not a TEXT\") (PROGN (WRITE-LINE (CDR (ASSOC 1 ENT)) FILE_ID) ) ) (SETQ OBJ (ENTSEL \"\\nSelect Text Object : \")) ) (CLOSE FILE_ID)) 程序说明 1 设定函数名称;使用ENTSEL取得使用者选取的对象存入变量OBJ 2 使用OPEN函数,开启(若档案不存在则自动建立)档案并设定为写入模式,将传回的档案描述子存入变量FILE_ID 3 使用WHILE循环函数,并设定进入循环的条件为 : 使用者有选取对象(变量OBJ不等于NIL) 4 抽出变量OBJ的第一个元素(以CAR取得),再取得该像素的数据(以ENTGET取得),存入变量ENT中 5 用ASSOC搜寻DXF码为 0(像素型态)的元素串行,并用CDR取出传回的元素串行中第二个元素,再用IF函数判断该元素(像素型态)是否等于TEXT 6 若选取的像素不是文字对象,用PRINC函数显示讯息;若是文字对象,则以PROGN函数包含各后续执行的程序 7 用ASSOC搜寻DXF码为 1(文字内容)的元素串行,并用CDR取出传回的元素串行中第二个元素,再用WRITE-LINE函数将取得的文字内容,写入档案描述子指定的档案内 8 左边的关括号的对应第6行的PROGN函数;右边的关括号的对应第5行的IF函数 9 与第1行程序类似,继续选取其它文字对象,并存入变量OBJ中 10 返回循环的开头(第3行),并重新检查条件式,以确定是否继续执行循环 11 关括号是对应第3行的WHILE循环函数 12 在没有选取对象后,循环结束;使用CLOSE函数,将指定的(档案描述子)档案关闭 第4节 -------------------------------------------------------------------------------- 练习 (Exercises) 新增程序TEXT-IN : 使用者在选取文字插入点后,将TEXT-IO档案的内容,以一般文字方式列于图面上 (DEFUN C:TEXT-IN ( ) (SETQ PT_BASE (GETPOINT \"\\nSelect Text Start Point : \") FILE_ID (OPEN \"C:/TEXT-IO.TXT\" \"R\") T_SIZE (GETVAR \"TEXTSIZE\")) (IF (= FILE_ID NIL) (PRINC \"\\nFile cannot open\") (PROGN (SETQ TEMP_S (READ-LINE FILE_ID)) (WHILE (/= TEMP_S NIL) (COMMAND \"TEXT\" PT_BASE \"\" TEMP_S \"\") (SETQ PT_BASE (POLAR PT_BASE (* PI 1.5) (* 1.7 T_SIZE)) TEMP_S (READ-LINE FILE_ID)) ) (CLOSE FILE_ID) )) (PRINC)) 程序说明 1 设定函数名称;使用GETPOINT取得使用者选取的文字插入点,存入变量PT_BASE 2 使用OPEN函数以只读模式\"r\"开启TEXT-IO.TXT档案,并将传回的档案描述子存入变量FILE_ID 3 使用GETVAR函数取得目前文字高度的系统变量TEXTSIZE,存入变量T_SIZE 4 用IF判断档案是否成功开启(储存档案描述子的变量FILE_ID是否为NIL);若开文件失败会显示讯息,若开文件成功,则以PROGN包含各后续须要执行的程序 5 以READ-LINE函数取得档案 (由档案描述子指定) 中,第一行的文字符串,并存入变量TEMP_S 6 使用WHILE循环函数,并设定进入循环的条件为 : 变量TEMP_S (从档案中取得的字符串)不是 NIL (没有资料) 7 以COMMAND函数执行TEXT指令,文字的插入点为变量PT_BASE,角度以空字符串\"\"响应,等于按下ENTER接受默认值;输入的文字为变量TEMP_S(从档案中取得),最后以空字符串\"\"响应以结束指令 8 使用POLAR函数,以PT_BASE为起点,向下(PI等于180度,乘1.5等于270度),距离为目前文字高度(变量T_SIZE)乘以1.7,求得新的(下一行)文字的插入点坐标,存回PT_BASE变量中,覆盖原有的坐标值 9 再使用READ-LINE函数,读取指定档案中,下一行的文字符串,存入变量TEMP_S并覆盖原值 10 返回循环的的开头(第6行),并重新检查条件式,以确定是否继续执行循环 11 当循环结束后,使用CLOSE函数关闭指定的档案 12 左边第1个关括号的对应第4行的PROGN函数;第2个关括号的对应第4行的IF函数,最右边的关括号则是对应第1行的DEFUN函数 注意 : ---- 若READ-LINE函数读取字符串至档案结尾时,函数会传回 NIL,并存入变量TEMP_S中,在返回WHILE作条件判断时,因为条件不成立而结束循环 ---- 在第8行程序的末端,两行文字的垂直距离为文字高度乘1.7,但该数值仅供参考而已,行距可能会因应所设定的字型而略有不同,请自行调节文字高度所乘的系数 十三符号处理 第1节 -------------------------------------------------------------------------------- 基本概念 符号表主要用作储存图面内,非图形(不可见)对象的数据 符号表本身不可以ENTMAKE函数建立,但符号表内的项目则可以 符号表内的项目不能以ENTDEL函数删除 除了VPORT符号表外,其它各符号表的项目名称均不能重复;且不能修改或更名下列各项目 : 不能修改或更改名称 不能更改名称 符号表 项目名称 符号表 项目名称 VPORT *ACTIVE STYLE STANDARD LINETYPE CONTINUOUS DIMSTYLE STANDARD LAYER 不可修改Xdata以外的任何项目(但可更改名称) BLOCKS *MODEL_SPACE *PAPER_SPACE APPID 不可更名任何项目 LAYER 0 符号表处理函数 TBLNEXT 函数 (TBLNEXT 符号表名称 [模式] ) 有效的符号表名称包括下列各项(不分大小写) : LAYER LTYPELTYPE VIEW STYLE BLOCK UCS APPID VPORT DIMSTYLE 若提供模式参数且不为 nil,函数会传回指定的符号表中,第一个项目的数据 若不提供模式参数,或参数为 nil,则传回指定的符号表中,下一个项目的数据 自图块符号表取得的项目数据 : i. 包含有图块定义中第一个项目像素名称(DXF码-2),该像素名称可作为ENTGET及ENTNEXT函数的参数,但不为其它像素存取函数接受;例如不能使用SSADD将它放入选集中 ii. 若图块中没有任何像素,传回的-2群组其像素的名称是ENDBLK 若找不到指定的符号表项目,或巳到达符号表的结尾,函数会传回 nil e.g. (TBLNEXT \"LAYER\" T) Result : ((0 . \"LAYER\") (2 . \"0\") (70 . 0) (62 . 7) (6 . \"CONTINUOUS\")) TBLSEARCH 函数 (TBLSEARCH 符号表名称 项目名称 [模式] ) 搜寻指定的符号表中,是否含有指定的项目;符号表及项目名称不分大小写 若找到会传回该项目的数据(格式与TBLNEXT传回值相同);否则传回 nil 若提供模式参数且不为 nil,系统会调节项目计数器,使可以用TBLNEXT取得该次呼叫TBLSEARCH函数传回项目之后的其它项目 e.g. (TBLSEARCH \"STYLE\" \"STANDARD\") Result : ((0 . \"STYLE\") (2 . \"STANDARD\") (70 . 0) (40 . 0.0) (41 . 1.0) (50 . 0.0) (75 . 0) (42 . 0.3) (3 . \"txt\") (4 . \"\")) TBLOBJNAME 函数 (TBLOBJNAME 符号表名称 项目名称 ) e.g. (TBLOBJNAME \"LAYER\" \"0\") 传回指定的符号表中,指定项目的像素名称;符号表及项目名称不分大小写 传回的像素名称,可以用在ENTGET及ENTMOD函数中 若找不到指定的项目,函数传回 nil 练习 (Exercises) 用TBLOBJNAME函数取得图层数据后再修改,并用于建立新的图层 ---- 取得像素名称(TBLOBJNAME),再取得图层资料(ENTGET),存入变量LAY COMMAND : (SETQ LAY (ENTGET (TBLOBJNAME \"LAYER\" \"CON2\"))) ---- 修改图层名称并存入新变量NEW中 COMMAND : (SETQ NEW (SUBST (CONS '2 \"NEW\") (ASSOC 2 LAY) LAY)) ---- 将变量NEW作为ENTMAKE的参数建立新图层 COMMAND : (ENTMAKE NEW) 第2节 -------------------------------------------------------------------------------- 练习 (Exercises) 新增程序D_LAY : 传回目前图面中,巳设定的全部图层的名称,颜色及其线型 (DEFUN C:D_LAY ( ) (SETQ TEMP_L (TBLNEXT \"LAYER\" T)) (WHILE (/= TEMP_L NIL) (PRINC (STRCAT \"\\n\" (CDR (ASSOC 2 TEMP_L)))) (PRINC \"\\"( (PRINC (CDR (ASSOC 62 TEMP_L))) (PRINC (STRCAT \"\\" (CDR (ASSOC 6 TEMP_L)))) (SETQ TEMP_L (TBLNEXT \"LAYER\")) ) (PRINC)) 程序说明 1 设定函数名称;使用TBLNEXT函数取得LAYER符号表中,第一个(函数最后的参数为 T)图层的项目数据并存入变量TEMP_L中 2 WHILE循环函数;并设定进入循环的条件 : 变量TEMP_L内存有图层的相关数据(在第1行中使用TBLNEXT函数传回) 3 用ASSOC及CDR函数,取得图层的名称 (DXF码2),并用STRCAT将传回的值与控制字符 \\n (换行)连结,再用PRINC函数将其显示 4 用PRINC配合控制字符 \ ,跳至下一定位点;使用ASSOC及CDR函数,取得图层的颜色 (DXF码62),并使用PRINC函数将结果显示 5 用ASSOC及CDR函数,取得图层的线型名称 (DXF码6),并用STRCAT将传回的值与控制字符 \ 连结,再以PRINC函数将结果显示 6 再次使用TBLNEXT函数取得LAYER符号中,下一个项目的数据(因为在函数中没有设定最后一个参数),存入变量TEMP_L中并覆盖原值 7 返回WHILE循环的开头(第2行),再次检验变量TEMP_L(在上一行中以TBLNEXT取得)是否为空值,以决定是否继续执行循环 8 以一个没有任何参数的PRINC函数,抑制多余的传回值及显示;最右边的关括号是对应第一行的DEFUN函数 第3节 -------------------------------------------------------------------------------- 练习 (Exercises) 新增程序C_LAY : 取得图层的数据,并可修改及更新图层的名称及其颜色 (DEFUN C:C_LAY ( ) (SETQ L_NAME (TBLOBJNAME \"LAYER\" (GETSTRING \"Layer Name : \"))) (IF (= L_NAME NIL) (PRINC \"\\nNone This Layer\") (PRONG (SETQ TEMP_L (ENTGET L_NAME)) (SETQ LAY_N (CDR (ASSOC 2 TEMP_L)) LAY_C (CDR (ASSOC 62 TEMP_L))) (PRINC (STRCAT \"\\nLayer Name <\" LAY_N \"> : \") (SETQ TEMP (GETSTRING)) (IF (AND (/= TEMP \"\") (/= TEMP LAY_N)) (SETQ LAY_N TEMP)) (PRINC \"\\nLayer Color <\") (PRINC LAY_C) (PRINC \"> : \") (SETQ TEMP (GETINT)) (IF (AND (/= TEMP NIL) (/= TEMP LAY_C)) (SETQ LAY_C TEMP)) (SETQ TEMP_L (SUBST (CONS 2 LAY_N) (ASSOC 2 TEMP_L) TEMP_L)) (SETQ TEMP_L (SUBST (CONS 62 LAY_C) (ASSOC 62 TEMP_L) TEMP_L)) (ENTMOD TEMP_L) )) (PRINC)) 程序说明 1 设定函数名称 2 以GETSTRING取得使用者输入的字符串(图层名称),作为TBLOBJNAME的参数,并将传回的像素名称,存入变量L_NAME中 3 用IF判断变量L_NAME是否为空值(nil),以检查传回的图层名称是否存在 4 若该图层不存在(变量L_NAME为 nil),则以PRINC显示讯息;若图层存在,则以PROGN包含各后续执行的程序 5 用ENTGET取得图层数据,并存入变量TEMP_L中 6 以ASSOC及CDR取得图层名称 (DXF码2),存入变量LAY_N;再使用相同方式取得图层颜色 (DXF码62),存入变量LAY_C 7 先以STRCAT函数连结各项数据 (包括换行控字符\\n,提示字符串,图层名称),再以PRINC函数显示 8 用GETSTRING函数取得使用者的输入(新图层名称,若按ENTER响应,则传回空宇串 \"\")存入变数TEMP中 9 用IF判断 : 若使用者输入的不是空字符串,且输入的字符串不等于原有的图层名称(在第6行中取得),则将输入的字符串存入变量LAY_N中 10 顺序以PRINC函数显示 : 换行控制字符,提示字符串及图层的颜色编号 11 用GETINT(必须输入整数,若按ENTER则传回 nil)函数取得使用者输入新的颜色号码,并存入变量TEMP中 12 用IF判断 : 若使用者输入的不是 NIL,且输入的整数不等于原有的图层的颜色号码(在第6行中取得),则将输入的整数存入变量LAY_C中 13 用SUBST函数将原图层的数据进行搜寻 (串行以ASSOC建立) 及替换 (以CON建立),以修改图层名称并存回变量TEMP_L中且覆盖原有数据 14 用SUBST函数将原图层的数据进行搜寻 (串行以ASSOC建立) 及替换 (以CON建立),以修改图层颜色并存回变量TEMP_L中且覆盖原有数据 15 用ENTMOD更新巳修改的图层数据(变量TEMP_L) 16 左边的关括号是对应第3行的PROGN函数;右边的关括号是对应第2行的IF函数 17 以一个没有任何参数的PRINC函数,抑制多余的传回值及显示;最右边的关括号是对应第一行的DEFUN函数 十四下拉式表 第1节 -------------------------------------------------------------------------------- 菜单档案 MNU 样板菜单档案 : 纯文字文件 MNS 原始菜单档案 : 纯文字文件,初始时与MNU相同,但不含批注或特殊格式,为MNC及MNR的来源 MNC 巳编译的菜单档案(二进制) : 被AutoCAD正式加载及执行的菜单 MNR 菜单资源文件 : 随编译MNC时产生 载入 若MNC的日期及时间与MNS相同(或较迟),则加载MNC执行;否则会重新编译MNS,产生MNC后再执行 若找不到MNS及MNC,即会在支持目录中寻找MNU,重新编译成MNS及MNC,再加载MNC执行 若找不到任何指定的MNS,MNC及MNU,会显示错误讯息,并要求指定一个菜单定义文件 离开应用程序前所使用的菜单,会成为下次启动应用程序的预设菜单 在产生MNS后,若修改了MNU时,必须以MENU指令,重新加载该MNU檔,经编译后产生新的MNS及MNC i. 执行MENU指令 ii. 在对话框上边选择菜单文件所在目录 (预设为 ACAD2000\\SUPPORT) iii. 在对话框下边档案类型字段中,选取菜单文件类型 (扩展名MNU或MNS) iv. 选取要编译的菜单文件,按 OPEN 按钮;或双按该菜单文件亦可 第2节 -------------------------------------------------------------------------------- 菜单定义文件结构 批注 以双斜线//为开头的文字(不同于AutoLISP程序文件以分号;作为批注) 菜单节 菜单档案是由多个菜单节组成,每个菜单节均对应于菜单里特定的区域;而每一个菜单节均有其节卷标(以表示该菜单节的开始) ***MENUGROUP 菜单档案群组名称 ***BUTTONSn 指向设备按钮菜单 (n = 1 - 4) ***AUXn 系统指向设备按钮菜单 (n = 1 - 4) ***POPn 下拉式或快捷菜单 (n = 0 - 16) ***TOOLBARS 工具列 (参阅第十六篇课程) ***IMAGE 影像菜单 (参阅第十五篇课程) ***SCREEN 屏幕菜单 (本教程不作讨论) ***TABLETn 数字化输入板菜单 (n = 1 - 4) ***HELPSTRINGS 当指向设备指向下拉式或快捷菜单上的项目,或工具列的按钮时,显示在状态列的提示 文字 ***ACCELERATORS 加速键定义 菜单项目 每一个菜单节都包含一些菜单项目;而菜单项目则由名称卷标,卷标及菜单宏构成 e.g. ID_Quit [Exit]^c^c_quit 名称标签 i. 是由英数字元与底线字符组成的字符串,名称卷标在菜单中必须是唯一的 ii. Bottons, Aux 及 Image这些菜单节是没有名称标签的 标签 i. 每个菜单节均有各自的用法与格式 ii. Bottons, Aux 及 Table 菜单节并没有甚么讯息要显示,固无须提供卷标;但标签仍可作为内部附注使用 iii. 标签是包含在中括号 [ ]内,定义要显示的内容 iv. 下拉式及快捷菜单,各卷标中的特殊字符如下: -- 作用为分隔行(当中括号内仅包含此两横时) [--] + 若为该行中最后一个字符,表示让宏连续至下一行 -> 用于卷标前缀,指出该菜单项目含有次菜单 [->Ellipse] <- 用于卷标前缀,表示该菜单项目为次菜单中最后一个项目 [<-Arc] ~ 用于卷标前缀,表示该菜单项目无法使用 (会以灰色显示) [~Test] !. 用于卷标前缀,表示在该菜单项目前面显示一个勾选选号 [!.Test] & 放在某字符之前,表示该字符为该菜单项目的加速键 [&Line] / 用以指定菜单项目的加速键 [/sTest] 宏 ---- 当菜单项目被选取时,即会顺序执行指定的宏 ---- 宏可以是AutoCAD内建指令,亦可以是AutoLISP程序代码或自定函数 ---- 宏中的特殊字符如下 : ; 等于按下ENTER键,与^M及空格功能相同 \\ 暂停以等待使用者输入 (在Accelerators菜单节无法使用) + 如果是该行的最后一个字符,表示宏连续至下一行 =* 显示目前的影像菜单,下拉式或快捷菜单 $ 加载菜单节,或引入条件式 DIESEL 宏表示式 ($M=) ^B 切换 (打开或关闭) 锁点模式 ^I 等于按下 TAB 键 ^C 取消指令 (等于按下 ESC) ^D 切换 (打开或关闭) 坐标显示功能 ^E 切换至下一个等角平面 ^G 切换 (打开或关闭) 格点显示 ^H 退格键 (Back Space) ^O 切换 (打开或关闭) 正交模式(等于按下F8键) ^P 切换 (打开或关闭) MENUECHO ^Q 将提示及输入的字符,响应到打印机 ^T 切换 (打开或关闭) 数字化输入板 ^V 变更目前视埠 ---- 某些文字编辑器不允许以空格作为行的结尾,此时应以分号代替空格 ---- 若行结尾是一个控制字符,反斜线,加号或分号,不会在行结尾自动加入空格 菜单替换 可置换作用中的 Buttons, Aux, Pop, Screen, Table 等菜单节的内容;其语法如下 : $菜单节 = [菜单群组] . 菜单节/次菜单节 各菜单节的名称如下 : A1 (或 B1) 鼠标右键 A2 (或 B2) SHIFT + 鼠标右键 A3 (或 B3) CONTROL + 鼠标右键 A4 (或 B4) CONTROL + SHIFT + 鼠标右键 P0 快捷菜单 第3节 -------------------------------------------------------------------------------- 加速键设定 加速键的设定方式有两种 : 名称卷标 [指令元] e.g. ID_Open [CONTROL+\"O\"] [指令元] 指令序列 e.g. [CONTROL+\"Q\"]^C^C_quit 可以使用的指令元如下 : CONTROL = CTRL 键 SHIFT = SHIFT 键 (左右相同) (以下各虚拟键必须以双号括住) \"F1\" = F1 键 \"F2\" = F2 键 \"F3\" = F3 键 \"F4\" = F4 键 \"F5\" = F5 键 \"F6\" = F6 键 P1 至 P16 下拉式菜单 (屏幕顶部由左至右) I 影像菜单 S 屏幕菜单 T1 至 T4 数字化输入板第一至第四输入区 \"F7\" = F7 键 \"F8\" = F8 键 \"F9\" = F9 键 \"F10\" = F10 键 \"F11\" = F11 键 \"F12\" = F12 键 \"UP\" = 向上键 \"DOWN\" = 向下键 \"LEFT\" = 向左键 \"RIGHT\" = 向右键 \"INSERT\" = 插入(INS)键 \"DELETE\" = 删除(DEL)键 \"ESCAPE\" = ESC键 \"NUMPAD0\" = 0 \"NUMPAD2\" = 2 键 \"NUMPAD3\" = 3 \"NUMPAD5\" = 5 键 \"NUMPAD6\" = 6 \"NUMPAD8\" = 8 键 \"NUMPAD9\" = 9 键 \"NUMPAD1\" = 1 键 键 \"NUMPAD4\" = 4 键 键 \"NUMPAD7\" = 7 键 键 F1 至 F11 均有系统的预设功能,如无必要请勿修改 各方向键 (UP,DOWN,LEFT,RIGHT)不能独立使用,必须配搭 CONTROL 键 ESC 键为系统的预设取消键,切勿更改;而 ESC 键亦只可与 SHIFT 键配搭使用 练习 (Exercises) 先将系统预设的菜单档案 ACAD.MNU (在ACAD2000\\SUPPORT 目录),复制至 C:\\TEST.MNU 以便修改 第4节 -------------------------------------------------------------------------------- 练习 (Exercises) 新增菜单节 POP512,再将该菜单设定在 AUX3 (CONTROL+鼠标右键)中启动成为快捷菜单;菜单内各项目如下图所示: ---- 启动文字编辑器,开启 C:\\TEST.MNU 菜单文件文件 ---- 跳至菜单节 POP511 (可使用编辑器的搜寻功能)的末端,加入下列的新菜单节 POP512 (若POP512巳设定了其它的功能,请自行找出最大数目的POP菜单节,以确定新的POP菜单节的数目) ***POP512 **TEST-1 [Te&st] ID_TEST_L [&Line]^C^C_line ID_TEST_C [&Line]^C^C_circle ID_TEST_A [&Line]^C^C_arc [--] ID_TEST_T [->&Text] ID_TEST_O [Text-&Out]^C^CTEXT-OUT ID_TEST_I [Text-&In]^C^CTEXT-IN ---- 跳至菜单节 AUX3 (接近文件顶部),将批注的下一行修改(将 SNAP 改为 TEST-1)以启动 POP512 菜单节;如下所示 : $P0=TEST-1 $P0=* ---- 存盘 (纯文字格式);并在 AutoCAD 中执行 MENU 指令,选取新的 C:\\TEST.MNU 菜单文件加载 说明 第1行 第2行 第3行 第4行 建立新的菜单节 (以三粒星***开始),名称为POP512 建立新的次菜单节 (以二粒星**开始),名称为 TEST-1 (以供在 AUX3 菜单节呼叫) 菜单在未拉出之前,显示在屏幕顶部横列中的文字;但此文字在快捷菜单中是没有作用的 菜单项目 : 名称标签为 ID_TEST_L,包在中括号内的是卷标(用作屏幕显示),随后为菜单项目所指定 执行的宏为LINE指令 第5,6行 菜单项目 : CIRCLE 及 ARC 菜单项目的名称卷标,卷标及宏指令 第7行 在菜单中建立一分隔线 第8行 菜单项目 : 卷标以 -> 开头,表示该项目下还有其它次菜单;选取时只用作显示次菜单项目,固无须指定执行的宏 第9行 次菜单项目 : 名称标签为 ID_TEST_O,中括号内的是卷标,功能宏为执行 TEXT-OUT (第12篇课程的练习) 第10行 次菜单项目 : 名称卷标为 ID_TEST_I,卷标以 <- 开头,表示该项目为次菜单中最后一个项目,菜单宏为执行 TEXT-IN (第12篇课程的练习) 第5节 -------------------------------------------------------------------------------- 练习 (Exercises) 新增菜单节 POP12,为一下拉式菜单 ---- 启动文字编辑器,开启 C:\\TEST.MNU 菜单文件文件 ---- 跳至菜单节 POP11 (可使用编辑器的搜寻功能)的末端,加入下列的新菜单节 POP12 (若POP12巳设定了其它的功能,请自行找出最大数目的POP菜单节(最大数目为POP16),以确定新的POP菜单节的数目) ***POP12 **TEST ID_TEST [Te&st] 随后的各项目与上一练习的 POP512 相同,照抄即可 ---- 存盘 (纯文字格式);并在AutoCAD中执行MENU指令,选取新的 C:\\TEST.MNU 菜单文件加载 说明 第1行 建立新的菜单节 (以三粒星***开始),名称为POP12 第2行 建立新的次菜单节 (以二粒星**开始),名称为 TEST 第3行 菜单在未拉出之前,显示在屏幕顶部横列中的文字 (可按 ALT+加速键叫出) 新增各菜单项目的辅助说明于 HELPSTRINGS 菜单节的末端 ---- 启动文字编辑器,开启 C:\\TEST.MNU 菜单文件文件 ---- 跳至菜单节 HELPSTRINGS (可使用编辑器的搜寻功能)的末端,加入下列的菜单项目说明 ID_TEST_L [TEST : Menu function LINE] ID_TEST_C [TEST : Menu function CIRCLE] ID_TEST_A [TEST : Menu function ARC] ID_TEST_O [TEST : Menu function TEST-OUT] ID_TEST_I [TEST : Menu function TEST-IN] ---- 存盘 (纯文字格式);并在AutoCAD中执行MENU指令,选取新的 C:\\TEST.MNU 菜单文件加载 说明 各行的左边为项目的名称卷标 (对应在快显或下拉式菜单中各项目的名称卷标) 在选取该菜单项目时,卷标 (中括号 [ ] ) 内的文字便会显示在状态列上 十五影象功能 第1节 -------------------------------------------------------------------------------- 影像菜单 (IMAGE MENU) 预设的影像菜单,其外观如下 : 左边的列示框会显示辅助说明或幻灯片文件名,右边则显示影像按钮;可使用下列两种方式选取 : 选取列示框内的文字或右边的影像按钮,再按下 OK 键;或 双按列示框内的文字或右边的影像按钮 选取左边列示框内的文字时,会同时选取右边对应之影像按钮;相反亦然 每次可显示20幅影像;多于20幅时可按 Next 按扭至下一页,或 Previous 按钮返回上一页 影像菜单是以阶层式 (循序式),而不是巢状式显示;固可以影像菜单来启动任一影像菜单,且没有巢状及结构的深度限制 e.g. [LIB(TEST,Test]^C^C$I=ACAD.IMAGE_次菜单名称 $I=* 除可插入图形外,亦可在宏中执行一般指令或AutoLISP指令 : e.g. [LIB(TEST,command]^C^C_CIRCLE e.g. [LIB(TEST,command]^C^C(GETVAR \"TEXTSIZE\") 建立影像菜单 步骤 1 (Step 1) 建立新的或使用现有的图形文件 注意 i. 应将图形的插入点位置移至坐标的原点 (0,0,0) 或以BASE指令设定 步骤 2 (Step 2) 以MSLIDE指令将图形建立成幻灯片文件 (扩展名 SLD) 注意 i. 幻灯片文件只作为影像菜单显示及选取用途,其内容应尽量简化,以提高显示的速度 ii. 影像菜单中显示的影像,其纵横比为 2:3;若绘图区有不同的纵横比时,产生的图像位置可能会有偏移 步骤 3 (Step 3) 将幻灯片文件名称列于导引文件 (纯文字格式,扩展名为 TXT)内;可在 DOS 模式内执行下列指令建立 DIR *.SLD/b > 导引档名称.TXT e.g. DIR *.SLB/b > LIST.TXT 有需要时可在幻灯片文件名称前加上目录路径 : DIR 目录路径*.SLD/b > 目录路径导引文件名称.TXT 注意 i. 亦可于文字文件内直接输入 : 每行输入一个幻灯片文件名称 (可以不加扩展名 SLD);有需要时可在文件名前加上目录路径 ii. 若不想建立幻灯片库 (SLB,参阅步骤 4),则可不执行本步骤,直接跳至步骤 5 即可 步骤 4 (Step 4) 在 DOS 模式内,以SLIDELIB.EXE程序将全部幻灯片文件 (SLD),配合步骤 3 所建立的纯文字导引文件,建立幻灯片库 (扩展名为 SLB) SLIDELIB 幻灯片库名称 < 导引文件名称.TXT e.g. SLIDELIB LIB < LIST.TXT 注意 i. 有需要时可在 SLIDELIB.EXE 程序文件或纯文字导引文件的前面加上目录路径 : 目录路径\\SLIDELIB 目录路径\\幻灯片库名称 < 目录路径\\导引文件名称.TXT ii. SLIDELIB.EXE 程序文件预设在AutoCAD的目录下 iii. 此步骤可将多个幻灯片文件 (SLD) 连结为单一的幻灯片库 (SLD),但不建立幻灯片库亦可进行后续之各步骤 步骤 5 (Step 5) 修改菜单定义文件 (预设为 ACAD.MNU,在ACAD2000\\SUPPORT 目录内) ---- 以文字编辑器开启菜单定义文件 ---- 以编辑器的搜寻功能,跳至影像菜单所在部份 (以***IMAGE 开头) ---- 于影像菜单的末端空位,输入如以下格式的内容 : **IMAGE_次菜单节名称 //设定该组影像按钮段落名称 标题字符串 //对话框上边标题列所显示的文字 [ 幻灯片库名称 ( 幻灯片名称,辅助说明 ) ] 宏指令 e.g. **IMAGE_TEST TEST [LIB(TEST,Test insert image)]^C^C_INSERT;TEST;\\;;\\ ---- 若没有幻灯片库 (SLB,即没有执行步骤4),只有幻灯片文件时,袛须在方括号内输入幻灯片文件名即可 : [ 幻灯片文件名,辅助说明 ] 宏 e.g. [TEST]^C^C_INSERT;TEST;\\;;\\ 注意 i. 文字编辑器可以使用 DOS 模式的 EDIT 指令,亦可使用 WORD,WORDPAD 等 ii. 菜单文件必须以纯文字格式存盘 iii. 预设之菜单文件为 ACAD.MNU,储存在 ACAD2000\\SUPPORT 目录 iv. 插入的档案须在支持的路径内,否则要在文件名称前加上目录路径 v. 辅助说明不一定须要;若没有输入,则在影像菜单中,只会显示幻灯片文件的名称,亦不须输入用作分隔的逗号 vi. 列示框内不会显示幻灯片库的名称 (即使有提供) vii. 若没有设定幻灯片库 (SLB),则不须在幻灯片及说明前后加上小括号 ( ) viii. 宏中使用的各特殊字符,请参阅第14篇课程 ix. [blank]若以 blank 为文字卷标时,会显示一条分隔线在列示框中,右边则会在对应的位置,显示一个空白的影像按钮 x. 若方括号与第一个字符间有一个空格,则文字会显示在列示框内,但右边则不会有任何影像显示 步骤 6 (Step 6) 建立新的下拉式菜单项目以加载及显示影像菜单,其格式如下 : ID_TEST [&TEST]^C^C$I=ACAD.IMAGE_次菜单节名称 $I=* 注意 i. $I= 为宏指令,作用为将指定的影像菜单加载,并以 $I=* 方式显现 ii. 不一定要以下拉式菜单(步骤6)来启动影像菜单,亦可使用底下介绍的菜单函数,在程序或指令中加载及显示影像菜单 步骤 7 (Step 7) 加载及编译菜单文件 : ---- 在AutoCAD中执行MENU指令 ---- 于对话框上边,选择菜单文件所在的目录 (预设为 ACAD2000\\SUPPORT) ---- 于对话框下边,档案类型字段中,选取菜单文件类型 (扩展名为 MNU 或 MNS) ---- 选取要编译的菜单文件,按 OPEN 按钮;或双按该菜单文件亦可 注意 i. 在离开应用程序前所使用的菜单,会成为下次启动应用程序时的预设菜单 菜单函数 MENUCMD 函数 (MENUCMD 字符串参数 ) 强制菜单显示;亦可设定或取得,指定菜单项目的现时状态 (停用或显示勾号) 字符串参数用以指定菜单的区域,可使用的设定值请参阅第14篇课程 - 菜单替换一段 函数传回值恒为 nil e.g. (MENUCMD \"P12=*\") //强制 TEST (POP12) 下拉式菜单显示 e.g. (MENUCMD \"I=IMAGE_TEST\") //加载 IMAGE_TEST 影像菜单 (MENUCMD \"I=*\") //显示巳加载的影像菜单 e.g. (MENUCMD \"P12.1=?\") //传回 POP12 菜单中,第一个菜单项目的现时状态 e.g. (MENUCMD \"P12.1=~\") //将 POP12 菜单中,第一个菜单项目的状态设定为不能使用 (灰色显示) e.g. (MENUCMD \"P12.1=!.\") //将 POP12 菜单中,第一个菜单项目的前面加上勾号 注意 : 菜单项目序号从 1 开始,而其中的分隔线亦会占用一个序号 第2节 -------------------------------------------------------------------------------- 练习 (Exercises) 注意 : 本练习之目的是以影像菜单为接口,并于宏中使用指令插入图形;但亦可在宏中执行其它的指令或程序;亦要注意3及4,6等步骤是不一定需要的 步骤 1 (Step 1) 在 C 的根目录下,建立新目录 TEST;并在该目录下建立以下三个图形文件 : TEST-1.DWG 以坐标 0,0 为圆心点,划一半径 25 的圆形 TEST-2.DWG 以坐标 0,0 为左下角点,划一边长为25的正四边形 TEST-3.DWG 划两条直线,第1条 -25,25 到 25,-25;第2条 25,25 到 -25,-25;两条线的交点在 0,0 坐标点 注意 : 三个图形的原点 (0,0 坐标) 即为该图形的插入点 步骤 2 (Step 2) 开启各图文件并分别以MSLIDE指令,建立幻灯片文件 (在同一目录内,文件名相同但扩展名为 SLD) 步骤 3 (Step 3) 建立纯文字格式的导引文件 (在同一目录内,文件名称为 TEST.TXT); 其内容顺序为各幻灯片的名称(不需扩展名),如下所示 : TEST-1 TEST-2 TEST-3 步骤 4 (Step 4) 将SLIDELIB.EXE可执行文件,由 ACAD2000\\SUPPORT目录中,复制至 C 根目录下的 TEST 目录内 在 DOS 模式中及 TEST 目录内,执行SLIDELIB指令建立幻灯片库,名称为 TEST.SLB;如下所示 : SLIDELIB TEST < TEST.TXT 将巳建立的 TEST.SLB 复制至 ACAD2000\\SUPPORT 目录内 步骤 5 (Step 5) 启动文字编辑器,开启 C:\\TEST.MNU 菜单定义文件 以搜寻功能,跳至影像菜单节 (***IMAGE) 的末端;新增如下的影像菜单 : **IMAGE_TEST //定义次菜单节 [Test Image Menu] //影像菜单显示时,对话框的标题列文字 [TEST(TEST-1)]^C^C_INSERT;TEST-1;\\;;\\ //定义第一个影像及其对应执行的宏 [TEST(TEST-2)]^C^C_INSERT;TEST-2;\\;;\\ //定义第二个影像及其对应执行的宏 [TEST(TEST-3)]^C^C_INSERT;TEST-3;\\;;\\ //定义第三个影像及其对应执行的宏 注意 i. 在小括号内的是幻灯片文件名称 (SLD),在中括号内的 TEST是幻灯片库名称 (SLB),宏中所插入的是图档的名称 (DWG) ii. 必须确定所有插入的图档,均在AutoCAD的支持目录下,否则要在图文件名称前加上目录路径 步骤 6 (Step 6) 用文字编辑器的搜寻功能,跳至最后一个下拉式菜单 (应为上篇课程练习的 TEST菜单节,节名称为 POP12) 的末端位置;新增如下的菜单项目,以启动影像菜单 [--] ;菜单分隔线 ID_TEST_M [I&mage]^C^C$I=ACAD.IMAGE_TEST $I=* 将菜单以纯文字格式储存 步骤 7 (Step 7) 在 AutoCAD 中执行 MENU 指令,在对话框中,选取档案类型为 MNU,双按根目录下的 TEST 菜单定义文件 (重新加载后,下拉式菜单如下图所示);在选取IMAGE菜单项目后,即会显示指定的影像菜单 十六工具列 第1节 -------------------------------------------------------------------------------- 工具列 (Toolbar) 定义 工具列必须在菜单定义文件 (MNU)中,***TOOLBARS菜单节内进行定义 工具列项目分类 一般工具列 名称标签 [ TOOLBAR (\"工具列名称\" , 方位 , 可见性 , X 距离 , Y 距离 , 列数 ) 一般工具列以关键词TOOLBAR定义 工具列名称可包含英数字元,连字号 (-),底线 (_) 当工具列为浮动时 (工具列不是停驻在窗口的四边),工具列的名称会显示在标题列上 表示方位的关键词不分大小写,可接受的设定值如下所示 : Floating (浮动) Top (窗口顶部) Bottom (窗口底部) Left (窗口左边) Right (窗口右边) 可见性关键词不分大小写,可接受的设定值如下 : Show (显示) Hide (隐藏) X 距离值为屏幕左边缘到工具列左侧的距离 (以像素为单位) Y 距离值为屏幕上边缘到工具列顶端的距离 (以像素为单位) 工具列按钮 名称卷标 [ BOTTON (\"按钮名称\" , 细图示档案 , 大图示档案 ) ] 功能宏 工具列按钮以关键词BOTTON定义 按钮名称可包含英数字元,连字号 (-),底线 (_) 当光标停在按钮上时,按钮名称即显示为工具提示 细图标文件名称,可包含英数字元,连字号 (-),底线 (_);为 16x15 的位图,大图示档案则为 24x22 位图 当按钮被选取时,即会顺序执行指定的宏指令;请参阅第14篇课程 分隔线 以 [--] 定义 拉出式图示工具列 名称标签 [ FLYOUT (工具列名称 , 细图示档案 , 大图标档案 , 模式 , 别名 ) ] 功能宏 拉出式图标工具列以关键词FLYOUT定义 拉出式图标工具列名称可包含英数字元,连字号 (-),底线 (_) 细图标文件名称,可包含英数字元,连字号 (-),底线 (_);为 16x15 的位图,大图示档案则为 24x22 位图 模式的设定值不分大小写,可接受的设定值如下 : OwnIcon 只会显示指定的按钮图标 OtherIcon 会显示在该工具列中最后一次选取的按钮图标 别名用于参考要显示的拉出式工具列(一个以 ** 语法定义的次菜单节工具列) 拉出式图标工具列的图标(不论小或大图示),其右下角会出现一个小三角形 工具列控件 名称卷标 [ CONTROL (控件名称 ) ] 工具列控件为AutoCAD所预设的,使用者可用于自订的工具列中,并以关键词CONTROL定义 可使用在工具列的控件如下 (不分大小写) : _Color 颜色控件;为一下拉式列示,供选取颜色使用 _Dimstyle 注标型式控件;为一下拉式列示,供选取注标型式使用 _Layer 图层控件;为一下拉式列示,供选取图层使用 _Linetype 线型控件;为一下拉式列示,供选取线型使用 _Lineweight 线宽控件;为一下拉式列示,供选取线宽使用 _Plotstyle 出图型式控件;为一下拉式列示,供选取出图型式的规格 _Refblkname 外部参考名称控件 _UcsManager UCS控件;为一下拉式列示,供选取UCS使用 _View 视景控件;为一下拉式列示,供选取目前3D视景规格 _Viewportscale 视端口比例控件;为一下拉式列示,供调整配置模式中的视端口比例 图层控件 颜色控件 线型控件 线宽控件 第2节 -------------------------------------------------------------------------------- 建立工具列 有两种方式 : 以系统提供的各个对话框建立工具列(本篇课程内容) 直接修改菜单定义文件中,有关菜单的定义(本篇课程练习) 新增工具列 选取 VIEW 下拉式菜单,最后一个菜单项目 Toorbars;开启 Toolbars (工具列) 对话框 对话框的底部有两个多选钮,分别是 : 是否以大图标显现按钮 是否显示提示字符串 (当鼠标指向按钮时) 在选取工具列后 (左上方的列示框),可按 Delete (删除) 按钮将该工具列删除 若要建立新的工具列,按下 New (新增) 按钮;会出现 New Toolbar (新增工具列) 对话框 在 Toolbar Name (工具列名称) 输入框中键入新工具列的名称,然后按 OK 钮,一个空的工具列即会出现 增加按钮 在 Toolbars 对话框中,按 Customize 按钮,开启 Customize Toolbar 对话框 在 Categories (种类) 下拉式列示框中,选取 Custom 项目 ---- 在下面的按钮选取框中,显示有两个按钮 : i. 左边的是一般按钮 (按钮是空的,没有任可图案) ii. 右边的按钮则是用于拉出式图示工具列 (FLYOUT,按钮的图案只是在右下角的一个小三角形) 用鼠标指向所选择的按钮上,按下鼠标左键不放,并将按钮拖曳至新建立的工具列中 (或其它工具列亦可),放开鼠标左键,即可将按钮加于工具列上 若要移除工具列上的按钮,可将按钮用鼠标拖曳至工具列以外的地方,放开鼠标左键即可 可重复拖放多个按钮至工具列上;完成后按对话框的 Close 按钮返回 Toolbars 对话框 修改按钮 用鼠标指向所新增的按钮上,按下鼠标右键;出现 Botton Properties (按钮属性) 对话框 若 Toolbar (工具列) 对话框末开启,而在图示上按右键,将不会显示按钮属性对话框 在 Name (名称) 输入按钮名称;在 Help (帮助) 输入提示字符串;在 Macro (宏) 输入要执行的宏指令 按对话框右下角的 Edit (编辑) 按钮,出现 Botton Editor (按钮编辑器) 对话框 顶部右边为预视框 以 1 : 1 显示按钮图标 顶部中间四个按钮 由左至右分别为 : 划点,划线,划圆,橡皮擦 右边为颜色选取框 中间为按钮编辑区 Grid (网格线) 多选钮 是否在中间的编辑区显示方格 Clear 按钮 清除整个编辑区 Open 按钮 开启旧文件并于编辑区显示 Undo 按钮 将动作取消并将图案还原 Save 按钮 将图案存盘 Save As 按钮 将图案另存新文件 Close 按钮 关闭 Botton Editor (按钮编辑器) 对话框 注意 : 即使选取的是拉出式 (FLYOUT) 按钮图标,亦不会在编辑区中显示右下角的三角形,亦不须在编辑时加上;该三角形是由系统在显示时,自动为 FLYOUT 图示加上去的 当按钮编辑完成后,按对话框的Save AS 或 Save 按钮,将图案存为位图格式 (扩展名为 BMP) 图案存盘后,按对话框的 Close 按钮,关闭并返回 Botton Properties (按钮属性) 对话框;并可在对话框右下角的 Button Icon (按钮图标) 中,找到刚建立的按钮图标 按对话框右上角的 Apply (应用) 按钮,将各属性赋予该按钮即可 最后要关闭各个巳启动的对话框 第3节 -------------------------------------------------------------------------------- 练习 (Exercises) 开启并修改菜单定义文件,新增如下的工具列 : ---- 启动文字编辑器,开启菜单定义文件 C:\\TEST.MNU ---- 用搜寻功能跳至菜单节 ***TOOLBARS 的最末端 ---- 建立两个新的工具列,其定义如下 : **TB_TEST ID_TB_TEST [_Toolbar(\"TEST\ ID_TB_L [_Botton(\"Test Line\ ID_TB_C [_Botton(\"Test Circle\ ID_TB_A [_Botton(\"Test Arc\ [--] ID_TB_F [_Flyout(\"Test flyout\ [--] ID_TB_M [_Botton(\"Image menu\IMAGE_TEST $I=* **TB_TEST_FO ID_TB_TFO [_Toolbar(\"TEST_FO\ ID_TB_O [_Botton(\"Text Out\ ID_TB_I [_Botton(\"Text In\ 存盘 (纯文字格式);在 AutoCAD 中执行 MENU指令,重新加载 C:\\TEST.MNU 菜单定义文件 说明 第1行 建立新的次菜单节 (**TB_TEST) 第2行 左边的是名称标签,右边则是 : 以TOOLBAR关键词定义一工具列,并在小括号内指定 (顺序由左至右) 提示字符串,属性为浮动,显示,XY的距离及列数 第3,4,5行 左边的是名称标签,右边则是 : 以BOTTON关键词定义一按钮,并在小括号内指定提示字符串,小图标及大图标的文件名称,最后为执行的指令宏 第6行 以 [--] 在工具列上产生分隔线,无须指定左边的名称标签及右边的宏指令 第7行 左边的是名称标签,右边则是 : 以FLYOUT关键词定义拉出式图标工具列,并在小括号内指定提示字符串,初始时的小图标,大图标文件名称,拉出模式,最后以别名指定拉出的工具列为 TB_TEST_FO (在第10行设定的工具列) 第8行 以 [--] 在工具列上产生分隔线,无须指定左边的名称标签及右边的宏指令 第9行 左边的是名称标签,右边则是 : 以BOTTON关键词定义一按钮,并在小括号内指定提示字符串,小图标及大图标的文件名称,最后为执行的指令宏(启动第15篇课程练习所建立的影像菜单) 第10行 建立新的次菜单节 (**TB_TEST_FO,为第7行的图标按钮所拉出来的工具列) 第11行 左边的是名称标签,右边则是 : 以TOOLBAR关键词定义一工具列,并在小括号内指定提示字符串,属性为浮动,隐藏,XY的距离及列数 第12,13行 左边的是名称标签,右边则是 : 以BOTTON关键词定义按钮,并在小括号内指定提示字符串,小图标及大图标的文件名称,最后为执行的指令宏(两个按钮分别执行第12篇课程,两个练习所建立的程序) 注意 : 1. 工具列显示时,若指定的按钮图标档案并不存在,则会以预设的\"哈哈笑\"图案替代 2. 范例中各个显示的按钮图形文件(BMP格式),需事先自行建立 十七线性填充 第1节 -------------------------------------------------------------------------------- 线型定义档 为一纯文字格式文件,扩展名为 LIN;系统预设的线型定义档为 ACAD.LIN 仅由圆点,线和空格所构成的称为简单线型;若线型中包含有文字或造型,则称为复合线型 一个线型档可包含多个线型定义 在线型档中,任何在分号 ; 右边的字符均视为批注 在绘图时,若线段太短或线型比例大小,在无法容纳一序列的虚线或点时,则会以连续线划出 每一种线型均以两行来定义,其格式如下 : *线型名称 [,线型叙述] 对齐方式 , 样式描述 1 , 样式描述 2 , .... 第1行 必须以星号 * 开头,紧接线型名称 若有提供线型描述,则需以逗号分隔 (描述文字不能多于47个字符) 线型描述会显示在\"线型管理员\"对话框中间,列示框的说明栏内 第2行 对齐方式目前只能使用 A,紧接一个逗号;其后为一连串以逗号分隔的线型样式描述 第2节 -------------------------------------------------------------------------------- 载入线型 在指令行输入 -LINETYPE 指令 在提示后选取加载选项 (L),输入线型名称 即会显示\"选取线型文件\"对话框以选取线型定义档 在指令行输入 LINETYPE 指令,即会显示\"线型管理员\"对话框 按下 LOAD (加载) 按钮,显示\"加载或重新加载线型\"对话框 按 FILE (档案) 按钮,即会显示\"选取线型文件\"对话框,以选取线型定义档 在中间的列示方框中,即可选取巳加载的线型定义档中的线型,并按 OK (或双按线型名称) 即可 简单线型定义 借着对齐模式设定为 A,使得线与弧的起点及终点均为线段 在 A 的对齐模式下,第一个样式描述的长度必须大于或等于 0;而第二个样式描述的长度必须小于 0 线型样式的长度描述如下 : 长度等 0 划一圆点 长度大于 0 划一指定长度的线段 长度小于 0 指定长度的空隔 e.g. *TEST,------ -- . -- A , 1.25 , -.25 , .25 , -.25 , 0 , -.25 , .25 , -.25 第3节 -------------------------------------------------------------------------------- 复合线型 (文字) 定义 在加载此类线型之前,须先用STYLE指令将与线型有关的字型样式设定 在样式描述中,可包含如下语法的文字描述 : [ \"字符串\" , 字型 , S=比例 , R=旋转角度 , X=X 偏移量 , Y=Y 偏移量 ] 字符串 在复合线型中所显示的文字,要在前后加上双引号 字型 在复合线型中所显示的文字字型,若省略则以目前使用的字型显示文字 比例 此比列会乘以文字定义时的高度,作为线型中文字显示的高度 若此值为 0,则会直接以现时文字定义的高度显示 旋转 可以在设定的数值后,附加角度的代表符号 d (省略时的默认值); r 代表弪度 ; g 代表分度 X 偏移量 此设定值不会与 S 的比例设定值相乘;若省略则默认值为 0 Y 偏移量 此设定值不会与 S 的比例设定值相乘;若省略则默认值为 0 e.g. *TEST-1,------ -- B.L. -- A , 5 , -1 , 1 , -1 , [\"B.L.\" , SIM , S=1 , R=0 , X=0 , Y=-0.5] , -2.5 , 1 , -1 注意 : i. 文字描述 (中括号) 后的一个空隔长度为 -2.5,表示由文字起点开始,至文字后第一条线的距离 ii. 在旋转角度的设定中,若以 R= 的方式设定,表示文字对于线作相对或相切旋转(文字随线段的角度改变);若以 A= 方式设定,表示文字相对于原点的绝对旋转量(文字角度固定不变) iii. 在旋转角度的设定中,若省略设定值,则会以 0 作为相对旋转角度 练习 (Exercises) 建立上例所示的线型 ---- 在 ACAD2000SUPPORT 目录下新增一线型定义档 (TEST.LIN,纯文字格式) ---- 新增一简单线型 TEST (参考上一课) 及文字线型 TEST-1 (参考上例) ---- 存盘后,在 AutoCAD 中执行 LINETYPE 指令,并加载该两款线型使用 第4节 -------------------------------------------------------------------------------- 复合线型 (造形) 定义 在样式描述中,可包含如下语法的文字描述 : [ 造形名称 , 造形档名称 , S=比例 , R= 旋转角度 , X=X 偏移量 , Y=Y 偏移量 ] 造形名称 1. 若省略此名称,线型定义会失败 2. 若该造形不在指定的造形档中,产生的线型将不含任何造形 造形档名称 1. 为巳编译(用COMPILE指令)及加载(用SHAPE指令)的造形定义档 (扩展名 SHX);若省略则线型定义会失败 2. 会在 AutoCAD 支持路径中,寻找该定义档 (若不提供路径或提供的路径不正确) 3. 若找不到该造形定义档,产生的线型将不含任何造形 比例,旋转角度,X 偏移量及 Y 偏移量,请参阅上一课有关文字复合线型的说明 填充图案样式定义 为一纯文字文件,扩展名为 PAT;系统预设的图案定义文件为 ACAD.PAT 分号在图案定义文件中作为批注,且空白行会被忽略 每一行定义中最多可有 80 个字符;样式定义格式如下 : *样式名称 [,样式描述] 角度 , X 原点 , Y 原点 , X 距离 , Y 距离 [, 线型描述 1 , 线型描述 2 ....] 若省略第1行的样式描述,则不必在样式名称后加上逗号 在 Boundary Hatch 对话框中,若选取的样式名称,与 ACAD.SLB 中某一幻灯片名称相同时,即会显示该相同名称的幻灯片 e.g. *TEST , Long Short Dot 45 , 0 , 0 , 0 , 0.5 , 1.25 , -.25 , .25 , -.25 , 0 , -.25 上列的图案定义中(顺序由左至右)分别设定 : 以 45 度角倾斜,X 及 Y 的原点均为 0 (线段会通过原点), X 距离为 0,Y 距离为 0.5(即线与线间的距离),从1.25开始即为线型定义的描述 第5节 -------------------------------------------------------------------------------- 练习 (Exercises) 建立上一课例子所示的填充图案 ---- 在 ACAD2000\\SUPPORT 目录下新增一图案定义文件 (TEST.PAT,纯文字格式) ---- 新增图案样式 TEST (参考上一课的例子) ---- 存盘后,在 AutoCAD 中执行 HATCH 指令,并用新增的图案填满某一区域 建立一填充图案 ---- 在 ACAD2000\\SUPPORT 目录下新增一图案定义文件 (TEST-1.PAT,纯文字格式) ---- 新增图案样式 TEST-1,其内容如下所示 : *TEST-1 90 , 0 , 0 , 0 , 1 , .5 , -.5 0 , 0 , .5 , 0 , 1 , .5 , -.5 270 , .5 , .5 , 0 , 1 , .5 , -.5 ---- 存盘后,在 AutoCAD 中执行 HATCH 指令,并用新增的图案填满某一区域 说明 行号 线段方向 X偏移 Y偏移 X距离 Y距离 实线长度 虚线长度 2 90度向上 0 0 0 1 0.5 -0.5 3 0度向右 0 0.5 0 1 0.5 -0.5 4 270度向下 0.5 0.5 0 1 0.5 -0. 十八脚本档案 第1节 -------------------------------------------------------------------------------- 指令别名定义文件 (ACAD.PGP) 为一纯文字文件;预设目录为 ACAD2000\\SUPPORT 左边的一栏为指令缩写,中间以逗号分隔;右边的一栏以星号 * 开头,随后为指令的全写 e.g. C, *COPY 指令的缩写或全写均不分大小字母 分号 ; 右边的字符被视为批注 只能作为指令简化的工具,但不能加入指令的任何选项 若出现相同的简化指令,则以最后的设定为准 若在 AutoLISP 程序文件中,自定函数的名称与 PGP 文件中的简化指令相同时,则以 LSP 程序文件的函数优先执行 在同一作业阶段中, PGG 文件修改后,要以 REINIT指令重新加载 (在出现的对话框中选取 PGP 文件再按 OK) 脚本档 (Script) 为一纯文字文件,扩展名为 SCR (在窗口系统中会被误认为是屏幕保护程序) 在脚本档中以 分号 ; 作为批注的识别符号 (不能与指令位于同一行) AutoCAD 视脚本为一个群组,固只需一个 UNDO (复原) 指令,即可还原为未执行脚本前的状态 在使用 OPEN 指令开启档案时,若文件名称中包含空格,则必须在文件名称的前后加上双引号\" 可利用脚本文件执行一连串的指令,或用以循环展示幻灯片 脚本档中每一行均代表一个指令 (或指令的内部选项),或使用者的输入 空格或 ENTER 被定义为每一行的终止符号 不分大小写 第2节 -------------------------------------------------------------------------------- 练习 (Exercises) 以选取点为左下角,执行脚本档绘划一正四边形 (边长为 10 个单位) ---- 在 C 的根目录中,建立 TEST.SCR 纯文字文件 ---- 输入以下指令后存盘 : @10 < 0 @10 < 90 @10 < 180 C ---- 在 AutoCAD 中,执行 LINE指令 (或PLINE指令),在选取起点后,即执行 'SCRIPT 通透指令,开启 Select Script File (选取脚本文件) 对话框,选取 C:\\TEST.SCR 脚本档即可 说明 第1行 从对上一点 (@,使用者的选取点) 开始,向右 10 个单位 第2行 从对上一点 (@) 开始,向上 10 个单位 第3行 从对上一点 (@) 开始,向左 10 个单位 第4行 以 C 选项 (只可用于LINE或PLINE指令),自动划出最后一条线到起点以封闭四边形 第3节 -------------------------------------------------------------------------------- 练习 (Exercises) 将第15篇课程 (影像菜单) 的练习,建立的三个幻灯片 (圆形,方形及交叉线) 顺序循环显示 ---- 在 C 的根目录中,建立 TEST-1.SCR 纯文字文件 ---- 将各个幻灯片文件 (SLD) 复制至 C 的根目录下 (或 AutoCAD 的支持目录),否则要在幻灯片文件名前加上目录路径 ---- 输入以下指令后存盘 : VSLIDE TEST-1 VSLIDE *TEST-2 DELAY 2000 VSLIDE VSLIDE *TEST-3 DELAY 2000 VSLIDE DELAY 2000 RSCRIPT ---- 在 AutoCAD 中,执行 SCRIPT指令,在 Select Script File (选取脚本文件) 对话框,选取 C:\\TEST-1.SCR 脚本档执行即可 说明 第1行 用VSLIDE指令,显示幻灯片 TEST-1 第2行 用*VSLIDE指令,预载显示幻灯片 TEST-2 第3行 用DELAY指令,延迟显示时间 (单位为千分一秒,输入范围 0 至 32767) 第4行 用VSLIDE指令,显示巳预载的幻灯片 TEST-2 第5行 用*VSLIDE指令,预载显示幻灯片 TEST-3 第6行 用DELAY指令,延迟显示时间 第7行 用VSLIDE指令,显示巳预载的幻灯片 TEST-3 第8行 用DELAY指令,延迟显示时间 第9行 用RSCRIPT指令,返回脚本文件第一行重新执行 (直至按下 ESC 键停止) 因篇幅问题不能全部显示,请点此查看更多更全内容