CAD的窗口框选(从左往右)和交叉框选(从右往左)

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);

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值