admin 发表于 2024-3-6 11:44:26

获取AutoCAD数据库中所有满足指定图层条件的实体对象ID

//获取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数组。
}
页: [1]
查看完整版本: 获取AutoCAD数据库中所有满足指定图层条件的实体对象ID