找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1675|回复: 1

[教学] API应用 不同角度块排行列并按紧邻分组

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-2-17 14:32:16 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 st788796 于 2014-2-17 17:40 编辑

  1. (defun c:tt (/ _makecircle _prossrow _drawcircle ss lst mat0 wid rad)
  2.   (defun _makecircle (p / e)
  3.     (setq e (xdrx_circle_make p rad))
  4.     (xdrx_entity_setcolor e 3)
  5.   )
  6.   ;;
  7.   (defun _pnts:divbydis        (p1 p2 dis / n ptl an)
  8.     (setq n   (fix (/ (distance p1 p2) dis))
  9.           ptl (list p1)
  10.           an  (angle p1 p2)
  11.     )
  12.     (repeat n
  13.       (setq ptl (cons (polar (car ptl) an dis) ptl))
  14.     )
  15.     (reverse ptl)
  16.   )
  17.   ;;行内按临近分组
  18.   (defun _prossrow (lst / ll)
  19.     (setq lst (mapcar '(lambda (x)
  20.                          (list (xdrx_getpropertyvalue x "Position") x)
  21.                        )
  22.                       lst
  23.               )
  24.           ll  (list (list (car lst)))
  25.           lst (cdr lst)
  26.     )
  27.     (while lst
  28.       (if (equal (distance (caar lst) (caaar ll)) wid 1e-2)
  29.         (setq ll (cons (cons (car lst) (car ll)) (cdr ll)))
  30.         (setq ll (cons (list (car lst)) ll))
  31.       )
  32.       (setq lst (cdr lst))
  33.     )
  34.     ll
  35.   )
  36.   ;;一个紧邻组车位绘制定位点
  37.   (defun _drawcircle (lst / len p1 p2 ptl)
  38.     (setq len (length lst))
  39.     (cond
  40.       ((= len 1) ;_一个车位
  41.        (_makecircle (caar lst))
  42.       )
  43.       ((= len 2) ;_两个车位
  44.        (_makecircle
  45.          (xdrx_line_midp (caar lst) (caadr lst))
  46.        )
  47.       )
  48.       ((zerop (rem len 2)) ;_偶数车位
  49.        (while lst
  50.          (_makecircle
  51.            (xdrx_line_midp (caar lst) (caadr lst))
  52.          )
  53.          (setq lst (cddr lst))
  54.        )
  55.       )
  56.       (t
  57.        (setq p1         (caar lst)
  58.              p2         (car (last lst))
  59.              ptl (_pnts:divbydis p1 p2 2.5)
  60.        )
  61.        (mapcar '(lambda        (x)
  62.                   (_makecircle x)
  63.                 )
  64.                ptl
  65.        )
  66.       ) ;_奇数车位
  67.     )
  68.   )
  69.   (setq wid 2.5) ;_ 车位宽度
  70.   (setq rad 0.2) ;_圆圈直径
  71.   (if (setq ss (ssget '((0 . "insert"))))
  72.     (progn
  73.       (setq lst         (mapcar '(lambda (x)
  74.                             (list (xdrx_getpropertyvalue x "Rotation")
  75.                                   (list        (xdrx_getpropertyvalue x "Position")
  76.                                         x
  77.                                   )
  78.                             ) ;_((角度 (插入点 块)) ....)
  79.                           )
  80.                          (xdrx_pickset->ents ss)
  81.                  )
  82.             lst         (XD::List:GroupByIndex lst 1e-3) ;_按角度分组((an1 (p11 e11) ...) (an2 (p22 e22) ...)...)
  83.             mat0 (xdrx_matrix_identity 3)
  84.             lst         (mapcar
  85.                    '(lambda (x / mat)
  86.                       (setq mat        (xdrx_matrix_setrotation
  87.                                   mat0
  88.                                   (- (car x)) ;_转正排序
  89.                                   '(0 0 1)
  90.                                   '(0 0 0)
  91.                                 )
  92.                       ) ;_建立不同角度的坐标系
  93.                       (mapcar
  94.                         '(lambda (a)
  95.                            (list (xdrx_point_transform (car a) mat) (cadr a))
  96.                          )
  97.                         (cdr x)
  98.                       ) ;_转换插入点
  99.                     )
  100.                    lst
  101.                  )
  102.             lst         (mapcar '(lambda (x)
  103.                             (XD::List:TableSort x 0 0 1e-3) ;_每个角度的分行
  104.                           )
  105.                          lst
  106.                  ) ;_对不同角度的分别排行 (((row11) (row12) ...) ((row21) (row22) ...) ...)
  107.             lst         (mapcar '(lambda (x)
  108.                             (mapcar '(lambda (a)
  109.                                        (mapcar 'cadr a)
  110.                                      )
  111.                                     x ;_每个角度
  112.                             )
  113.                           )
  114.                          lst
  115.                  )
  116.             lst         (mapcar '(lambda (x)
  117.                             (mapcar '(lambda (a)
  118.                                        (_prossrow a)
  119.                                      )
  120.                                     (vl-remove nil x)
  121.                             ) ;_每个行内再分组
  122.                           )
  123.                          lst ;_(((e11 e12 ...) (e21 e22 ...)) ...)
  124.                  )
  125.       )
  126.       (mapcar '(lambda (x)
  127.                  (mapcar '(lambda (a)
  128.                             (mapcar '(lambda (b)
  129.                                        (_drawcircle b) ;_一个组团
  130.                                      )
  131.                                     a ;_行组
  132.                             )
  133.                           )
  134.                          x ;_角度组
  135.                  )
  136.                )
  137.               lst
  138.       )
  139.     )
  140.   )
  141.   (princ)
  142. )
rotaterow.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1336个

财富等级: 财源广进

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 13:23 , Processed in 0.382693 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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