resbuf(Result buffer structure:结果缓存区表)是用来处理所有AutoCAD的基本数据类型的.
struct resbuf {
struct resbuf *rbnext; //指向下一个resbuf的指针
short restype; //查询参数的种类,是一个DXF组码
union ads_u_val resval; //相应种类的匹配值
};
从定义上我们可以看出,结构resbuf是一个链表,每一个缓冲区指定一个检查参数和匹配的值;缓冲区的restype段是一个DXF组码,它指示要查询
的参数的种类,而缓冲区的resval域指定要匹配的值.
union ads_u_val {
ads_real rreal;
ads_real rpoint[3];
short rint;
char *rstring;
long rlname[2];
long rlong;
struct ads_binary rbinary;
unsigned char ihandle[8]; //可能临时使用,目前仅仅为内部使用
};
————————————————
版权声明:本文为CSDN博主「pangshaohua」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pangshaohua/article/details/5408052
//打印扩展数据列表, void printList(struct resbuf* pRb) { int rt, i; char buf[133]; for (i = 0;pRb != NULL;i++, pRb = pRb->rbnext) { if (pRb->restype < 1010) { rt = RTSTR; } else if (pRb->restype < 1040) { rt = RT3DPOINT; } else if (pRb->restype < 1060) { rt = RTREAL; } else if (pRb->restype < 1071) { rt = RTSHORT; } else if (pRb->restype == 1071) { rt = RTLONG; } else { /*记住,这里else可能为>1071的数,从而为后面的pRb->restype == RTSHORT做了工作, #define RTNONE 5000 #define RTREAL 5001 #define RTPOINT 5002 #define RTSHORT 5003 #define RTANG 5004 #define RTSTR 5005 #define RTENAME 5006 #define RTPICKS 5007 #define RTORINT 5008 #define RT3DPOINT 5009 #define RTLONG 5010 #define RTVOID 5014 */ rt = pRb->restype; } switch (rt) { case RTSHORT: if (pRb->restype == RTSHORT) { acutPrintf( "RTSHORT : %d/n", pRb->resval.rint); } else { acutPrintf("(%d . %d)/n", pRb->restype, pRb->resval.rint); }; break; case RTREAL: if (pRb->restype == RTREAL) { acutPrintf("RTREAL : %0.3f/n", pRb->resval.rreal); } else { acutPrintf("(%d . %0.3f)/n", pRb->restype, pRb->resval.rreal); }; break; case RTSTR: if (pRb->restype == RTSTR) { acutPrintf("RTSTR : %s/n", pRb->resval.rstring); } else { acutPrintf("(%d . /"%s/")/n", pRb->restype, pRb->resval.rstring); }; break; case RT3DPOINT: if (pRb->restype == RT3DPOINT) { acutPrintf( "RT3DPOINT : %0.3f, %0.3f, %0.3f/n", pRb->resval.rpoint[X], pRb->resval.rpoint[Y], pRb->resval.rpoint[Z]); } else { acutPrintf("(%d %0.3f %0.3f %0.3f)/n", pRb->restype, pRb->resval.rpoint[X], pRb->resval.rpoint[Y], pRb->resval.rpoint[Z]); } break; case RTLONG: acutPrintf("RTLONG : %dl/n", pRb->resval.rlong); break; } //这里为什么要有这个,主要是为了当记录多的时候,起到翻页功能,就要cmd dir /p类似 if ((i == 23) && (pRb->rbnext != NULL)) { i = 0; acedGetString(0, "Press <ENTER> to continue...", buf); } }
struct resbuf 中的 restype 类型:
-5 APP:永久反应器链
-4 APP:条件运算符(仅适用于 ssget)
-3 APP:扩展数据 (XDATA) 标记(固定)
-2 APP:图元名参照(固定)
-1 APP:图元名。每次打开图形时,图元名都会发生变化,从不保存(固定)
0 表示图元类型的字符串(固定)
1 图元的主文字值
2 名称(属性标记、块名等)
3-4 其他文字或名称值
5 图元句柄;最多 16 个十六进制数字的字符串(固定)
6 线型名(固定)
7 文字样式名(固定)
8 图层名(固定)
9 DXF:变量名标识符(仅在 DXF 文件的 HEADER 段中使用)
10 主要点;直线或文字图元的起点、圆的圆心,等等
DXF:主要点的 X 值(后跟 Y 和 Z 值代码 20 和 30)
APP:三维点(三个实数的列表)
11-18 其他点
DXF:其他点的 X 值(后跟 Y 值代码 21-28 和 Z 值代码 31-38)
APP:三维点(三个实数的列表)
20,30 DXF?:主要点的 Y 值和 Z 值
21-28,
31-37 DXF:其他点的 Y 值和 Z 值
38 DXF:如果非零,则为图元的标高
39 如果非零,则为图元的厚度(固定)
40-48 双精度浮点值(文字高度、缩放比例等)
48 线型比例;双精度浮点标量值;默认值适用于所有图元类型
49 重复的双精度浮点值。一个图元的可变长度表(例如,LTYPE 表中的虚线长度)中可能会出现多个 49 组。7x 组总是出现在第一个 49 组之前,用以指定表的长度
50-58 角度(在 DXF 文件中以度为单位,在 AutoLISP 和 ObjectARX 应用程序中以弧度为单位)
60 图元可见性;整数值;未赋值或值为 0 时表示可见;值为 1 时表示不可见
62 颜色号(固定)
66 “图元跟随”标志(固定)
67 空间 模型空间或图纸空间(固定)
68 APP:标识视口是打开但在屏幕上完全不可见,还是未激活或处于关闭状态
69 APP:视口标识码
70-78 整数值,例如重复计数、标志位或模式
90-99 32 位整数值
100 子类数据标记(将派生类名作为字符串)从其他具体类派生的所有对象和图元类必须具有此标记。子类数据标记用于分离由同一对象的继承链中的不同类定义的数据。
对于从 ObjectARX 派生的每个不同的具体类的 DXF 名称来说,这是必须满足的额外要求(参见“子类标记”)
102 控制字符串,后跟“{<任意名称>”或“}”。除了字符串必须以“{”开始外,它与扩展数据 1002 组码类似。其后可跟任意字符串,字符串的解释取决于应用程序。所允许的另一个控制字符串是作为组结束符的“}”。除了在执行图形核查操作期间外,AutoCAD 一般不解释这些字符串。它们供应用程序使用
105 DIMvar 符号表条目的对象句柄
110 UCS 原点(仅当将代码 72 设置为 1 时才显示)
DXF:X 值;APP:三维点
111 UCS X 轴(仅当将代码 72 设置为 1 时才显示)
DXF:X 值;APP:三维矢量
112 UCS Y 轴(仅当将代码 72 设置为 1 时才显示)
DXF:X 值;APP:三维矢量
120-122 DXF:UCS 原点的 Y 值、UCS X 轴和 UCS Y 轴
130-132 DXF:UCS 原点的 Z 值、UCS X 轴和 UCS Y 轴
140-149 双精度浮点值(例如点、标高和 DIMSTYLE 设置)
170-179 16 位整数值,例如表示 DIMSTYLE 设置的标志位
210 拉伸方向(固定)
DXF:拉伸方向的 X 值
APP:三维拉伸方向矢量
220,230 DXF:拉伸方向的 Y 值和 Z 值
270-279 16 位整数值
280-289 16 位整数值
290-299 布尔标志值
300-309 任意字符串
310-319 与 1004 组码的表示和限制相同的任意二进制数据块:最大长度为 254 个字符的十六进制字符串表示最大长度为 127 个字节的数据块
320-329 任意对象句柄;“按原样”获取的句柄值。它们在 INSERT 和 XREF 操作期间不进行转换
330-339 软指针句柄;指向同一个 DXF 文件或图形中的其他对象的任意软指针。在 INSERT 和 XREF 操作期间进行转换
340-349 硬指针句柄;指向同一个 DXF 文件或图形中的其他对象的任意硬指针。在 INSERT 和 XREF 操作期间进行转换
350-359 软所有者句柄;指向同一个 DXF 文件或图形中的其他对象的任意软所有者指针。在 INSERT 和 XREF 操作期间进行转换
360-369 硬所有者句柄;指向同一个 DXF 文件或图形中的其他对象的任意硬所有者指针。在 INSERT 和 XREF 操作期间进行转换
370-379 线宽枚举值 (AcDb::LineWeight)。作为 16 位整数存储和移动。自定义非图元对象时可以使用所有范围组码,但图元类只能使用以图元表示的 371-379 DXF 组码,因为 AutoCAD? 和 AutoLISP 始终假定 370 组码是图元线宽。这将使 370 组码和其他“通用”图元字段具有相同的行为
380-389 PlotStyleName 类型枚举 (AcDb::PlotStyleNameType)。作为 16 位整数存储和移动。自定义非图元对象时可以使用所有范围组码,但图元类只能使用以图元形式表示的 381-389 DXF 组码,原因与上述线宽范围相同
390-399 表示 PlotStyleName 对象的句柄值的字符串,本质上是硬指针,但范围不同,更容易处理向后兼容。作为对象 ID(在 DXF 文件中为句柄)和 AutoLISP 中的特殊类型存储和移动。自定义非图元对象时可以使用所有范围组码,但图元类只能使用以图元形式表示的 391-399 DXF 组码,原因与上述线宽范围相同
400-409 16 位整数
410-419 字符串
420-427 32 位整数值。与真彩色一同使用时,表示 24 位颜色值的 32 位整数。高阶字节(8 位)为 0;低阶字节为包含“蓝色”值 (0-255)、然后是“绿色”值的无符号字符;次高阶字节是“红色”值。将该整数值转换为十六进制将得到以下位掩码:0x00RRGGBB。例如,红色==200、绿色==100 和蓝色==50 的真彩色为 0x00C86432,而在 DXF 中以十进制表示则为 13132850
430-437 字符串;用于真彩色时,则为表示颜色名称的字符串
440-447 32 位整数值。用于真彩色时,表示透明度值
450-459 长整数
460-469 双精度浮点值
470-479 字符串
999 DXF:999 组码表示它后面的行是注释字符串。SAVEAS 不会在 DXF 输出文件中包含这样的组,但 OPEN 则包括这些组并忽略注释。可以使用 999 组在已编辑的 DXF 文件中包含注释
1000 扩展数据中的 ASCII 字符串(最多可以包含 255 个字节)
1001 扩展数据的注册应用程序名(最多可以包含 31 个字节的 ASCII 字符串)
1002 扩展数据控制字符串(“{”或“}”)
1003 扩展数据图层名
1004 扩展数据中的字节数据块(最多可以包含 127 个字节)
1005 扩展数据中的图元句柄;最多可以包含 16 个十六进制数字的字符串
1010 扩展数据中的点
DXF:X 值(后跟 1020 和 1030 组)
APP:三维点
1020,1030 DXF:点的 Y 值和 Z 值
1011 扩展数据中的三维世界空间位置
DXF:X 值(后跟 1021 和 1031 组)
APP:三维点
1021,1031 DXF:世界空间位置的 Y 值和 Z 值
1012 扩展数据中的三维世界空间位移
DXF:X 值(后跟 1022 和 1032 组)
APP:三维矢量
1022,1032 DXF:世界空间位移的 Y 值和 Z 值
1013 扩展数据中的三维空间方向
DXF:X 值(后跟 1022 和 1032 组)
APP:三维矢量
1023, 1033
DXF:世界空间方向的 Y 值和 Z 值
1040 扩展数据双精度浮点值
1041 扩展数据距离值
1042 扩展数据缩放比例
1070 扩展数据 16 位有符号整数
1071 扩展数据 32 位有符号长整数
文章评论