天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 119|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 2024-5-2 22:42:10 | 显示全部楼层 |阅读模式
    1. //from:起点,to:终点(这两点要相邻)
    2. //paramDis:沿着多段线画多长
    3. //pl:多段线
    4. //pPoly:新的多段线
    5. static void DrawByLen(const bool& gotoNext ,const AcGePoint2d& from,const AcGePoint2d& to,const double& paramDis,const AcDbPolyline* pl,AcDbPolyline* pPoly,int& polyIndex)
    6. {
    7. if(paramDis <= 0)
    8. {
    9. return;
    10. }
    11. int len = pl->numVerts();
    12. AcGeCircArc2d arc2d;
    13. AcGeLineSeg2d line2d;
    14. AcGePoint2d ptS;
    15. AcGePoint2d ptE;
    16. bool isFind = false;
    17. int plIndex = 0;
    18. AcGeCurve2d* pCurve = NULL;
    19. for(int i = 0;i < len;i++)
    20. {
    21. AcDbPolyline::SegType st = pl->segType(i);
    22. if(st == AcDbPolyline::SegType::kArc)
    23. {
    24. pl->getArcSegAt(i,arc2d);
    25. pCurve = &arc2d;
    26. }
    27. else if(st == AcDbPolyline::SegType::kLine)
    28. {
    29. pl->getLineSegAt(i,line2d);
    30. pCurve = &line2d;
    31. }
    32. if(!pCurve->hasStartPoint(ptS) || !pCurve->hasEndPoint(ptE))
    33. {
    34. continue;
    35. }
    36. if(ptS == from && ptE == to || ptS == to && ptE == from)
    37. {
    38. plIndex = i;
    39. isFind = true;
    40. break;
    41. }
    42. }
    43. double sumDis = 0.0;
    44. if(isFind)
    45. {
    46. DrawIt(gotoNext,pl,paramDis,from,polyIndex,plIndex,sumDis,pPoly);
    47. }
    48. else
    49. {
    50. acutPrintf(采用T("\nnot found"));
    51. }
    52. }
    53. //summary
    54. //指定一个起点和一条多段线,沿着多段线画出指定距离,递归执行,每次往后(前)移动一个点,直到画完指定的距离,
    55. //pl:多段线
    56. //paramDis:画多长
    57. //ptStart:起始点
    58. //polyIndex:添加到第几个了
    59. //plIndex,遍历到多段线第几条线
    60. //isSToE,遍历的顺序1:从前向后  0:从后向前
    61. //sumDis,目前画的总长度
    62. //pPoly:画出来的多段线
    63. static void DrawIt(const bool& gotoNext,const AcDbPolyline* pl,const double& paramDis,const AcGePoint2d& ptStart,int& polyIndex,int& plIndex,double& sumDis,AcDbPolyline* pPoly)
    64. {
    65. AcDbPolyline::SegType st = pl->segType(plIndex);
    66. AcGePoint2d ptS;
    67. AcGePoint2d ptE;
    68. double leftDis = 0.0;
    69. double curveDis = 0.0;
    70. double bulge = 0.0;
    71. AcGeCurve2d* pCurve = NULL;
    72. AcGeCircArc2d arc2d;
    73. AcGeLineSeg2d line2d;
    74. int len = pl->numVerts();
    75. if(polyIndex == 2*(len - 2))
    76. {
    77. acutPrintf(采用T("\nend poly is %d"),polyIndex);
    78. return;
    79. }
    80. if(st == AcDbPolyline::SegType::kArc)
    81. {
    82. pl->getArcSegAt(plIndex,arc2d);
    83. pCurve = &arc2d;!!!注意:指针的生命周期一定要大于等于指向的变量的生命周期,否则变量release掉指针就空了,再次使用指针程序直接崩溃!!
    84. }
    85. else if(st == AcDbPolyline::SegType::kLine)
    86. {
    87. pl->getLineSegAt(plIndex,line2d);
    88. pCurve = &line2d;
    89. }
    90. if(!pCurve->hasStartPoint(ptS) || !pCurve->hasEndPoint(ptE))
    91. {
    92. return;
    93. }
    94. curveDis = pCurve->length(pCurve->paramOf(ptS),pCurve->paramOf(ptE));
    95. leftDis = paramDis - sumDis;
    96. pl->getBulgeAt(plIndex,bulge);
    97. if(curveDis > leftDis)
    98. {
    99. double paramEnding = 0.0;
    100. if(gotoNext)
    101. {
    102. AcGePoint2d ptEnding;
    103. AcGePoint2d ptS;
    104. pCurve->hasStartPoint(ptS);
    105. GetPtAtDistOnCurve(pCurve,ptS,leftDis,ptEnding,Adesk::kTrue);
    106. bulge = tan(atan(bulge) * leftDis/curveDis);
    107. pPoly->addVertexAt(polyIndex,ptS,bulge);
    108. polyIndex ++;
    109. pPoly->addVertexAt(polyIndex,ptEnding);
    110. }
    111. else
    112. {
    113. AcGePoint2d ptEnding;
    114. AcGePoint2d ptE;
    115. pCurve->hasEndPoint(ptE);
    116. GetPtAtDistOnCurve(pCurve,ptE,leftDis,ptEnding,Adesk::kFalse);
    117. bulge = tan(atan(bulge) * leftDis/curveDis);
    118. pPoly->addVertexAt(polyIndex,ptE,-bulge);
    119. polyIndex ++;
    120. pPoly->addVertexAt(polyIndex,ptEnding);
    121. }
    122. return;
    123. }
    124. else
    125. {
    126. if(gotoNext)
    127. {
    128. pPoly->addVertexAt(polyIndex,ptS,bulge);
    129. polyIndex ++;
    130. pPoly->addVertexAt(polyIndex,ptE);
    131. polyIndex ++;
    132. //acutPrintf(采用T("\nplIndex is %d,poly is %d。is goto next,bulge is %.2f"),plIndex,polyIndex,bulge);
    133. }
    134. else
    135. {
    136. pPoly->addVertexAt(polyIndex,ptE,-bulge);
    137. polyIndex ++;
    138. pPoly->addVertexAt(polyIndex,ptS);
    139. polyIndex ++;
    140. }
    141. /*acutPrintf(采用T("\nptS[X] :%.2f,ptS[Y]:%.2f,ptE[X]:%.2f,ptE[Y]:%.2f"),ptS[X],ptS[Y],ptE[X],ptE[Y]);*/
    142. sumDis += curveDis;
    143. }
    144. if(gotoNext)
    145. {
    146. plIndex = plIndex < len - 1  ? ++plIndex : 0;
    147. }
    148. else
    149. {
    150. plIndex = plIndex > 0 ? --plIndex : len - 1;
    151. }
    152. DrawIt(gotoNext,pl,paramDis,ptStart,polyIndex,plIndex,sumDis,pPoly);
    153. }
    154. 反回曲线上一定距离的点(默认从起点开始计算)
    155. pCurve:曲线指针,dist:距离,point:要返回的点
    156. Adesk::Boolean isGotoNext  true:沿着正向寻找,false:沿着反方向寻找
    157. static void GetPtAtDistOnCurve(const AcGeCurve2d* pCurve,const AcGePoint2d& ptInput,double dist,AcGePoint2d& point,Adesk::Boolean isGotoNext)
    158. {
    159. if(pCurve == NULL)
    160. {
    161. return;
    162. }
    163. AcGePoint2d ptS;
    164. ptS = ptInput;
    165. double pa = 0.0;
    166. double datumParam = 0.0;
    167. //Adesk::Boolean posParamDir = Adesk::kTrue;
    168. datumParam = pCurve->paramOf(ptS);
    169. pa = pCurve->paramAtLength(datumParam,dist,isGotoNext);
    170. point = pCurve->evalPoint(pa);
    171. }
    复制代码

     

     

     

     

    ARX 沿着多段线绘制一定距离,递归执行
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 10:19 , Processed in 0.166508 second(s), 28 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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