ObjectARX選擇集快還是遍歷塊表記錄獲取實體objectid快?


這是根據拾取點來獲取 點實體AcDbPoint 的結果,明顯遍歷更快。

雖然有點以偏概全,但對於條件固定的選擇,使用遍歷是個更高效率的選擇。

 

 

 以下是測試源碼。

	static void getpoint1()
	{
		ads_name ss;
		ads_point pt;
		if (RTNORM!=acedGetPoint(NULL,_T("\n選擇點: "),pt))
		{
			return;
		}
		clock_t start,finish;
		double totaltime;
		start=clock();
		resbuf *rb=acutBuildList(RTDXF0,_T("point"),10,pt,RTNONE);
		if (RTNORM != acedSSGet(_T("X"),NULL,NULL,rb,ss))
		{
			acutRelRb(rb);
			acutPrintf(_T("\n未選擇到對象!"));
			finish=clock();
			totaltime=(double)(finish-start)/CLOCKS_PER_SEC;    
			acutPrintf(_T("\n選擇失敗耗時: %0.9lf"),totaltime);
			return;
		}
		acutRelRb(rb);
		finish=clock();
		totaltime=(double)(finish-start)/CLOCKS_PER_SEC;    
		acutPrintf(_T("\n選擇完成耗時: %0.9lf"),totaltime);
		Adesk::Int32 nsslen=0;
		acedSSLength(ss,&nsslen);
		AcDbObjectIdArray objIds;
		for (int i=0;i<nsslen;i++)
		{
			ads_name ent;
			acedSSName(ss,i,ent);
			AcDbObjectId objId;
			acdbGetObjectId(objId,ent);
			if (!objId.isNull())
			{
				objIds.append(objId);
			}
		}
		acedSSFree(ss);
		finish=clock();
		totaltime=(double)(finish-start)/CLOCKS_PER_SEC;    
		acutPrintf(_T("\n轉ID集合耗時: %0.9lf"),totaltime);

		if (objIds.length()>0)
		{
			acutPrintf(_T("\n選擇到%d個對象!"),objIds.length());
		}
	}
	static void getpoint2()
	{
		ads_point pt;
		if (RTNORM!=acedGetPoint(NULL,_T("\n選擇點: "),pt))
		{
			return;
		}

		clock_t start,finish;
		double totaltime;
		start=clock();

		AcGePoint3d p1=asPnt3d(pt);
		AcDbBlockTablePointer pBlkTbl(curDoc()->database(),AcDb::kForRead);
		if (Acad::eOk != pBlkTbl.openStatus())
		{
			acutPrintf(_T("\n打開塊表失敗,錯誤碼= %s"),acadErrorStatusText(pBlkTbl.openStatus()));
			return;
		}
		AcDbBlockTableIterator *pBlkTblIter=NULL;
		Acad::ErrorStatus es= pBlkTbl->newIterator(pBlkTblIter);
		if (pBlkTblIter==NULL)
		{
			acutPrintf(_T("\n打開塊表失敗,錯誤碼= %s"),acadErrorStatusText(es));
			return;
		}
		AcDbObjectIdArray objIds;
		for (pBlkTblIter->start();!pBlkTblIter->done();pBlkTblIter->step())
		{
			AcDbBlockTableRecord *pBlkRcd=NULL;
			es= pBlkTblIter->getRecord(pBlkRcd,AcDb::kForRead);
			if (Acad::eOk != es)
			{
				continue;
			}
			if (!pBlkRcd->isLayout())
			{
				pBlkRcd->close();
				continue;
			}
			AcDbBlockTableRecordIterator *pBlkRcdIter=NULL;
			pBlkRcd->newIterator(pBlkRcdIter);
			if (pBlkRcdIter==NULL)
			{
				pBlkRcd->close();
				continue;
			}
			for (pBlkRcdIter->start();!pBlkRcdIter->done();pBlkRcdIter->step())
			{
				AcDbEntity *pEnt=NULL;
				pBlkRcdIter->getEntity(pEnt,AcDb::kForRead);
				if (pEnt == NULL)
				{
					continue;
				}
				if (pEnt->isKindOf(AcDbPoint::desc()))
				{
					AcDbPoint *pPoint=AcDbPoint::cast(pEnt);
					if (pPoint!=NULL)
					{
						AcGePoint3d ptTemp=pPoint->position();
						if (ptTemp.isEqualTo(p1))
						{
							objIds.append(pPoint->objectId());
						}
					}
				}
				pEnt->close();
			}
			delete pBlkRcdIter;
			pBlkRcd->close();
		}
		delete pBlkTblIter;

		finish=clock();
		totaltime=(double)(finish-start)/CLOCKS_PER_SEC;    
		acutPrintf(_T("\n遍歷耗時: %0.9lf"),totaltime);

		if (objIds.length()>0)
		{
			acutPrintf(_T("\n選擇到%d個對象!"),objIds.length());
		}
	}

  


免責聲明!

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



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