找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 864|回复: 10

[求助] [已解决]我想获取曲线集后按面积排序为什么不行

[复制链接]

已领礼包: 28个

财富等级: 恭喜发财

发表于 2018-7-19 14:49:55 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 1121443108qaz 于 2018-7-20 10:48 编辑

代码没问题,是输出时用科学计数法我以为排序无效,其实是有效的。
  1. struct curvewitharea
  2. {
  3.         AcDbObjectId entId;
  4.         double area;
  5.         bool operator < (const curvewitharea& That)const
  6.         {
  7.                 return this->area < That.area;
  8.         }
  9.         bool operator >(const curvewitharea& That)const
  10.         {
  11.                 return this->area > That.area;
  12.         }
  13.         bool operator ==(const curvewitharea& That)const
  14.         {
  15.                 if (fabs(this->area-That.area)<1e-6)
  16.                 {
  17.                         return true;
  18.                 }
  19.                 return false;
  20.         }
  21. };

  1. void CEntityUtil::sortByAera(const AcDbObjectIdArray& curveIds)
  2. {
  3.         double area;
  4.         
  5.         std::vector <curvewitharea> Curves;
  6.         ErrorStatus es;
  7.         AcDbCurve* pCurve = NULL;
  8.         for (long i=0;i<curveIds.length();i++)
  9.         {
  10.                 curvewitharea curve;
  11.                 es = acdbOpenObject(pCurve, curveIds.at(i), AcDb::kForRead);
  12.                 if (es==Acad ::eOk)
  13.                 {
  14.                         es=pCurve->getArea(area);
  15.                         if (es==Acad::eOk)
  16.                         {
  17.                                 curve.entId = curveIds.at(i);
  18.                                 curve.area = area;
  19.                                 Curves.push_back(curve);
  20.                         }              pCurve->close();
  21.                 }
  22.         }
  23.         std::sort(Curves.begin(), Curves.end(), std::less<curvewitharea>());
  24.         for (long j=0;j<Curves.size();j++)
  25.         {
  26.                 curvewitharea a = Curves.at(j);
  27.                 acutPrintf(L"\n The %d area is %g", j, a.area);
  28.         }
  29. }

  1. static void xxxMyGrouptest()
  2.         {
  3.                 AcDbObjectIdArray entIds;
  4.                 if (!MyUtil::getEnt(entIds))
  5.                 {
  6.                         return;
  7.                 }
  8.                 CEntityUtil::sortByAera(entIds);
  9.         }



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

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-7-19 14:51:29 | 显示全部楼层
我参照坛里这帖子写的啊,为什么我的不行,人家的就成了http://bbs.xdcad.net/thread-707124-1-1.html
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-7-19 14:54:30 | 显示全部楼层

回帖奖励 +50 D豆

打印的结果是什么样的?

点评

就是面积并不按顺序排,是乱的。我新建了好多个矩形,传进去,照理来说打印结果是要按顺序的啊。但是没有。  详情 回复 发表于 2018-7-19 15:33
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-7-19 15:33:04 来自手机 | 显示全部楼层
newer 发表于 2018-7-19 14:54
打印的结果是什么样的?

就是面积并不按顺序排,是乱的。我新建了好多个矩形,传进去,照理来说打印结果是要按顺序的啊。但是没有。

点评

aeo版主写过一个AcArray的通用的快速排序的模板,你试试,别用std. AcArry 排序,写了个模板12 个回复 - 172 次查看Acarray 没有排序函数,转来转去太麻烦 写了一个模板,以后可以和数组 qsort排序一样。 用了最  详情 回复 发表于 2018-7-19 18:12
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-7-19 18:12:44 | 显示全部楼层
1121443108qaz 发表于 2018-7-19 15:33
就是面积并不按顺序排,是乱的。我新建了好多个矩形,传进去,照理来说打印结果是要按顺序的啊。但是没有 ...

aeo版主写过一个AcArray的通用的快速排序的模板,你试试,别用std.

AcArry 排序,写了个模板
12 个回复 - 172 次查看
Acarray 没有排序函数,转来转去太麻烦 写了一个模板,以后可以和数组 qsort排序一样。 用了最简单的快速排序,(qsort速度是不稳定的) **** 本内容需购买可见 **** 比较函数: 这是论坛里面的:
2016-11-27 23:32 - aeo - ObjectARX

点评

我看了下,还是想知道我哪里写错了。。从它那里我看不出来  详情 回复 发表于 2018-7-19 21:00
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-7-19 21:00:03 来自手机 | 显示全部楼层
newer 发表于 2018-7-19 18:12
aeo版主写过一个AcArray的通用的快速排序的模板,你试试,别用std.

AcArry 排序,写了个模板12 个回复 ...

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

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2018-7-20 09:57:57 | 显示全部楼层
使用 std::sort 自定义比较函数

  1. struct curvewitharea
  2. {
  3.         AcDbObjectId entId;
  4.         double area;
  5. };
  6. bool less (const curvewitharea &a , const curvewitharea &b)
  7. {
  8.         return        a.area-b.area < 1e-6;
  9. }
复制代码

使用方法
  1. std::sort(curves.begin(), curves.end(),less);
复制代码

另外 pCurve 好像没有 close();

点评

搞错了,其实是可以的。  详情 回复 发表于 2018-7-20 10:47
是的pcurve没close,另外用这个自定义的还是不行。。。  详情 回复 发表于 2018-7-20 10:38
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-7-20 10:38:25 来自手机 | 显示全部楼层
st788796 发表于 2018-7-20 09:57
使用 std::sort 自定义比较函数

使用方法

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

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-7-20 10:47:50 来自手机 | 显示全部楼层
st788796 发表于 2018-7-20 09:57
使用 std::sort 自定义比较函数

使用方法

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2018-7-20 10:58:28 | 显示全部楼层
测试代码

  1. struct curvewitharea
  2. {
  3.         AcDbObjectId entId;
  4.         double area;
  5. };
  6. bool less (const curvewitharea &a , const curvewitharea &b)
  7. {
  8.         return        a.area-b.area < 1e-6;
  9. }
  10. static void MyGroupCvarea ()
  11.         {
  12.                 ads_name ss;

  13.                 resbuf* filter=acutBuildList(RTDXF0,L"LWLINE,*POLYLINE,SPLINE,LINE,ARC,CIRCLE,ELLIPSE",RTNONE);
  14.                
  15.                 if (RTNORM!=acedSSGet(L"",NULL,NULL,filter,ss))
  16.                 {
  17.                         acutRelRb(filter);
  18.                         return;
  19.                 }
  20.                 acutRelRb(filter);
  21.                 AcDbObjectIdArray ids;
  22.                 ads_name ent;
  23.                 AcDbObjectId entid;
  24.                 long slen;
  25.                 acedSSLength(ss,&slen);
  26.                 for (long i=0;i<slen;i++)
  27.                 {
  28.                         acedSSName(ss,i,ent);
  29.                         acdbGetObjectId(entid,ent);
  30.                         ids.append(entid);
  31.                 }
  32.                 acedSSFree(ss);
  33.                 double area;
  34.                 std::vector<curvewitharea> curves;
  35.                 ErrorStatus es;
  36.                 AcDbCurve* pCurve = NULL;
  37.                 for (long i=0;i< ids.length();i++)
  38.                 {
  39.                         curvewitharea curve;
  40.                         es = acdbOpenObject(pCurve, ids.at(i), AcDb::kForRead);
  41.                         if (es==Acad ::eOk)
  42.                         {
  43.                                 es=pCurve->getArea(area);
  44.                                 if (es==Acad::eOk)
  45.                                 {
  46.                                         curve.entId = ids.at(i);
  47.                                         curve.area = area;
  48.                                         curves.push_back(curve);
  49.                                 }
  50.                                 pCurve->close();
  51.                         }
  52.                 }
  53.                 std::sort(curves.begin(), curves.end(),less);
  54.                 for (long j=0;j<curves.size();j++)
  55.                 {                         
  56.                         acutPrintf(L"\n The %d area is %g", j, curves.at(j).area);
  57.                 }
  58.         }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 11:09 , Processed in 0.314180 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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