這是根據拾取點來獲取 點實體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());
}
}
