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

  • 相关阅读:
    NET与Matlab结合 —— 最小二乘法直线拟合(C#)
    C#基础概念二十五问
    C# where子句
    最小二乘法
    蛙蛙推荐:一套.net窗体身份验证方案(解决了防止用户重复登陆,session超时等问题)
    在 ASP.NET 上实现锁定表头、支持滚动的表格的做法
    一个使用泛型的工厂类
    反射技术与设计模式
    ASP.NET实现匿名访问控制
    危险字符过滤的类
  • 原文地址:https://www.cnblogs.com/NewAutoMan/p/6464081.html
Copyright © 2020-2023  润新知