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