设为首页收藏本站

中国膜结构网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 208|回复: 0

ARX 沿着多段线绘制一定距离,递归执行

[复制链接]
  • TA的每日心情
    开心
    2021-6-23 14:19
  • 签到天数: 1543 天

    [LV.Master]伴坛终老

    发表于 2021-1-26 19:22 | 显示全部楼层 |阅读模式
    //from:起点,to:终点(这两点要相邻)
    //paramDis:沿着多段线画多长
    //pl:多段线
    //pPoly:新的多段线
    static void DrawByLen(const bool& gotoNext ,const AcGePoint2d& from,const AcGePoint2d& to,const double& paramDis,const AcDbPolyline* pl,AcDbPolyline* pPoly,int& polyIndex)
    {
    if(paramDis <= 0)
    {
    return;
    }
    int len = pl->numVerts();

    AcGeCircArc2d arc2d;
    AcGeLineSeg2d line2d;


    AcGePoint2d ptS;
    AcGePoint2d ptE;
    bool isFind = false;
    int plIndex = 0;
    AcGeCurve2d* pCurve = NULL;

    for(int i = 0;i < len;i++)
    {
    AcDbPolyline::SegType st = pl->segType(i);

    if(st == AcDbPolyline::SegType::kArc)
    {
    pl->getArcSegAt(i,arc2d);
    pCurve = &arc2d;
    }
    else if(st == AcDbPolyline::SegType::kLine)
    {
    pl->getLineSegAt(i,line2d);
    pCurve = &line2d;
    }


    if(!pCurve->hasStartPoint(ptS) || !pCurve->hasEndPoint(ptE))
    {
    continue;
    }

    if(ptS == from && ptE == to || ptS == to && ptE == from)
    {
    plIndex = i;
    isFind = true;
    break;
    }
    }


    double sumDis = 0.0;
    if(isFind)
    {
    DrawIt(gotoNext,pl,paramDis,from,polyIndex,plIndex,sumDis,pPoly);
    }
    else
    {
    acutPrintf(_T("\nnot found"));
    }
    }


    //summary////
    //指定一个起点和一条多段线,沿着多段线画出指定距离,递归执行,每次往后(前)移动一个点,直到画完指定的距离,
    //pl:多段线
    //paramDis:画多长
    //ptStart:起始点
    //polyIndex:添加到第几个了
    //plIndex,遍历到多段线第几条线
    //isSToE,遍历的顺序1:从前向后  0:从后向前
    //sumDis,目前画的总长度
    //pPoly:画出来的多段线
    static void DrawIt(const bool& gotoNext,const AcDbPolyline* pl,const double& paramDis,const AcGePoint2d& ptStart,int& polyIndex,int& plIndex,double& sumDis,AcDbPolyline* pPoly)
    {

    AcDbPolyline::SegType st = pl->segType(plIndex);
    AcGePoint2d ptS;
    AcGePoint2d ptE;
    double leftDis = 0.0;
    double curveDis = 0.0;
    double bulge = 0.0;
    AcGeCurve2d* pCurve = NULL;
    AcGeCircArc2d arc2d;
    AcGeLineSeg2d line2d;
    int len = pl->numVerts();


    if(polyIndex == 2*(len - 2))
    {
    acutPrintf(_T("\nend poly is %d"),polyIndex);
    return;
    }


    if(st == AcDbPolyline::SegType::kArc)
    {
    pl->getArcSegAt(plIndex,arc2d);
    pCurve = &arc2d;////!!!注意:指针的生命周期一定要大于等于指向的变量的生命周期,否则变量release掉指针就空了,再次使用指针程序直接崩溃!!
    }
    else if(st == AcDbPolyline::SegType::kLine)
    {
    pl->getLineSegAt(plIndex,line2d);
    pCurve = &line2d;
    }
    if(!pCurve->hasStartPoint(ptS) || !pCurve->hasEndPoint(ptE))
    {
    return;
    }
    curveDis = pCurve->length(pCurve->paramOf(ptS),pCurve->paramOf(ptE));
    leftDis = paramDis - sumDis;


    pl->getBulgeAt(plIndex,bulge);


    if(curveDis > leftDis)
    {
    double paramEnding = 0.0;

    if(gotoNext)
    {
    AcGePoint2d ptEnding;
    AcGePoint2d ptS;
    pCurve->hasStartPoint(ptS);
    GetPtAtDistOnCurve(pCurve,ptS,leftDis,ptEnding,Adesk::kTrue);


    bulge = tan(atan(bulge) * leftDis/curveDis);


    pPoly->addVertexAt(polyIndex,ptS,bulge);
    polyIndex ++;
    pPoly->addVertexAt(polyIndex,ptEnding);
    }
    else
    {
    AcGePoint2d ptEnding;
    AcGePoint2d ptE;
    pCurve->hasEndPoint(ptE);
    GetPtAtDistOnCurve(pCurve,ptE,leftDis,ptEnding,Adesk::kFalse);


    bulge = tan(atan(bulge) * leftDis/curveDis);


    pPoly->addVertexAt(polyIndex,ptE,-bulge);
    polyIndex ++;
    pPoly->addVertexAt(polyIndex,ptEnding);
    }
    return;
    }
    else
    {
    if(gotoNext)
    {
    pPoly->addVertexAt(polyIndex,ptS,bulge);
    polyIndex ++;
    pPoly->addVertexAt(polyIndex,ptE);
    polyIndex ++;
    //acutPrintf(_T("\nplIndex is %d,poly is %d。is goto next,bulge is %.2f"),plIndex,polyIndex,bulge);
    }
    else
    {
    pPoly->addVertexAt(polyIndex,ptE,-bulge);
    polyIndex ++;
    pPoly->addVertexAt(polyIndex,ptS);
    polyIndex ++;

    }
    /*acutPrintf(_T("\nptS[X] :%.2f,ptS[Y]:%.2f,ptE[X]:%.2f,ptE[Y]:%.2f"),ptS[X],ptS[Y],ptE[X],ptE[Y]);*/
    sumDis += curveDis;

    }


    if(gotoNext)
    {
    plIndex = plIndex < len - 1  ? ++plIndex : 0;
    }
    else
    {
    plIndex = plIndex > 0 ? --plIndex : len - 1;
    }


    DrawIt(gotoNext,pl,paramDis,ptStart,polyIndex,plIndex,sumDis,pPoly);


    }

    ////反回曲线上一定距离的点(默认从起点开始计算)
    ////pCurve:曲线指针,dist:距离,point:要返回的点
    ////Adesk::Boolean isGotoNext  true:沿着正向寻找,false:沿着反方向寻找
    static void GetPtAtDistOnCurve(const AcGeCurve2d* pCurve,const AcGePoint2d& ptInput,double dist,AcGePoint2d& point,Adesk::Boolean isGotoNext)
    {
    if(pCurve == NULL)
    {
    return;
    }
    AcGePoint2d ptS;
    ptS = ptInput;
    double pa = 0.0;
    double datumParam = 0.0;
    //Adesk::Boolean posParamDir = Adesk::kTrue;

    datumParam = pCurve->paramOf(ptS);
    pa = pCurve->paramAtLength(datumParam,dist,isGotoNext);
    point = pCurve->evalPoint(pa);
    }
    回复


    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构工程服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系电话:198-7840-1958,QQ:463017170.
    相关关键词:膜结构车棚,膜结构车棚覆盖,膜结构车棚公司,膜结构车棚多少钱,膜结构车棚厂家,膜结构车棚价格,社区膜结构车棚,膜结构车棚膜布厂家 ,膜结构车棚哪家好,膜结构车棚多少钱一米,膜结构车棚报价,膜结构车棚哪里有,膜结构车棚定制,膜结构车棚安装,膜结构车棚设计,膜结构车棚电话,膜结构车棚加工,膜结构车棚膜布价格,膜结构车棚批发,膜结构车棚制造商,膜结构车棚生产厂家,膜结构车棚设计,膜结构车棚施工,膜结构车棚多少钱一平米,膜结构车棚订制,张拉膜车棚,张拉膜车棚覆盖,张拉膜车棚公司,张拉膜车棚多少钱,张拉膜车棚厂家,张拉膜车棚价格,社区张拉膜车棚,张拉膜车棚膜布厂家 ,张拉膜车棚哪家好,张拉膜车棚多少钱一米,张拉膜车棚报价,张拉膜车棚哪里有,张拉膜车棚定制,张拉膜车棚安装,张拉膜车棚设计,张拉膜车棚电话,张拉膜车棚加工,张拉膜车棚膜布价格,张拉膜车棚批发,张拉膜车棚制造商,张拉膜车棚生产厂家,张拉膜车棚设计,张拉膜车棚施工,张拉膜车棚多少钱一平米,张拉膜车棚订制,常用膜材品牌:德国杜肯、法国法拉利、德国海德斯、德国米乐、日本平岗、韩国秀博、比利时希运、美国赫虏伯、中国科宝、上海慧遥。

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    推荐膜材品牌上一条 /6 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构

    QQ|申请友链|手机版|中国膜结构论坛