找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1957|回复: 14

[研讨] 将排序进行到低(也适合倾斜对象)

[复制链接]

已领礼包: 604个

财富等级: 财运亨通

发表于 2014-11-15 13:34:43 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 /db_自贡黄明儒_ 于 2014-11-15 16:25 编辑
  1. ;;[功能] 将排序进行到低(也适合倾斜对象)
  2. ;;MinAreaRectangle Graham-scan 见http://bbs.mjtd.com/thread-81308-1-1.html By highflybir
  3. ;;ssPts: 1 选择集,返回图元列表
  4. ;;           2 点表(1到n维 1维时key只能是x或X),返回点表
  5. ;;          3 图元列表,返回图元列表
  6. ;;       4 字符列表或者数值列表
  7. ;;Key: "xyzXYZ"任意组合,例如"yX",y在前表示y坐标优先,小y表示从小到大(注:二维点时,不能有z)
  8. ;;FUZZ: 允许误差
  9. ;;注:点表可以1到n维混合,Key长度不大于点的最小维数。
  10. ;;示例1 (HH:SortEndByPt (ssget) "YxZ" 0.5);返回(<Entity name: 7ef7b3a8> <Entity name: 7ef7b3a0>)
  11. ;;示例2 (HH:SortEndByPt (list '(2 3) '(2 4) '(3 5)) "Yx" 0.5);返回((3 5) (2 4) (2 3))
  12. ;;示例3 (HH:SortEndByPt '(<Entity name: 7ef79a28> <Entity name: 7ef79a10>) "YxZ" 0.5)
  13. ;;示例4 (HH:SortEndByPt (list "DF" "ZX" "A" "DD" "A") "X" 1)=>("ZX" "DF" "DD" "A" "A")
  14. ;;示例5 (HH:SortEndByPt (list 5 8 5.0 9 5) "X" 1)=>(9 8 5 5.0 5)
  15. ;;自贡黄明儒 2014年11月15日
  16. (defun HH:SortEndByPt (ssPts KEY FUZZ / AN FUN LST P P1 P2 PB PT PTS SSPTS)
  17.   ;;1 点列表排序
  18.   (defun sortpts (PTS FUN xyz FUZZ)
  19.     (vl-sort pts
  20.              '(lambda (a b)
  21.                 (if (not (equal (xyz a) (xyz b) fuzz))
  22.                   (fun (xyz a) (xyz b))
  23.                 )
  24.               )
  25.     )
  26.   )
  27.   ;;2 排序先后
  28.   (defun sortpts1 (PTS KEY FUZZ)
  29.     (foreach xyz (reverse (vl-string->list Key))
  30.       (cond ((< xyz 100)
  31.              (setq fun >)
  32.              (setq xyz (nth (- xyz 88) (list car cadr caddr)))
  33.             )
  34.             (T
  35.              (setq fun <)
  36.              (setq xyz (nth (- xyz 120) (list car cadr caddr)))
  37.             )
  38.       )
  39.       (setq Pts (sortpts Pts fun xyz fuzz))
  40.     )
  41.   )
  42.   ;;3 [功能] 点表旋转
  43.   (defun HH:Sort-rotate        (pts pb an / P PT)
  44.     (mapcar '(lambda (p)
  45.                (setq pt (list (car p) (cadr p)))
  46.                (setq pt (polar pb (+ (angle pt pb) an) (distance pt pb)))
  47.                (list (car pt) (cadr pt) (caddr p) (cadddr p))
  48.              )
  49.             pts
  50.     )
  51.   )
  52.   ;;4 [功能] 排序用选择集(图元列表)取点函数
  53.   (defun HH:SortEndByPt-SS (ss / E EN GRAH N P SORT)
  54.     (cond
  55.       ((= (type ssPts) 'PICKSET)
  56.        (repeat (setq n (sslength ss))
  57.          (setq e (ssname ss (setq n (1- n))))
  58.          (setq en (entget e))
  59.          (cond ((wcmatch (cdr (assoc 0 en)) "POINT,ARC,CIRCLE,ELLIPSE")
  60.                 (setq p (cdr (assoc 10 en)))
  61.                )
  62.                (T (setq p (MiddleCenPoint e)))
  63.          )
  64.          (setq Sort (cons (append p (list e)) Sort))            ;排序
  65.          (setq Grah (cons p Grah))                            ;扫描
  66.        )
  67.       )
  68.       (T
  69.        (foreach        n ss
  70.          (setq en (entget n))
  71.          (cond ((wcmatch (cdr (assoc 0 en)) "POINT,ARC,CIRCLE,ELLIPSE")
  72.                 (setq p (cdr (assoc 10 en)))
  73.                )
  74.                (T (setq p (MiddleCenPoint n)))
  75.          )
  76.          (setq Sort (cons (append p (list n)) Sort))            ;排序
  77.          (setq Grah (cons p Grah))                            ;扫描
  78.        )
  79.       )
  80.     )
  81.     (list Grah Sort)
  82.   )
  83.   ;;5  本程序主程序
  84.   (cond
  85.     ((or (= (type ssPts) 'PICKSET)
  86.          (and (Listp ssPts) (= (type (car ssPts)) 'ENAME))
  87.      )
  88.      (setq pts (HH:SortEndByPt-SS ssPts))
  89.      (setq lst (cadr pts))
  90.      (setq pts (car pts))
  91.      (setq pts (car (MinAreaRectangle (Graham-scan pts))))  ;4点     
  92.      ;;如果前2点(最下2点)Y坐标误差>fuzz,则旋转对象
  93.      (setq p1 (car pts))
  94.      (setq p2 (cadddr pts))
  95.      (cond ((> (abs (- (cadr p1) (cadr p2))) FUZZ)
  96.             (setq lst (HH:Sort-rotate lst p1 (- (angle p1 p2))))
  97.            )
  98.      )
  99.      (mapcar 'cadddr (sortpts1 lst KEY FUZZ))
  100.     )
  101.     ((Listp ssPts)
  102.      (cond
  103.        ;;是否为点
  104.        ((and (vl-consp (car ssPts))
  105.              (null (vl-catch-all-error-p (vl-catch-all-apply 'vlax-3d-point (car ssPts))))
  106.         )
  107.         (setq pts (car (MinAreaRectangle (Graham-scan ssPts)))) ;4点
  108.         (setq p1 (car pts))
  109.         (setq p2 (cadr pts))
  110.         (cond ((equal (abs (- (cadr p1) (cadr p2))) FUZZ)
  111.                (setq lst (HH:Sort-rotate ssPts p1 (angle p1 p2)))
  112.               )
  113.               (T (setq lst ssPts))
  114.         )
  115.         (sortpts1 lst KEY FUZZ)
  116.        )
  117.        (T
  118.         (cond ((wcmatch key "X,Y,Z") (vl-sort ssPts '>))
  119.               ((wcmatch key "x,y,z") (vl-sort ssPts '<))
  120.         )
  121.        )
  122.      )
  123.     )
  124.   )
  125. )
  126. ;;功能:获取对象正中点
  127. (defun MiddleCenPoint (e / P1 P2 PLIST X)
  128.   (cond ((= (type e) 'ename) (setq e (vlax-ename->vla-object e))))
  129.   (vla-getboundingbox e 'p1 'p2)
  130.   (setq p1 (vlax-safearray->list p1))
  131.   (setq p2 (vlax-safearray->list p2))
  132.   (mapcar '(lambda (X Y) (* (+ X Y) 0.5)) P1 P2)
  133. )
1.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-15 14:23:41 | 显示全部楼层
本帖最后由 st788796 于 2014-11-15 14:30 编辑

排序没什么不同,只和点的坐标系有关系,你给何 WCS 一直的坐标就是按 WCS 排,你给倾斜坐标系坐标就按倾斜坐标系排

更通用的是给个 xdir ,所有点转换到这个 xdir 坐标系下排序

点评

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-11-15 14:29:53 | 显示全部楼层
st788796 发表于 2014-11-15 14:23
排序没什么不同,只和点的坐标系有关系,你给何 WCS 一直的坐标就是按 WCS 排,你给倾斜坐标系坐标就按倾斜 ...

是呀,首先要确定倾斜了多少

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-15 14:35:15 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2014-11-15 14:29
是呀,首先要确定倾斜了多少

你怎么定倾斜多少呢?

点评

我先用highflybir的程序扫描,获得最小包围矩形,矩形一边的2点如果小于允差,就不旋转各对象。  详情 回复 发表于 2014-11-15 15:14
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-15 14:36:55 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2014-11-15 14:29
是呀,首先要确定倾斜了多少

排序只管排序,点转换另外写
  1. (defun pnts:trans (pts xdir)
  2.   (mapcar '(lambda (x / p)
  3.              (setq p (trans x 0 xdir))
  4.              (list (car p) (last p) 0.0)
  5.            )
  6.           pts
  7.   )
  8. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-11-15 15:14:34 | 显示全部楼层
newer 发表于 2014-11-15 14:35
你怎么定倾斜多少呢?

我先用highflybir的程序扫描,获得最小包围矩形,矩形一边的2点如果小于允差,就不旋转各对象。

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-15 15:26:03 | 显示全部楼层
本帖最后由 newer 于 2014-11-15 15:31 编辑
/db_自贡黄明儒_ 发表于 2014-11-15 15:14
我先用highflybir的程序扫描,获得最小包围矩形,矩形一边的2点如果小于允差,就不旋转各对象。

下面哪一个是你的主方向呢?

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-15 15:36:34 | 显示全部楼层
我想这么排

QQ截图20141115153401.png


还想这么排

QQ截图20141115153433.png

甚至又想这么排

QQ截图20141115153500.png


上面每个排法的行列元素都不一样哦, 你用最小矩形怎么求?

点评

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-15 15:51:52 | 显示全部楼层

你这是和黄老抬杠了,排自然要有同一特性的{:soso_e100:}

点评

我是想和黄老师说了,排序不用想那么复杂的,找到最小点,然后想怎么排怎么排,给个X轴就够了,更通用。  详情 回复 发表于 2014-11-15 16:09
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-11-15 15:52:21 | 显示全部楼层

这种就不好干了。我只能根据最小包围盒的方向排。

点评

别把自己限制死了,一般这种斜排啥的,都是在UCS,PLAN命令画图,然后你在WCS排,在CAD里面,要多利用UCS啊,你的排序和UCS的X轴结合就行了。别想太通用了,什么都让代码去做,太通用反而累了。 你的代  详情 回复 发表于 2014-11-15 16:12
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-15 16:09:41 | 显示全部楼层
st788796 发表于 2014-11-15 15:51
你这是和黄老抬杠了,排自然要有同一特性的

我是想和黄老师说了,排序不用想那么复杂的,找到最小点,然后想怎么排怎么排,给个X轴就够了,更通用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-15 16:12:39 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2014-11-15 15:52
这种就不好干了。我只能根据最小包围盒的方向排。

一般这种斜排啥的,都是在UCS,PLAN命令画图,然后你在WCS排,在CAD里面,要多利用UCS啊,你的排序和UCS的X轴结合就行了。别想太通用了,什么都让代码去做,太通用反而累了。 你的代码多个UCS X轴的参数就更通用了。让用户决定按哪个方向排。因为你给决定的,不一定是用户需要的。

你把那些文字实体啥的想象抽象成 点, 想在哪个方向排都行。

点评

确实这样好些  详情 回复 发表于 2014-11-15 16:18

评分

参与人数 1D豆 +5 收起 理由
lucas3 + 5 技术引导讨论和指点奖!

查看全部评分

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-11-15 16:18:22 | 显示全部楼层
newer 发表于 2014-11-15 16:12
一般这种斜排啥的,都是在UCS,PLAN命令画图,然后你在WCS排,在CAD里面,要多利用UCS啊,你的排序和UCS ...

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

使用道具 举报

已领礼包: 1336个

财富等级: 财源广进

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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