- UID
- 739618
- 积分
- 526
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2014-10-22
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2016-10-4 14:56:12
|
显示全部楼层
谢谢指导,但我使用之后还是没有成功,下面将我的代码贴出来供您参考
// - YTMsupport.RT command (do not rename)
//按照x从小到大排序,当x相等时按照y从大到小排序
static int compare (const AcGePoint3d &p1 , const AcGePoint3d &p2)
{
if(fabs((p1.x-p2.x)) < 0.00001)
{
if (p1.y < p2.y)
return 1;
else
return -1;
}
else
{
if (p1.x > p2.x)
return 1;
else
return -1;
}
}
static void YTMsupportRT(void)
{
// Add your code for command YTMsupport.RT here
ads_name sset;
ads_point pt1,pt2;
struct resbuf *rb;
rb=acutBuildList(RTDXF0,_T("LINE,ARC,LWPOLYLINE"),RTNONE);
acutPrintf(_T("\n请选择砂面的轮廓线:"));
if(acedGetPoint(NULL,_T("\n请选择左上角点:"),pt1)!=RTNORM)
{
return;
}
if(acedGetCorner(pt1,_T("\n请输入右下角点:"),pt2)!=RTNORM)
{
return;
}
if(acedSSGet(_T("W"),pt1,pt2,rb,sset)!=RTNORM)
{
return;
}
long length=0;
acedSSLength(sset,&length);
acutPrintf(_T("\n实体数:%d"),length);
AcGePoint3dArray ptarry;
ptarry.setLogicalLength(0);
for(int i=0;i<length;i++)
{
ads_name ename;
Acad::ErrorStatus es;
acedSSName(sset,i,ename);
AcDbObjectId entId;
//获取图元ID
es=acdbGetObjectId(entId,ename);
if(es == Acad::eOk)
{
AcDbEntity *pEnt=NULL;
AcDbLine *pLine=NULL;
AcDbArc *pArc=NULL;
AcDb2dPolyline *p2dPline=NULL;
AcDb3dPolyline *p3dPline=NULL;
AcDbPolyline *pPline=NULL;
es=acdbOpenObject(pEnt,entId,AcDb::kForRead);
if(es == Acad::eOk)
{
if(pEnt->isKindOf(AcDbLine::desc()))
{
pLine=AcDbLine::cast(pEnt);
ptarry.append(pLine->startPoint());
ptarry.append(pLine->endPoint());
}
if(pEnt->isKindOf(AcDbArc::desc()))
{
pArc=AcDbArc::cast(pEnt);
//AcGePoint3d pt0(0,0,0);
AcGePoint3d pcen=pArc->center();
//CCreatEnt::YTMAddLine(pt0,pcen);
AcGePoint3d pstar;
pstar[X]=pcen[X]+cos(pArc->startAngle())*(pArc->radius());
pstar[Y]=pcen[Y]+sin(pArc->startAngle())*(pArc->radius());
pstar[Z]=0;
AcGePoint3d pend;
pend[X]=pcen[X]+cos(pArc->endAngle())*(pArc->radius());
pend[Y]=pcen[Y]+sin(pArc->endAngle())*(pArc->radius());
pend[Z]=0;
//CCreatEnt::YTMAddLine(pstar,pend);
ptarry.append(pstar);
ptarry.append(pend);
}
if(pEnt->isKindOf(AcDb3dPolyline::desc()))
{
p3dPline=AcDb3dPolyline::cast(pEnt);
AcDbObjectIterator* pVertsIter=p3dPline->vertexIterator();
AcDb3dPolylineVertex* pVertex=NULL;
AcDbObjectId vertexId;
for(;!pVertsIter->done();pVertsIter->step())
{
vertexId=pVertsIter->objectId();
p3dPline->openVertex(pVertex,vertexId,AcDb::kForRead);
ptarry.append(pVertex->position());
}
delete pVertsIter;
}
if(pEnt->isKindOf(AcDb2dPolyline::desc()))
{
p2dPline=AcDb2dPolyline::cast(pEnt);
AcDbObjectIterator *pVertIter = p2dPline->vertexIterator();
//对顶点进行遍历
AcDb2dVertex *pVertex;
AcGePoint3d location;
AcDbObjectId vertexobjectId;
for (int vertexNumber = 0; !pVertIter->done(); vertexNumber++, pVertIter->step())
{
//打开矢量对象
vertexobjectId = pVertIter->objectId();
if(acdbOpenObject(pVertex, vertexobjectId,AcDb::kForRead)!=Acad::eOk)
{
return;
}
//获得矢量对象的坐标
location = pVertex->position();
pVertex->close();
//输出坐标
//acutPrintf(L"\nVertox %d location is : %0.3f, %0.3f, %0.3f", vertexNumber, location[X], location[Y], location[Z]);
ptarry.append(location);
}
delete pVertIter;
}
if(pEnt->isKindOf(AcDbPolyline::desc()))
{
pPline=AcDbPolyline::cast(pEnt);
for(int i=0;i<pPline->numVerts();i++)
{
AcGePoint3d pt;
pPline->getPointAt (i,pt);
ptarry.append(pt);
}
}
}
if(pEnt!=NULL)
{
pEnt->close();
}
if(pLine!=NULL)
{
pLine->close();
}
if(pArc!=NULL)
{
pArc->close();
}
if(p2dPline!=NULL)
{
p2dPline->close();
}
if(p3dPline!=NULL)
{
p3dPline->close();
}
}
}
AcGeVector3d v1(0,5,0);
for(int i=0;i<ptarry.length();i++)
{
CString strtmp;
//strtmp.Format(_T("%.2f,%.2f,%.2f"),ptarry.at(i)[X],ptarry.at(i)[Y],ptarry.at(i)[Z]);
strtmp.Format(_T("%d"),i);
CCreatEnt::SetColor(CCreatEnt::YTMAddMText(ptarry.at(i)+v1,strtmp),3);
}
std::sort(ptarry.asArrayPtr(),ptarry.asArrayPtr()+ptarry.logicalLength(),compare);
AcGeVector3d v2(0,-5,0);
for(int i=0;i<ptarry.length();i++)
{
CString strtmp;
//strtmp.Format(_T("%.2f,%.2f,%.2f"),ptarry.at(i)[X],ptarry.at(i)[Y],ptarry.at(i)[Z]);
strtmp.Format(_T("%d"),i);
CCreatEnt::SetColor(CCreatEnt::YTMAddMText(ptarry.at(i)+v2,strtmp),1);
}
AcGePoint3d ptright=ptarry.at(0);
AcGePoint3d ptleft=ptarry.at(ptarry.length()-1);
CCreatEnt::YTMAddMText(ptright,_T("左"));
CCreatEnt::YTMAddMText(ptleft,_T("右"));
int n = ptarry.logicalLength();
AcGePoint3d * pts = new AcGePoint3d[n];
for (int i = 0;i<n;i++)
{
pts = ptarry;
}
qsort(pts,n,sizeof(AcGePoint3d),comp_x);
acutPrintf(_T("\n排序后结果是:"));
for (int i = 0;i<n;i++)
{
acutPrintf(_T("\n第 %d的坐标是: %.1f , %.1f"),i,pts.x,pts.y);
}
delete [] pts;
pts = NULL;
acutRelRb(rb);
acedSSFree(sset);
acutPrintf(_T("\n轮体旋转完成!壹加技术."));
}
static int comp_x(const void *p1,const void *p2 )
{
if (((AcGePoint3d *)p1)->x < ((AcGePoint3d *)p2)->x)
return -1;
else
return (((AcGePoint3d *)p1)->x == ((AcGePoint3d *)p2)->x) ? 0 : 1;
}
代码中红色部分来源于http://www.objectarx.net/forum.p ... page=1&tid=9516中高飞鸟的代码,他的排序是正确的。由于我的代码没有对直线相接处的端点进行去重复点,所以序号文字会有重叠的。我想求的是多个直线、圆弧、多段线的最左、最右点(当X坐标相同时,取Y值最小的点),您的排序最左、最右点分别是第二和倒数第二个点,且顺序好像不太对。
|
|