首页 > 代码库 > 按顺序等距排列平行直线

按顺序等距排列平行直线

技术分享

static void zffObjectARX_MyCommand17(void)
{
ads_name ss;
AcDbVoidPtrArray ents;
if (acedSSGet(NULL,NULL,NULL,NULL,ss)!=RTNORM)
{
acedAlert(_T("选择实体失败!"));
return;
}
AcGePoint3dArray pts;
long num;
acedSSLength(ss,&num);
if (num<3)
{
acedAlert(_T("无需均分!"));
return;
}
for (int i=0;i<num;i++)
{
AcDbObjectId entId;
AcDbEntity* pEnt=NULL;
ads_name name;
AcGePoint3d pt;

acedSSName(ss,i,name);
acdbGetObjectId(entId,name);
if (acdbOpenObject(pEnt,entId,AcDb::kForWrite)!=Acad::eOk)
{
acedAlert(_T("部分实体打开失败,无法均分!"));
pEnt->close();
return;
}
if (pEnt->isKindOf(AcDbLine::desc()))
{
AcDbLine* pLine=AcDbLine::cast(pEnt);
pLine->getClosestPointTo(AcGePoint3d::kOrigin,pt,Adesk::kTrue);
pts.append(pt);
ents.append(static_cast<void*>(pLine));
}
else
{
pEnt->close();
}
}
acedSSFree(ss);
AcGePoint3d pt1,pt2;
double dist=0,dist1;
long len=pts.length();
for (int i=0;i<len;i++)
{
for (int j=i+1;j<len;j++)
{
dist1=pts[i].distanceTo(pts[j]);
if (dist1>dist)
{
dist=dist1;
pt1=pts[i];
pt2=pts[j];
}
}
}
pts.remove(pt1);
pts.remove(pt2);
int m,n=0;
for (int j=0;j<pts.length();)
{
dist=pt1.distanceTo(pt2);
for (int i=0;i<pts.length();i++)
{
dist1=pts[i].distanceTo(pt1);
if (dist1<dist)
{
dist=dist1;
m=i;
}
}
AcGeVector3d vec=pt1-pts[m]-(pt1-pt2)*(n+1)/(len-1);
AcGeMatrix3d max;
max.setToTranslation(vec);
for (int i=0;i<ents.length();i++)
{
AcDbLine* pLine=static_cast<AcDbLine*>(ents[i]);
AcGePoint3d ptclose;
pLine->getClosestPointTo(pts[m],ptclose,Adesk::kTrue);

if (pts[m].distanceTo(ptclose)<0.001)
{
pLine->transformBy(max);
}
}
pts.remove(pts[m]);
n++;
}
for (int i=0;i<ents.length();i++)
{
AcDbLine* pLine1=static_cast<AcDbLine*>(ents[i]);
pLine1->close();
}
}

按顺序等距排列平行直线