Autolisp: Deleting All Attributes In A Block

Unlike the previous post where you could only delete all but one attribute, this LISP routine allows you to delete all attributes in the selected blocks.

As seen below:

  • ATTDEL2 <to start>
  • Select blocks with attributes  <enter> all attributes from these blocks will be deleted.

 

 

 

 

 

 

 

 

 

; written by Tony Burba

; found @ http://forums.autodesk.com/t5/Visual-LISP-AutoLISP-and-General/Need-lisp-to-delete-all-attributes-from-set-of-blocks/td-p/1565037

(defun tl_fld (v1 v2) (cdr (assoc v1 v2)))

(defun c:attdel2 (/	     ss		cnt	   blk

blkdat     blknam	blktblnam  blknewdat

blktbldat  newblkdat	atk_dbug   nextent

nextentdat nextenttyp	endblklst

)

(command "undo" "group")

(setq atk_dbug nil)

;;  (setq atk_dbug T)

(if (setq ss (ssget (list (cons 0 "insert") (cons 66 1))))

(progn

(setq cnt -1)

(repeat (sslength ss)

(setq blk	(ssname ss (setq cnt (1+ cnt)))

blkdat	(entget blk)

blknam	(tl_fld 2 blkdat)

newblknam	(strcat blknam "_na")

blknewdat	(subst (cons 2 newblknam)

(assoc 2 blkdat)

blkdat

)

blknewdat	(subst (cons 66 0)

(assoc 66 blknewdat)

blknewdat

)

)

(if (not (tblsearch "block" newblknam))

(progn

(setq blktblnam (tblobjname "block" blknam)

blktbldat (entget blktblnam)

newblkdat (subst (cons 2 newblknam)

(assoc 2 blktbldat)

blktbldat

)

newblkdat (subst (cons 70 (- (tl_fld 70 blktbldat) 2))

(assoc 70 blktbldat)

newblkdat

)

)

(if	(entmake newblkdat)

(progn

(if atk_dbug

(princ "\nStarting new block definition . . . ")

)

(setq nextent	 (entnext blktblnam)

nextentdat (entget nextent)

nextenttyp (tl_fld 0 nextentdat)

)

(while (and nextenttyp (/= nextenttyp "ENDBLK"))

(if (/= nextenttyp "ATTDEF")

(if	(not (entmake nextentdat))

(princ "\nCan't make subentity.")

(if atk_dbug

(princ (strcat "\nAdding "

nextenttyp

" as subentity "

(itoa xcnt)

)

)

)

)

(if	atk_dbug

(princ "\nSkipping attribute definition.")

)

)

(setq	nextentdat

nil

nextenttyp nil

)

(if (setq nextent (entnext nextent))

(setq

nextentdat (entget nextent)

nextenttyp (tl_fld 0 nextentdat)

)

)

)

(setq endblklst	(list (cons 0 "endblk")

(cons 100 "AcDbBlockEnd")

)

)

(if (not (entmake endblklst))

(princ "\nCan't terminate block definition")

)

)

(princ "\nCan't start new block definition.")

)

)

)

(if (tblsearch "block" newblknam)

(progn

(entdel blk)

(entmake blknewdat)

)

)

)

(setq ss nil)

)

)

(command "undo" "end")

(tl_$tlp)

)

 

Advertisements

About AutoCAD Tips

This blog serves as a knowledge base for myself (and anyone else) so that I can reference tips & tricks that I have learned and also refer others to it as well. I hope that this blog helps you learn at least one tip to make your drafting/design experience better.
This entry was posted in Attributes, AutoLISP, Blocks, Modifying, TIPS. Bookmark the permalink.

5 Responses to Autolisp: Deleting All Attributes In A Block

  1. Tom says:

    …. am I wrong when I think this is useless for AutoCAD LT?

    • AutoCAD Tips says:

      kinda – You can create custom linetypes but you have to do them manually. LT can’t run AutoLISP.
      However, a couple of years ago there was a 3rd party enabler that could let you run lisp files. I don’t know what ever happened to that.

  2. EduardChris says:

    Thank you very much. It works perfectly.

  3. Kathleen says:

    I’ve wasted a couple days on these disastrous xrefs. The attributes were the last thing I had to tackle. I could use ATTDISP to hide them in CAD, but linked into Revit they still show. Thanks for sharing it, you saved me a major headache.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s