实体数据函数
某些函数对图元数据进行操作,并可用于修改当前图形数据库。该函数删除指定的实体。在离开当前图形之前,不会从数据库中清除该图元。因此,如果应用程序在该会话期间第二次调用并指定同一实体,则该实体将被取消删除。(可用于检索已删除实体的名称。acdbEntDel()acdbEntDel()acdbHandEnt() 注意:使用 时,属性和折线顶点不能独立于其父实体删除; 仅对主要实体进行操作。要删除属性或顶点,请使用或调用 AutoCAD ATTEDIT 或 PEDIT 命令,用于重新定义不带不需要的子图元的图元,或者打开顶点或属性并使用其方法擦除它。acdbEntDel()acdbEntDel()acedCommandS()acedCmdS()acdbEntMod()erase()
该函数返回指定实体的定义数据。数据以结果缓冲区的链表形式返回。列表中每个项目(缓冲区)的类型由 DXF 组代码指定。列表中的第一项包含实体的当前名称 ()。acdbEntGet()restype == -1 ObjectARX 应用程序可以使用以下两个函数检索和打印实体的定义数据。(该函数不处理扩展数据。printdxf() void getlast() { struct resbuf *ebuf, *eb; ads_name ent1; acdbEntLast(ent1); ebuf = acdbEntGet(ent1); eb = ebuf; acutPrintf("\nResults of entgetting last entity\n"); // Print items in the list. for (eb = ebuf; eb != NULL; eb = eb->rbnext) printdxf(eb); // Release the acdbEntGet() list. acutRelRb(ebuf); } int printdxf(eb) struct resbuf *eb; { int rt; if (eb == NULL) return RTNONE; if ((eb->restype >= 0) && (eb->restype <= 9)) rt = RTSTR ; else if ((eb->restype >= 10) && (eb->restype <= 19)) rt = RT3DPOINT; else if ((eb->restype >= 38) && (eb->restype <= 59)) rt = RTREAL ; else if ((eb->restype >= 60) && (eb->restype <= 79)) rt = RTSHORT ; else if ((eb->restype >= 210) && (eb->restype <= 239)) rt = RT3DPOINT ; else if (eb->restype < 0) // Entity name (or other sentinel) rt = eb->restype; else rt = RTNONE; switch (rt) { case RTSHORT: acutPrintf("(%d . %d)\n", eb->restype, eb->resval.rint); break; case RTREAL: acutPrintf("(%d . %0.3f)\n", eb->restype, eb->resval.rreal); break; case RTSTR: acutPrintf("(%d . \"%s\")\n", eb->restype, eb->resval.rstring); break; case RT3DPOINT: acutPrintf("(%d . %0.3f %0.3f %0.3f)\n", eb->restype, eb->resval.rpoint[X], eb->resval.rpoint[Y], eb->resval.rpoint[Z]); break; case RTNONE: acutPrintf("(%d . Unknown type)\n", eb->restype); break; case -1: case -2: // First block entity acutPrintf("(%d . <Entity name: %8lx>)\n", eb->restype, eb->resval.rlname[0]); } return eb->restype; } 在下一个示例中,以下(默认)条件适用于当前图形。
此外,用户还使用以下命令序列绘制了一条线: 命令:line 指定第一点:1,2 指定下一个点或[撤消]:6,6 指定下一个点或[撤消]:ENTER 然后,调用将打印以下内容(名称值会有所不同)。getlast() 最后一个实体的 acdbEntGet() 的结果: (-1 . <实体名称:60000014>) (0 .“行”) (8 ."0") (10 1.0 2.0 0.0) (11 6.0 6.0 0.0) (210 0.0 0.0 1.0) 注意:该函数以 AutoLISP 关联列表的格式打印输出,但项目存储在结果缓冲区的链表中。printdxf()
列表开头的结果缓冲区(带有 -1 哨兵代码)包含此列表所表示的实体的名称。该函数使用它来标识要修改的实体。acdbEntMod() 实体组件(存储在字段中)的代码是 DXF 使用的代码。与 DXF 一样,仅当实体标头项具有非默认值时,才会返回实体标头项。与 DXF 不同,无论可选实体定义字段是否等于其默认值,都会返回它们。这简化了处理;应用程序始终可以假定这些字段存在。此外,与 DXF 不同的是,关联的 X、Y 和 Z 坐标作为单点变量 () 返回,而不是作为单独的 X (10)、Y (20) 和 Z (30) 组返回。该值包含 X 坐标的组编号(在 10-19 范围内)。restyperesval.rpointrestype 若要查找具有特定代码的组,应用程序可以遍历列表。此处显示的函数在结果缓冲区列表中搜索指定类型的组。entitem() static struct resbuf *entitem(rchain, gcode) struct resbuf *rchain; int gcode; { while ((rchain != NULL) && (rchain->restype != gcode)) rchain = rchain->rbnext; return rchain; } 如果列表中不存在参数指定的 DXF 组代码(或者不是有效的 DXF 组),则“从末尾掉下来”并返回 。请注意,这等效于 AutoLISP 函数。gcodegcodeentitem()NULLentitem()(assoc) 该函数修改实体。它传递一个列表,该列表的格式与 返回的列表相同,但应用程序修改了一些实体组值(可能)。此功能补充了 ;ObjectARX 应用程序更新数据库的主要方法是使用 检索实体,修改其实体列表,然后将列表传递回数据库。acdbEntMod()acdbEntGet()acdbEntGet()acdbEntGet()acdbEntMod() 注意:若要恢复图元颜色或线型的默认值,请将颜色设置为 256,即 BYLAYER,或将线型设置为 BYLAYER。acdbEntMod()
下面的代码片段检索图形中第一个图元的定义数据,并将其图层属性更改为 MYLAYER。 ads_name en; struct resbuf *ed, *cb; char *nl = "MYLAYER"; if (acdbEntNext(NULL, en) != RTNORM) return BAD; // Error status ed = acdbEntGet(en); // Retrieve entity data. for (cb = ed; cb != NULL; cb = cb->rbnext) if (cb->restype == 8) { // DXF code for Layer // Check to make sure string buffer is long enough. if (strlen(cb->resval.rstring) < (strlen(nl))) // Allocate a new string buffer. cb->resval.rstring = realloc(cb->resval.rstring, strlen(nl) + 1); strcpy(cb->resval.rstring, nl); if (acdbEntMod(ed) != RTNORM) { acutRelRb(ed); return BAD; // Error } break; // From the for loop } acutRelRb(ed); // Release result buffer. 内存管理是 ObjectARX 应用程序的责任。示例中的代码确保字符串缓冲区的大小正确,并且在操作完成后释放由 (并传递给 ) 的结果缓冲区,无论调用是否成功。 acdbEntGet()acdbEntMod()acdbEntMod() 注意:如果用于修改块定义中的实体,则会影响对该块的所有 INSERT 或 XREF 引用;此外,块定义中的实体不能被 删除。acdbEntMod()acdbEntDel()
应用程序还可以通过调用函数将实体添加到图形数据库。与 一样,to 的参数是一个结果缓冲区列表,其格式类似于 返回的列表的格式。(如果存在实体名称字段 [-1],则调用将忽略该字段。新图元将追加到图形数据库中(它将成为图形中的最后一个图元)。如果实体是复杂实体(折线或块),则在完成之前不会将其追加到数据库中。acdbEntMake()acdbEntMod()acdbEntMake()acdbEntGet()acdbEntMake() 以下示例代码片段在层 MYLAYER 上创建一个圆圈。 int status; struct resbuf *entlist; ads_point center = {5.0, 7.0, 0.0}; char *layer = "MYLAYER"; entlist = acutBuildList(RTDXF0, "CIRCLE",// Entity type 8, layer, // Layer name 10, center, // Center point 40, 1.0, // Radius 0 ); if (entlist == NULL) { acdbFail("Unable to create result buffer list\n"); return BAD; } status = acdbEntMake(entlist); acutRelRb(entlist); // Release acdbEntMake buffer. if (status == RTERROR) { acdbFail("Unable to make circle entity\n"); return BAD; } 两者对传递给它们的图元数据执行的一致性检查与AutoCAD DXFIN命令在读取DXF文件时执行的一致性检查相同。如果无法创建有效的图形图元,则它们将失败。acdbEntMod()acdbEntMake() 父主题: |
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-3-31 12:42
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.