CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoCAD 2023 开发者帮助

扩展数据

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

扩展数据

扩展数据 (xdata) 由使用 ObjectARX 或 AutoLISP 编写的应用程序创建,可以添加到任何对象中。Xdata 由应用程序使用的 resbufs 的链表组成。(AutoCAD 会维护信息,但不会使用它。数据与 1000 到 1071 范围内的 DXF 组代码相关联。 ® ®

此机制节省空间,可用于向对象添加轻量级数据。但是,xdata 仅限于 16K 和现有的 DXF 组代码和类型集。

有关 xdata 的更详细说明,请参见《AutoCAD DXF 参考手册》。

使用该函数获取包含对象的 xdata 副本的 resbuf 链:AcDbObject::xData()

virtual resbuf* 
AcDbObject::xData(const char* regappName = NULL) const;

使用该函数指定对象的 xdata:AcDbObject::setXData()

virtual Acad::ErrorStatus 
AcDbObject::setXData(const resbuf* xdata);

下面的示例使用该函数获取所选对象的 xdata,然后将 xdata 打印到屏幕。然后,它将字符串 () 添加到 xdata 并调用该函数来修改对象的 xdata。此示例还说明了 and 函数的用法。xData()testrunsetXdata()upgradeOpen()downgradeOpen()

// This function calls the selectObject() function to allow 
// the user to pick an object; then it accesses the xdata of 
// the object and sends the list to the printList() function 
// that lists the restype and resval values.
// 
void
printXdata()
{
    // Select and open an object.
    //
    AcDbObject *pObj;
    if ((pObj = selectObject(AcDb::kForRead)) == NULL) {
        return;
    }
    // Get the application name for the xdata.
    //
    char appname[133];
    if (acedGetString(NULL,
        "\nEnter the desired Xdata application name: ",
        appname) != RTNORM)
    {
        return;
    }
    // Get the xdata for the application name.
    //
    struct resbuf *pRb;
    pRb = pObj->xData(appname);
    if (pRb != NULL) {
        // Print the existing xdata if any is present.
        // Notice that there is no -3 group, as there is in
        // LISP. This is ONLY the xdata, so
        // the -3 xdata-start marker isn't needed.
        // 
        printList(pRb);
        acutRelRb(pRb);
    } else {
        acutPrintf("\nNo xdata for this appname");
    }
    pObj->close();
}
void 
addXdata() 
{
    AcDbObject* pObj = selectObject(AcDb::kForRead);
    if (!pObj) {
        acutPrintf("Error selecting object\n");
        return;
    }
    // Get the application name and string to be added to
    // xdata.
    //
    char appName[132], resString[200];
    appName[0] = resString[0] = '\0';
    acedGetString(NULL, "Enter application name: ",
        appName);
    acedGetString(NULL, "Enter string to be added: ",
        resString);
    struct  resbuf  *pRb, *pTemp;
    pRb = pObj->xData(appName);
    if (pRb != NULL) {
        // If xdata is present, then walk to the
        // end of the list.
        //
        for (pTemp = pRb; pTemp->rbnext != NULL;
                pTemp = pTemp->rbnext)
                { ; }
    } else {
        // If xdata is not present, register the application
        // and add appName to the first resbuf in the list.
        // Notice that there is no -3 group as there is in
        // AutoLISP. This is ONLY the xdata so
        // the -3 xdata-start marker isn't needed.
        // 
        acdbRegApp(appName);
        pRb = acutNewRb(AcDb::kDxfRegAppName);
        pTemp = pRb;
        pTemp->resval.rstring
            = (char*) malloc(strlen(appName) + 1);
        strcpy(pTemp->resval.rstring, appName);
    }
    // Add user-specified string to the xdata.
    //
    pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString);
    pTemp = pTemp->rbnext;
    pTemp->resval.rstring
        = (char*) malloc(strlen(resString) + 1);
    strcpy(pTemp->resval.rstring, resString);
    // The following code shows the use of upgradeOpen()
    // to change the entity from read to write.
    //
    pObj->upgradeOpen();
    pObj->setXData(pRb);
    pObj->close();
    acutRelRb(pRb);
}

路过

雷人

握手

鲜花

鸡蛋

最新评论

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

GMT+8, 2024-12-15 22:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部