找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1493|回复: 1

[每日一码] ARX 沿着多段线指定距离画线(递归执行)

[复制链接]

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-10-26 14:15:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
//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);  
}  

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 2450个

财富等级: 金玉满堂

发表于 2016-10-27 09:40:18 | 显示全部楼层
学习!!!!!!!!!!!!!!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 18:25 , Processed in 0.341704 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表