遍历指定动态块的所有可见性名称方法(二)

edata / 2023-08-12 / 原文

依然采用了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)
					)
				)
			)
		)
	)