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());
}
}

浙公网安备 33010602011771号