本帖最后由 菜卷鱼 于 2013-12-19 10:51 编辑
 - (defun c:et ()
- (setvar "cmdecho" 0)
- (setq ptlist1 nil)
- (setq ss (ssget '( (0 . "INSERT")) ))
- (setq ss0 (sort-se (sort-se ss 10 1 50 nil) 10 0 2 nil ))
- (setq sct (sslength ss))
- (setq x1 0 x2 0)
- (setq ss1 ss0 ss2 ss0)
- (repeat sct
- (setq sent (entget (ssname ss1 x1 )))
- (setq ascd10 (assoc 10 sent))
- (setq ptlist1 (cons ascd10 ptlist1))
- (setq x1 (1+ x1))
- )
- (etmove)
- (prin1)
- )
- (defun etmove ( )
- (setvar "cmdecho" 0)
- (command "_.undo" "be")
- (setq ptlist2 ptlist1)
- (repeat sct
- (setq acx10 (cdr (car ptlist2)))
- (setq ptlist2 (cdr ptlist2))
- (setq sn (ssname ss2 x2 ) )
- (setq sent2 (entget sn))
- (setq acy10 (cdr (assoc 10 sent2)))
- (command "_move" sn "" acy10 acx10 )
- (setq x2 (1+ x2))
- )
- (command "_.undo" "e")
- (setvar "cmdecho" 1)
- )
- ;;;;;;通用排序程序,来自明经论坛
- (vl-load-com)
- (defun SORT-SE (SE DXF INT FUZZ K / ENT INDEX LST NEWLST NEWSE TMP)
- ;;建立排序列表
- (setq LST '() INDEX 0)
- (repeat (sslength SE)
- (setq ENT (entget (ssname SE INDEX))
- TMP (cdr (assoc DXF ENT)) )
- (if (and INT (= (type INT) 'INT) (= (type TMP) 'list)(< INT (length TMP)) )
- (setq TMP (nth INT TMP)))
- (setq LST (cons (list TMP (cdr (assoc 5 ENT))) LST))
- (setq INDEX (1+ INDEX)));;排序操作
- (if (and FUZZ
- (or (= (type FUZZ) 'INT)
- (= (type FUZZ) 'REAL))
- (or (= (type TMP) 'INT) (= (type TMP) 'REAL)))
- (setq NEWLST
- (vl-sort LST (function (lambda (E1 E2) (< (+ (car E1) FUZZ) (car E2)))
- )))
- (setq NEWLST
- (vl-sort LST (function (lambda (E1 E2) (< (car E1) (car E2))))
- ))) ;;如果K为T,则倒置
- (if K (setq NEWLST (reverse NEWLST)))
- (setq NEWSE (ssadd))
- (foreach TMP NEWLST
- (setq NEWSE (ssadd (handent (cadr TMP)) NEWSE))
- ) ;;返回值 NEWSE ;_结束defun;;;
- )
- ;;;;示例:
- ;(SORT-SE SS 10 0 5.0 T);;;;;;;;;
- ;表示按照10组码的X坐标值进行排序,允许偏差值为5.0,顺序为从大到小;;;;;;;
- ;(SORT-SE SS 10 1 3.0 NIL);;;;;;;
- ;表示按照10组码的Y坐标值进行排序,允许偏差值为3.0,顺序为从小到大;;;;;;
- ;(SORT-SE SS 8 NIL NIL NIL);;;;;;;
- ;表示按照8组码值(图层名称)进行排序,顺序为从小到大;;;;;;
- (prin1)
|