AutoLisp从入门到放弃(五)
本章将介绍通过AutoLisp代码来查看图形的实体信息所用到的部分相关知识。
一、列表(LIST)
在之前的内容我们已经对列表这一数据类型有过简单地介绍,我们查看实体数据信息的方法是基于列表和DXF组码的,所以在正式开始之前需要对列表和DXF组码做简单的了解。
1、列表的创建
列表的所有元素都会被包括在成对的括号中,这一点和AutoLisp语法规则完全一致,甚至我们可以说,AutoLisp代码中的所有语句实际上就是一个个列表。换而言之,AutoLisp语言中的列表,就可以理解为通过圆括号包围的一组数据,列表中的每一个数据被称为一个原子,原子之间用空格隔开,像下面这个就是一个列表:
(1 2 3) ;; 包含3个整型数据元素的列表,三个数据分别为1、2、3
列表中的元素可以是不同类型的,例如:
(1 "2" 3) ;; 包含了两个整型元素和一个字符串的列表
此外,列表是可以嵌套的,一个列表的元素的数据类型可以是列表,例如:
(1 2 (3 4 5)) ;; 包含三个元素的列表,其中第三个元素是一个列表
按照这个逻辑,如果我想将一个列表赋值给一个变量,代码应该如下:
(setq #lsList (1 2 3)) ;; 这里想要将(1 2 3)这个列表赋值给变量#lsList
但是,如果我们将这行代码在AutoCAD中执行的时候会发现,命令行提示:错误: 函数错误: 1。
这是因为在AutoLisp代码中,列表的第一个元素,应该是一个函数名。所以在这里解释器把(1 2 3)当作一行语句尝试运算它时,把1当作函数名,而2和3当作是参数。所以我们需要使用AutoLisp中的函数来定义一个列表。
关键函数:list(')
(list 1 2 3) ;; 生成一个包含三个元素1、2、3的列表
'(1 2 3) ;; 与前一行代码作用相同
2、操作列表常用函数
常用函数:
nth:返回列表中指定位置的元素。
(nth 0 #lsList) ;; 返回列表#lsList中的第一个元素。
car:返回列表中的第一个元素。
(car #lsList) ;; 返回列表#lsList中的第一个元素。
cdr:返回列表除第一个元素之外的所有元素组成的子列表。
(setq #lsList (list 1 2 3))
(cdr #lsList) ;; 这里的执行结果是一个列表(2 3)
cdr这个函数还有一系列的扩充用法,我们可以把他写成cddr,这样就是返回第二个元素之后的所有元素组成的列表;以此类推,cdddr:返回前三个元素之后的所有元素组成的列表,cddddr:返回前四个元素之后的所有元素组成的列表。d的重复次数最多为四次,cddddr这样是合法的,而cdddddr会报错。
append:向一个列表中追加元素。
(setq #lsList '(3 2))
(append #lsList '(1)) ;; 执行结果会得到一个新的列表(3 2 1),这里需要注意,追加的数据一定是列表,否则会报错。
扩展内容:CONS(点对)
在AutoLisp中,除了支持列表这一基本数据类型之外,还可以使用CONS函数定义点对,具体用法如下:
(cons 1 2) ;; 将数据1 2合成一个点对,表现形式为(1 . 2),这种数据形式我们在接下来的学习中会经常看到。
二、DXF组码
DXF 是Autodesk开发的用于AutoCAD与其它软件之间进行CAD数据交换的CAD数据文件格式。
1、DXF组码文件基本结构
DXF 文件本质上由代码及关联值对组成。代码(通常称为组码)表明其后的值的类型。使用这些组码和值对,可以将 DXF 文件组织到由记录组成的区域中,这些记录由组码和数据项目组成。在 DXF 文件中,每个组码和值都各占一行。
每段都以一个后跟字符串 SECTION 的组码 0 开始,其后是组码 2 和表示该段名称的字符串(例如,HEADER)。每段都由定义其元素的组码和值组成。每段都以一个后跟字符串 ENDSEC 的组码 0 结束。
DXF 文件完整的结构如下:
- HEADER 段。包含图形的基本信息。它由 AutoCAD 数据库版本号和一些系统变量组成。每个参数都包含一个变量名称及其关联的值。
- CLASSES 段。包含应用程序定义的类的信息,这些类的实例出现在数据库的 BLOCKS、ENTITIES 和 OBJECTS
段中。类定义在类的层次结构中是固定不变的。 - TABLES 段。包含以下符号表的定义:
- APPID(应用程序标识表)
- BLOCK_RECORD(块参照表)
- DIMSTYLE(标注样式表)
- LAYER(图层表)
- LTYPE(线型表)
- STYLE(文字样式表)
- UCS(用户坐标系表)
- VIEW(视图表)
- VPORT(视口配置表).
- BLOCKS 段。包含构成图形中每个块参照的块定义和图形图元。
- ENTITIES段。包含图形中的图形对象(图元),其中包括块参照(插入图元)。
- OBJECTS段。包含图形中的非图形对象。除图元、符号表记录以及符号表以外的所有对象都存储在此段。OBJECTS
段中的条目样例是包含多线样式和组的词典。 - THUMBNAILIMAGE 段。包含图形的预览图像数据。此段为可选。
如果使用 SAVE 或 SAVEAS 命令的“选择对象”选项,那么所得到的 DXF 文件的 ENTITIES 区域将只包含选择的图元。
2、DXF组码值类型
代码范围 | 组值类型 |
---|---|
0-9 | 字符串(随着从 AutoCAD 2000 起引入了扩展符号名称,字数限制已由 255 个字符扩大到 2049 个单字节字符,不包括行末的换行符) |
10-39 | 双精度三维点值 |
40-59 | 双精度浮点值 |
60-79 | 16 位整数值 |
90-99 | 32 位整数值 |
100 | 字符串(最多 255 个字符;对于 Unicode 字符串,字符数要少一些) |
102 | 字符串(最多 255 个字符;对于 Unicode 字符串,字符数要少一些) |
105 | 表示 16 进制 (hex) 句柄值的字符串 |
120-129 | 双精度浮点值 |
130-139 | 双精度浮点值 |
140-149 | 双精度标量浮点值 |
170-179 | 16 位整数值 |
210-239 | 双精度浮点值 |
270-279 | 16 位整数值 |
280-289 | 16 位整数值 |
290-299 | 布尔标志值 |
300-309 | 任意字符串 |
310-319 | 表示二进制数据块的十六进制值的字符串 |
320-329 | 表示 16 进制句柄值的字符串 |
330-369 | 表示十六进制对象 ID 的字符串 |
370-379 | 16 位整数值 |
380-389 | 16 位整数值 |
390-399 | 表示 16 进制句柄值的字符串 |
400-409 | 16 位整数值 |
410-419 | 字符串 |
420-429 | 32 位整数值 |
430-439 | 字符串 |
440-449 | 32 位整数值 |
450-459 | 长整数 |
460-469 | 双精度浮点值 |
470-479 | 字符串 |
999 | 注释(字符串) |
– | – |
1000-1009 | 字符串(与 0-9 代码范围的限制相同) |
1010-1059 | 双精度浮点值 |
1060-1070 | 16 位整数值 |
1071 | 32 位整数值 |
本章并没有多少关于AutoLisp代码的讲解,内容也更多是为后面的学习铺垫。且内容较为基础,如果需要更深入了解本章所介绍的DXF组码相关知识,可以去Autodesk官方帮助文档中查阅。