天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 141|回复: 0

实体的选中

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 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. }
    复制代码

     

     

     

     

    实体的选中
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 07:00 , Processed in 0.209100 second(s), 36 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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