AutoCAD二次开发实用教程第5章 AutoL课件.ppt
第5章 AutoLISP文件,1. 了解Auto LISP文件操作的概念; 2. 掌握Auto LISP文件打开、关闭、读写相关函数的使用; 3.能够用AutoLISP文件操作函数编写程序,实现程序设计;,本章要求:,AutoLISP语言和其它高级语言一样具有文件处理功能,提供了文件操作函数。 在AutoLISP语言中,程序和数据二者都具有相同的结构,所以程序文件和数据文件二者无严格区别。AutoLISP提供的文件操作函数能处理数据文件,也能处理程序文件。另外,AutoLISP只支持ASC码的顺序文件。 AutoLISP提供了一个Load函数,可以将程序文件装入内存,并对其求值。,第5章 AutoLISP文件,5.1 AutoLISP文件的特点 AutoLISP文件的扩展名为.lsp,是由若干个AutoLISP表达式构成的。 一个LISP文件可定义多个函数或AutoCAD命令。以下是一个表达式分写在若干行上的实例:(defun plus(x y) (+ (* x y) x)以下是一行写若干个表达式的实例:(setq a 2.0) (setq b 4.0) (+ a b),第5章 AutoLISP文件,5.1 AutoLISP文件的特点 由于在AutoLISP程序中含有大量的括号,使得程序代码不易阅读。解决这个问题的方法就是缩排对齐格式。(defun fun (x) (cond ( x 0) 1) (= x 0) 2) ( x 0) 1) (= x 0) 2) ( x 0) 0) ),第5章 AutoLISP文件,5.2 程序中的注释 注释能够增加程序的可读性,不仅便于对程序的阅读和调试,也便于对程序的维护、移植和扩充。 注释的形式可以是整行、整段或行间注释。 整行或后半行注释以分号“;”开头,至行尾为注释部分,第5章 AutoLISP文件,5.2 程序中的注释 【例1】定义打印ASCII码为33 90的字符的命令。;该程序打印ASCII码为3390的字符;在Command:提示下,键入pras(defun c:pras(/ as );定义pras为AutoCAD命令,as为局部变元 (setq as 33) ;设置as为第一个ASCII码33 (while(= as 90) ;while循环开始 (princ(chr as) ;打印ASCII码的为as的字符 (terpri) ;换新行 (setq as (1+ as);设置as为as 的下一个ASCII码 ) ;while循环结束) ;命令定义结束,第5章 AutoLISP文件,5.3 在AutoCAD环境下加载AutoLISP文件 1命令行方式加载AutoLISP文件用load函数,调用load函数的格式如下: Command:(load 驱动器:路径文件名 出错信息) 例如: 文件fi1e1.lsp最后一个表达式是定义函数func1,它的路径是d:user1。加载该文件的表达式如下:Command:(load d: user1 fi1e1 没有找到这个文件! )若加载成功,返回函数名func1,否则返回没有找到这个文件! 这个信息。,第5章 AutoLISP文件,5.3 在AutoCAD环境下加载AutoLISP文件 2对话框方式 选择下拉菜单ToolsLoad Application 项,或者选择下拉菜单ToolsAutoLISPLoad项,或者在“Command:”提示下键入appload,通过随后弹出的“Load/Unload Applications”对话框加载AutoLISP文件。3自动加载 AutoCAD在启动时,可以自动加载acad.lsp、acad2006.lsp、acaddoc.lsp和acad2006doc.lsp4个lisp文件。用户可以创建和维护这些文件,其中acad.lsp和acaddoc.lsp只能由用户来创建。,第5章 AutoLISP文件,5.3 在AutoCAD环境下加载AutoLISP文件 4间接自动加载如果把调用autoload函数的表达式写在自动加载的acad2006doc.lsp等文件内,在AutoCAD启动时,随着acad2006doc.lsp等文件的自动加载,被调用的autoload函数还可以加载一些LISP文件。调用autoload函数的格式如下:Command:(autoload lisp文件名 命令表),第5章 AutoLISP文件,5.4 搜索、获得文件的函数1. (FINDFILE) FINDFILE 函数搜索的路径,并返回此路径描述。 若不存在,它就返回NIL。 例如: 若“Li.Lsp 文件在C:ACAD路径下则: (FINDFILE Li.Lsp) 返回C:ACADLi.Lsp,第5章 AutoLISP文件,5.4 搜索、获得文件的函数2. (GETFILED 对话框标题 文件名 扩展名 标志值) “文件名”可以为空串。 “扩展名”也可以为空串,隐含指出文件的扩展名是*(即所有类型的文件) 标志值是整数,可为1、2、4、8,这几个值组成一个大于0而小于15的值。各标志值的含义是: 1 在覆盖一个现存文件时,会给用户警告信息。 2 使TYPE It按钮变成灰色,即禁用TYPE It按钮。 4 允许用户改变文件原扩展名。 8 AutoCAD使用它搜索路径,仅返回文件名,而不包含路径描述。如果不设置它,则返回整个路径描述。,第5章 AutoLISP文件,5.5 打开、关闭文件的函数 1(OPEN )功能:该函数打开一个文件,准备对文件读写数据。是字符串,指定要打开文件的名称和扩展名。文件名前面可以加文件路径,如果不加路径则OPEN默认其路径为AutoCAD启动目录。是一个读/写标志,指明文件的状态为打开文件用于读、写或追加。字符串可以包含下列字符之一:r:打开用于读操作。w :打开用于写操作。如果不存在,则创建新文件并打开它。如果文件名存在,则覆盖其现有数据。,第5章 AutoLISP文件,a:打开文件用于追加操作,如果不存在,则创建一个新文件并打开它;如果存在,则打开该文件并把文件指针移到现有数据的尾部,用户写入文件的数据追加到现有数据的后面。返回值:如果成功,OPEN返回一个可由其他I/O函数使用的文件描述符。如果指定了模式r且不存在,则OPEN返回NIL。例如:(SETQ f (OPEN “new.tst” “w”) 返回值(SETQ f (OPEN “old.txt” “w”) 返回值OPEN函数的返回值实际上是一个文件指针。文件指针的指向因而异。,第5章 AutoLISP文件,5.5 打开、关闭文件的函数【例2】 若将一条直线段的两端点坐标写入到一个文件中,则可以: (SETQ fi(GETSTRING Enter file name:) (SETQ f(OPEN fi w) (SETQ P1(GETPOINT first point:) (PRINC Pl f) (SETQ P2(GETPOINT Second point:) (PRINC P2 f) (CLOSE f)(COMMAND “line” p1 p2 “”)程序运行后,用记事本打开“fi”文件可以看到两个坐标值。,第5章 AutoLISP文件,5.5 打开、关闭文件的函数 2(CLOSE)函数的功能:该函数关闭一个已打开的文件,以切断文件描述符与文件的联系,并返回NIL(见上例):在OPEN函数打开文件时获得的文件描述符。 返回值:当用户用OPEN函数打开文件,并进行读、写操作后,必须用CLOSE函数将文件关闭。这是因为:若文件没有关闭,则内存上的部分数据可能因未写到外存文件中而丢失;由于用OPEN打开的文件要占用有限的内存,关闭文件,则内存释放。CLOSE函数的返回值为NIL。,第5章 AutoLISP文件,5.6 用于文件的输入输出函数1(READ 符串)符串参数不能在表或字符串外包含空格。返回值:READ函数将其参数转换成相应的数据类型后返回。如果未指定参数,READ返回NIL。如果字符串中包含由空格、换行符、制表符或括号等LISP分隔符分开的多个词,则只返回其中的第一个词。 例如: (READ hello) 返回原子HELLO (READ hello there) 返回原子HELLO (READ (a b) 返回表(AB) (READ 1.2300) 返回1.23,第5章 AutoLISP文件,5.6 用于文件的输入输出函数2(READ-LINE) 该函数从键盘或一个已打开的文件中读取一行字符串,并返回这个字符串,若遇到了文件结束标志,则返回NIL。 例如: 假设F是一个有效的已打开文件的指针,则: (READ-LINE f) 将返回文件中的下一个输入行,若已经到达文件结束处,则返回NIL,假设用户指定的文件中存储的是坐标点,且文件由PRINT函数输出数据来产生。【例4】 以读方式打开文件:命令:(SETQ f (OPEN c:my documentsnew.tst r) 返回:#使用 READ-line 从文件中读取一行:命令:(READ-LINE f) To boldly go where nomad has gone before.,第5章 AutoLISP文件,5.6 用于文件的输入输出函数 3(WRITE-LINE) 该函数将写到屏幕上或写到由表示的打开文件中(并在结尾加回车符),它返回的字符串带有双引号,但写到文件中时则省略引号。 【例5】 假设f是一个已打开的有效的文件描述符,则: (WRITE-LINE Test f) 将在文件f中输出内容Test并返回“Test” 【例6】 打开新文件:命令:(SETQ f (OPEN c:my documentsnew.tst w) #使用 write-line将一行文本写入文件:命令:(write-line To boldly go where nomad has gone before. f) To boldly go where nomad has gone before.在关闭文件以前该行文本不会被真正写入文件:命令:(CLOSE f) NIL,第5章 AutoLISP文件,5.6 用于文件的输入输出函数 4(READ-CHAR) 该函数从键盘输入缓冲区或从指定的已打开的文件中读入一个字符,并返回该读入字符的ASCII码值(整型数)。 如果没有指定可选的,且键盘输入缓冲区中没有字符,则READ-CHAR函数等待用户输入(随后按下回车键)。 【例7】 (PROMPT n 请输入字符:) (WHILE(/=(SETQ ch(READ-CHAR)10) (PRINT(CHR ch) (PRINT ) (PRINT ch) ) 显示: 请输入字符:A A 65,第5章 AutoLISP文件,5.6 用于文件的输入输出函数 5(WRITE-CHAR ) 该函数将一个字符写到屏幕上或写到由表示的打开的文件中,其中是要写字符的ASCII码值,也是该函数的返回值。 例如: (WRITE-CHAR 67) 返回67 将大写字母C写到屏幕上。 若f是一个打开的文件的描述符,则: (WRITE-CHAR 67 f) 返回67将字母C写到上述文件中。 说明: WRITE-CHAR 函数不能往文件中写一个NULL字符(ASCII码0)。5.7 综合举例 见教程第5章 【例8】 和【例9】,第5章 AutoLISP文件,本章作业:,第一次作业 1、2第二次作业 3、4,