在ObjectARX二次开发中,有两种方式可以获取点周围的闭合区域,
- 程序中向AutoCAD发送“-boundary”命令,获取边界集合。
- 在R18以上平台,使用acedTraceBoundary 函数。
方法一
下述例程可以获取点周围闭合区域边界的选择集,注意选择集里为多段线实体。
void CmdFindBoundary()
{
ads_point ptInput;
ads_name entPrevious;
ads_name entLast;
ads_name ssBoundary;
acdbEntLast(entPrevious); //在获取闭合区域之前文档的最后一个实体名
if (RTNORM == acedGetPoint(NULL, _T("\n请点取一个内部点"), ptInput))
{
acedSSAdd(NULL, NULL, ssBoundary);
acedCommand(RTSTR, _T("-BOUNDARY"), RTSTR, _T("A"), RTSTR, _T("I"), RTSTR, _T("Y"), RTSTR, _T("O"), RTSTR, _T("P"), RTSTR, _T(""), RTPOINT, ptInput, RTSTR, _T(""), RTNONE);
while (RTNORM == acdbEntNext(entPrevious, entLast))
{
acedSSAdd(entLast, ssBoundary, ssBoundary); //该集合将所有多段线边界都添加进来
ads_name_set(entLast, entPrevious);
}
int32_t lLenSS=0;
acedSSLength(ssBoundary, &lLenSS);
if (lLenSS)
{
ads_name ent;
for (int32_t i = 0; i < lLenSS; i++)
{
acedSSName(ssBoundary, i, ent);
acedRedraw(ent, 3); //高亮显示边界
}
acedGetPoint(NULL, _T("\n请点取任意一点结束命令"), ptInput);
}
acedSSFree(ssBoundary);
}
}
方法二
利用下述接口,该接口仅暴露在R18以上平台,使用非常容易,大家参见帮助文档即可。
Acad::ErrorStatus acedTraceBoundary(
const AcGePoint3d& seedPoint,
bool detectIslands,
AcDbVoidPtrArray& resultingBoundarySet
);
写作不易,觉得文章拿得出手,就请点个赞吧!