admin 发表于 2024-3-6 11:47:27

实体的选中

//提示用户选择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)) {
                                                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)) {
                                        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);
}
页: [1]
查看完整版本: 实体的选中