明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 15689|回复: 57

[源码] 图框排齐,源码参考.1128更新3.7

  [复制链接]
发表于 2014-10-13 19:43 | 显示全部楼层 |阅读模式
本帖最后由 鱼与熊掌 于 2014-11-28 20:12 编辑

/********************************************************
矩形图框对齐3.6

1.qx,先图框左对齐在进行图框的上下对齐,请注意顺序.
2.qx1,图框左对齐.
2.qx2.图框右对齐,请查看文件中的fuzz,偏差值.
  !.详解:qx2如果没有没有先试用qx1,(也就是左对齐.)
    那么就只能对齐最左边的那个图框的那一排.注意计算方式.
3.qx3.加入等距对齐,命令是先使用getdist的,如果想用固定距离可以自己改代码.
      !请注意,如果大距离对齐到小距离不会出错.
      !请注意,如果小距离变成大等距对齐就出错.请看error的演示.
      !了解对齐的算法,从左向右对齐.
4.优化move,调用cx-move函数.
5.加入几个函数在cxapi.
6.程序打包了.233333.
.2014-10-28.by 鱼与熊掌.QQ:775452144
;演示如果等距,排序顺序,左到右,如果从小到大出错,如何出错

fuzz偏差值,范围外面的不上下对齐


/.**************************分隔.**************************

更新px3.6, 2014-10-27
1,(vl-load-com),加入这个东西,你们报错的。我在别的电脑测试了一下,发现少了这个东西。-。-
2.稍等。



更新px3.5,2014-10-24
1.附件加入cxapi 里面全是支持函数.我比较懒.
2.加入优化代码.
3.没加入等距对齐.




PX 3.0
------------------------------------------------
1.分裂成qx qx1 qx2 qxx.
2.qx(左对齐后 上下对齐.)
3.qx1 ,左对齐.
4.qx2.上下对齐.
5.支持多图框对齐.
6.保存变量在c:盘.不用每次启动去选择,也不必每次去选择图框对齐.
7.qxx选择需要对齐的图框.
8.提示多了几行.
ps.1.暂时关闭等距对齐,因为要支持多图框,算法得重写;..!!!蛋疼.
    2.关于图框重合,请注意偏差值. 太黏的图框将合体,注意.(或者自己调偏差值)
    3.请下载支持函数.
    4.开放下载不收钱.
    5.期待优化.
    6.哎.
    7.接下去打算只支持单排对齐,也就是误差无限大.上下对齐就只对齐选中的.
      或者误差值将偏大. 总之待定.







------------------------2014-10-18更新------------------------
px 2.5
1.图框内物体移动
2.加入横向对齐加入间距.
3.新思路准备加上匹配多图框.(图上不只是有一个图框的情况下)
4.求助,希望大家一起完善一下. 写好注释便于维护.
5.分裂成两个命令应该比较好用

------------------------2014-10-18更新------------------------




------------------------2014-10-14更新------------------------
1.加入左边图框对齐.
2.加入过滤图框选项.
3.所需要的函数都在这个帖子里面有
------------------------2014-10-14更新------------------------


欢迎谈论,仅供参考
引用:
http://bbs.mjtd.com/thread-111326-1-1.html
http://bbs.mjtd.com/thread-107489-1-1.html

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2018-8-26 12:22 | 显示全部楼层
paulpipi 发表于 2018-8-26 08:59
(defun a(pt dst /)
(polar pt pi dst)
)

这是?  新手看不懂呢 能融合后 放出完整的代码吗
发表于 2018-8-20 10:59 | 显示全部楼层
不同大小的图框排序有问题  会出现重合在一起  另外 能不能增加等距排序功能 可以自己设置距离大小
发表于 2018-8-19 11:30 | 显示全部楼层
不同大小的图框排序有问题  会出现重合在一起  另外 能不能增加等距排序功能 可以自己设置距离大小
 楼主| 发表于 2014-10-13 19:47 | 显示全部楼层
  1. ;newnth i j list 取表一部分 来自 老黄
  2. ;(newnth 2 3 '(1 2 3 4 5))=(3 4)
  3. (defun newnth (from to lst / L X)
  4.   (repeat from (setq lst (cdr lst)))
  5.   (repeat (1+ (- to from)) (setq l (cons (car lst) l)) (setq lst (cdr lst)))
  6.   (REVERSE l)
  7. )
  8. (defun xnth(to lst)
  9. (car(newnth  to to lst))
  10. )

  11. ;来自  老黄
  12. ;ssPts: 1 选择集,返回图元列表
  13. ;;           2 点表(1到n维 1维时key只能是x或X),返回点表
  14. ;;          3 图元列表,返回图元列表
  15. ;;Key: "xyzXYZ"任意组合,例如"yX",y在前表示y坐标优先,小y表示从小到大(注:二维点时,不能有z)
  16. ;;FUZZ: 允许误差
  17. ;;注:点表可以1到n维混合,Key长度不大于点的最小维数。
  18. ;;示例1 (HH:ssPts:Sort (ssget) "YxZ" 0.5);返回(<Entity name: 7ef7b3a8> <Entity name: 7ef7b3a0>)
  19. ;;示例2 (HH:ssPts:Sort (list '(2 3) '(3 5)) "Yx" 0.5);返回((3 5) (2 3))
  20. ;;示例3 (HH:ssPts:Sort '(<Entity name: 7ef79a28> <Entity name: 7ef79a10>) "YxZ" 0.5)
  21. ;;示例4 (HH:ssPts:Sort (list "DF" "ZX" "A" "DD" "A") "X" 1)=>("ZX" "DF" "DD" "A" "A")
  22. ;;示例5 (HH:ssPts:Sort (list 5 8 5 9) "X" 1)=>(9 8 5)
  23. ;;本程序是在fsxm的扩展 自贡黄明儒 2014年3月22日
  24. (defun HH:ssPts:Sort (ssPts KEY FUZZ / E EN FUN LST N)
  25.   ;;1 点列表排序
  26.   (defun sortpts (PTS FUN xyz FUZZ)
  27.     (vl-sort pts
  28.              '(lambda (a b)
  29.                 (if (not (equal (xyz a) (xyz b) fuzz))
  30.                   (fun (xyz a) (xyz b))
  31.                 )
  32.               )
  33.     )
  34.   )
  35.   ;;2 排序
  36.   (defun sortpts1 (PTS KEY FUZZ)
  37.     (setq Key (vl-string->list Key))
  38.     (foreach xyz (reverse Key)
  39.       (cond ((< xyz 100)
  40.              (setq fun >)
  41.              (setq xyz (nth (- xyz 88) (list car cadr caddr)))
  42.             )
  43.             (T
  44.              (setq fun <)
  45.              (setq xyz (nth (- xyz 120) (list car cadr caddr)))
  46.             )
  47.       )
  48.       (setq Pts (sortpts Pts fun xyz fuzz))
  49.     )
  50.   )
  51.   ;;3 本程序主程序
  52.   (cond
  53.     ((= (type ssPts) 'PICKSET)
  54.      (repeat (setq n (sslength ssPts))
  55.        (if (and        (setq e (ssname ssPts (setq n (1- n))))
  56.                 (setq en (entget e))
  57.            )
  58.          (setq lst (cons (append (cdr (assoc 10 en)) (list e)) lst))
  59.        )
  60.      )
  61.      (mapcar 'last (sortpts1 lst KEY FUZZ))
  62.     )
  63.     ((Listp ssPts)
  64.       (cond
  65.         ((vl-consp (car ssPts)) (sortpts1 ssPts KEY FUZZ))
  66.         ((= (type (car ssPts)) 'ENAME)
  67.          (foreach e ssPts
  68.            (if (setq en (entget e))
  69.              (setq lst (cons (append (cdr (assoc 10 en)) (list e)) lst))
  70.            )
  71.          )
  72.          (mapcar 'last (sortpts1 lst KEY FUZZ))
  73.         )
  74.         (T
  75.          (cond ((equal key "X") (vl-sort ssPts '>))
  76.                (T (vl-sort ssPts '<))
  77.          )
  78.         )
  79.       )
  80.     )   
  81.   )
  82. )
  83. ;;*****************************************************************************通用点表排序


  84. ;******************************************************
  85. (defun get-box            ;返回最大外型两对角点的表
  86. (SS1 / get-ssbox get-enbox get-Extents)
  87. (defun get-ssbox        ;返回集最大外框两对角点的表
  88. (ss / boxlst maxlst minlst objlst)
  89.   (setq objlst (mapcar 'vlax-ename->vla-object (ss-enlst ss)))
  90.   (setq boxlst (mapcar 'get-enbox objlst))
  91.   (setq minlst (mapcar 'car boxlst))
  92.   (setq maxlst (mapcar 'cadr boxlst))
  93.   (list
  94.     (apply 'mapcar (cons 'min minlst))
  95.     (apply 'mapcar (cons 'max maxlst))
  96.   )
  97. )
  98. (defun get-enbox (obj) ;返回对象最大外框两对角点的表
  99.   (if (= (type obj) 'ENAME) (setq obj (vlax-ename->vla-object obj)))
  100.   (vla-getboundingbox obj 'Minp 'Maxp)
  101.   (mapcar 'vlax-safearray->list (list Minp Maxp))
  102. )
  103. (defun get-Extents(lst);返回点表最大外框两对角点的表
  104.   (list
  105.     (apply 'mapcar (cons 'min lst))
  106.     (apply 'mapcar (cons 'max lst))
  107.   )
  108. )

  109. (cond
  110.   ((= (type SS1) 'PICKSET) (get-ssbox SS1))  ;集
  111.   ((= (type SS1) 'ENAME) (get-enbox SS1))    ;图元
  112.   ((= (type SS1) 'LIST) (get-Extents SS1))   ;点表
  113.   (t nil)
  114. )
  115. )

  116. (defun ss-enlst           ;选择集与对象名表互转
  117. (ss / enlst)
  118. (cond
  119.   ((= (type ss) 'PICKSET)
  120.     (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) (mapcar 'cadr (ssnamex SS)))
  121.   )
  122.   ((= (type ss) 'LIST)
  123.     (setq enlst (ssadd))
  124.     (last (mapcar '(lambda (x) (ssadd x enlst)) ss))
  125.   )
  126. )
  127. )
发表于 2014-10-13 20:49 | 显示全部楼层
好像没反应!!!!
 楼主| 发表于 2014-10-13 20:55 | 显示全部楼层
spp_wall 发表于 2014-10-13 20:49
好像没反应!!!!

需要函数支持 ,函数没有缺吧.     排齐的东西需要是个图块.
  然后看一下排齐思路
 楼主| 发表于 2014-10-13 20:57 | 显示全部楼层
spp_wall 发表于 2014-10-13 20:49
好像没反应!!!!

  目前支持的是这样的  左边的图框需要X轴已经对齐了.
然后 右边的这些图框   左下角的点必须在左边的图框高度内,那么他们就会被对齐.
  然后如果你想添加新功能,  就可以自己添加了
发表于 2014-10-13 20:57 | 显示全部楼层
本帖最后由 spp_wall 于 2014-10-13 20:59 编辑
鱼与熊掌 发表于 2014-10-13 20:55
需要函数支持 ,函数没有缺吧.     排齐的东西需要是个图块.
  然后看一下排齐思路

是块 函数是你放的吧
令: tt
选择对象: 指定对角点: 找到 5 个
选择对象:
move
选择对象:   找到 1 个
选择对象:
指定基点或 [位移(D)] <位移>:  _non 指定第二个点或 <使用第一个点作为位移>: _non no function definition:
S指定第二个点或 <使用第一个点作为位移>: *取消*
 楼主| 发表于 2014-10-13 21:01 | 显示全部楼层
spp_wall 发表于 2014-10-13 20:57
是块 函数是你放的吧
令: tt
选择对象: 指定对角点: 找到 5 个

年少的时候写了这四个.
(defun a(pt dst /)
(polar pt pi dst)
)
(defun w(pt dst /)
(polar pt (/ pi 2) dst)
)
(defun s(pt dst /)
(polar pt (+ pi (/ pi 2)) dst)
)
不好意思 加上.
发表于 2014-10-13 21:05 | 显示全部楼层
鱼与熊掌 发表于 2014-10-13 21:01
年少的时候写了这四个.
(defun a(pt dst /)
(polar pt pi dst)

可以了  谢谢分享!!!!!!
发表于 2014-10-13 21:25 | 显示全部楼层
赞一个~~
发表于 2014-10-13 21:38 | 显示全部楼层
允许误差 建议调整为图块高度的一半或和图块大小相关的值,而不是固定的值,更好一些
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-26 12:37 , Processed in 0.352035 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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