Lisp »Tips 'n Tricks
»Lybk.lsp
Salva su file un elenco di blocchi presenti nel disegno aperto divisi per layer.
Ecco la procedura:
Dopo aver caricato il comando nel modo solito digitare alla linea di comando:
lybk
Selezionare con una finestra tutto o una parte del disegno, poi premere Invio per confermare la selezione.
Il Lisp salva sul file LYBK.TXT l'elenco dei blocchi divisi per layer.
Esempio:
File: Tav04-Prova.dwg
QUOTE :
2 TR_QUOTA
SOLAI-ACCIAIO :
4 HEB160
PILASTRI :
8 HEB160
16 HEA180
Autore: Claudio Piccini
;|
LYBK.LSP * 21 Dic. 2003
Copyright (c)2003 by Claudio Piccini * www.cg-cad.com
<piccinik@yahoo.it>
Conta i blocchi per nome e per layer
Salva i dati su file LYBK.TXT
|;
(defun myerror (s)
(if (/= s "Function cancelled")
(princ (strcat "\nError: " s))
)
(ripVar)
(princ)
)
(defun salVar ()
(setq orto (getvar "orthomode"))
(setq snapp (getvar "osmode"))
(setq snm (getvar "snapmode"))
(setq piano (getvar "clayer"))
(setq nomeDir (getvar "dwgprefix"))
(setq nomeDWG (getvar "dwgname"))
)
(defun ripVar ()
(command "_redraw")
(setvar "cmdecho" 1)
(setvar "osmode" snapp)
(setvar "snapmode" snm)
(setvar "orthomode" orto)
(setvar "clayer" piano)
(setvar "cecolor" "BYLAYER")
(setq *error* olderr)
(princ)
)
(defun c:lybk (/ SS lly lbk record lnome bnome nf f1
index index2 index3
nBlk str EL A L
olderr snapp snm orto piano nomeDir nomeDWG
)
(setq olderr *error* *error* myerror)
(setvar "cmdecho" 0)
(salVar)
(if (/= (setq SS (ssget (list (cons 0 "insert")))) nil)
(progn
(setq lly (list nil)) ; lista layer
(setq record (tblnext "layer" T))
(while record
(setq lnome (cdr (assoc 2 record)))
(setq lly (append lly (list lnome)))
(setq record (tblnext "layer"))
)
(setq lly (cdr lly)) ; elimino nil dalla lista layer
(setq lbk (list nil)) ; lista blocchi
(setq index 0)
(repeat (sslength SS)
(setq EL (entget (SSNAME SS index)))
(setq A (cdr (assoc 2 EL)))
(if (/= (substr A 1 1) "*") ; ignora i blocchi anonimi: *X
(progn
; E = test di controllo
(setq E 0)
(setq index2 0)
(repeat (length lbk)
(setq bnome (nth index2 lbk))
(if (= bnome A)
(setq E 1)
)
(setq index2 (1+ index2))
)
(if (= E 0)
(setq lbk (append lbk (list A)))
)
)
)
(setq index (1+ index))
)
(setq lbk (cdr lbk)) ; elimino nil dalla lista blocchi
;|
Scorro la lista layer (lly) e con l'aiuto della lista
dei nomi dei blocchi (lbk)
conto i blocchi per nome e per layer
salvo i dati su file LYBK.TXT
nella cartella dove è presente il file DWG aperto.
La procedura richiede un po' di tempo ...
|;
(setq nf (strcat nomeDir "lybk.txt"))
(setq f1 (open nf "w")) ; creo il file
(princ "File: " f1)
(princ nomeDWG f1)
(princ "\n\n" f1)
(setq index 0)
(repeat (length lly) ; cicla per la lunghezza della lista dei Layer
(setq lnome (nth index lly)) ; nome Layer (es. VISTE)
(setq index2 0)
(setq str "") ; start stringa
(repeat (length lbk)
(setq nBlk 0) ; start contatore blocchi
(setq bnome (nth index2 lbk)) ; nome blocco (es. SIEPE)
(setq index3 0)
(repeat (sslength SS)
(setq EL (entget (SSNAME SS index3)))
(setq A (cdr (assoc 2 EL))) ; estraggo il nome del blocco dal blocco
(setq L (cdr (assoc 8 EL))) ; estraggo il nome del layer dal blocco
(if (and (= bnome A)(= lnome L))
(setq nBlk (1+ nBlk))
)
(setq index3 (1+ index3))
)
;|
Se nBlk /= 0 converto il numero in caratteri,
creo la stringa di testo (str)
e infine la scrivo sul file LYBK.TXT nella cartella aperta.
|;
(if (/= nBlk 0)
(progn
(setq cBlk (rtos nBlk 2 0))
(setq str (strcat str cBlk " " bnome "\n\t")) ; es. 8 SIEPE
)
)
(setq index2 (1+ index2))
)
(if (/= str "")
(progn
(setq str (strcat lnome " :\n\t" str)) ; es. VISTE :
; 8 SIEPE
; 1 BICI
(princ str f1) ; salvo la stringa su file
(princ "\n" f1)
)
)
(setq index (1+ index))
)
(close f1) ; chiudo il file
) ; progn
(princ "\nNessun blocco presente nel disegno!")
) ; if
(ripvar) ; ripristino le variabili d'ambiente
)
|
Lisp »Tips 'n Tricks
|