|
www.mxdraw.com
|
返回命名对象字典
Mcad::ErrorStatus getNamedObjectsDictionary(McDbDictionary*& pDict, McDb::OpenMode mode);
|
参数 |
说明 |
|
McDbDictionary*& pDict |
返回的字典指针 对象的打开方式 |
如果成功返回Mcad::eOk,如果传递的数据非法则返回Mcad::eInvalidInput
例如:读取数据命名对象字典中所有数据
LPCTSTR
CTestCommands::bytesToHexStr(char* buffer, int len, CString& hexStr)
{
unsigned char k;
int j;
CString tmpStr;
hexStr.Empty(); // make sure nothing in it yet since we are concatenating it
for (j=0;j<len;j++) {
k = static_cast<unsigned char>(buffer[j]);
tmpStr.Format(_T("%02hX"), k);
hexStr += tmpStr;
}
return hexStr;
}
int
CTestCommands::dxfCodeToDataType(int resType)
{
if ((resType >= 0) && (resType <= 9))
return RTSTR;
else if ((resType >= 10) && (resType <= 17))
return RT3DPOINT;
else if ((resType >= 38) && (resType <= 59))
return RTREAL;
else if ((resType >= 60) && (resType <= 79))
return RTSHORT;
else if ((resType >= 90) && (resType <= 99))
return RTLONG;
else if ((resType == 100) || (resType == 101) || (resType == 102) ||(resType == 105))
return RTSTR;
else if ((resType >= 110) && (resType <= 112))
return RTSTR;
else if ((resType >= 140) && (resType <= 149))
return RTREAL;
else if ((resType >= 170) && (resType <= 179))
return RTSHORT;
else if ((resType >= 210) && (resType <= 219))
return RT3DPOINT;
else if ((resType >= 270) && (resType <= 299))
return RTSHORT;
else if ((resType >= 300) && (resType <= 309))
return RTSTR;
// 310-319为二进制数据
else if ((resType >= 310) && (resType <= 319))
return resType;
else if ((resType >= 320) && (resType <= 369))
return RTENAME;
else if ((resType >= 370) && (resType <= 379))
return RTSHORT;
else if ((resType >= 380) && (resType <= 389))
return RTSHORT;
else if ((resType >= 390) && (resType <= 399))
return RTENAME;
else if ((resType >= 400) && (resType <= 409))
return RTSHORT;
else if ((resType >= 410) && (resType <= 419))
return RTSTR;
else if (resType == 1004)
return resType; // binary chunk
else if ((resType >= 999) && (resType <= 1009))
return RTSTR;
else if ((resType >= 1010) && (resType <= 1013))
return RT3DPOINT;
else if ((resType >= 1038) && (resType <= 1059))
return RTREAL;
else if ((resType >= 1060) && (resType <= 1070))
return RTSHORT;
else if ((resType == 1071))
return RTLONG;
else if ((resType < 0) || (resType > 4999))
return resType;
else
return RTNONE;
}
void
CTestCommands::dxfToStr(const resbuf* rb, CString& dxfCodeStr, CString& valueStr)
{
int dataType = dxfCodeToDataType(rb->restype);
dxfCodeStr.Format(_T("%d"), rb->restype);
CString tmpStr;
switch (dataType) {
case RTSHORT:
valueStr.Format(_T("%d"), rb->resval.rint);
break;
case RTLONG:
valueStr.Format(_T("%ld"), rb->resval.rlong);
break;
case RTREAL:
valueStr.Format(_T("%g"), rb->resval.rreal);
break;
case RTSTR:
if (rb->resval.rstring == NULL)
valueStr = _T("(NULL)");
else
valueStr.Format(_T(""%s""), rb->resval.rstring);
break;
case RT3DPOINT:
valueStr.Format(_T("(%g, %g, %g)"), rb->resval.rpoint[X],
rb->resval.rpoint[Y], rb->resval.rpoint[Z]);
break;
case RTPOINT:
valueStr.Format(_T("(%g, %g)"), rb->resval.rpoint[X], rb->resval.rpoint[Y]);
break;
case -6:
valueStr = _T("Extension Dictionary");
break;
case -5:
valueStr = _T("Persistent Reactors");
break;
case -4:
valueStr.Format(_T("Conditional Operator: "%s""), rb->resval.rstring);
break;
case -3:
valueStr = _T("Start of Xdata");
break;
case -2:
valueStr.Format(_T("<Entity Name Reference: %8lx>"), rb->resval.rlname[0]);
break;
case -1:
case RTENAME:
if ((rb->restype >= 330 )&& (rb->restype < 340))
valueStr.Format(_T("<Soft Pointer: %8lx>"), rb->resval.rlname[0]);
else if((rb->restype >= 340) && (rb->restype < 350))
valueStr.Format(_T("<Hard Pointer: %8lx>"), rb->resval.rlname[0]);
else if((rb->restype >= 350) && (rb->restype < 360))
valueStr.Format(_T("<Soft Ownership: %8lx>"), rb->resval.rlname[0]);
else if((rb->restype >= 360) && (rb->restype < 370))
valueStr.Format(_T("<Hard Ownership: %8lx>"), rb->resval.rlname[0]);
else if((rb->restype >= 390) && (rb->restype < 399))
valueStr.Format(_T("<Hard Pointer: %8lx>"), rb->resval.rlname[0]);
else
valueStr.Format(_T("<Entity Name: %8lx>"), rb->resval.rlname[0]);
break;
case RTPICKS:
valueStr.Format(_T("<Selection Set: %8lx>"), rb->resval.rlname[0]);
break;
case RTLB:
valueStr = _T("List Begin");
break;
case RTLE:
valueStr = _T("List End");
break;
case RTNIL:
valueStr = _T("NIL");
break;
case RTT:
valueStr = _T("T");
break;
default:
{
if (dataType == 1004 || (dataType >= 310 && dataType <= 319) )
{
// 二进制数据。
valueStr.Format(_T("Binary Chunk: "%s""),
bytesToHexStr(rb->resval.rbinary.buf,
rb->resval.rbinary.clen, tmpStr));
}
else
{
valueStr = _T("*Unknown*");
}
}
break;
}
}
void
CTestCommands::printResbufChain(resbuf* const rb)
{
CString dxfCodeStr, valueStr, tmpStr;
resbuf* tmp = rb;
while (tmp) {
dxfToStr(tmp, dxfCodeStr, valueStr);
tmpStr.Format(_T("n(%s . %s)"), dxfCodeStr, valueStr);
acutPrintf(static_cast<LPCTSTR>(tmpStr));
tmp = tmp->rbnext;
}
}
void CTestCommands::ReadNamedObjectsDictionary()
{
{
// 把字典中所有的数据都输出
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
AcDbObjectPointer<AcDbDictionary> spDict(pDb->namedObjectsDictionaryId(),AcDb::kForRead);
if(spDict.openStatus() == Acad::eOk)
{
PrintDictionary(spDict.object() );
}
}
// 读取指定的数据.
AcDbDictionary *pNamedobj;
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
if(pDb->getNamedObjectsDictionary(pNamedobj, AcDb::kForRead) != Acad::eOk)
{
return ;
}
AcDbDictionary *pDict;
if(pNamedobj->getAt(_T("ESTATE_DICT"), (AcDbObject*&)pDict,AcDb::kForRead) != Acad::eOk)
{
pNamedobj->close();
return ;
}
pNamedobj->close();
//得到数据字典LAYERRECORD
AcDbXrecord *pXrec;
if(pDict->getAt(_T("LAYERRECORD"), (AcDbObject*&)pXrec,AcDb::kForRead) != Acad::eOk)
{
pDict->close();
return ;
}
pDict->close();
// 把记录中数据输出.
struct resbuf *pRbList;
pXrec->rbChain(&pRbList);
printResbufChain(pRbList);
acutRelRb(pRbList);
pXrec->close();
}