CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoCAD 2022 开发者帮助

实体数据函数

2024-5-18 18:49| 发布者: admin| 查看: 14| 评论: 0|原作者: admin|来自: AutoCAD

实体数据函数

某些函数对图元数据进行操作,并可用于修改当前图形数据库。该函数删除指定的实体。在离开当前图形之前,不会从数据库中清除该图元。因此,如果应用程序在该会话期间第二次调用并指定同一实体,则该实体将被取消删除。(可用于检索已删除实体的名称。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; 
} 

在下一个示例中,以下(默认)条件适用于当前图形。

  • 当前图层为 0
  • 当前线型为 CONTINUOUS
  • 当前高程为 0
  • 实体句柄被禁用

此外,用户还使用以下命令序列绘制了一条线:

命令: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 不同的是,关联的 XYZ 坐标作为单点变量 () 返回,而不是作为单独的 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()


路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 )

GMT+8, 2024-6-27 16:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部