ObdecARX 动态拖动矩形框删除图形

【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);  //释放选择集

最后需要释放选择集,以免造成内存泄漏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值