Search the FAQ Archives

3 - A - B - C - D - E - F - G - H - I - J - K - L - M
N - O - P - Q - R - S - T - U - V - W - X - Y - Z
faqs.org - Internet FAQ Archives

comp.cad.autocad AutoLISP FAQ (part 2/2) - samples, code
Section - [22] Block Attributes

( Part1 - Part2 - Single Page )
[ Usenet FAQs | Web FAQs | Documents | RFC Index | Business Photos and Profiles ]


Top Document: comp.cad.autocad AutoLISP FAQ (part 2/2) - samples, code
Previous Document: [21.8] How to write XYZ data of selected objects to a file?
Next Document: [23] Polylines
See reader questions & answers on this topic! - Help others by sharing your knowledge
[22.1] How to access block attributes?

  Check all subentities after the INSERT until the attribute is found.
  See http://xarch.tu-graz.ac.at/autocad/stdlib/STDENT.LSP

  ;;; returns entget-list of attribute attname (STRING) in element ele
  ;;; or nil if not found
  (defun ATTELE (ele attname / rslt)
    (if (and (istypep ele "INSERT")
             (= (getval 66 ele) 1))
      (progn
        (setq ele (entnext (entity ele)))
        (while (istypep ele "ATTRIB")
          (if (= (strcase (getval 2 ele)) (strcase attname))
            (setq rslt (entget ele) ele nil)      ;break the loop
            (setq ele (entnext ele))))))
    rslt
  )

  ;;;Example:
  (attele (entsel) "TEST")   ; returns entget-list of
                             ; attribute "TEST" if the block has it

  BTW: Even trickier functions to get entities DXF group codes are
       GET and EDLGETENT by Vladimir Nesterowsky.
  ;;;Sample calls:
  ;;; return list of 2,1 and -1 group values
  (defun GET-ATTRIBS-LOOK-UP (block-ename)
    (get '(2 1 -1) (cdr (edlgetent block-ename))))

  (defun ALL-VERTICES-AND-BULGES (pline-ename)
    (get '(10 42)  (cdr (edlgetent pline-ename))))

  available at http://members.tripod.com/~vnestr/

------------------------------

[22.2] How to MODIFY block attributes? DATESTAMP.LSP

  For a very simple DATESTAMP.LSP simply entmod the entget-list 
  of the DATE attribute in your plotstamp block, retrieved from 
  (attele) as above.

  ;;; change the attribute value of INSERT ele to new (group 1)
  (defun ATTCHG (ele attname new / b)
    (if (setq b (attele ele attname))
      (entmod (subst (cons 1 new) (getval 1 b) b))))

  ;;; Change all DATESTAMP attributes in all inserted PLOT* blocks
  (defun C:DATESTAMP ()
    (ssmap            ;fixed by Alan Williams, wrong arg order
     '(lambda (ele)
        (attchg ele "DATESTAMP" (today))
        (entupd ele)
      )
      (ssget "X" '((0 . "INSERT")(2 . "PLOT*")))))
  ;;;return todays date, could be a DIESEL or this string conversion
  (defun TODAY (/ s)
    (setq s (rtos (getvar "CDATE") 2))  ;gets the julian date
    (strcat (substr s 5 2) "-" (substr s 7 2)"-"(substr s 3 2)))

  Automatic datestamps are normally done with either RTEXT 
  (bonus/express tools) or HPCONFIG with a HPGL/2 plotter. (<a2000i)

------------------------------

[22.3] How to UPDATE block attributes?

  There exists a support/ATTREDEF.LSP to update attribute properties
  (position, layer, ...) for already inserted blocks.

  On complex entities you must (entupd) the header entity, to see
  the update on the screen (forces an element REGEN).

  ;;; Example:
  (setq s (getstring "Change Attribute to: "))
  (attchg (attele (setq b (entsel "of block: ")) s)))
  (entupd (car b))        ; the block, not the attribute

  ;;; some more helper funcs to get the main entity of any attribute
  ;;; or vertex
  (defun MAIN-ENTITY (ele)
    (setq b (entity b))   ;force ENAME
    (while (istypep b '("ATTRIB" "ATTDEF" "VERTEX"))
      (setq b (entnext b)))               ;loop until no more sub-ents
    (if (istypep b '("SEQEND" "ENDBLK"))
      (getval -2 b)                       ;complex entity -> header
      b                                   ;normal entity
    )
  )

------------------------------

[22.4] How to ENTMAKE a Block Complex Entity in AutoLISP

   See http://xarch.tu-graz.ac.at/autocad/stdlib/ENTMAKE.LSP or 
   http://www.autodesk.com/support/techdocs/td30/td301515.htm (broken)
   There is an example how to use multiple calls to (entmake) to create
   the block header, the entities, closes the block and finally
   (entmake) the INSERT.
     For anonymous blocks beware that only
   (setq bn (entmake '((0 . "ENDBLK")))) returns the blockname for
   (entmake (list '(0 . "INSERT")'(70 . 1)(cons 2 bn) ...))

User Contributions:

Comment about this article, ask questions, or add new information about this topic:

CAPTCHA




Top Document: comp.cad.autocad AutoLISP FAQ (part 2/2) - samples, code
Previous Document: [21.8] How to write XYZ data of selected objects to a file?
Next Document: [23] Polylines

Part1 - Part2 - Single Page

[ Usenet FAQs | Web FAQs | Documents | RFC Index ]

Send corrections/additions to the FAQ Maintainer:
rurban@xarch.tu-graz.ac.at (Reini Urban)





Last Update March 27 2014 @ 02:11 PM