找回密码
 立即注册

QQ登录

只需一步,快速开始

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

实体的选中

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-6 11:47:27 | 显示全部楼层 |阅读模式
  1. //提示用户选择AutoCAD中的实体,并将所选择的实体的ID添加到一个AcDbObjectIdArray数组中。
  2. bool CSelectUtil::PromptSelectEnts(const TCHAR * prompt, resbuf * rb,
  3.         AcDbObjectIdArray & entIds)//(提示字符串,指向resbuf的指针,id数组引用entIds。返回类型为布尔值)
  4. {
  5.         ads采用name selName;
  6.         acutPrintf(prompt);//打印出传入的提示字符串
  7.         int rc = acedSSGet(NULL, NULL, NULL, rb, selName);
  8.         //提示用户选择实体。选择的结果存储在selName中,并返回一个整数rc作为结果代码
  9.         if (rc == RTNORM) {//用户正常选择了实体
  10.                 int length;
  11.                 acedSSLength(selName, &length);// 获取用户选择实体的数量
  12.                 for (int i = 0; i < length; i++)//循环遍历每一个选择的实体
  13.                 {
  14.                         ads采用name name;
  15.                         acedSSName(selName, i, name);//获取第i个选择实体的名称
  16.                         AcDbObjectId oId;
  17.                         if (acdbGetObjectId(oId, name) == ErrorStatus::eOk) {
  18.                                 entIds.append(oId);//尝试获取实体的ID。如果成功将该ID添加到entIds数组中
  19.                         }
  20.                 }
  21.                 acedSSFree(selName);//释放与selName相关的内存
  22.                 return true;//如果用户正常选择了实体,则返回true
  23.         }
  24.         else {
  25.                 acedSSFree(selName);//释放与selName相关的内存
  26.                 acutPrintf(采用T("\n用户没有选择任何实体或者发生了错误"));
  27.                 return false;
  28.         }
  29. }
  30. //提示用户选择实体并获取选定实体ID(提示用户进行选择的消息,保存选择集,保存类描述,保存选定的实体ID)
  31. bool CSelectUtil::PromptSelectEnts(const TCHAR * prompt, resbuf * rb, std::vector<AcRxClass*>& classDescs, AcDbObjectIdArray & entIds)
  32. {
  33.         ads采用name selName;
  34.         acutPrintf(prompt);//打印提示消息(prompt)
  35.         int rc = acedSSGet(NULL, NULL, NULL, rb, selName);
  36.         if (rc == RTNORM) {
  37.                 int length;
  38.                 acedSSLength(selName, &length);
  39.                 for (int i = 0; i < length; i++)
  40.                 {
  41.                         ads采用name name;
  42.                         acedSSName(selName, i, name);
  43.                         AcDbObjectId oId;
  44.                         if (acdbGetObjectId(oId, name) == ErrorStatus::eOk) {
  45.                                 AcDbEntity *ent = NULL;
  46.                                 if (acdbOpenObject(ent, oId) != ErrorStatus::eOk) {
  47.                                         continue;
  48.                                 }
  49.                                 for (int j = 0; j < (int)classDescs.size(); j++)
  50.                                 {
  51.                                         if (ent->isKindOf(classDescs[j])) {
  52.                                                 entIds.append(ent->objectId());
  53.                                                 break;
  54.                                         }
  55.                                 }
  56.                                 ent->close();
  57.                         }
  58.                 }
  59.         }
  60.         acedSSFree(selName);
  61.         return (entIds.length() > 0);
  62. }
  63. bool CSelectUtil::PromptSelectEnts(const TCHAR * prompt, resbuf * rb, AcRxClass *& classDescs, AcDbObjectIdArray & entIds)
  64. {
  65.         std::vector<AcRxClass*> vec;
  66.         vec.push采用back(classDescs);//将classDescs添加到了vec的尾部
  67.         return CSelectUtil::PromptSelectEnts(prompt, rb, vec, entIds);
  68. }
  69. //提示用户选择一个实体,并检查所选实体是否符合一系列指定的类描述(...,包含类描述的向量,用于返回所选实体的引用,用于存储选择点的pickPoint,布尔值(决定打开实体的模式是只读还是可写)。
  70. bool CSelectUtil::PromptSelectEntity(const TCHAR * prompt, std::vector<AcRxClass*>& classDescs, AcDbEntity *& pEnt, AcGePoint3d & pickPoint, bool bOpenForWrite)
  71. {
  72.         ads采用name entName;
  73. // 如果用户没有选择有效的实体(例如,取消了选择),代码会跳转到标签RETRY,重新提示用户进行选择。
  74. RETRY:if (acedEntSel(prompt, entName, asDblArray(pickPoint)) == RTNORM)
  75. {
  76.         AcDbObjectId oId;
  77.         //尝试从AutoCAD的内部名称空间获取所选实体的对象ID。如果成功,它将返回ErrorStatus::eOk。
  78.         if (acdbGetObjectId(oId, entName) == ErrorStatus::eOk)
  79.         //提示用户选择一个实体,并将所选实体的名称存储在entName中,同时将选择点存储在pickPoint中。
  80.         {
  81.                 ErrorStatus es;
  82.                 if (bOpenForWrite) //决定是以写入模式还是读取模式打开所选实体
  83.                 {
  84.                         es = acdbOpenObject(pEnt, oId, AcDb::OpenMode::kForWrite);
  85.                 }
  86.                 else {
  87.                         es = acdbOpenObject(pEnt, oId, AcDb::OpenMode::kForRead);
  88.                 }
  89.                 //如果打开实体失败(例如,因为权限问题或实体不存在),函数会返回false。
  90.                 if (es != ErrorStatus::eOk) {
  91.                         pEnt = NULL;
  92.                         return false;
  93.                 }//否则,它会检查所选实体是否属于classDescs中的任何一个类
  94.                 else {
  95.                         bool ret = false;
  96.                         for (int i = 0; i < (int)classDescs.size(); i++)
  97.                         {   //检查所选实体是否属于指定的类
  98.                                 if (pEnt->isKindOf(classDescs[i])) {
  99.                                         ret = true;
  100.                                         break;
  101.                                 }
  102.                                 else
  103.                                 {
  104.                                         pEnt = NULL;
  105.                                         return false;
  106.                                 }
  107.                         }
  108.                         if (ret)
  109.                                 return true;
  110.                         else {
  111.                                 pEnt->close();
  112.                                 acutPrintf(L"\n选择的实体类型不符合要求,请再次选择...");
  113.                                 goto RETRY;
  114.                         }
  115.                 }
  116.         }
  117.         else
  118.         {   //如果用户没有选择有效的实体(例如,取消了选择),这个调用会失败
  119.                 pEnt = NULL;
  120.                 return false;
  121.         }
  122. }
  123. bool CSelectUtil::PromptSelectEntity(const TCHAR * prompt, AcRxClass *& classDescs, AcDbEntity *& pEnt, AcGePoint3d & pickPoint, bool bOpenForWrite)
  124. {
  125.         std::vector<AcRxClass*>vec;
  126.         vec.push采用back(classDescs);//将参数classDescs添加到向量vec中
  127.         return CSelectUtil::PromptSelectEntity(prompt, vec, pEnt, pickPoint, bOpenForWrite);
  128. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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