Guest bmn123 Posted December 18, 2009 Posted December 18, 2009 I'm looking for a way to run the ATTEDIT command on all drawings that are currently open in AutoCAD. I currently have this (.scr) script: -ATTEDIT N N MyBlock MyField * OldText NewText or as written in LISP: (command "-attedit" "N" "N" "MyBlock" "MyField" "*" "OldText" "NewText") But I want to make it run on all drawings that are currently open (ie. not as they're being opened or based on what folder they are in). Any suggestions? VBA? Quote
Lee Mac Posted December 18, 2009 Posted December 18, 2009 If you intend to perform operations on drawings other than the activeDocument, you will not be able to use "command" statements, but will have to use Visual LISP. I shall post an example. Quote
Lee Mac Posted December 18, 2009 Posted December 18, 2009 Example: (defun atedit (blk lst / dwg lay obj att tag) (vl-load-com) (mapcar 'set '(blk lst) (list (strcase blk) (mapcar (function (lambda (x) (cons (strcase (car x)) (cdr x)))) lst))) (vlax-for dwg (vla-get-Documents (vlax-get-acad-object)) (vlax-for lay (vla-get-layouts dwg) (vlax-for obj (vla-get-Block lay) (if (and (eq "AcDbBlockReference" (vla-get-ObjectName obj)) (eq (vla-get-HasAttributes obj) :vlax-true)) (foreach att (vlax-invoke obj 'GetAttributes) (if (setq tag (assoc (strcase (vla-get-TagString att)) lst)) (vla-put-TextString att (cdr tag))))))) (vla-regen dwg acAllViewports)) (princ)) (defun c:test ( ) (atedit "Block Name" '(("TAG1" . "New Value") ("TAG2" . "New Value"))) (princ)) Quote
Guest bmn123 Posted December 18, 2009 Posted December 18, 2009 Example: [..] Thank you very much, it works great. However: 1) After the text is replaced in each drawing, the text gets slightly misplaced. It can easily be adjusted by manually double clicking the block and just selecting cancel in the attribute editor dialogue box, but I'd like it to be done automatically. 2) Some attribute tags may have the same name, ie. there may be several attribute tags called MyField. Is it possible to replace only the attributes contaning values == "Oldtext"? Quote
Lee Mac Posted December 18, 2009 Posted December 18, 2009 This will use "Old Text", but I believe the attribute shift to be a bug [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] atedit [b][color=RED]([/color][/b]blk lst [b][color=BLUE]/[/color][/b] dwg lay obj att tag[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vl-load-com[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]mapcar[/color][/b] [b][color=DARKRED]'[/color][/b][b][color=BLUE]set[/color][/b] [b][color=DARKRED]'[/color][/b][b][color=RED]([/color][/b]blk lst[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]list[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]strcase[/color][/b] blk[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]mapcar[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]function[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]lambda[/color][/b] [b][color=RED]([/color][/b]x[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]list[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]strcase[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] x[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cadr[/color][/b] x[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]caddr[/color][/b] x[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] lst[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vlax-for[/color][/b] dwg [b][color=RED]([/color][/b][b][color=BLUE]vla-get-Documents[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vlax-get-acad-object[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vlax-for[/color][/b] lay [b][color=RED]([/color][/b][b][color=BLUE]vla-get-layouts[/color][/b] dwg[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vlax-for[/color][/b] obj [b][color=RED]([/color][/b][b][color=BLUE]vla-get-Block[/color][/b] lay[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]and[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] [b][color=#ff00ff]"AcDbBlockReference"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vla-get-ObjectName[/color][/b] obj[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vla-get-HasAttributes[/color][/b] obj[b][color=RED])[/color][/b] [b][color=Blue]:vlax-true[/color][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]foreach[/color][/b] att [b][color=RED]([/color][/b][b][color=BLUE]vlax-invoke[/color][/b] obj [b][color=DARKRED]'[/color][/b]GetAttributes[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]and[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] tag [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]strcase[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vla-get-TagString[/color][/b] att[b][color=RED])[/color][/b][b][color=RED])[/color][/b] lst[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vla-get-TextString[/color][/b] att[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cadr[/color][/b] tag[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vla-put-TextString[/color][/b] att [b][color=RED]([/color][/b][b][color=BLUE]caddr[/color][/b] tag[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vla-regen[/color][/b] dwg [b][color=Blue]acAllViewports[/color][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:test [b][color=RED]([/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b]atedit [b][color=#ff00ff]"Block Name"[/color][/b] [b][color=DARKRED]'[/color][/b][b][color=RED]([/color][/b][b][color=RED]([/color][/b][b][color=#ff00ff]"TAG1"[/color][/b] [b][color=#ff00ff]"Old Value"[/color][/b] [b][color=#ff00ff]"New Value"[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=#ff00ff]"TAG2"[/color][/b] [b][color=#ff00ff]"Old Value"[/color][/b] [b][color=#ff00ff]"New Value"[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] Quote
Guest bmn123 Posted December 23, 2009 Posted December 23, 2009 This will use "Old Text", but I believe the attribute shift to be a bug (...) Excellent, thank you very much. The following command solves the attribute shift issue: MOVE ALL 0 0 Can something like that be run on every drawing too, using Visual LISP? Quote
Lee Mac Posted December 23, 2009 Posted December 23, 2009 Try this: (defun atedit (blk lst / dwg lay obj att tag) (vl-load-com) (mapcar 'set '(blk lst) (list (strcase blk) (mapcar (function (lambda (x) (list (strcase (car x)) (cadr x) (caddr x)))) lst))) (vlax-for dwg (vla-get-Documents (vlax-get-acad-object)) (vlax-for lay (vla-get-layouts dwg) (vlax-for obj (vla-get-Block lay) (if (and (eq "AcDbBlockReference" (vla-get-ObjectName obj)) (eq (vla-get-HasAttributes obj) :vlax-true)) (progn (foreach att (vlax-invoke obj 'GetAttributes) (if (and (setq tag (assoc (strcase (vla-get-TagString att)) lst)) (eq (vla-get-TextString att) (cadr tag))) (vla-put-TextString att (caddr tag)))) (vla-move obj (vlax-3D-point '(0 0 0)) (vlax-3D-point '(0 0 0))))))) (vla-regen dwg acAllViewports)) (princ)) (defun c:test ( ) (atedit "Block Name" '(("TAG1" "Old Value" "New Value") ("TAG2" "Old Value" "New Value"))) (princ)) Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.