遍历指定动态块的所有可见性名称方法(二)
依然采用了entget dxf大法
测试代码
ads_name ent;
ads_point pt;
if(RTNORM != acedEntSel(NULL,ent,pt))
{
acutPrintf(_T("\n未选择到对象!"));
return;
}
AcDbObjectId objId;
acdbGetObjectId(objId,ent);
AcDbObjectPointer<AcDbBlockReference> pBlkRef(objId,AcDb::kForRead);
if(Acad::eOk != pBlkRef.openStatus())
{
acutPrintf(_T("\n打开块参照失败!"));
return;
}
AcDbDynBlockReference dynBlkRef(objId);
if(!dynBlkRef.isDynamicBlock())
{
acutPrintf(_T("\n非动态块参照!"));
return;
}
AcDbObjectId blkDefId=dynBlkRef.dynamicBlockTableRecord();
AcDbBlockTableRecordPointer pBlkDef(blkDefId,AcDb::kForRead);
if(Acad::eOk != pBlkDef.openStatus())
{
acutPrintf(_T("\n块定义打开失败!"));
return;
}
AcDbObjectId dicId= pBlkDef->extensionDictionary();
AcDbObjectPointer<AcDbDictionary> pDic(dicId,AcDb::kForRead);
if(Acad::eOk != pDic.openStatus())
{
acutPrintf(_T("\n扩展词典打开失败!"));
return;
}
AcDbObjectId enhancedblkId;
pDic->getAt(_T("ACAD_ENHANCEDBLOCK"),enhancedblkId);
AcDbObjectPointer<AcDbEvalGraph> pEnhancedBlk(enhancedblkId,AcDb::kForRead);
if(Acad::eOk != pEnhancedBlk.openStatus())
{
acutPrintf(_T("\nACAD_ENHANCEDBLOCK打开失败!"));
return;
}
AcDbEvalNodeIdArray nodeIdArray;
pEnhancedBlk->getAllNodes(nodeIdArray);
for(int i=0;i<nodeIdArray.length();i++)
{
AcDbEvalNodeId subId=nodeIdArray.at(i);
AcDbObject *pNode=NULL;
pEnhancedBlk->getNode(subId,AcDb::kForRead,&pNode);
if(pNode == NULL) continue;
if(pNode->isKindOf(AcDbEvalExpr::desc()))
{
CString strDxfName=pNode->objectId().objectClass()->dxfName();
if (_T("BLOCKVISIBILITYPARAMETER") == strDxfName)
{
ads_name nodeEnt;
Acad::ErrorStatus es= acdbGetAdsName(nodeEnt,pNode->objectId());
resbuf *elist= acdbEntGet(nodeEnt);
if (elist!=NULL)
{
for (resbuf *eb = elist; eb != NULL; eb = eb->rbnext)
{
if (eb->restype == 301)
{
printdxf(eb);
}
else if (eb->restype == 303)
{
printdxf(eb);
}
}
acutRelRb(elist);
}
}
}
pNode->close();
}
函数调用
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 || eb->restype == 301)
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;
}
效果展示
附带lisp版本
(defun c:tt(/ en obj blkName doc blocks blkdef exDic enhancedblk ename lst names)
(if(setq en(car(entsel "\n选择图块")))
(progn
(setq obj(vlax-ename->vla-object en))
(setq blkName(vla-get-EffectiveName obj))
(setq doc(vla-get-activedocument(vlax-get-acad-object)))
(setq blocks(vla-get-blocks doc))
(setq blkdef(vla-item blocks blkName))
(if(= (vla-get-isdynamicblock blkdef) :vlax-true)
(progn
(setq exDic(vla-GetExtensionDictionary blkdef))
(setq enhancedblk(vla-item exdic "ACAD_ENHANCEDBLOCK"))
(setq ename(vlax-vla-object->ename enhancedblk))
(setq lst(vl-remove-if-not '(lambda(x)(= (car x) 360)) (entget ename)))
(if lst
(progn
(foreach n lst
(setq names (checkVisibility (cdr n)))
(if names (print names))
)
)
)
)
)
(vlax-release-object doc)
(vlax-release-object blocks)
(vlax-release-object blkdef)
(vlax-release-object obj)
)
)
(princ)
)
(defun checkVisibility(ent / elist name lst)
(setq elist(entget ent))
(if (= "BLOCKVISIBILITYPARAMETER" (cdr(assoc 0 elist)))
(progn
(setq name(cdr(assoc 301 elist)))
(setq lst(vl-remove-if-not '(lambda(x)(= (car x) 303)) elist))
(if lst
(progn
(setq lst(mapcar 'cdr lst))
(list name lst)
)
)
)
)
)