找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1962|回复: 18

[分享] AcArray的一个入门应用实例

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2017-2-13 16:42:07 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 csharp 于 2017-2-13 16:49 编辑

论坛开源函数有个 xd::list:groupbyindex , 在 ARX 下这个索引就要自己定义一个 class 或者 struct ,下面这个例子已消除重复图块为例,以 STL 标准库的 vector 及其标准函数为基础,首先定义一个 struct 即 索引,说明哪些特性相同的时候视为重复,测试中只写了插入点,实际中可以再增加其它属性(名称、比例等)
首先定义一个数据,

  1. typedef struct blockInfo{
  2.     AcGePoint3d position;//插入点
  3.     AcDbObjectId id;
  4.     AcGeTol tol;
  5.     bool operator < (const blockInfo &a) const//排序比较函数,X 由小到大,Y由小到大, 相当于按行左下角点起始
  6.     {
  7.         if (fabs((this->position).y-a.position.y)<1e-6)
  8.         {
  9.             return this->position.x<a.position.x;
  10.         }
  11.         else
  12.             return this->position.y<a.position.y;
  13.     }
  14.     bool operator > (const blockInfo &a) const//
  15.     {
  16.         if (fabs(this->position.y-a.position.y)<1e-6)
  17.         {
  18.             return this->position.x>a.position.x;
  19.         }
  20.         else
  21.             return this->position.y>a.position.y;
  22.     }
  23.     bool operator == (const blockInfo &a) const
  24.     {         
  25.         return this->position.isEqualTo(a.position,tol);
  26.     }
  27. }BLOCKINFO;
复制代码

这里面定义一个 operator <  用于 sort 排序即可, == 操作符是用于 unique 函数“消除重复" , 实测环境 XP + VS2002 + AutoCAD 2004 中 struct 中 == 操作符不起作用的,还需要单独定义一个比较函数

  1. bool myfunction (const blockInfo &a,const blockInfo &b)//比较是否重复
  2. {
  3.     return a==b;
  4. }
复制代码

主程序
游客,如果您要查看本帖隐藏内容请回复

运行结果

命令: test02
选择对象: 指定对角点: 找到 16 个

选择对象:

2130145760
2130145752
2130145744
2130145736
2130145728
2130145720
2130145712
2130145704
2130145696
2130145688
2130145680
2130145672
2130145664
2130145656
2130145648
2130145640
=====sort=====
2130145664,(470.99,372.57)
2130145656,(470.99,372.57)
2130145648,(470.99,372.57)
2130145640,(470.99,372.57)
2130145696,(544.59,372.57)
2130145688,(544.59,372.57)
2130145680,(544.59,372.57)
2130145672,(544.59,372.57)
2130145760,(617.74,372.57)
2130145752,(617.74,372.57)
2130145744,(617.74,372.57)
2130145736,(617.74,372.57)
2130145728,(711.04,372.57)
2130145720,(711.04,372.57)
2130145712,(711.04,372.57)
2130145704,(711.04,372.57)
=====unique=====
2130145664,(470.99,372.57)
2130145696,(544.59,372.57)
2130145760,(617.74,372.57)
2130145728,(711.04,372.57)
2130145696,(544.59,372.57)
2130145688,(544.59,372.57)
2130145680,(544.59,372.57)
2130145672,(544.59,372.57)

2130145760,(617.74,372.57)
2130145752,(617.74,372.57)
2130145744,(617.74,372.57)
2130145736,(617.74,372.57)

2130145728,(711.04,372.57)
2130145720,(711.04,372.57)
2130145712,(711.04,372.57)
2130145704,(711.04,372.57)


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

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2017-2-13 16:47:23 | 显示全部楼层
可以看到在AutoCAD里面和上个帖子的 vector<int> 是有差异的,前面的是不重复的,后面的重复包括了最后一个重复对象和其它重复对象
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-2-13 16:59:11 | 显示全部楼层
程序里面用了两次 acutRelRb(filter);  最后那个应该删除。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2017-2-13 17:01:13 | 显示全部楼层


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

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-2-13 17:16:20 | 显示全部楼层

哦,你这么写,是得有两个 relrb, 不过建议你IF里面的RETURN不要,都在最结尾一个return, if里面的relrb 不要,这样程序逻辑更好些,尽量不要多个return
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6569个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 85个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2017-2-16 08:04:10 | 显示全部楼层
unique 返回的是迭代器位置,该位置以前的元素不重复,容器长度不变,该位置以后元素不确定, int 那个例子凑巧了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2017-2-21 14:20:56 | 显示全部楼层
好像没必要写这么多吧。
只要写一个小于或者一个 ()就可以吧。

stl判断相等的方法 是A和B判断不成立,B和A判断也不成立,就表示A=B

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2017-2-21 14:32:11 | 显示全部楼层
本帖最后由 aeo 于 2017-2-21 14:48 编辑

猎豹截图20170221142615.jpg



std::unique
The function uses operator== to compare the pairs of elements (or pred, in version (2)).

The behavior of this function template is equivalent to:
1
2
3
4
5
6
7
8
9
10
11
12
13
template <class ForwardIterator>  ForwardIterator unique (ForwardIterator first, ForwardIterator last){  if (first==last) return last;  ForwardIterator result = first;  while (++first != last)  {    if (!(*result == *first))  // or: if (!pred(*result,*first)) for version (2)      *(++result)=*first;  }  return ++result;}


作用是从输入序列中删除”所有相邻的重复元素
效率非常低,必须先排序,而且
排序会把原来次序打乱

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

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2017-4-16 15:10:44 | 显示全部楼层
学习学习思路

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

使用道具 举报

已领礼包: 2477个

财富等级: 金玉满堂

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

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 05:15 , Processed in 0.237194 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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