设为首页收藏本站

晓东CAD家园-论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 106|回复: 0

[每日一码] AcDbPolyline和AcGeCurve2d互转函数

[复制链接]

签到天数: 285 天

连续签到: 4 天

[LV.8]以坛为家I

已领礼包: 13个

财富等级: 恭喜发财

发表于 2018-2-12 13:36:08 | 显示全部楼层 |阅读模式

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

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

x
  1. static void convertPolylineToGeCurve(AcDbPolyline* pPoly, AcGeCurve2d*& out_pGeCurve)

  2. {
  3.         AcGeVoidPointerArray geCurves;
  4.         AcGeVector3d normal = pPoly->normal();
  5.         // Is the polyline closed or open
  6.         int nSegs = -1;
  7.         if (pPoly->isClosed())
  8.                 nSegs = pPoly->numVerts();
  9.         else
  10.                 nSegs = pPoly->numVerts() - 1;

  11.         for (int i = 0; i < nSegs; i++)
  12.         {
  13.                 if (pPoly->segType(i) == AcDbPolyline::kLine)
  14.                 {
  15.                         AcGeLineSeg2d line;
  16.                         pPoly->getLineSegAt(i, line);
  17.                         AcGeLineSeg2d *pLine = new AcGeLineSeg2d(line);
  18.                         geCurves.append(pLine);
  19.                 }
  20.                 else if (pPoly->segType(i) == AcDbPolyline::kArc)
  21.                 {
  22.                         AcGeCircArc2d arc;
  23.                         pPoly->getArcSegAt(i, arc);
  24.                         AcGeCircArc2d *pArc = new AcGeCircArc2d(arc);
  25.                         geCurves.append(pArc);
  26.                 }
  27.         }// for
  28.         if (geCurves.length() == 1)
  29.                 out_pGeCurve = (AcGeCurve2d*)(geCurves[0]);
  30.         else
  31.                 out_pGeCurve = new AcGeCompositeCurve2d(geCurves);
  32. } // End of convertPolylineToGeCurve()

  33.   //------------------------------------------------------------------------

  34. static void convertGeCurveToPolyline(AcGeCurve2d* pCurve, AcDbPolyline*& pResultPoly)
  35. {
  36.         AcGeVoidPointerArray resultCurves;
  37.         AcGeCompositeCurve2d* pResultCurve;
  38.         if (pCurve->isKindOf(AcGe::kCompositeCrv2d))
  39.         {
  40.                 pResultCurve = (AcGeCompositeCurve2d*)pCurve;
  41.                 pResultCurve->getCurveList(resultCurves);
  42.         }
  43.         else
  44.                 resultCurves.append(pCurve);
  45.         int nCurves = resultCurves.length();
  46.         pResultPoly = new AcDbPolyline(nCurves);
  47.         AcGeCurve2d *pThisCurve = NULL;
  48.         int i = 0;
  49.         for (i = 0; i < nCurves; i++)
  50.         {
  51.                 pThisCurve = (AcGeCurve2d*)(resultCurves);
  52.                 if (pThisCurve->isKindOf(AcGe::kCircArc2d))
  53.                 {
  54.                         AcGeCircArc2d *pArc = (AcGeCircArc2d*)pThisCurve;
  55.                         double ang = 0.25 * (pArc->endAng() - pArc->startAng());
  56.                         double bulge = tan(ang);
  57.                         if (pArc->isClockWise())
  58.                                 bulge = -bulge;
  59.                         pResultPoly->addVertexAt(i, pArc->startPoint(), bulge);
  60.                 }
  61.                 else if (pThisCurve->isKindOf(AcGe::kLineSeg2d))
  62.                 {
  63.                         AcGeLineSeg2d *pLine = (AcGeLineSeg2d*)pThisCurve;
  64.                         pResultPoly->addVertexAt(i, pLine->startPoint(), 0);
  65.                 }
  66.         }// for

  67.         AcGePoint2d endPt;
  68.         if (pThisCurve->hasEndPoint(endPt))
  69.                 pResultPoly->addVertexAt(i, endPt, 0);
  70. } // End of convertGeCurveToPolyline()


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

本版积分规则

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

GMT+8, 2018-8-17 10:21 , Processed in 0.138843 second(s), 17 queries , Gzip On, WinCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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