struct resbuf的理解及struct resbuf 中的 restype 类型说明

作者: admin 分类: C++,CAD,ObjectARX 发布时间: 2019-12-03 21:09

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 位有符号长整数

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

标签云