找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 143|回复: 0

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

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-6 11:44:26 | 显示全部楼层 |阅读模式
  1. //获取AutoCAD数据库中所有满足指定图层条件的实体对象ID
  2. AcDbObjectIdArray CDwgDataBaseUtil::GetAllEntityIds(const TCHAR* layerName, AcDbDatabase *pDb)
  3. {
  4.         AcDbObjectIdArray entIds;        // 满足条件的实体ID集合
  5.         bool bFilterLayer = false;        // 是否需要过滤图层
  6.         AcDbObjectId layerId;
  7.         if (layerName != NULL)//如果layerName不为NULL,则需要进行图层过滤
  8.         {   // 获取层表->判断是否有该图层->获得层表id->设置过滤控制符
  9.                 AcDbLayerTable *pLayerTbl = NULL;//访问AutoCAD的图层表
  10.                 acdbHostApplicationServices()->workingDatabase()
  11.                 //调用ObjectARX函数获取工作数据库的符号表,并将其赋值给pLayerTbl。
  12.                         ->getSymbolTable(pLayerTbl, AcDb::kForRead);
  13.                 if (!pLayerTbl->has(layerName))
  14.                 //检查指定的图层是否存在,如果存在,则获取该图层的ID,并将bFilterLayer设置为true
  15.                 {
  16.                         pLayerTbl->close();
  17.                         return entIds;
  18.                 }
  19.                 pLayerTbl->getAt(layerName, layerId);
  20.                 pLayerTbl->close();
  21.                 bFilterLayer = true;
  22.         }
  23.         // 获得块表
  24.         AcDbBlockTable *pBlkTbl = NULL;
  25.         pDb->getBlockTable(pBlkTbl, AcDb::kForRead);
  26.         // 获得模型空间的块表记录
  27.         AcDbBlockTableRecord *pBlkTblRcd = NULL;
  28.         pBlkTbl->getAt(ACDB采用MODEL采用SPACE, pBlkTblRcd, AcDb::kForRead);
  29.         pBlkTbl->close();
  30.         // 创建遍历器,依次访问模型空间的每一个实体
  31.         AcDbBlockTableRecordIterator *it = NULL;
  32.         pBlkTblRcd->newIterator(it);
  33.         for (it->start(); !it->done(); it->step())
  34.         {   // 如果过滤控制符为真,获得该层上所有实体的id
  35.                 AcDbEntity *pEnt = NULL;
  36.                 Acad::ErrorStatus es = it->getEntity(pEnt, AcDb::kForRead);
  37.                 //使用迭代器获取当前实体的指针,并检查获取操作是否成功。
  38.                 if (es == Acad::eOk)
  39.                 {
  40.                         if (bFilterLayer)        // 过滤图层
  41.                         {
  42.                                 if (pEnt->layerId() == layerId)//检查当前实体是否属于指定的图层
  43.                                 {
  44.                                         entIds.append(pEnt->objectId());//将该实体的ID添加到entIds数组中
  45.                                 }
  46.                         }
  47.                         else
  48.                         {
  49.                                 entIds.append(pEnt->objectId());
  50.                         }
  51.                         pEnt->close();
  52.                 }
  53.                 else
  54.                 {
  55.                         acutPrintf(TEXT("\nCDwgDatabaseUtil::GetAllEntityIds中打开实体失败(错误代码:%d)."), (int)es);
  56.                 }
  57.         }
  58.         delete it;
  59.         pBlkTblRcd->close();
  60.         //释放资源,关闭打开的对象和迭代器
  61.         return entIds; //返回满足条件的实体对象ID数组。
  62. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 14:20 , Processed in 0.143019 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表