zoukankan      html  css  js  c++  java
  • ObjectARX选择集快还是遍历块表记录获取实体objectid快?

    这是根据拾取点来获取 点实体AcDbPoint 的结果,明显遍历更快。

    虽然有点以偏概全,但对于条件固定的选择,使用遍历是个更高效率的选择。

     

     以下是测试源码。

    	static void getpoint1()
    	{
    		ads_name ss;
    		ads_point pt;
    		if (RTNORM!=acedGetPoint(NULL,_T("
    选择点: "),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("
    未选择到对象!"));
    			finish=clock();
    			totaltime=(double)(finish-start)/CLOCKS_PER_SEC;    
    			acutPrintf(_T("
    选择失败耗时: %0.9lf"),totaltime);
    			return;
    		}
    		acutRelRb(rb);
    		finish=clock();
    		totaltime=(double)(finish-start)/CLOCKS_PER_SEC;    
    		acutPrintf(_T("
    选择完成耗时: %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("
    转ID集合耗时: %0.9lf"),totaltime);
    
    		if (objIds.length()>0)
    		{
    			acutPrintf(_T("
    选择到%d个对象!"),objIds.length());
    		}
    	}
    	static void getpoint2()
    	{
    		ads_point pt;
    		if (RTNORM!=acedGetPoint(NULL,_T("
    选择点: "),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("
    打开块表失败,错误码= %s"),acadErrorStatusText(pBlkTbl.openStatus()));
    			return;
    		}
    		AcDbBlockTableIterator *pBlkTblIter=NULL;
    		Acad::ErrorStatus es= pBlkTbl->newIterator(pBlkTblIter);
    		if (pBlkTblIter==NULL)
    		{
    			acutPrintf(_T("
    打开块表失败,错误码= %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("
    遍历耗时: %0.9lf"),totaltime);
    
    		if (objIds.length()>0)
    		{
    			acutPrintf(_T("
    选择到%d个对象!"),objIds.length());
    		}
    	}
    

      

  • 相关阅读:
    JavaScript基础
    CSS基础
    HTML基础
    LeetCode OJ:Subsets II(子集II)
    LeetCode OJ:Combination Sum III(组合之和III)
    LeetCode OJ:Minimum Size Subarray Sum(最小子数组的和)
    LeetCode OJ:House Robber(住宅窃贼)
    LeetCode OJ:Minimum Path Sum(最小路径和)
    LeetCode OJ:Minimum Depth of Binary Tree(二叉树的最小深度)
    LeetCode OJ:Rotate Array(倒置数组)
  • 原文地址:https://www.cnblogs.com/edata/p/13869862.html
Copyright © 2011-2022 走看看