实体数据函数
某些函数对图元数据进行操作,并可用于修改当前图形数据库。该函数删除指定的实体。在离开当前图形之前,不会从数据库中清除该图元。因此,如果应用程序在该会话期间第二次调用并指定同一实体,则该实体将被取消删除。(可用于检索已删除实体的名称。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-10-31 02:41
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.