- UID
- 3262
- 积分
- 76
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-3-23
- 最后登录
- 1970-1-1
|
发表于 2004-11-15 12:53:39
|
显示全部楼层
采用这个那个算法的算半天,倒不如直接采用CAD的内部命令生成,即BPOLY,我觉得采用这个命令是最好的,送你一个函数:
void EditGridControl::PickVertexPoints(ads_point pt,AcGePoint3dArray &pts)
{//选近内部点的所有顶点的封闭多边形
//BeginEditorCommand(); //编辑命令开始
ads_name ssname,newname;
int nResult=acedSSGet("L", NULL, NULL, NULL, ssname); //取最后一个实体
if (nResult == RTCAN || nResult == RTERROR)
{
acutPrintf("当前图形没有任何图形实体!");
//CompleteEditorCommand(); // 编辑命令完成
acedSSFree(ssname);
return; //为空、错误则返回
}
Acad::ErrorStatus es;
ads_name entName;
AcDbObjectId objId,newId;
acedSSName( ssname, 0, entName );
es = acdbGetObjectId(objId, entName);
// ads_point pt;
// acedGetPoint(NULL, "\n指定内部点: ", pt) ;
// CompleteEditorCommand(); // 编辑命令完成
if (acedCommand(RTSTR, "BPOLY" , RT3DPOINT, pt, RTSTR,"",0) != RTNORM) return;// MessageBox("不成功");
nResult=acedSSGet("L", NULL, NULL, NULL, newname); //取最后一个实体
if (nResult == RTCAN || nResult == RTERROR) return; //为空、错误则返回
acedSSName( newname, 0, entName );
acedSSFree(ssname); //释放选择集,否则只能选128次
acedSSFree(newname); //释放选择集,否则只能选128次
es = acdbGetObjectId(newId, entName);
if(objId == newId)
{
//MessageBox("可能是未构成封闭图形,造成失败!请检查后重试");
return;
}
AcDbEntity *pEnt = NULL;
es = acdbOpenAcDbEntity(pEnt, newId, AcDb::kForWrite);
if(pEnt->isKindOf(AcDbPolyline::desc()) == Adesk::kTrue){ //实体为多义线
// acutPrintf(" 是一条多义线");
AcDbPolyline *Pline;
Pline=AcDbPolyline::cast(pEnt);
// pEnt->close();
for(unsigned int c=0;c<Pline->numVerts();c++)
{
AcGePoint3d pt1;
Pline->getPointAt(c,pt1);
pts.append(pt1);
}
// if (Pline->isClosed()) { //闭合则加开始顶点
// AcGePoint3d tmpPt = pts[0];
// pts.append(tmpPt);
pEnt->erase(true);
}
pEnt->close();
} |
|