long8-龙8(中国)唯一官方网站

linuxf二次开发中 ->XData 问题

在生成的示例程序里,我是在void initApp()里新增了一个命令 acedRegCmds->addCommand(ACRX_T("ASDK_SAMPLES_HELLOARX"),
ACRX_T("ASDK_test"), ACRX_T("test"), ACRX_CMD_MODAL,
TestXData);

该命令的实现代码为





AcDbObjectId appendEnt(AcDbEntity* _pEnt)

{

AcDbDatabase* pAcDb=acdbHostApplicationServices()->workingDatabase();

AcDbBlockTable* pBlkTbl;

pAcDb->getBlockTable(pBlkTbl, AcDb::kForRead);

AcDbBlockTableRecord* pBlkTblRec;

pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRec, AcDb::kForWrite);

pBlkTbl->close();



AcDbObjectId id;

Acad::ErrorStatus es = pBlkTblRec->appendAcDbEntity(id, _pEnt);

if (es != Acad::eOk)

{

pBlkTblRec->close();

delete _pEnt;

_pEnt = NULL;

return AcDbObjectId::kNull;

}



pBlkTblRec->close();

_pEnt->close();



actrTransactionManager->queueForGraphicsFlush();//刷新显示

actrTransactionManager->flushGraphics();

acedUpdateDisplay();



return id;

}



AcString _AC_STR_(QString qstr)

{

return AcString((const char*)qstr.toUtf8(), AcString::Utf8);

}



AcString _AC_STR_(char* str)

{

return AcString((const char*)str, AcString::Utf8);

}



QString _T_(ACHAR* str)

{

return QString::fromStdWString(str);

}



char *_SZ_(QString _qstr)

{

char *str;

QByteArray ba = _qstr.toLocal8Bit() ;//不可以 _qstr.toLocal8Bit().data() ,如果这样,可能会出错

str = ba.data();

char *ret = new char[strlen(str) +1];

strcpy(ret,str);

return ret;

}



void TestXData()

{

Acad::ErrorStatus es;



AcGePoint3d pt1(0, 0, 0), pt2(100, 500, 0);

AcDbLine* pLine = new AcDbLine(pt1, pt2);

AcDbObjectId id = appendEnt(pLine);



es = acdbOpenObject(pLine, id, AcDb::kForWrite);

if (es != Acad::eOk)

{

acutPrintf(ACRX_T("\nError to acdbOpenObject"));

return;

}



QString strRegApp = "appreg",

strData1 = "Dat1",

strData2 = "Dat2";

acdbRegApp(_AC_STR_(strRegApp));

struct resbuf* rb = acutBuildList(AcDb::kDxfRegAppName, _SZ_(strRegApp),

AcDb::kDxfXdAsciiString, _SZ_(strData1),

AcDb::kDxfXdAsciiString, _SZ_(strData2),

RTNONE);

pLine->setXData(rb);

acutRelRb(rb);

pLine->close();











AcDbBlockTable *pBlkTbl_read;

acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl_read, AcDb::kForRead);



AcDbBlockTableRecord *pBlkTblRec_read;

pBlkTbl_read->getAt(ACDB_MODEL_SPACE, pBlkTblRec_read, AcDb::kForRead);

if(pBlkTbl_read)pBlkTbl_read->close();



AcDbBlockTableRecordIterator *pltr;

pBlkTblRec_read->newIterator(pltr);



AcDbEntity *pEnt_read;

for(pltr->start();!pltr->done();pltr->step())

{

pltr->getEntity(pEnt_read, AcDb::kForRead);

if (pEnt_read->isKindOf(AcDbLine::desc()))// 符合条件的 多义线 作为判断的依据

{

AcDbLine *pLine_read = AcDbLine::cast(pEnt_read);//whether it's a line

if(pLine_read != NULL)

{

QString strData1_read, strData2_read;

struct resbuf *pRb_read = pEnt_read->xData(_AC_STR_(strRegApp));//获取实体的扩展数据

if (pRb_read != NULL)

{

struct resbuf *pTemp_read = pRb_read; //使用临时的结果缓冲区指针进行遍历,pRb不修改便于释放

if(pTemp_read)pTemp_read = pTemp_read->rbnext;

if(pTemp_read)strData1_read = _T_(pTemp_read->resval.rstring);

if(pTemp_read)pTemp_read = pTemp_read->rbnext;

if(pTemp_read)strData2_read = _T_(pTemp_read->resval.rstring);



QMessageBox::information(NULL,"info","acdbline::cast ok\r\ndata1=" + strData1_read +"\r\ndata2="+strData2_read);

}

else

{

QMessageBox::information(NULL,"info","acdbline::cast ok, but resbuf read return null");

}

acutRelRb(pRb_read);

}

else

{

QMessageBox::information(NULL,"info","acdbline::cast error");

}



if(pLine_read)pLine_read->close();

}

if(pEnt_read)pEnt_read->close();

}

delete pltr;



if(pBlkTblRec_read)pBlkTblRec_read->close();



QMessageBox::information(NULL,"info","test over...");





}

当在cad里test命令时,总是得到 QMessageBox::information(NULL,"info","acdbline::cast ok, but resbuf read return null");不知道是什么原因导致读取不到里面的数据,麻烦赐教,谢谢



已邀请:

龙8软件的糕糕

赞同来自:

您好,请私信一下我您的联系方式。我来协调研发老师协助您确认问题。

该问题目前已经被锁定, 无法添加新回复

友情链接: