aws 发表于 2023-5-2 20:14:03

图元按大小排序


[*]大伙帮忙看看,我想写图元按Y轴长度来从左到右排序,
[*]这段代码,哪里出了问题,另外这个思路能不能行得通?
[*]

[*](defun c:js()
[*](setvar "cmdecho" 0)
[*](command "undo" "be")
[*](setq bz(getvar "osmode"))(setvar "osmode" 0)
[*](setq ss(ssget))
[*](setq p(getpoint "\n选择排列起始点:"))
[*](setq ylst '() lst '())
[*](repeat(setq n(sslength ss))
[*]    (setq en(ssname ss(setq n(1- n))))
[*]    (setq enbox(getenbox en))
[*]    (setq p1(car enbox))
[*]    (setq p9(cadr enbox))
[*]    (setq y(-(cadr p9)(cadr p1)));---获取单个图元的Y长度
[*]    (setq tuyuan(cdr(assoc -1(entget en))));---获取图元名
[*]    (setq ylst(cons y ylst))
[*]    (setq lst(cons(list y tuyuan p1 p9)lst))
[*])
[*](repeat (sslength ss)
[*]    (setq yy(apply 'max ylst));---返回最大y长度
[*]    (setq yylst(nth(lstwz yy ylst)lst));---返回yy对应的那个
[*]    (setq ylst(vl-remove yy ylst));---删掉列表中指定元素
[*]    (setq sss(ssadd))
[*]    (setq yyen(cadr yylst))
[*]    (setq p11(caddr yylst))
[*]    (setq p99(cadddr yylst))
[*]    (setq p33(list(car p99)(cadr p11)))
[*]    (ssadd yyen sss)
[*]    (command "MOVE" sss "" p11 p)
[*]    (setq p p33)
[*])
[*](setvar "osmode" bz)
[*](command "undo" "e")
[*](setvar "cmdecho" 1)
[*](princ)
[*])
[*];---返回a在表lst中的位置
[*](defun lstwz(a lst / b)
[*](cond((setq b(member a lst))(-(length lst)(length b))))
[*])
[*];---获取单个图元左下角,右上角,中心点坐标
[*](defun getenbox(en / enbox py pz pzx)
[*](vla-getboundingbox(vlax-ename->vla-object en) 'minp 'maxp)
[*](setq pz(vlax-safearray->list minp))
[*](setq py(vlax-safearray->list maxp))
[*](setq pzx(mapcar '(lambda(X Y)(/(+ X Y)2))pz py))
[*](setq enbox(list pz py pzx))
[*]enbox
[*])

liuhe 发表于 2023-5-2 21:07:57


(defun c:js (/ BZ SS P YLST LST N EN ENBOX P1 P9 Y TUYUAN I YYLST EE P11)
(setvar "cmdecho" 0)
(command "undo" "be")
(setq bz(getvar "osmode"))(setvar "osmode" 0)
(setq ss(ssget))
(setq p(getpoint "\n选择排列起始点:"))
(setq ylst '() lst '())
(repeat(setq n(sslength ss))
    (setq en(ssname ss(setq n(1- n))))
    (setq enbox(getenbox en))
    (setq p1(car enbox))
    (setq p9(cadr enbox))
    (setq y(-(cadr p9)(cadr p1)));---获取单个图元的Y长度
    (setq tuyuan(cdr(assoc -1(entget en))));---获取图元名
    (setq lst(cons(list y tuyuan )lst))
   
)
(setq        lst (vl-sort lst
                     (function (lambda (e1 e2)
                               (<(car e1) (car e2))
                             )
                     )
          )
        I   0
)
(repeat (length LST)
    (setq yylst(nth I lst));---返回yy对应的那个
    (setq EE(cadr yylst))
    (setq enbox(getenbox EE))
    (setq p11(car enbox))
    (vla-move (vlax-ename->vla-object EE) (vlax-3D-point p11 ) (vlax-3D-point p ))
    (setq enbox(getenbox EE))
    (setq p(list(car(cadr enbox))(cadr P)))
    (setq           I(1+ I))
)
(setvar "osmode" bz)
(command "undo" "e")
(setvar "cmdecho" 1)
(princ)
)
;---返回a在表lst中的位置
;;;(defun lstwz(a lst / b)
;;;(cond((setq b(member a lst))(-(length lst)(length b))))
;;;)
;---获取单个图元左下角,右上角,中心点坐标
(defun getenbox(en / enbox py pz pzx)
(vla-getboundingbox(vlax-ename->vla-object en) 'minp 'maxp)
(setq pz(vlax-safearray->list minp))
(setq py(vlax-safearray->list maxp))
(setq pzx(mapcar '(lambda(X Y)(/(+ X Y)2))pz py))
(setq enbox(list pz py pzx))
enbox
)


不知道是不是你想要的

DLSPH 发表于 2023-12-19 14:27:23

ninja37 发表于 2023-5-18 22:19
大师能不能改一下加上一个选项 按等距离排列的功能

(defun c:JS(/ en enbox getenbox n p p1 p9 ss ty y ylst)
      (defun getenbox(en / enbox py pz pzx)
                (vla-getboundingbox(vlax-ename->vla-object en) 'minp 'maxp)
                (setq pz(vlax-safearray->list minp))
                (setq py(vlax-safearray->list maxp))
                (setq pzx(mapcar '(lambda(X Y)(/(+ X Y)2))pz py))
                (setq enbox(list pz py pzx))
                enbox
      )
(setvar "cmdecho" 0)
(command "undo" "be")



(setq os1 (getvar "osmode"))
(setvar "osmode" 1)

(if (= selcc nil) (setq selcc 10))                               ;偏移距离初设 0      
(setq cc1 (getdist (strcat "输入间距:<" (rtos selcc) ">")))
(if (= cc1 nil)(setq cc1 selcc )(setq selcc cc1))

(setvar "osmode" 0)


(setq ss(ssget))
(setq p(getpoint "\n选择排列起始点:"))
(setq ylst '())
(repeat(setq n(sslength ss))
    (setq en(ssname ss(setq n(1- n))))
    (setq enbox(getenbox en))

       (if (= N nil)
    (exit)
)
    (setq p1(car enbox))
    (setq p9(cadr enbox))
    (setq y(-(cadr p9)(cadr p1)));---获取单个图元的Y长度
    (setq ylst(append ylst (list (list y en (list (car p1) (cadr p9))))))
)
(setq ylst (vl-sort ylst '(lambda (x y) (< (car x) (car y)))))
      (foreach tylst ylst
                (setq y(car tylst))(print y)
                (setq ty(cadr tylst))
                (setq p1(caddr tylst))
                (command "move" ty "" "non" p1 "non" p)
                ;(setq p(polar p 0.0 y))
                (setq p(polar p (* pi 1.5) (+ y cc1)))
      )
      

(setvar "osmode" os1)
(command "UNDO" "e")
(setvar "cmdecho" 1)
(princ)
)

飞雪神光 发表于 2023-5-2 20:45:47

(defun c:js(/ en enbox getenbox n p p1 p9 ss ty y ylst)
        (defun getenbox(en / enbox py pz pzx)
                (vla-getboundingbox(vlax-ename->vla-object en) 'minp 'maxp)
                (setq pz(vlax-safearray->list minp))
                (setq py(vlax-safearray->list maxp))
                (setq pzx(mapcar '(lambda(X Y)(/(+ X Y)2))pz py))
                (setq enbox(list pz py pzx))
                enbox
        )
(setvar "cmdecho" 0)
(command "undo" "be")
(setq ss(ssget))
(setq p(getpoint "\n选择排列起始点:"))
(setq ylst '())
(repeat(setq n(sslength ss))
    (setq en(ssname ss(setq n(1- n))))
    (setq enbox(getenbox en))
    (setq p1(car enbox))
    (setq p9(cadr enbox))
    (setq y(-(cadr p9)(cadr p1)));---获取单个图元的Y长度
    (setq ylst(append ylst (list (list y en (list (car p1) (cadr p9))))))
)
(setq ylst (vl-sort ylst '(lambda (x y) (< (car x) (car y)))))
        (foreach tylst ylst
                (setq y(car tylst))(print y)
                (setq ty(cadr tylst))
                (setq p1(caddr tylst))
                (command "move" ty "" "non" p1 "non" p)
                ;(setq p(polar p 0.0 y))
                (setq p(polar p (* pi 1.5) y))
        )
        (command "undo" "e")
(princ)
)

aws 发表于 2023-5-3 08:24:22

liuhe 发表于 2023-5-2 21:07
不知道是不是你想要的

非常完美,感谢指点

aws 发表于 2023-5-3 08:25:44

飞雪神光 发表于 2023-5-2 20:45


感谢指点!

h806600727 发表于 2023-5-3 16:54:59

如何让图元里的文字跟着一起移动,文字在图元中的位置不变:handshake,麻烦大佬给改一下

aws 发表于 2023-5-3 19:26:29

h806600727 发表于 2023-5-3 16:54
如何让图元里的文字跟着一起移动,文字在图元中的位置不变,麻烦大佬给改一下

跟着一起移动,且相对位置不变,那么你就把文字和图元做成块,再移动呗,之后再把块炸开即可

LYC688 发表于 2023-5-3 19:53:32

liuhe 发表于 2023-5-2 21:07
不知道是不是你想要的

应该可以指定选择X和y方向,这样好一些

liuhe 发表于 2023-5-3 20:45:25

LYC688 发表于 2023-5-3 19:53
应该可以指定选择X和y方向,这样好一些

……,要不你让程序更好一下?

aws 发表于 2023-5-4 07:42:16

LYC688 发表于 2023-5-3 19:53
应该可以指定选择X和y方向,这样好一些

自己稍加修改就可以实现了,主要是学习大佬的一些关键节点方法
页: [1] 2
查看完整版本: 图元按大小排序