扩展数据
扩展数据 (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); } 父主题: |
|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2024-12-15 22:22
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.