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");不知道是什么原因导致读取不到里面的数据,麻烦赐教,谢谢
没有找到相关结果
1 个回复
龙8软件的糕糕
赞同来自:
您好,请私信一下我您的联系方式。我来协调研发老师协助您确认问题。