遍歷動態塊塊定義的可見性名稱方法


測試代碼

由於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; 
	} 

效果


鳴謝

鳴謝 瘋狂的青蛙 驚驚

參考C#代碼

https://www.cnblogs.com/JJBox/p/12489648.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM