找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1162|回复: 12

[研讨] objectarx点集沿曲线排序太慢了,有其他方法吗

[复制链接]

已领礼包: 195个

财富等级: 日进斗金

发表于 2017-1-14 21:36:14 | 显示全部楼层 |阅读模式

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

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

×
;点集vector <AcGePoint3d> pts沿曲线排序
AcDbCurve *pCurve;
bool sortcurve(AcGePoint3d &a, AcGePoint3d &b) //沿曲线排序比较函数
{
AcGePoint3d outa, outb;
double outpa, outpb;
pCurve->getClosestPointTo(a, outa);
pCurve->getClosestPointTo(b, outb);
pCurve->getParamAtPoint(outa, outpa);
pCurve->getParamAtPoint(outb, outpb);
return outpa < outpb;
}
// 提示用户选择样条参照曲线  
  ads_name ent; ads_point pt;
  if(acedEntSel(ACRX_T("\n选择参照曲线:"), ent, pt) == RTNORM)
  {
   AcDbObjectId objId;
   acdbGetObjectId(objId, ent);
   // 获得指向当前元素的指针;
   AcDbEntity *pEnt;
   acdbOpenAcDbEntity(pEnt, objId, AcDb::kForRead);

   if (pEnt->isKindOf(AcDbCurve::desc()))//曲线;
   {
    pCurve = AcDbCurve::cast(pEnt);
    sort(pts.begin(), pts.end(), sortcurve );
    pCurve->close();
   }
   pEnt->close();
  }
这样可以沿曲线同向排序,就是速度太慢了,几十个点CAD的界面都看到非常明显的停顿,有其他方法可以加速吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-1-14 23:58:54 | 显示全部楼层
代码不全?

pts 从哪里来的? sort函数?

你排序用的什么算法?

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

使用道具 举报

已领礼包: 347个

财富等级: 日进斗金

发表于 2017-1-16 09:36:49 | 显示全部楼层
分析一下效率差的问题出在哪里,如果是算法的问题,可以使用 快速排序改你的算法;如果是“bool sortcurve(AcGePoint3d &a, AcGePoint3d &b) //沿曲线排序比较函数”这个比较函数效率差的的话,应当修改你的算法。我估计还是第二个原因导致的效率差。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 195个

财富等级: 日进斗金

 楼主| 发表于 2017-1-16 10:18:41 | 显示全部楼层
是bool sortcurve(AcGePoint3d &a, AcGePoint3d &b)的原因,沿曲线排序objectarx中有别的函数可以用吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-1-16 11:08:12 | 显示全部楼层

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

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-1-16 13:15:42 | 显示全部楼层
AEO版主写过一个 AcArray的快速排序模板,你去找找看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2017-1-16 15:28:34 | 显示全部楼层
本帖最后由 Highflybird 于 2017-1-16 16:01 编辑

你先把点的参数存起来,不要在排序的比较函数中用到曲线的函数,这样就会节省大量的时间。节省的时间简直不止一个数量级.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2017-1-16 15:48:45 | 显示全部楼层


  1. typedef struct pointInfo
  2. {
  3.         double param;
  4.         AcGePoint3d point;
  5.         bool operator < ( pointInfo &ptInfo)
  6.         {
  7.                 return param < ptInfo.param;

  8.         }
  9.         bool operator > ( pointInfo &ptInfo)  
  10.         {
  11.                 return param > ptInfo.param;
  12.         }

  13. }PointInfo;

  14. static void asdkMyGroupsSortpoints()
  15.         {
  16.                 // 提示用户选择样条参照曲线  
  17.                 ads_name ent;
  18.                 ads_point pt;
  19.                 if(acedEntSel(ACRX_T("\n选择参照曲线:"), ent, pt) == RTNORM)
  20.                 {
  21.                         AcDbObjectId objId;
  22.                         acdbGetObjectId(objId, ent);
  23.                         // 获得指向当前元素的指针;

  24.                         AcDbObjectPointer <AcDbCurve> pCurve(objId, AcDb::kForRead);
  25.                         if(pCurve.openStatus()!=Acad::eOk)
  26.                                 return;
  27.                         ads_name ss;
  28.                         resbuf *filter=acutBuildList(RTDXF0,_T("POINT"),RTNONE);
  29.                         if (acedSSGet(NULL,NULL,NULL,filter,ss) != RTNORM)
  30.                         {
  31.                                 acutRelRb(filter);
  32.                                 return;
  33.                         }
  34.                         acutRelRb(filter);
  35.                         AcGePoint3dArray pts;
  36.                         long slen;
  37.                         acedSSLength(ss,&slen);
  38.                         ads_name pnt;               
  39.                         double pam;
  40.                         Acad::ErrorStatus es;
  41.                         std::vector<struct pointInfo> myvec;
  42.                         struct pointInfo ptInfo;
  43.                         for (long i=0;i<slen;i++)
  44.                         {
  45.                                 acedSSName(ss,i,pnt);
  46.                                 acdbGetObjectId(objId,pnt);
  47.                                 AcDbObjectPointer<AcDbPoint> pPoint(objId,AcDb::kForRead);
  48.                                 AcGePoint3d pt(pPoint->position()),ptOn;
  49.                                 es=pCurve->getClosestPointTo(pt,ptOn);
  50.                                 if (es!=Acad::eOk)
  51.                                 {
  52.                                         continue;
  53.                                 }
  54.                                 es=pCurve->getParamAtPoint(ptOn,pam);
  55.                                 if (es!=Acad::eOk)
  56.                                 {
  57.                                         continue;
  58.                                 }
  59.                                
  60.                                 ptInfo.param=pam;
  61.                                 ptInfo.point=pt;

  62.                                 myvec.push_back(ptInfo);
  63.                         }
  64.                         std::sort(myvec.begin(),myvec.end());
  65.                         std::vector<struct pointInfo>::iterator itor=myvec.begin();
  66.                         for (;itor!=myvec.end();itor++)
  67.                         {
  68.                                 acutPrintf(_T("\n%.3f,%.3f,%.3f"),((*itor).point).x,((*itor).point).y,((*itor).point).z);
  69.                         }                       
  70.                 }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2017-1-16 16:18:28 | 显示全部楼层
arx的曲线操作函数特别费时,尤其是对样条曲线。所以在涉及到这类函数时,要小心使用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 195个

财富等级: 日进斗金

 楼主| 发表于 2017-1-16 19:36:54 | 显示全部楼层
谢谢Highflybird和csharp的解答;样条曲线我感觉模拟比较理想,不容易出现飞点现象。我刚才按照二位的提示修改了一下代码,500个点排序用时3秒可以接受;比我原先的代码快多了!谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-1-16 21:19:14 | 显示全部楼层

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2017-1-17 00:25:15 | 显示全部楼层
把点的参数求出来
按参数排序
参数反求点
。。。。。。。。。。。。。
如果你的点求了一点都不能动(参数反求点有误差)
那你参数按位置排序 (相当于vl-sort-i)

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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