测试代码
由于autocad没有公布动态块块定义的相关接口,无法遍历到可见性的名称列表,现有的api只能得到名称,不能确定是可见性还是其他属性,不能够精确的判断。
此例子可以通过遍历数据库所有对象,通过dxf名称获取可见性句柄,通过entget方式获取相关信息。代码如下。
AcDbDatabase *pDb=curDoc()->database();
AcDbHandle endHandle= pDb->handseed();
for (AcDbHandle h=pDb->blockTableId().handle();h<endHandle;h++)
{
AcDbObjectId objId;
pDb->getAcDbObjectId(objId,false,h);
if (!objId.isNull())
{
CString strDxfName=objId.objectClass()->dxfName();
if (_T("BLOCKVISIBILITYPARAMETER") == strDxfName)
{
acutPrintf(_T("\nDxfName=%s,Handle="),objId.objectClass()->dxfName());
h.print();
ads_name ent;
Acad::ErrorStatus es= acdbGetAdsName(ent,objId);
resbuf *elist= acdbEntGet(ent);
if (elist!=NULL)
{
for (resbuf *eb = elist; eb != NULL; eb = eb->rbnext)
{
if (eb->restype == 303)
{
printdxf(eb);
}
}
acutRelRb(elist);
}
}
}
}
调用的函数
static int printdxf(struct resbuf *eb)
{
int rt;
if (eb == NULL)
return RTNONE;
if ((eb->restype >= 0) && (eb->restype <= 9))
rt = RTSTR ;
else if ((eb->restype >= 10) && (eb->restype <= 19))
rt = RT3DPOINT;
else if ((eb->restype >= 38) && (eb->restype <= 59))
rt = RTREAL ;
else if ((eb->restype >= 60) && (eb->restype <= 79))
rt = RTSHORT ;
else if ((eb->restype >= 210) && (eb->restype <= 239))
rt = RT3DPOINT ;
else if (eb->restype < 0)
// Entity name (or other sentinel)
rt = eb->restype;
else if (eb->restype == 303)
rt = RTSTR ;
else
rt = RTNONE;
switch (rt) {
case RTSHORT:
acutPrintf(_T("(%d . %d)\n"), eb->restype,
eb->resval.rint);
break;
case RTREAL:
acutPrintf(_T("(%d . %0.3f)\n"), eb->restype,
eb->resval.rreal);
break;
case RTSTR:
acutPrintf(_T("(%d . \"%s\")\n"), eb->restype,
eb->resval.rstring);
break;
case RT3DPOINT:
acutPrintf(_T("(%d . %0.3f %0.3f %0.3f)\n"),
eb->restype,
eb->resval.rpoint[X], eb->resval.rpoint[Y],
eb->resval.rpoint[Z]);
break;
case RTNONE:
acutPrintf(_T("(%d . Unknown type)\n"), eb->restype);
break;
case -1:
case -2:
// First block entity
acutPrintf(_T("(%d . <Entity name: %8lx>)\n"),
eb->restype, eb->resval.rlname[0]);
}
return eb->restype;
}
效果
鸣谢
鸣谢 疯狂的青蛙 惊惊