objectarx2023开发记录,获取多段线顶点坐标

1、获取已有对象

需要使用acedSSGet函数。其中-b表示取消框选,只能点选

:S则表示选择单个实体。

		ads_name ss;

		resbuf rb;
		rb.restype = 0;
		rb.resval.rstring = _T("LWPOLYLINE");
		rb.rbnext = NULL;

		int rt = acedSSGet(_T("-b:S"), NULL, NULL, &rb, ss);

获取时,需要判断是否获取成功,返回RTNORM参数,则表示返回成功。

返回RTCAN表示用户按下ESC键。

2、处理获取的对象

acedSSName函数,获取其名称,以及对应序号的实体返回值。如下:

			ads_name entres;
			acedSSName(ss, 0, entres);

获取实体id,使用acdbGetObjectId函数,如下:

			AcDbObjectId ssId;
			acdbGetObjectId(ssId, entres);

根据ID,已某种方式,打开对象,使用acdbOpenObject函数,获取实体。如下:

			AcDbEntity* pEnt;
			acdbOpenObject(pEnt, ssId, AcDb::kForRead);

判断实体是否为指定对象,使用isKindOf函数,这里判断是否为多段线,如下:

if (pEnt->isKindOf(AcDbPolyline::desc()))
{
    
}

从实体中获取多段线AcDbPolyline::cast(pEnt);如下:

				AcDbPolyline* pPolyline;
				pPolyline = AcDbPolyline::cast(pEnt);

遍历多段线,获取每个顶点的坐标,使用getPointAt函数,如下:

				num = pPolyline->numVerts();
				//acutPrintf(TEXT("num:%d\n"), num);

				for (int j = 0; j < num; j++)
				{
					AcGePoint2d pt;
					if (pPolyline->getPointAt(j, pt) == eOk)
					{
						*pA = pt;
						pA += 1;
						//acutPrintf(TEXT("XY:%g,%g\n"), pt.x, pt.y);
					}
				}
				pPolyline->close();

使用完多段线指针,需使用close()关闭。否则多段线将无法执行操作。

3、使用的函数总结:

acedSSGet();---获取对象
acedSSName();---获得的对象名称
acdbGetObjectId();----获取对象的ID
acdbOpenObject();-----打开获取的对象
isKindOf();------判断实体的类型
desc();-------实体类型获取函数
cast();-------从实体中获取多段线
numVerts();-----多段线指针的,获取顶点数量函数
getPointAt();-----获取多段线顶点坐标的函数
close();------指针关闭函数,使用完需关掉
acedSSFree();----关闭选择集的函数,释放资源

4、整体代码如下:

	//*************************获取坐标函数**********************************
	static void GetPolylineCoordinates(AcGePoint2d* pA, int& num)
	{
		ads_name ss;

		resbuf rb;
		rb.restype = 0;
		rb.resval.rstring = _T("LWPOLYLINE");
		rb.rbnext = NULL;

		int rt = acedSSGet(_T("-b:S"), NULL, NULL, &rb, ss);
		if (rt == RTNORM)
		{
			acutPrintf(TEXT("已选1个\n"));
			ads_name entres;
			acedSSName(ss, 0, entres);

			AcDbObjectId ssId;
			acdbGetObjectId(ssId, entres);

			AcDbEntity* pEnt;
			acdbOpenObject(pEnt, ssId, AcDb::kForRead);

			if (pEnt->isKindOf(AcDbPolyline::desc()))
			{
				AcDbPolyline* pPolyline;
				pPolyline = AcDbPolyline::cast(pEnt);
				num = pPolyline->numVerts();
				//acutPrintf(TEXT("num:%d\n"), num);

				for (int j = 0; j < num; j++)
				{
					AcGePoint2d pt;
					if (pPolyline->getPointAt(j, pt) == eOk)
					{
						*pA = pt;
						pA += 1;
						//acutPrintf(TEXT("XY:%g,%g\n"), pt.x, pt.y);
					}
				}
				pPolyline->close();
			}
			pEnt->close();
			acedSSFree(entres);
		}
		else if (rt == RTCAN)
		{
			acutPrintf(TEXT("取消\n"));
		}
		else if (rt == RTREJ)
		{
			acutPrintf(TEXT("输入无效\n"));
		}
		else
		{
			acutPrintf(TEXT("输入失效2\n"));
		}
		acedSSFree(ss);


	}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值