他只能按顺序读写ASCII文件。AUTOLISP不能处理二进制文件,也不能随机获取数据(AUTOCAD用户要求增加这些功能,但Autodesk公司不予支持。) 将数据写进一个文件分为3步: 1. 打开数据文件; 2. 将数据写进文件 3. 关闭文件
其他大多数程序设计语言会要求用户首先创建文件,如果文件不存在AutoLisp会创建的。
第一步:打开数据文件
用OPEN函数打开一个文件有3个目的:(1)从文件中读取数据;(2)把数据写进该文件;(3)在文件中追加数据。AUTOLISP一次只能完成其中的一项,所以用户必须用类型符来指定操作(必须是小写): “r”-----read 从文件读取数据
“w”----write 原有数据全部删除,然后添加新数据 “a”----append 将新数据添加到原有数据的末尾。
要使程序一直向文件中添加数据,选择追加模式。AUTOLISP代码如下: 在命令行输入:(setq fil (open “xyzdata.txt”“a”))则显示:# 该代码把文件描述符存放在变量fil中,从此程序指向fil而不是文件名xyzdata.txt。 “a”提示AUTOLISP打开xyzdata.txt追加数据。类型符的小写相当重要,这也是AUTOLISP中唯一区分大小写的地方,OPEN函数的类型符在下表中说明“ 类型 说明 “a” 将数据追加到文件末尾 “q” 删除原有数据,并将数据写到文件中 “r” 从文件中读取数据 第二步:将数据写进文件 用WRITE-LINE函数将数据写进文件。该函数只能将一行数据写进文件中(与之相关的,WRITE函数写一行字符到文件中)。代码如下: (write-line xyz1 fil) 一些软件如电子表格,数据库程序,甚至一些文字处理软件用逗号分隔数字来读取数据,这称为“逗号分隔值”或称CSV 8.1518,3.2752,0.0000 这些程序把逗号当作一个分隔符而不当作字面上的逗号。这就允许电子表格软件在每个单元格中放一个数值,以便用户的后期处理。 回顾用STRCAT函数和CDR,CADR和CADDR函数分隔x,y,z插入坐标的方法,在两两之间逗号。 第三步:关闭文件 关闭文件是为了更好地保管(用户忘记时AUTOCAD会自动关闭文件,但优秀的程序员会随手关闭)。关闭文件很简单: (close fil) 用记事本添加数据,并使之以粗体字出现在label.lsp副本的下一页中。 ;Label.Lsp labels a picked point with its x ,y ,z coordinates. 11 ;by Chen Pingfeng,10,September,2012. (defun c:label (/ xyz xyz1 uprec ptx pty ptz) ;Ask user for the number of decimal places; (setq uprec (getint “Label precision”)) ;Ask the user to pick a point in the drawing; (setq xyz (getpoint “Pick point:”)) ;Separate 3D point into individual x,y,z-values: (setq ptx (car xyz) pty (cadr xyz) ptz (caddr xyz) ) ;Truncate values: (setq ptx (rtos ptx 2 uprec) pty (rtos pty 2 uprec) ptz (rtos ptz 2 uprec) ) ;Recombine individual values into a 3D point: (setq xyz1 (strcat ptx “,” pty “,” ptz “,”)) ;Place text: (command “text” xyz 200 0 xyz1) ;Open the data file for appending: (setq fil (open “xyzdata.txt”“a”)) ;Write the line of data to the file: (write-line xyz1 fil) ;Close the file (close fil) ) 将代码载入AUTOCAD再次测试并运行。在您在图形中选取点的同时,例程标记了所选点并把该3D数据写进文件。稍后,该数据文件出现下列信息: 8.1548,3.2752,0.0000 7.0856,4.4820,0.0000 62.5562,5.5635,0.0000 可以根据需要把xyzdata.txt文件输入一个电子表格程序中。 注意:xyzdata.txt这个文件会自动生成,并保存在“我的文档”中。 附加程序增强功能 回顾期望列表中的一个项目是控制文字放置的图层,有2种方法达到此目的: 1. 无代码法:在启动AutoLISP函数前设置图层; 2. 有代码法:提示用户输入层名,然后用系统变量CLAYER进行设置: (setq lname (getstring “Label layer:”)) (setvar “CLAYER” lname) 在Pick point 提示行前添加上面2行代码。 另一个增强功能是指定文字样式。同样有2种方法:无代码法在启动例程前设置文字风格;另一种方法是添加下列AUTOLISP代码: 12 (setq tsname (getstring “Label text style:”)) (setvar “TEXTSTYLE” tsname) 在一次在Pick point提示前添加上面2行代码。 AutoLISP使用小贴士: 将LSP代码载入AutoCAD中 1. 用LOAD命令把AutoLISP代码载入AutoCAD: 在命令行输入:(load “points”) 2. 如果你觉得上面比较烦的话,可以编写(defun c:x () (load “points”)) 现在每次需要载入points.lsp程序时,只要键入x再按下ENTER键就可以了: 在命令行直接输入:x 3. windows有一个快捷的方法:把.lsp文件从外面拖拽到CAD中如图: 切换系统变量: 系统的变量有0和1两个值,分别表示关于开。比如:系统变量GRIDMODE默认值为0;关闭时,网格不显示。(在低版本的CAD中) 当AutoLISP改变系统变量的值时,该办法可把它们设置回初始状态。 下面是一个代码段(setq splvar (getvar “splframe”)) … (setvar”splframe” splvar) 取消NIL 每次运行一个AutoLISP例程时,在结尾都会显示令人讨厌的nil。Nil的出现是有原因的,但是有原因并不表明就该保留nil。用(PRINC)作为例程的结尾就可以禁止nil出现了。 13 ;Label.Lsp labels a picked point with its x ,y ,z coordinates. ;by Chen Pingfeng,10,September,2012. (defun c:label (/ xyz xyz1 uprec ptx pty ptz) ;Ask user for the number of decimal places; (setq uprec (getint “Label precision”)) ;Ask the user to pick a point in the drawing; (setq xyz (getpoint “Pick point:”)) ;Separate 3D point into individual x,y,z-values: (setq ptx (car xyz) pty (cadr xyz) ptz (caddr xyz) ) ;Truncate values: (setq ptx (rtos ptx 2 uprec) pty (rtos pty 2 uprec) ptz (rtos ptz 2 uprec) ) ;Recombine individual values into a 3D point: (setq xyz1 (strcat ptx “,” pty “,” ptz “,”)) ;Place text: (command “text” xyz 200 0 xyz1) ;Open the data file for appending: (setq fil (open “xyzdata.txt”“a”)) ;Write the line of data to the file: (write-line xyz1 fil) ;Close the file (close fil) ) (princ) 标点符号的问题: 文本字符串中的转义符必需用小写。比如\\e是转义符(相当于ASCII 27),\\t是制表符。注意他们用的是反斜线,因此不能应反斜线来分隔文件夹名。AutoLISP会误认为您键入一个转义符。 AUTOLISP用引号(””)来识别字符串。这样您不能用一个引号来表示引号或者英寸了。如25英寸写作25”。代替方法是用转义符,专门用ASCII字符对应的八进制代码来表示引号。只要把042弄清楚,举一反三,其他就容易了。把字符串指定到变量中,如下表示: (setq distxt “The length is ”) (setq distval 25) (setq qumark “\\42”) 可以看到八进制码042指定给了变量qumark。反斜线提示了AUTOLISP后面的数字是八进制的(八进制是十六进制的一半:0 1 2 3 4 5 6 7 10 11 12 ……16 17 20 21 ….)。然后用STRCAT函数将以上3个字符串接起来: (strcat distxt distval qumark) 14 文字已经正确: “The length is 25” 对提示语句同样适用: (prompt “The diameter is 2.54 \\042”) 相类似的,可以把\\009用于带制表符的空格文本。 (prompt “The diameter is \\009 2.54\\42”) 15