获取AutoCAD数据库中所有满足指定图层条件的实体对象ID
//获取AutoCAD数据库中所有满足指定图层条件的实体对象IDAcDbObjectIdArray CDwgDataBaseUtil::GetAllEntityIds(const TCHAR* layerName, AcDbDatabase *pDb)
{
AcDbObjectIdArray entIds; // 满足条件的实体ID集合
bool bFilterLayer = false; // 是否需要过滤图层
AcDbObjectId layerId;
if (layerName != NULL)//如果layerName不为NULL,则需要进行图层过滤
{ // 获取层表->判断是否有该图层->获得层表id->设置过滤控制符
AcDbLayerTable *pLayerTbl = NULL;//访问AutoCAD的图层表
acdbHostApplicationServices()->workingDatabase()
//调用ObjectARX函数获取工作数据库的符号表,并将其赋值给pLayerTbl。
->getSymbolTable(pLayerTbl, AcDb::kForRead);
if (!pLayerTbl->has(layerName))
//检查指定的图层是否存在,如果存在,则获取该图层的ID,并将bFilterLayer设置为true
{
pLayerTbl->close();
return entIds;
}
pLayerTbl->getAt(layerName, layerId);
pLayerTbl->close();
bFilterLayer = true;
}
// 获得块表
AcDbBlockTable *pBlkTbl = NULL;
pDb->getBlockTable(pBlkTbl, AcDb::kForRead);
// 获得模型空间的块表记录
AcDbBlockTableRecord *pBlkTblRcd = NULL;
pBlkTbl->getAt(ACDB采用MODEL采用SPACE, pBlkTblRcd, AcDb::kForRead);
pBlkTbl->close();
// 创建遍历器,依次访问模型空间的每一个实体
AcDbBlockTableRecordIterator *it = NULL;
pBlkTblRcd->newIterator(it);
for (it->start(); !it->done(); it->step())
{ // 如果过滤控制符为真,获得该层上所有实体的id
AcDbEntity *pEnt = NULL;
Acad::ErrorStatus es = it->getEntity(pEnt, AcDb::kForRead);
//使用迭代器获取当前实体的指针,并检查获取操作是否成功。
if (es == Acad::eOk)
{
if (bFilterLayer) // 过滤图层
{
if (pEnt->layerId() == layerId)//检查当前实体是否属于指定的图层
{
entIds.append(pEnt->objectId());//将该实体的ID添加到entIds数组中
}
}
else
{
entIds.append(pEnt->objectId());
}
pEnt->close();
}
else
{
acutPrintf(TEXT("\nCDwgDatabaseUtil::GetAllEntityIds中打开实体失败(错误代码:%d)."), (int)es);
}
}
delete it;
pBlkTblRcd->close();
//释放资源,关闭打开的对象和迭代器
return entIds; //返回满足条件的实体对象ID数组。
}
页:
[1]