找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: Love-Lisp

[研讨] 曲线选择集交点打断的源码

[复制链接]

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-8-23 13:20:23 | 显示全部楼层
本帖最后由 牢固 于 2013-8-23 13:23 编辑
XDSoft 发表于 2013-8-23 12:51
箭头反过来,模拟出来了,你试试 (xdrx_curve_intersectbreak (ssget) 1) 和(xdrx_curve_intersectbreak  ...

2004加载8.20的API,在窗口以运行(xdrx_curve_intersectbreak (ssget)),然后新建dwg窗口,再运行(xdrx_curve_intersectbreak (ssget)),选择对象后,弹出窗口,点击n次确定后,选择的对象消失了:
a.jpg 2008同样如此!

点评

这个应该是程序内部有错误的时候,这个错误影响到了。修改了API,打断圆可能出现删除的状态应该避免了。 你的程序第二次打断的时候出现错误,应该是第一次打断的时候某种情况下对象没关闭,你试试打断一次,别再  详情 回复 发表于 2013-8-23 15:02
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-8-23 15:02:52 | 显示全部楼层
牢固 发表于 2013-8-23 13:20
2004加载8.20的API,在窗口以运行(xdrx_curve_intersectbreak (ssget)),然后新建dwg窗口,再运行(xdrx_cu ...

这个应该是程序内部有错误的时候,这个错误影响到了。修改了API,打断圆可能出现删除的状态应该避免了。

你的程序第二次打断的时候出现错误,应该是第一次打断的时候某种情况下对象没关闭,你试试打断一次,别再打断,试试去移动下实体什么的,看看能不能移动。

点评

按照你的提示,在曲线打断之前将落在曲线起终点之上的点排除之后,再打断真就没问题了! 看来虽然arx帮助里说getSplitCurves方法当打断的参数在起点或终点是会自动忽略生成曲线,实际上对圆弧来说某些时候并非这样  详情 回复 发表于 2013-8-23 18:11
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8611个

财富等级: 富甲天下

发表于 2013-8-23 15:17:01 | 显示全部楼层
和我前几天遇到的情况是一样的,我那个是大量的圆弧打断。20号的API已经改了吗?

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-23 16:17:35 | 显示全部楼层
liuyj 发表于 2013-8-23 15:17
和我前几天遇到的情况是一样的,我那个是大量的圆弧打断。20号的API已经改了吗?

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

使用道具 举报

 楼主| 发表于 2013-8-23 18:11:44 | 显示全部楼层
XDSoft 发表于 2013-8-23 15:02
这个应该是程序内部有错误的时候,这个错误影响到了。修改了API,打断圆可能出现删除的状态应该避免了。
...

按照你的提示,在曲线打断之前将落在曲线起终点之上的点排除之后,再打断真就没问题了!
看来虽然arx帮助里说getSplitCurves方法当打断的参数在起点或终点是会自动忽略生成曲线,实际上对圆弧来说某些时候并非这样,难道是ARX的Bug?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-8-23 18:48:36 来自手机 | 显示全部楼层
也可能是浮点误差来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-8-23 19:05:06 | 显示全部楼层
2010 版,少了数段弧,XDRX API B2013.0820已更新!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-24 09:21:42 | 显示全部楼层
一楼源码已更新,圆弧打断的Bug已修正,且支持容差打断!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8611个

财富等级: 富甲天下

发表于 2013-8-24 11:28:54 | 显示全部楼层
编译一下?俺不会ARX

点评

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-8-24 12:05:42 | 显示全部楼层
liuyj 发表于 2013-8-24 11:28
编译一下?俺不会ARX

API已经更新0824,下载测试下。

点评

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

使用道具 举报

发表于 2013-8-24 12:21:25 | 显示全部楼层
XDSoft 发表于 2013-8-24 12:05
API已经更新0824,下载测试下。

选了 18000 个Line arc CAD 没反应了!

点评

我优化了下打断的代码,效率极大地提高!测试300*350的直线方格网,也就是650条相交直线,速度居然是秒杀,竟然XDRX_CURVE_INTERSECTBREAK 函数快了几十倍! 在CAD2008上同时加载ssbreak2008_x32.arx和晓东API,  详情 回复 发表于 2013-8-24 20:49
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-24 20:49:49 | 显示全部楼层
[ 本帖最后由 LoveArx 于 2016-11-27 12:52 编辑 ]\n\nFree-Lancer 发表于 2013-8-24 12:21
选了 18000 个Line arc CAD 没反应了!
我优化了下打断的代码,效率极大地提高!测试300*350的直线方格网,也就是650条相交直线,速度居然是秒杀,竟然XDRX_CURVE_INTERSECTBREAK 函数快了几十倍!

500X500的直线方格网比较结果:

比较的结果令人震惊!我改进后的代码主要在于优化了计算曲线交点的过程,看来优化算法对于大量计算来说至关重要!
cad2008 编译的ARX程序:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:ssbreak2008_x32.rar 
下载次数:50  文件大小:53.7 KB  售价:2D豆 [记录]
下载权限: 不限 以上  [免费赚D豆]


在CAD2008上同时加载ssbreak2008_x32.arx和晓东API,用如下代码测试:
  1. (defun c:tt ()
  2.   (princ "\n第一组曲线:")
  3.   (setq ss (ssget '((0 . "*line,arc,circle,ellipse"))))
  4.   (princ "\n第二组曲线:")
  5.   (setq ss1 (ssget '((0 . "*line,arc,circle,ellipse"))))
  6.   (if (and ss ss1)
  7.     (progn
  8.       (setq *StartTime* (car (_VL-TIMES)))
  9.       (setq l1 (XDRX_CURVE_INTERSECTBREAK ss))
  10.       (princ
  11.   (strcat  "\n  XDRX_CURVE_INTERSECTBREAK 用时\n  "
  12.     (rtos (* 0.001 (- (car (_VL-TIMES)) *StartTime*)) 2 4)
  13.     "  秒 "
  14.   )
  15.       )
  16.       (setq *StartTime* (car (_VL-TIMES)))
  17.       (setq l2 (XLRX-SSBreak ss1 0.01))
  18.       (princ
  19.   (strcat  "\n  XLRX-SSBreak 用时\n  "
  20.     (rtos (* 0.001 (- (car (_VL-TIMES)) *StartTime*)) 2 4)
  21.     "  秒 "
  22.   )
  23.       )
  24.       (princ)
  25.     )
  26.   )
  27. )

改进后arx的IntersectBreakSS函数源码:
  1. //改进后的曲线选择集交点打断
  2. void IntersectBreakSS (ads_name ss,AcDbVoidPtrArray& curveSegments,ads_real rTol)
  3. {
  4.   Acad::ErrorStatus es;
  5.   ads_name e1;
  6.   AcGePoint3dArray nPoints;
  7.   AcGeTol tol;
  8.   tol.setEqualPoint(rTol);
  9.   tol.setEqualVector(rTol);
  10.   if (!(nPoints.isEmpty()))
  11.   {
  12.     nPoints.setPhysicalLength(0);
  13.     nPoints.setLogicalLength(0);
  14.   }
  15.   long len;
  16.   acedSSLength(ss,&len);
  17.   //实体个数小于两个,直接返回值
  18.   if (len < 2)
  19.   {
  20.     if (len = 1)
  21.     {
  22.       AcDbEntity *pEnt;
  23.       AcDbObjectId Id;
  24.       acedSSName(ss,0,e1);
  25.       acdbGetObjectId(Id,e1);
  26.       es = acdbOpenObject(pEnt,Id,AcDb::kForRead);
  27.       if (es != Acad::eOk)
  28.       {
  29.         pEnt->close();

  30.       }
  31.       curveSegments.append(pEnt);
  32.       pEnt->close();
  33.     }
  34.     return;
  35.   }
  36.   //将选择集实体转换到对象数组IdArray
  37.   AcDbObjectIdArray IdArray;
  38.   AcDbEntity *pEnt,*pEnt1;
  39.   AcDbObjectId Id,Id1;
  40.   AcDbCurve *pCurve,*pCurve1;
  41.   for (long i =0;i < len;i++)
  42.   {
  43.     acedSSName(ss,i,e1);
  44.     acdbGetObjectId(Id,e1);
  45.     es = acdbOpenObject(pEnt,Id,AcDb::kForRead);
  46.     if (es != Acad::eOk)
  47.     {
  48.       pEnt->close();

  49.     }
  50.     pCurve = AcDbCurve::cast(pEnt);
  51.     if (pCurve == NULL)
  52.     {
  53.       pEnt->close();
  54.       continue;
  55.     }
  56.     IdArray.append(Id);
  57.     pEnt->close();
  58.   }
  59.   //曲线总个数
  60.   len = IdArray.length();
  61.   //创建每条曲线的交点数组
  62.   AcGePoint3dArray *Pt3DArrays = new AcGePoint3dArray[len];
  63.   for (int i = 0;i < len;i++)
  64.   {
  65.     Pt3DArrays.setPhysicalLength(0);
  66.     Pt3DArrays.setLogicalLength(0);
  67.   }
  68.   //计算所有交点,存储在Pt3DArrays数组中
  69.   for (long i = 0;i < len-1;i++)
  70.   {
  71.     Id = IdArray.at(i);
  72.     acdbOpenObject(pEnt,Id,AcDb::kForRead);
  73.     pCurve = AcDbCurve::cast(pEnt);
  74.     AcGePoint3d pstart0,pend0;
  75.     pCurve->getStartPoint(pstart0);
  76.     pCurve->getEndPoint(pend0);
  77.     for (long j = i+1;j < len;j++)
  78.     {
  79.       Id1 = IdArray.at(j);
  80.       acdbOpenObject(pEnt1,Id1,AcDb::kForRead);
  81.       pCurve1 = AcDbCurve::cast(pEnt1);
  82.       AcGePoint3dArray nPts;
  83.       //计算交点
  84.       pEnt->intersectWith(pEnt1,AcDb::kOnBothOperands,nPts);
  85.       AcGePoint3d pstart1,pend1,pt;
  86.       pCurve1->getStartPoint(pstart1);
  87.       pCurve1->getEndPoint(pend1);      
  88.       //遍历nPts,除落在曲线端点外的点添加到Pt3DArrays
  89.       for (int m = 0;m < nPts.length();m++)
  90.       {
  91.         pt = nPts[m];
  92.         if (!(pstart0.isEqualTo(pt,tol) || pend0.isEqualTo(pt,tol)))
  93.         {
  94.           //交点添加到第i条曲线上
  95.           Pt3DArrays.append(pt);
  96.         }        
  97.         if (!(pstart1.isEqualTo(pt,tol) || pend1.isEqualTo(pt,tol)))
  98.         {
  99.           //交点添加到第j条曲线上
  100.           Pt3DArrays[j].append(pt);
  101.         }      
  102.       }
  103.       //判断pCurve1的端点是否在pCurve容差范围之内,添加到交点表第i条曲线上
  104.       pCurve->getClosestPointTo(pstart1,pt);
  105.       if (pstart1.isEqualTo(pt,tol) && !(pstart0.isEqualTo(pt,tol) || pend0.isEqualTo(pt,tol)))
  106.       {
  107.         Pt3DArrays.append(pt);
  108.       }
  109.       pCurve->getClosestPointTo(pend1,pt);
  110.       if (pend1.isEqualTo(pt,tol) && !(pstart0.isEqualTo(pt,tol) || pend0.isEqualTo(pt,tol)))
  111.       {
  112.         Pt3DArrays.append(pt);
  113.       }  
  114.       //判断pCurve的端点是否在pCurve1容差范围之内,添加到交点表第j条曲线上
  115.       pCurve1->getClosestPointTo(pstart0,pt);
  116.       if (pstart0.isEqualTo(pt,tol) && !(pstart1.isEqualTo(pt,tol) || pend1.isEqualTo(pt,tol)))
  117.       {
  118.         Pt3DArrays[j].append(pt);
  119.       }
  120.       pCurve1->getClosestPointTo(pend0,pt);
  121.       if (pend0.isEqualTo(pt,tol) && !(pstart1.isEqualTo(pt,tol) || pend1.isEqualTo(pt,tol)))
  122.       {
  123.         Pt3DArrays[j].append(pt);
  124.       }  
  125.       pEnt1->close();
  126.     }
  127.     pEnt->close();
  128.   }
  129.   for (long i = 0;i < len;i++)
  130.   {
  131.     AcGePoint3dArray nPts;
  132.     nPts.setPhysicalLength(0);
  133.     nPts.setLogicalLength(0);
  134.     nPts = Pt3DArrays;
  135.     //取出第i条曲线pCurve
  136.     Id = IdArray.at(i);
  137.     acdbOpenObject(pEnt,Id,AcDb::kForRead);
  138.     pCurve = AcDbCurve::cast(pEnt);   
  139.     //根据点nPts打断第i条曲线
  140.     if (nPts.length() > 0)
  141.     {
  142.       //nPts按曲线pCurve排序
  143.       CCalculation::QSortPointsOnCurve(pCurve,nPts);
  144.       //len1打断曲线前curveSegments的长度
  145.       long len1 = curveSegments.length();
  146.       pCurve->upgradeOpen();
  147.       //按参数表params打断曲线pCurve
  148.       es = pCurve->getSplitCurves(nPts,curveSegments);

  149.       //len2打断曲线后curveSegments的长度
  150.       long len2 = curveSegments.length();
  151.       if ((len2 - len1) > 1)/*生成了新的曲线*/
  152.       {
  153.         //acutPrintf(_T("\n共生成直线 %d  条!"),(len2 - len1));
  154.         pCurve->erase();
  155.         pEnt->close();
  156.         for (int ii = len1; ii <len2; ii++)
  157.         {
  158.           AcDbEntity *pEntity = NULL;
  159.           pEntity = (AcDbEntity *)curveSegments[ii];
  160.           //将生成的曲线添加到数据库
  161.           CCreateEnt::PostToSpace(pEntity);
  162.         }

  163.       }
  164.       else /*没有生成新曲线*/
  165.       {
  166.         pEnt->close();
  167.         AcDbEntity *pEnt1;
  168.         pEnt1  = (AcDbEntity *)curveSegments[(len2 - 1)];
  169.         delete(pEnt1);
  170.         curveSegments.setAt(len2 - 1,pCurve);
  171.       }
  172.     }
  173.     else /*曲线没有交点,无需打断*/
  174.     {      
  175.       pEnt->close();
  176.       curveSegments.append(pCurve);
  177.     }

  178.   }
  179.   delete []Pt3DArrays;
  180. }

aa.jpg
bb.jpg

点评

看了下API的代码,里面多了次重复的选择集遍历到AcDbObjectIdArray数组,API代码为了考虑编程的方便和通用,这个函数使用了专门的类处理,中间有些耗费。抽空精简下,再供测试。  详情 回复 发表于 2013-8-24 22:02
如何优化的给大家介绍下啊,原来什么算法,优化后又什么样的算法。  详情 回复 发表于 2013-8-24 21:18
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2013-8-24 21:18:52 | 显示全部楼层
Love-Lisp 发表于 2013-8-24 20:49
我优化了下打断的代码,效率极大地提高!测试300*350的直线方格网,也就是650条相交直线,速度居然是秒杀 ...

如何优化的给大家介绍下啊,原来什么算法,优化后又什么样的算法。

点评

原先计算交点是nXn次计算, for (int i=0,i < len,i++) //循环n次 { acedSSName(ss,i,e1); //e1转化为pCurve对象 AcDbEntity *pEnt; AcDbObjectId Id; AcDbCurve *pCurve; es = acdbGetObjectId(  详情 回复 发表于 2013-8-24 21:52
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-24 21:52:48 | 显示全部楼层
Lisphk 发表于 2013-8-24 21:18
如何优化的给大家介绍下啊,原来什么算法,优化后又什么样的算法。

原先计算交点是nXn次计算,
for (int i=0,i < len,i++) //循环n次
{
   acedSSName(ss,i,e1);
//e1转化为pCurve对象
                AcDbEntity *pEnt;
                AcDbObjectId Id;
                AcDbCurve *pCurve;
                es = acdbGetObjectId(Id,e1);
                if (es != Acad::eOk)
                {
                        continue;
                }
                es = acdbOpenObject(pEnt,Id,AcDb::kForRead);
                if (es != Acad::eOk)
                {
                        pEnt->close();
                        continue;
                }
                pCurve = AcDbCurve::cast(pEnt);
                if (pCurve == NULL)
                {
                        pEnt->close();
                        continue;
                }

    for (int j=0,j < len,j++) //循环n次
    {
      acedSSName(ss,j,e2);
   //e2转化为pCurve1对象
                        AcDbEntity *pEnt1;
                        AcDbObjectId Id1;
                        AcDbCurve *pCurve1;
                        es = acdbGetObjectId(Id1,e2);
                        if (es != Acad::eOk)
                        {
                                continue;
                        }
                        es = acdbOpenObject(pEnt1,Id1,AcDb::kForRead);
                        if (es != Acad::eOk)
                        {
                                pEnt1->close();
                                continue;
                        }
                        pCurve1 = AcDbCurve::cast(pEnt1);
                        if (pCurve1 == NULL)
                        {
                                pEnt1->close();
                                continue;
                        }

     //计算pcurve和pCurve1 的交点

   ...
    }
}
其中每次循环都要从选择集中取出ename,再转化为pCurve对象,这个循环过程耗时较大!

改进后的计算交点是nX(n-1)/2次计算,原因是计算过交点的曲线下次循环不再重复计算交点,每次计算两条曲线的交点分别存储在各自曲线对应的数组中!另外 我首先将选择集先转化为AcDbObjectIdArray,转化的过程中将无效对象和不是曲线对象排除,以后循环时通过AcDbObjectIdArray来提取对象,此时就无需再对对象的有效性进行检查,这应该也会节省一点时间!
在曲线数量越大时,两种算法差距越明显!nXn 和 nX(n-1)/2次的区别!
其他还有一些细节上的优化,具体详见楼上的源代码:改进前的代码在一楼,优化后的代码在27楼!

点评

另外,API考虑的参数多,还有一种自身打断,你的 i=0 第二次i=i+1, 就会落下自身对自身的交点的处理。就是你省下的那些次数。代码可以在综合考虑完善下算法。  详情 回复 发表于 2013-8-24 22:21
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-8-24 22:02:08 | 显示全部楼层
Love-Lisp 发表于 2013-8-24 20:49
我优化了下打断的代码,效率极大地提高!测试300*350的直线方格网,也就是650条相交直线,速度居然是秒杀 ...

看了下API的代码,里面多了次重复的选择集遍历到AcDbObjectIdArray数组,API代码为了考虑编程的方便和通用,这个函数使用了专门的类处理,中间有些耗费。抽空精简下,再供测试。

点评

深有同感!代码越通用,必然降低运行效率!对于非大量计算的代码,基本无所谓,无需考虑效率问题!对于需要大量计算的程序来说,还真不能为了考虑代码的简洁性,而损失了效率!  详情 回复 发表于 2013-8-24 22:13
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 08:39 , Processed in 0.211277 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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