|
- //获取AutoCAD数据库中所有满足指定图层条件的实体对象ID
- AcDbObjectIdArray 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数组。
- }
复制代码 |
|