zoukankan      html  css  js  c++  java
  • 2021年1月1日 AutoCAD.Net/C#.Net QQ群:193522571 按顺序等距排列平行直线

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

  • 相关阅读:
    动手动脑
    编写一个程序,用户输入两个数,求出其加减乘除,并用消息框显示计算结果
    实验报告
    《大道至简第二章读后感》
    《大道至简》第一章读后感
    CentOS 6.x 播放 mp3 音乐 —— 成功
    CentOS下通过rdesktop连接Windows远程桌面
    Linux之文件系统的简单操作
    Linux之档案管理
    如何判断raid1中哪块硬盘损坏?
  • 原文地址:https://www.cnblogs.com/NewAutoMan/p/6464081.html
Copyright © 2011-2022 走看看