pckite 发表于 2004-7-21 14:06:00

[ARX]版主、高手进来

关于添加扩展数据时,遇到一个大问题,运行addXData() 时打印出:ERROR: could not set Data :eRegappIdNotFound ,没能把数据添加,怎么办呢?
(If any of the regappNames in xdata are not in the APPID table, then Acad::eRegappIdNotFound is returned
说明我们注册appName不成功 ?acdbRegApp(appName);可能不成功,它返回的是一个数字,-5001 )
//--------------
void addXData()
{
        Acad::ErrorStatus es;
        struct resbuf *pRb, *pTemp;
        AcDbSymbolTable * appTable;
        char * appName="Test";
        char * resString="abcdefgffff";       
        AcDbDatabase *pDb=acdbHostApplicationServices()->workingDatabase();       
        pDb->getRegAppTable(appTable,AcDb::kForWrite);
                       pRb = appTable->xData(appName);
                       if (pRb == NULL)
        {
                                               acdbRegApp(appName);
                                                       pRb = acutNewRb(AcDb::kDxfRegAppName);
                                                       pTemp = pRb;
                                                       pTemp->resval.rstring = (char*) malloc(strlen(appName) + 1);
                                                       strcpy(pTemp->resval.rstring, appName);
       
                                               }
        else
        {
               for (pTemp = pRb; pTemp->rbnext != NULL;
                                                                                                                       pTemp = pTemp->rbnext)
                                                                                                                       { ; }
               
                                                                                               acutPrintf("pRb != NULL\n");               
                                               }
               
                       pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString);
                       pTemp = pTemp->rbnext;
                       pTemp->resval.rstring
                                                       = (char*) malloc(strlen(resString) + 1);
                       strcpy(pTemp->resval.rstring, resString);
                       appTable->upgradeOpen();
                       es=appTable->setXData(pRb);
               acutPrintf(_T("\n ERROR: could not set Data (%s)\n"),acadErrorStatusText(es));       
                       
                       appTable->close();
  acutRelRb(pRb);       
  acutPrintf("add data is ok\n");
               
}
//-------------------------------------------------

warmrain 发表于 2004-7-21 14:45:00

添加扩展数据要有一个目标对象,你这里没有啊给你个例子
void addXdata() {    AcDbObject* pObj = selectObject(AcDb::kForRead);//选择一个对象,如一个圆什么的    if (!pObj) {      acutPrintf("Error selecting object\n");      return;    }   //让用户输入application name 和要添加到xdata中的字符串    char appName, resString;    appName = resString = '\0';    acedGetString(NULL, "Enter application name: ",      appName);    acedGetString(NULL, "Enter string to be added: ",      resString);      structresbuf*pRb, *pTemp;      pRb = pObj->xData(appName);    if (pRb != NULL) {      // 如果 xdata 存在,就找到扩展数据的尾部      for (pTemp = pRb; pTemp->rbnext != NULL;                pTemp = pTemp->rbnext)                { ; }    } else {      // xdata 不存在,就注册 appName      acdbRegApp(appName);      pRb = acutNewRb(AcDb::kDxfRegAppName);      pTemp = pRb;      pTemp->resval.rstring            = (char*) malloc(strlen(appName) + 1);      strcpy(pTemp->resval.rstring, appName);    }    // 添加用户输入的字符串到xdata.    pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString);    pTemp = pTemp->rbnext;    pTemp->resval.rstring      = (char*) malloc(strlen(resString) + 1);    strcpy(pTemp->resval.rstring, resString);    pObj->upgradeOpen();    pObj->setXData(pRb);      pObj->close();    acutRelRb(pRb);}

pckite 发表于 2004-7-21 15:13:00

谢谢warmrain!添加扩展数据要有一个目标对象,我的目标是appTable啊, appTable->xData是存在的函数啊。
页: [1]
查看完整版本: [ARX]版主、高手进来