本帖最后由 Gu_xl 于 2012-3-13 19:23 编辑
;;批量物体对齐
 - (defun c:pldq ()
- ;;选择集转表
- (defun gxl-Sel-SS->List (ss / i s )
- (if ss
- (repeat (setq i (sslength ss))
- (setq s (cons (ssname ss (setq i (1- i))) s))
- )
- )
- )
- ;;计算物体中心点
- (defun gxl-getboxCenter (e1 / obj minpoint maxpoint)
- (if (= 'ENAME (type e1))
- (setq obj (vlax-ename->vla-object e1)) ;转换图元名
- (setq obj e1)
- )
- (vla-GetBoundingBox obj 'minpoint 'maxpoint)
- ;取得包容图元的最大点和最小点
- (setq minpoint (vlax-safearray->list minpoint)) ;把变体数据转化为表
- (setq maxpoint (vlax-safearray->list maxpoint)) ;把变体数据转化为表
- (setq p (mapcar '+ minpoint maxpoint))
- (mapcar '(lambda (x) (* 0.5 x)) p)
- )
- ;;主程序
- (setq cmdecho (getvar 'cmdecho))
- (setq osmode (getvar 'osmode))
- (setvar 'osmode 0)
- (setvar 'cmdecho 0)
- (princ "\n选择基准物体:")
- (setq s1 (ssget))
- (princ "\n选择要对齐物体:")
- (setq s2 (ssget))
- (setq s1 (GXL-SEL-SS->LIST s1)
- s2 (GXL-SEL-SS->LIST s2)
- )
- (setq s1 (mapcar '(lambda (x) (list x (GXL-GETBOXCENTER x))) s1))
- (setq s1 (vl-sort s1 '(lambda (a b) (> (cadadr a) (cadadr b))) )) ;_ 按Y从大到小排序
- (setq s2 (mapcar '(lambda (x) (list x (GXL-GETBOXCENTER x))) s2))
- (setq s2 (vl-sort s2 '(lambda (a b) (> (cadadr a) (cadadr b))) )) ;_ 按Y从大到小排序
- (setq n 0)
- (repeat (length s1)
- (setq e1 (car (nth n s1))
- p1 (cadr (nth n s1))
- )
- (if (setq e2 (car (nth n s2)))
- (progn
- (setq p2 (cadr (nth n s2)))
- (setq p3 (list (car p2) (cadr p1) (caddr p2)))
- (command "move" e2 "" p2 p3)
- )
- )
- (setq n (1+ n))
- )
- (setvar 'osmode osmode)
- (setvar 'cmdecho cmdecho)
- (princ)
- )
|