Jump to content

Cycling through all AutoCAD drawings that are currently opened ...


Recommended Posts

Posted

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?

Posted

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.

Posted

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))

   

Posted
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"?

Posted

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]

Posted
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?

Posted

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))

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...