CAD的框选功能包括从左往右框选和从右往左的交叉框选(其中交叉框选会出现漏掉一些元素的问题)
区别:
窗口框选:将所有完全在框选区域内的元素选中
交叉框选:将所有接触到框选区域内的元素选中
CAD框选 代码
//获取被选中的选择集合
ads_name slist;
struct resbuf* ptr = ads_buildlist(0);
if (acedSSGet(NULL, NULL, NULL, ptr, slist) != RTNORM)//用户选择
{
ads_relrb(ptr);
}
ads_relrb(ptr);
//显示窗口
AdInt32 nNum;
if (ads_sslength(slist, &nNum) != RTNORM || nNum == 0)
{
ads_ssfree(slist);
return;
}
AcDbObjectIdArray selectIds;
selectIds.setLogicalLength(0);
AdInt32 len = 0;
acedSSLength(slist, &len);
AcDbObjectId objId;
for (long i = 0; i < len; i++)
{
ads_name entres;
acedSSName(slist, i, entres);
Acad::ErrorStatus sta = acdbGetObjectId(objId, entres);
if (sta != Acad::eOk)
continue;
selectIds.append(objId);
}
ads_ssfree(slist);
交叉框选 解决方法:通过两点式方法进行框选。
//获取被选中的选择集合
ads_name slist;
struct resbuf* ptr = ads_buildlist(0);
AcGePoint3d p1, p2;
if (ads_getpoint(NULL, _T("\n 选择第一点: "), asDblArray(p1)) != RTNORM)
{
//显示窗口
ShowWindow(SW_SHOW);
}
if (ads_getcorner(asDblArray(p1), _T("\n 选择对角点: "), asDblArray(p2)) != RTNORM)
{
//显示窗口
ShowWindow(SW_SHOW);
}
ads_point pt1, pt2;
pt1[0] = p1.x;
pt1[1] = p1.y;
pt1[2] = p1.z;
pt2[0] = p2.x;
pt2[1] = p2.y;
pt2[2] = p2.z;
if (acedSSGet(_T("W"), pt1, pt2, ptr, slist) != RTNORM)//用户选择
{
ads_relrb(ptr);
//显示窗口
ShowWindow(SW_SHOW);
}
ads_relrb(ptr);
//显示窗口
ShowWindow(SW_SHOW);
AdInt32 nNum;
if (ads_sslength(slist, &nNum) != RTNORM || nNum == 0)
{
ads_ssfree(slist);
return;
}
AcDbObjectIdArray selectIds;
selectIds.setLogicalLength(0);
AdInt32 len = 0;
acedSSLength(slist, &len);
AcDbObjectId objId;
for (long i = 0; i < len; i++)
{
ads_name entres;
acedSSName(slist, i, entres);
Acad::ErrorStatus sta = acdbGetObjectId(objId, entres);
if (sta != Acad::eOk)
continue;
selectIds.append(objId);
}
ads_ssfree(slist);