|
- //提示用户选择AutoCAD中的实体,并将所选择的实体的ID添加到一个AcDbObjectIdArray数组中。
- bool CSelectUtil::PromptSelectEnts(const TCHAR * prompt, resbuf * rb,
- AcDbObjectIdArray & entIds)//(提示字符串,指向resbuf的指针,id数组引用entIds。返回类型为布尔值)
- {
- ads采用name selName;
- acutPrintf(prompt);//打印出传入的提示字符串
- int rc = acedSSGet(NULL, NULL, NULL, rb, selName);
- //提示用户选择实体。选择的结果存储在selName中,并返回一个整数rc作为结果代码
- if (rc == RTNORM) {//用户正常选择了实体
- int length;
- acedSSLength(selName, &length);// 获取用户选择实体的数量
- for (int i = 0; i < length; i++)//循环遍历每一个选择的实体
- {
- ads采用name name;
- acedSSName(selName, i, name);//获取第i个选择实体的名称
- AcDbObjectId oId;
- if (acdbGetObjectId(oId, name) == ErrorStatus::eOk) {
- entIds.append(oId);//尝试获取实体的ID。如果成功将该ID添加到entIds数组中
- }
- }
- acedSSFree(selName);//释放与selName相关的内存
- return true;//如果用户正常选择了实体,则返回true
- }
- else {
- acedSSFree(selName);//释放与selName相关的内存
- acutPrintf(采用T("\n用户没有选择任何实体或者发生了错误"));
- return false;
- }
- }
- //提示用户选择实体并获取选定实体ID(提示用户进行选择的消息,保存选择集,保存类描述,保存选定的实体ID)
- bool CSelectUtil::PromptSelectEnts(const TCHAR * prompt, resbuf * rb, std::vector<AcRxClass*>& classDescs, AcDbObjectIdArray & entIds)
- {
- ads采用name selName;
- acutPrintf(prompt);//打印提示消息(prompt)
- int rc = acedSSGet(NULL, NULL, NULL, rb, selName);
- if (rc == RTNORM) {
- int length;
- acedSSLength(selName, &length);
- for (int i = 0; i < length; i++)
- {
- ads采用name name;
- acedSSName(selName, i, name);
- AcDbObjectId oId;
- if (acdbGetObjectId(oId, name) == ErrorStatus::eOk) {
- AcDbEntity *ent = NULL;
- if (acdbOpenObject(ent, oId) != ErrorStatus::eOk) {
- continue;
- }
- for (int j = 0; j < (int)classDescs.size(); j++)
- {
- if (ent->isKindOf(classDescs[j])) {
- entIds.append(ent->objectId());
- break;
- }
- }
- ent->close();
- }
- }
- }
- acedSSFree(selName);
- return (entIds.length() > 0);
- }
-
- bool CSelectUtil::PromptSelectEnts(const TCHAR * prompt, resbuf * rb, AcRxClass *& classDescs, AcDbObjectIdArray & entIds)
- {
- std::vector<AcRxClass*> vec;
- vec.push采用back(classDescs);//将classDescs添加到了vec的尾部
- return CSelectUtil::PromptSelectEnts(prompt, rb, vec, entIds);
- }
- //提示用户选择一个实体,并检查所选实体是否符合一系列指定的类描述(...,包含类描述的向量,用于返回所选实体的引用,用于存储选择点的pickPoint,布尔值(决定打开实体的模式是只读还是可写)。
- bool CSelectUtil::PromptSelectEntity(const TCHAR * prompt, std::vector<AcRxClass*>& classDescs, AcDbEntity *& pEnt, AcGePoint3d & pickPoint, bool bOpenForWrite)
- {
- ads采用name entName;
- // 如果用户没有选择有效的实体(例如,取消了选择),代码会跳转到标签RETRY,重新提示用户进行选择。
- RETRY:if (acedEntSel(prompt, entName, asDblArray(pickPoint)) == RTNORM)
- {
- AcDbObjectId oId;
- //尝试从AutoCAD的内部名称空间获取所选实体的对象ID。如果成功,它将返回ErrorStatus::eOk。
- if (acdbGetObjectId(oId, entName) == ErrorStatus::eOk)
- //提示用户选择一个实体,并将所选实体的名称存储在entName中,同时将选择点存储在pickPoint中。
- {
- ErrorStatus es;
- if (bOpenForWrite) //决定是以写入模式还是读取模式打开所选实体
- {
- es = acdbOpenObject(pEnt, oId, AcDb::OpenMode::kForWrite);
- }
- else {
- es = acdbOpenObject(pEnt, oId, AcDb::OpenMode::kForRead);
- }
- //如果打开实体失败(例如,因为权限问题或实体不存在),函数会返回false。
- if (es != ErrorStatus::eOk) {
- pEnt = NULL;
- return false;
- }//否则,它会检查所选实体是否属于classDescs中的任何一个类
- else {
- bool ret = false;
- for (int i = 0; i < (int)classDescs.size(); i++)
- { //检查所选实体是否属于指定的类
- if (pEnt->isKindOf(classDescs[i])) {
- ret = true;
- break;
- }
- else
- {
- pEnt = NULL;
- return false;
- }
- }
- if (ret)
- return true;
- else {
- pEnt->close();
- acutPrintf(L"\n选择的实体类型不符合要求,请再次选择...");
- goto RETRY;
- }
- }
- }
- else
- { //如果用户没有选择有效的实体(例如,取消了选择),这个调用会失败
- pEnt = NULL;
- return false;
- }
- }
-
- bool CSelectUtil::PromptSelectEntity(const TCHAR * prompt, AcRxClass *& classDescs, AcDbEntity *& pEnt, AcGePoint3d & pickPoint, bool bOpenForWrite)
- {
- std::vector<AcRxClass*>vec;
- vec.push采用back(classDescs);//将参数classDescs添加到向量vec中
- return CSelectUtil::PromptSelectEntity(prompt, vec, pEnt, pickPoint, bOpenForWrite);
- }
复制代码 |
|