; TABLES.LSP ; This is a programming example. ; Exerciser for (TBLNEXT) and (TBLSEARCH) functions. ; The functions (LAYER), (LTYPE), (VIEW), (STYLE), (BLOCK) ; (UCS), and (VPORT) can be called independently. Each lists the ; entries in the associated symbol table, optionally in alphabetical ; order. The TABLES command ((C:TABLES) function) calls each of them ; in turn. ; For the layer, linetype, and text style tables, an asterisk in column ; one marks the current setting. If the current linetype is "BYLAYER", ; the linetype corresponding to the current layer will be marked with ; an "L" in column one. ; by Duff Kurland - Autodesk, Inc. ; October 12, 1986 ; Added (UCS) and (VPORT) - May 1988 ; (LAYER) - Dump the layer table (defun layer ( / c d f ln lt ly n x) (tblset "layer") (write-line " Layer Status Color Linetype Description") (terpri) (setq cl (getvar "clayer")) ; get current layer (setq n 0) (setq x (next T)) ; get first layer (while x (setq n (1+ n) ly (fld 2 x) ; layer name ln (fld 6 x) ; linetype name c (fld 62 x) ; color number f (logand (fld 70 x) 1) ; "frozen" flag lt (tblsearch "ltype" ln) ; linetype table entry d (fld 3 lt) ; linetype prose description ) (write-line (strcat (if (= ly cl) "* " " ") ; flag current layer (strfill ly 12) ; edit layer name (strfill (cond ((= f 1) "Frozen") ; edit status ((< c 0) "Off") (T "On") ) 8 ) (strfill (itoa (abs c)) 7) ; edit color number (strfill ln 12) ; edit linetype name (substr d 1 30) ; edit linetype description ) ) (setq x (next nil)) ; get next layer entry ) (princ (if (= n 0) " -None-\n\n" "\n")) nil ) ; (LTYPE) - Dump the linetype table (defun ltype ( / a cl d f lt n s x) (tblset "ltype") (write-line " Linetype Align Segs Description") (terpri) (setq cl (getvar "celtype")) ; get current linetype (setq f "* ") ; set default "current" flag ; If current linetype is "BYLAYER", look up the linetype ; associated with the current layer, and change the ; "current" flag from "* " to "L ". (setq cl (cond ((= cl "BYBLOCK") "") ((= cl "BYLAYER") (setq f "L ") (fld 6 (tblsearch "layer" (getvar "clayer")))) (T cl) ) ) (setq n 0) (setq x (next T)) ; first linetype (while x (setq n (1+ n) lt (fld 2 x) ; linetype name d (fld 3 x) ; linetype prose description a (fld 72 x) ; alignment code s (fld 73 x) ; number of dash length items ) (write-line (strcat (if (= lt cl) f " ") ; flag current entity linetype (strfill lt 12) ; edit layer name (strfill (chr a) 7) ; alignment code (strfill (itoa s) 6) ; number of dash length items (substr d 1 30) ; linetype description ) ) (if (> s 0) (progn ; Edit dash length items (setq x (member (assoc 49 x) x)) ; get list of dash items (while x (setq s (cdar x)) ; get dash length (write-line (strcat (strfill " " 27) (cond ((= s 0) "Dot") ((> s 0) (strcat "Pen down " (rtos s 2 4))) (T (strcat "Pen up " (rtos (abs s) 2 4))) ) ) ) (setq x (cdr x)) ; get next dash item ) )) (setq x (next nil)) ; get next linetype entry ) (princ (if (= n 0) " -None-\n\n" "\n")) nil ) ; (VIEW) - Dump the named view table (defun view ( / c d h n v w x) (tblset "view") (write-line " View Height x Width Center Direction") (terpri) (setq n 0) (setq x (next T)) ; get first view (while x (setq n (1+ n) v (fld 2 x) ; view name c (fld 10 x) ; center point d (fld 11 x) ; view direction h (fld 40 x) ; height w (fld 41 x) ; width (valid only for windows) ) (write-line (strcat " " (strfill v 12) ; edit view name (strfill (strcat (rtos h 2 4) ; edit height x width "x" (rtos w 2 4)) 18 ) (strfill (strcat (rtos (car c) 2 4) ; edit center point "," (rtos (cadr c) 2 4)) 18 ) (rtos (car d) 2 4) ; edit X portion of direction "," (rtos (cadr d) 2 4) ; edit Y portion of direction "," (rtos (caddr d) 2 4) ; edit Z portion of direction ) ) (setq x (next nil)) ; get next view entry ) (princ (if (= n 0) " -None-\n\n" "\n")) nil ) ; (STYLE) - Dump the text style table (defun style ( / cs fb ff g h n o s w x) (tblset "style") (write-line " Text style Height Width Slant Flags Font Bigfont") (terpri) (setq cs (getvar "textstyle")) ; get current style (setq n 0) (setq x (next T)) ; get first style (while x (setq n (1+ n) s (fld 2 x) ; style name ff (fld 3 x) ; primary font file fb (fld 4 x) ; big font file h (fld 40 x) ; height w (fld 41 x) ; width factor o (fld 50 x) ; obliquing angle g (fld 71 x) ; generation flags ) (write-line (strcat (if (= s cs) "* " " ") ; flag current style (strfill s 12) ; edit style name (strfill (rtos h 2 4) 8) ; height (strfill (rtos w 2 4) 8) ; width factor (strfill (angtos o 0 2) 7) ; obliquing angle (strfill (itoa g) 7) ; generation flags (strfill ff 10) ; primary font file fb ; big font file ) ) (setq x (next nil)) ; get next style entry ) (princ (if (= n 0) " -None-\n\n" "\n")) nil ) ; (BLOCK) - Dump the block definition table (defun block ( / b e ec ed et f n o x) (tblset "block") (write-line " Block Flags Origin") (terpri) (setq n 0) (setq x (next T)) ; get first block definition (while x (setq n (1+ n) b (fld 2 x) ; block name o (fld 10 x) ; origin X,Y,Z f (fld 70 x) ; flags ) (write-line (strcat " " (strfill b 12) ; edit block name (strfill (itoa f) 7) ; flags (rtos (car o) 2 4) ; origin X "," (rtos (cadr o) 2 4) ; origin Y "," (rtos (caddr o) 2 4) ; origin Z ) ) ; Display interesting facts about the entities comprising ; this block definition. (setq e (fld -2 x)) ; point to first entity (while e (setq ed (entget e)) ; get the entity data (setq et (fld 0 ed)) ; entity type (setq ec (fld 62 ed)) ; entity color (write-line (strcat (strfill " " 14) (strfill et 9) ; edit entity type " on layer " (fld 8 ed) ; edit layer name " with color " (cond ((= ec 0) "BYBLOCK") ; edit color number ((null ec) "BYLAYER") (T (itoa ec)) ) ) ) (if (setq e (entnext e)) ; if there's another entity, (setq ed (entget e)) ; read its data ) ) (terpri) (setq x (next nil)) ; get next block entry ) (princ (if (= n 0) " -None-\n\n" "\n")) nil ) ; (UCS) - Dump the UCS table (defun ucs ( / n x na o xd yd) (tblset "ucs") (write-line " UCS Origin X axis direction Y axis direction") (terpri) (setq n 0) (setq x (next T)) ; get first ucs (while x (setq n (1+ n) na (fld 2 x) ; UCS name o (fld 10 x) ; origin xd (fld 11 x) ; X axis direction yd (fld 12 x) ; Y axis direction ) (write-line (strcat (if (= na cucs) "* " " ") ; flag current UCS (strfill na 12) ; edit UCS name (strfill (strcat "(" (rtos (car o) 2 2) ; edit UCS origin "," (rtos (cadr o) 2 2) "," (rtos (caddr o) 2 2) ")") 18) (strfill (strcat "(" (rtos (car xd) 2 2) ; edit X axis direction "," (rtos (cadr xd) 2 2) "," (rtos (caddr xd) 2 2) ")") 20) "(" (rtos (car yd) 2 2) ; edit Y axis direction "," (rtos (cadr yd) 2 2) "," (rtos (caddr yd) 2 2) ")" ) ) (setq x (next nil)) ; get next UCS entry ) (princ (if (= n 0) " -None-\n\n" "\n")) nil ) ; (VPORT) - Dump the viewport table (defun vport ( / n x na ll ur v) (setq prev nil) (tblset "vport") (write-line " Viewport Lower left Upper Right View Mode") (terpri) (setq n 0) (setq x (nextvp T prev)) ; get first viewport (while x (setq n (1+ n) na (fld 2 x) ; viewport name ll (fld 10 x) ; lower left corner ur (fld 11 x) ; upper right corner v (fld 71 x) ; view mode ) (write-line (strcat " " (strfill na 10) ; edit viewport name " " (strfill (strcat "(" ; edit lower left corner (rtos (car ll) 2 2) "," (rtos (cadr ll) 2 2) ")") 15) (strfill (strcat "(" ; edit upper right corner (rtos (car ur) 2 2) "," (rtos (cadr ur) 2 2) ")") 15) " " (rtos v 2 2) ; edit view mode ) ) (setq x (nextvp nil prev)) ; get next viewport entry ) (princ (if (= n 0) " -None-\n\n" "\n")) nil ) ; Blank-fill the given string to a specified number of characters (defun strfill (s len) (substr (strcat s " ") 1 len) ) ; Return the value associated with a particular entity field (defun fld (num lst) (cdr (assoc num lst)) ) ; Set up to process specified symbol table. If TBLSORT is not yet ; defined, ask user whether the entries should be sorted. If sorting ; is enabled, obtain all entries and sort them forming TBLENTS list. (defun tblset (tbl / new s) (textscr) (setq tblname tbl) ; set table name (if (null tblsort) (progn ; sorting not yet determined (initget 1 "Yes No") ; Establish keywords, no null (setq s (getkword "\nSort the entries (Y/N) ? ")) (setq tblsort (if (= s "Yes") 1 0)) )) (if (= tblsort 1) (progn ; if sorting is enabled (setq tblents nil) ; start with null list (setq new (cdr (assoc 2 (tblnext tbl T)))) ; get first entry name (while new (setq tblents (cons new tblents)) ; add to list (setq new (cdr (assoc 2 (tblnext tbl)))) ; get next entry name ) (setq tblents (str-sort tblents)) ; sort the name list )) ) ; Obtain next (or first) entry from table, or from sorted entry list. (defun next (first / temp) (if (= tblsort 1) (progn ; if sorting enabled (setq temp (car tblents)) ; get next name from list (if temp (progn ; if not end of list... (setq tblents (cdr tblents)) ; chop from list (tblsearch tblname temp) ; get table entry for this name )) ) (tblnext tblname first) ; else get next (or first) table entry ) ) ; Obtain next (or first) vports entry from table, or from sorted entry list. (defun nextvp (first prev / temp) (if (= tblsort 1) (progn ; if sorting enabled (if first (setq temp (car tblents)) ; get first name from list (progn (setq prev (car tblents)) ; store previous name (setq temp (cadr tblents)) ; get next name from list ) ) (if temp (progn (if (null first) (setq tblents (cdr tblents)); chop from list ) (if (= prev temp) (progn (setq prev temp) (tblnext tblname first) ; get next table entry )(progn (setq prev temp) (tblsearch tblname temp T) ; get table entry for this name )) )) ) (tblnext tblname first) ; else get next (or first) table entry ) ) ; Sort a list of strings. (defun str-sort (x) (cond ((null (cdr x)) x) (T (str-merge (str-sort (first-half x)) (str-sort (last-half x)))))) (defun str-merge (a b) (cond ((null a) b) ((null b) a) ((< (strcmp (car a) (car b)) 0) (cons (car a) (str-merge (cdr a) b))) (t (cons (car b) (str-merge a (cdr b)))))) (defun first-half (l) (head l (1- (length l)))) (defun head (l n) (cond ((minusp n) nil) (t (cons (car l) (head (cdr l) (- n 2)))))) (defun last-half (l) (tail l (1- (length l)))) (defun tail (l n) (cond ((minusp n) l) (t (tail (cdr l) (- n 2))))) ; Compare two strings. Return 0 if they are equal, -1 if the ; first string is less than the second in ASCII collating sequence, ; and 1 if the second string is less than the first. (defun strcmp (a b) (cond ((= a b) 0) (T (cond ((< (ascii a) (ascii b)) -1) ((> (ascii a) (ascii b)) 1) (t (strcmp (substr a 2) (substr b 2))))))) ; Dump all the symbol tables (defun C:TABLES () (setq tblsort nil) ; Force "Sort Y/N" query (layer) (ltype) (view) (style) (block) (ucs) (vport) )