Another option:
This will move multiple attributes by tag:
- ;; ============ Amove2.lsp ===============;;;; FUNCTION:;; Will move Multiple Attribute Tags;;;; SYNTAX: AMOVE2;;;; AUTHOR:;; Copyright (c) 2009, Lee McDonnell;; (Contact Lee Mac, CADTutor.net);;;; VERSION:;; 1.0 ~ 28.06.2009;;;; ====================================(defun c:amove2 (/ *error* lklst ent Blk Obj bNme ss bPt ObjLst) (vl-load-com) (defun *error* (msg) (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))) (if lklst (foreach l lklst (vla-put-lock (car l) (cdr l)))) (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")) (princ (strcat "\n>"))) (redraw) (princ)) (vlax-for l (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object))) (setq lklst (cons (cons l (vla-get-lock l)) lklst)) (vla-put-lock l :vlax-false)) (while (progn (setq ent (car (nentsel "\nSelect Attribute: "))) (cond ((eq 'ENAME (type ent)) (if (not (eq "ATTRIB" (cdr (assoc 0 (entget ent))))) (princ "\n** Object is not an Attribute **") nil)) (t (princ "\n** Nothing Selected **"))))) (setq Blk (vla-ObjectIdtoObject (vla-get-ActiveDocument (vlax-get-acad-object)) (vla-get-OwnerId (setq Obj (vlax-ename->vla-object ent))))) (setq bNme (if (vlax-property-available-p Blk 'EffectiveName) (vla-get-EffectiveName Blk) (vla-get-Name Blk))) (setq ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 bNme) (cons 66 1)))) (if (setq bPt (getpoint "\nSelect Base Point: ")) (progn (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))) (setq ObjLst (vl-remove-if-not (function (lambda (x) (eq (vla-get-TagString x) (vla-get-TagString Obj)))) (apply 'append (mapcar 'asmi-GetAttributes (mapcar 'vlax-ename->vla-object (mapcar 'cadr (ssnamex ss))))))) (lmac-ss-drag-move "\nMove Attributes" ObjLst bPt t) (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))))) (foreach l lklst (vla-put-lock (car l) (cdr l))) (princ)) ;;Asmi(defun asmi-GetAttributes (Block / atArr caArr) (append (if (not (vl-catch-all-error-p (setq atArr (vl-catch-all-apply 'vlax-safearray->list (list (vlax-variant-value (vla-GetAttributes Block))))))) atArr) (if (not (vl-catch-all-error-p (setq caArr (vl-catch-all-apply 'vlax-safearray->list (list (vlax-variant-value (vla-GetConstantAttributes Block))))))) caArr))) ;; Ghosting Example, by Lee McDonnell(defun lmac-ss-drag-move (msg ss pt hi / oBjLst MiP MaP bsvec cPLst gr) (vl-load-com) (if msg (prompt (strcat (if (not (vl-string-search "\n" msg)) "\n""") msg))) (or (and (listp ss) (setq OBjLst ss)) (setq oBjLst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))) (vla-getBoundingBox (car oBjLst) 'MiP 'MaP) (setq bsvec (mapcar '- (vlax-safearray->list MiP) pt));;; (mapcar;;; (function;;; (lambda (x);;; (vla-highlight x :vlax-true)));;; (setq cpLst;;; (mapcar 'vla-copy oBjLst))) (while (eq 5 (car (setq gr (grread 't ))) (redraw) (if (and (eq 5 (car gr)) (listp (cadr gr))) (progn (vla-getBoundingBox (car oBjLst) 'MiP 'MaP) (mapcar (function (lambda (x) (vla-move x (vlax-3D-point (mapcar '- (vlax-safearray->list MiP) bsVec)) (vlax-3D-point (cadr gr))))) oBjLst) (if hi (grdraw pt (cadr gr) 3 1)))));;; (mapcar;;; (function;;; (lambda (x);;; (vl-catch-all-apply;;; 'vla-delete;;; (list x)))) cpLst) (redraw))
I have also updated the code in my first post to add some features. |