【CAD二次开发】使用选择集删除矩形框中的所有图形
开发环境-VS2008+ObjectARX2010+autocad2010
(1)使用向导创建一个新项目SelectionRect,新建命令Rectdel
在入口函数处写如下代码
acrxEntryPoint.cpp
ads_point startPt;
if (acedGetPoint(NULL, _T("请输入起点:"), startPt) != RTNORM)
{
return;
}
ads_point endPt;
if (acedGetCorner(startPt, _T("请输入终点:"), endPt) != RTNORM)
{
return;
}
① 这里的acedGetPoint() 和 acedGetCorner() 函数正好可以获取一个动态的矩形框
//矩形框的位置
AcGePoint3d startPoint = asPnt3d(startPt);
AcGePoint3d endPoint = asPnt3d(endPt);
startPt 和 endPt 属于点的类型,需要转化为 AcGePoint3d 类型,以便后续的使用
double dist = startPoint.distanceTo(endPoint);
AcGeVector3d curVec(endPoint - startPoint);//计算当前向量
AcGeVector2d vec; //取得对角向量
vec.x = curVec[X];
vec.y = curVec[Y];
double angle = vec.angle(); //当前向量与x轴之间的夹角
AcGePoint3d point1 = startPoint; //矩形第一个角点
AcGePoint3d point2;
point2[X] = startPoint[X] + dist * cos(angle);
point2[Y] = startPoint[Y];
point2[Z] = startPoint[Z];
AcGePoint3d point3 = endPoint;//矩形第三个角点
AcGePoint3d point4;
point4[X] = startPoint[X];
point4[Y] = startPoint[Y] + dist * sin(angle);
point4[Z] = startPoint[Z];
计算矩形的各个角点,确定矩形框的位置范围。
②接下来构建选择集,创建缓冲区链表
//选择集
ads_name ssname;
struct resbuf *pointList; // 结果缓冲区链表
//选择被指定多边形包围的所有实体
pointList = acutBuildList(RTPOINT, point1, RTPOINT, point2, RTPOINT, point3, RTPOINT, point4, 0);
if (acedSSGet(_T("WP"), pointList, NULL, NULL, ssname) != RTNORM)
{
return;
}
acutRelRb(pointList); //释放链表空间
acedSSGet 方式会自己闭合曲线,WP表示圈围模式(各种不同的模式读者可以自行探索)
③ 从选择集中删除实体图形
//遍历选择集,删除所有的实体
long length;
ads_name entName;
if (acedSSLength(ssname, &length) != RTNORM)
{
return;
}
for (long i = 0; i < length; i++)
{
if (acedSSName(ssname, i, entName) != RTNORM) //将指定位置的实体名称给到entName
{
continue;
}
AcDbObjectId entId;
if (acdbGetObjectId(entId, entName) != Acad::eOk)
{
return;
}
AcDbEntity *pEnt;
if (acdbOpenObject(pEnt, entId, AcDb::kForWrite) != Acad::eOk)
{
return;
}
pEnt->erase(true);//删除实体对象
pEnt->close();
}
acedSSFree(ssname); //释放选择集
最后需要释放选择集,以免造成内存泄漏。