找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2338|回复: 10

[分享] 函数分享:AcDbPolyline 节点除重

[复制链接]
发表于 2013-9-11 22:12:53 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Love-Lisp 于 2013-9-11 22:14 编辑

和大家分享一下我写的AcDbPolyline 节点除重函数!
  1. //多段线除重
  2. //输入 AcDbPolyline 、AcGeTol、angPrec = 角度偏差值//功能:AcDbPolyline 消除重复节点和同直线段或同圆弧上的节点
  3. Acad::ErrorStatus CCurve::RemoveDumpPoly(AcDbPolyline *&pPolyine,AcGeTol Tol,double angPrec)
  4. {
  5.   if (!pPolyine->isKindOf(AcDbPolyline::desc()))
  6.   {
  7.     return Acad::eNotImplementedYet;
  8.   }
  9.   bool isclosed = pPolyine->isClosed();
  10.   AcGePoint3d p0 ,p1,p2;
  11.   AcGeVector3d v1,v2;
  12.   int k =0;
  13.   if (isclosed)
  14.   {
  15.     pPolyine->getPointAt(pPolyine->numVerts()-1,p0);
  16.   }
  17.   pPolyine->getPointAt(k,p1);
  18.   pPolyine->getPointAt(k+1,p2);
  19.   while (k < pPolyine->numVerts())
  20.   {
  21.     int n = k+1;
  22.     if (n == pPolyine->numVerts())
  23.     {
  24.       n = 0;
  25.     }
  26.     int m = k - 1;
  27.     if (m < 0)
  28.     {
  29.       m = pPolyine->numVerts()-1;
  30.     }
  31.     pPolyine->getPointAt(m,p0);
  32.     pPolyine->getPointAt(k,p1);
  33.     pPolyine->getPointAt(n,p2);
  34.     if (p1.isEqualTo(p2,Tol))
  35.     {
  36.       pPolyine->removeVertexAt(k);
  37.       if (n == 0)
  38.       {
  39.         pPolyine->setClosed(true);
  40.       }
  41.     }
  42.     else
  43.     {
  44.       v1 =p1 - p0 ;
  45.       v2 = p2 - p1;
  46.       if ((v1.angleTo(v2)<= angPrec && k != 0) || (v1.angleTo(v2)<= angPrec && k == 0 && isclosed))
  47.       {
  48.         pPolyine->removeVertexAt(k);
  49.       }
  50.       else
  51.       k++;
  52.     }

  53.   }
  54.   //删除同弧段
  55.     k = 0;
  56.   double bulge1=0,bulge2=0;
  57.   AcGePoint3d cp1,cp2;
  58.   while (k < pPolyine->numVerts() -1)
  59.   {
  60.     pPolyine->getBulgeAt(k,bulge2);
  61.     pPolyine->getPointAt(k,p1);
  62.     if (!g_Equal(0,bulge2,0.00001))
  63.     {
  64.       if (g_Equal(0,bulge1,0.00001))
  65.       {
  66.         pPolyine->getPointAt(k,p0);
  67.         pPolyine->getPointAt(k+1,p1);
  68.         bulge1 = bulge2;
  69.         //计算弧段的圆心
  70.         double ang,rad;
  71.         ang = 2 * atan(bulge1);
  72.         rad = p0.distanceTo(p1) / (2 * sin(ang));
  73.         ads_point cp;
  74.         ang = (Pi2 - ang) + acutAngle(asDblArray(p0),asDblArray(p1));
  75.         acutPolar(asDblArray(p0),ang,rad,cp);
  76.         cp1 = asPnt3d(cp);
  77.         k++;

  78.       }
  79.       else
  80.       {
  81.         pPolyine->getPointAt(k,p1);
  82.         pPolyine->getPointAt(k+1,p2);
  83.         //计算弧段的圆心
  84.         double ang,rad,ang1,ang2 ;
  85.         ang = 2 * atan(bulge2);
  86.         rad = p1.distanceTo(p2) / (2 * sin(ang));
  87.         ads_point cp;
  88.         ang = (Pi2 - ang) + acutAngle(asDblArray(p1),asDblArray(p2));
  89.         acutPolar(asDblArray(p1),ang,rad,cp);
  90.         cp2 = asPnt3d(cp);
  91.         if (cp1.isEqualTo(cp2,Tol))
  92.         {
  93.           pPolyine->removeVertexAt(k);
  94.           //重新计算弓弦比
  95.           ang1 = acutAngle(asDblArray(cp1),asDblArray(p0));
  96.           ang2 = acutAngle(asDblArray(cp1),asDblArray(p2));
  97.           if (bulge1 > 0)
  98.           {
  99.             ang = ang2 -ang1;
  100.             if (ang > _2Pi)
  101.               ang = ang - _2Pi;
  102.             else if (ang < 0)
  103.             ang = ang + _2Pi;
  104.           }
  105.           else
  106.           {
  107.             ang = ang1 - ang2;
  108.             if (ang > _2Pi)
  109.               ang = ang - _2Pi;
  110.             else if (ang < 0)
  111.               ang = ang + _2Pi;
  112.           }
  113.           ang = ang / 4; //包角
  114.           if (bulge1 > 0)
  115.           {
  116.             bulge1 = tan(ang);
  117.           }
  118.           else
  119.           {
  120.             bulge1 = -1 * tan(ang);
  121.           }
  122.           pPolyine->setBulgeAt(k-1,bulge1);

  123.            

  124.         }
  125.         else
  126.         {
  127.           p0 = p1;
  128.           cp1 = cp2;
  129.           bulge1 = bulge2;
  130.           k++;
  131.         }

  132.       }
  133.     }
  134.     else
  135.     {
  136.       p0 = p1;
  137.       bulge1 = 0;
  138.       k++;
  139.     }
  140.   }
  141.   if (pPolyine->isClosed() && pPolyine->numVerts() > 2)
  142.   {
  143.     int numVerts = pPolyine->numVerts();
  144.      pPolyine->getBulgeAt(numVerts-1,bulge1);
  145.      pPolyine->getBulgeAt(0,bulge2);
  146.     if (!g_Equal(bulge1,0,0.00001) && !g_Equal(bulge2,0,0.00001))
  147.     {
  148.       pPolyine->getPointAt(numVerts-1,p0); /*最后一点*/
  149.       pPolyine->getPointAt(0,p1); /*起始点*/
  150.       pPolyine->getPointAt(1,p2);/* 第二点*/
  151.       //计算p0p1弧段的圆心
  152.       double ang,rad,ang1,ang2;
  153.       ang = 2 * atan(bulge1);
  154.       rad = p0.distanceTo(p1) / (2 * sin(ang));
  155.       ads_point cp;
  156.       ang = (Pi2 - ang) + acutAngle(asDblArray(p0),asDblArray(p1));
  157.       acutPolar(asDblArray(p0),ang,rad,cp);
  158.       cp1 = asPnt3d(cp);
  159.       //计算p1p2弧段的圆心
  160.       ang = 2 * atan(bulge2);
  161.       rad = p1.distanceTo(p2) / (2 * sin(ang));
  162.       ang = (Pi2 - ang) + acutAngle(asDblArray(p1),asDblArray(p2));
  163.       acutPolar(asDblArray(p1),ang,rad,cp);
  164.       cp2 = asPnt3d(cp);
  165.       if (cp1.isEqualTo(cp2,Tol))
  166.       {
  167.         pPolyine->removeVertexAt(0);
  168.         //重新计算弓弦比
  169.         ang1 = acutAngle(asDblArray(cp1),asDblArray(p0));
  170.         ang2 = acutAngle(asDblArray(cp1),asDblArray(p2));
  171.         if (bulge1 > 0)
  172.         {
  173.           ang = ang2 -ang1;
  174.           if (ang > _2Pi)
  175.             ang = ang - _2Pi;
  176.           else if (ang < 0)
  177.             ang = ang + _2Pi;
  178.         }
  179.         else
  180.         {
  181.           ang = ang1 - ang2;
  182.           if (ang > _2Pi)
  183.             ang = ang - _2Pi;
  184.           else if (ang < 0)
  185.             ang = ang + _2Pi;
  186.         }
  187.         ang = ang / 4; //包角
  188.         if (bulge1 > 0)
  189.         {
  190.           bulge1 = tan(ang);
  191.         }
  192.         else
  193.         {
  194.           bulge1 = -1 * tan(ang);
  195.         }
  196.         pPolyine->setBulgeAt(numVerts-2,bulge1);

  197.       }
  198.     }


  199.   }
  200.   return Acad::eOk;
  201. }



评分

参与人数 1D豆 +10 收起 理由
XDSoft + 10 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-9-11 22:22:49 | 显示全部楼层
你算是真上路了,而且跑的还挺快{:soso_e113:}

点评

呵呵,谢谢夸奖,刚开始入门,发现要学的东西太多了! 目前学着写了大概有二三十个函数了吧,主要是曲线方面的函数: {_T("XLRX-CURVEINTERS"), XL_CurveInters},/*计算交点 (XLRX-CURVEINTERS e1 e  详情 回复 发表于 2013-9-11 22:39
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-9-11 22:30:32 | 显示全部楼层
以后就是 Love ARX 不是 Love Lisp 了:lol

点评

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

使用道具 举报

 楼主| 发表于 2013-9-11 22:39:23 | 显示全部楼层
XDSoft 发表于 2013-9-11 22:22
你算是真上路了,而且跑的还挺快

呵呵,谢谢夸奖,刚开始入门,发现要学的东西太多了!{:soso_e127:}
目前学着写了大概有二三十个函数了吧,主要是曲线方面的函数:
        {_T("XLRX-CURVEINTERS"), XL_CurveInters},/*计算交点 (XLRX-CURVEINTERS e1 e2) (XLRX-CURVEINTERS ss) */
        {_T("XLRX-SortListUp"), XL_QSortLispUp},/*表升序排序 (XLRX-SortListUp list)*/
        {_T("XLRX-SortPtsOnCurve"), XL_SortPtsOnCurve}, /*点沿曲线排序 (XLRX-SortPtsOnCurve curve PtList)*/
        {_T("XLRX-SplitCurves"), XL_BreakCurves}, /*按点表打断曲线 (XLRX-BreakCurves curve PtList)*/
        {_T("XLRX-SSBreak"), XL_SsIntersectBreak}, /*交点打断,参数(XLRX-SSBreak SS [tol])*/
        {_T("XLRX-SETPREC"), XL_SetGolblePrec}, /*设置点、向量的全局精度 (XLRX-SETPREC prec) */
        {_T("XLRX-GETSSBOX"), XL_GetSsBox}, /*返回选择集对象包围框 (XLRX-GETSSBOX ss) */
        {_T("XLRX-GETSAMPLEPT"), XL_Curvesampt},/*返回多段线节点 (XLRX-GETSAMPLEPT curve [容差值]) 返回值不含闭合点*/
        {_T("XLRX-Region2Poly"), XL_RegionToPoly},/*Region转LWPOLYLINE (XLRX-Region2Poly ename/ss [容差值])*/
        {_T("XLRX-DumpPoly"), XL_RemoveDumpPolyPoint},/*多段线除重 参数 (XLRX-DumpPoly ename [点的容差值] [角度容差值])*/
        {_T("XLRX-Curve2Region"), XL_CurveToRegion},//曲线转面域 (XLRX-Curve2Region ss [容差值])
        {_T("XLRX-SYS-ZoomWinDow"), XL_ZoomWinDow},//窗口显示(XLRX-SYS-ZoomWinDow p1 p2 [扩展比率 = 1.0])
        {_T("XLRX-SYS-GETVAR"), XL_GetVar},/*(xlrx-getvar sysname)*/
        {_T("xlrx-Curve-Centroid"), XL_GetCentroid}, /*计算封闭曲线的形心坐标 (xlrx-Curve-Centroid curve)*/
        {_T("xlrx-Pts2Region"), XL_MakeRegionFromPoints},/*点表绘制region*/
        {_T("xlrx-DumpLine"), XL_DumpLineArcCircle},/*直线消重 (xlrx-DumpLine ss [Prec] [blayer] [bLType]) */
        {_T("xlrx-PtinPoly"), XL_PtIsinPoly}, /*判断点是否在封闭曲线内,模拟点法 (xlrx-ptInPoly  curve pt [prec = 模拟点精度]) (xlrx-ptInPoly pts pt)*/
        {_T("xlrx-PtinPoly1"), XL_PtIsinPoly1}, /*判断点是否在封闭曲线内,切线法! (xlrx-ptInPoly pt curve) (xlrx-ptInPoly pt pts)*/
        {_T("xlrx-ClockWiseP"), XL_ClockWiseP}, /*判断点表或曲线或3点是否顺时针 (xlrx-clockwisep pts) (xlrx-clockwisep curve ) (xlrx-clockwisep p1 p2 p3 )*/
        {_T("xlrx-Curve2Spline"), XL_CurveToSpline}, /*曲线转Spline (xlrx-Curve2Spline curve[ss])*/
        {_T("xlrx-PolyRelation"), XL_PolyRelation}, /*判断两封闭曲线之间的相互关系 (xlrx-PolyRelation curve1 curve2 [prec])*/
        {_T("xlrx-OnorInPoly"), XL_OnorInPoly}, /*判断封闭曲线1是否在封闭曲线2内 (xlrx-OnorInPoly poly1 poly2 [prec]) */
        {_T("xlrx-GetHull"), XL_GetHull}, //根据点表计算凸包 (xlrx-GetHull ptlist [DrawBox Flag])
        {_T("xlrx-Spl_Ell2LWPoly"), XL_Spl_Ell2LWPoly}, //LWPOLYLINE模拟SPline (xlrx-Spl_Ell2LWPoly spline [ArcFlag t= 圆弧模拟 nil = 直线模拟] [弦长距离 = 0.1])



点评

wow!! 可否给我寄来,有些我想完善到API里面  详情 回复 发表于 2013-9-11 22:49
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-11 22:48:00 | 显示全部楼层
Free-Lancer 发表于 2013-9-11 22:30
以后就是 Love ARX 不是 Love Lisp 了

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-9-11 22:49:39 | 显示全部楼层
Love-Lisp 发表于 2013-9-11 22:39
呵呵,谢谢夸奖,刚开始入门,发现要学的东西太多了!
目前学着写了大概有二三十个函数了 ...

wow!!

可否给我寄来,有些我想完善到API里面{:soso_e163:}

点评

没有问题! 能够入老大法眼,无尚荣幸!  详情 回复 发表于 2013-9-11 22:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-11 22:58:22 | 显示全部楼层
XDSoft 发表于 2013-9-11 22:49
wow!!

可否给我寄来,有些我想完善到API里面

没有问题!
能够入老大法眼,无尚荣幸!{:soso_e113:}

点评

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-9-11 23:17:16 | 显示全部楼层
Love-Lisp 发表于 2013-9-11 22:58
没有问题!
能够入老大法眼,无尚荣幸!

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-12 16:30:44 | 显示全部楼层
楼主,可否把你的API PLINE模拟的SPLINE,分别用折线模拟和弧线模拟的,带原来的SPLINE,传个DWG图上来吗? 看看弧线模拟和PLINE模拟的区别。

点评

直线模拟和弧线模拟的节点数是相同的,弧线模拟是将直线段变成圆弧,弧线的中点落在曲线上,这样看上去模拟线和原曲线更接近!  详情 回复 发表于 2013-9-12 20:57
最简单的实体应该是 Line 吧! 模拟点好像更好的就是股票的曲线,偏差  详情 回复 发表于 2013-9-12 19:51
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-9-12 19:51:31 | 显示全部楼层
newer 发表于 2013-9-12 16:30
楼主,可否把你的API PLINE模拟的SPLINE,分别用折线模拟和弧线模拟的,带原来的SPLINE,传个DWG图上来吗?  ...

最简单的实体应该是 Line 吧! 模拟点好像更好的就是股票的曲线,偏差

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

使用道具 举报

 楼主| 发表于 2013-9-12 20:57:00 | 显示全部楼层
newer 发表于 2013-9-12 16:30
楼主,可否把你的API PLINE模拟的SPLINE,分别用折线模拟和弧线模拟的,带原来的SPLINE,传个DWG图上来吗?  ...

直线模拟和弧线模拟的节点数是相同的,弧线模拟是将直线段变成圆弧,弧线的中点落在曲线上,这样看上去模拟线和原曲线更接近!

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 15:27 , Processed in 0.288153 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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