实体的选中
//提示用户选择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]