CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

ObjectARX 开发指南

扩展数据

2023-1-1 05:12| 发布者: admin| 查看: 365| 评论: 0|来自: AutoCAD

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

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

有关 xdata 的更详细说明,请参见 AutoCADDXF 参考

使用 thefunction 获取包含对象 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。这个例子还说明了 theand 函数的用法。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 )

GMT+8, 2024-5-19 13:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部