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

被折叠的 条评论
为什么被折叠?



