cg-Cad

Lisp »Tips 'n Tricks »Lblk.lsp

Un lisp che inserisce una legenda con (disegno) nome e numero dei blocchi selezionati.

lblk.lsp
Dato un disegno con molti blocchi...

*LBLK.LPS V1.2
- Inserito il gestore degli errori
- Selezione blocchi: tutti o solo di un layer.

*LBLK.LPS V1.1
- Esclude i blocchi anonimi di Autocad (*cad)
- Legge dalla variabile d'ambiente TEXTSIZE l'altezza dei testi nel disegno corrente.
- Chiede la distanza del testo dal blocco e l'altezza dell'interlinea testo (utile nel caso di blocchi con dimensione uguale o simile).

Per il problema della differenza di scala tra i blocchi è possibile usare il lisp LECH che mi scala i blocchi selezionati localmente.

;|
  LBLK.LSP versione 1.0
  Copyright © 2003 by Michele Ingenuo, Claudio Piccini

  Inserisce una legenda con il nome ed il 
  numero dei blocchi selezionati
|;
(defun c:lblk (/ SS EL A lb N INDEX 
                   nlb Index2 nBlk nome 
                   cBlk stringa lstr P1
  )
  (graphscr)
  (setvar "cmdecho" 0)
  ; selezione dei blocchi
  (setq SS (ssget (list (cons 0 "insert"))))
  (setq EL (entget (SSNAME SS 0)))
  ; A = nome blocco
  (setq A (cdr (assoc 2 EL)))
  ; lb lista dei nomi dei blocchi
  (setq lb (list A))
  ; N = dimensione di SS - 1
  (setq N (- (sslength SS) 1))
  (setq INDEX 1)
  ; cicla N volte
  (repeat N
   (setq EL (entget (SSNAME SS INDEX)))
   (setq A (cdr (assoc 2 EL)))
   ; E = test di controllo
   (setq E 0)
   (setq Index2 0)
   ; nlb = dimensione di lb
   (setq nlb (length lb))
   (repeat nlb
    (setq nome (nth Index2 lb))
    (if (= nome A) (setq E 1))
    (setq Index2 (1+ Index2))
   )
   (if (= E 0)(setq lb (append lb (list A))))
   (setq INDEX (1+ INDEX))
  )
  ;| 
   scorro la lista SS e con l'aiuto di lb 
   conto i blocchi con lo stesso nome
  |;
  (setq N (sslength SS))
  ; nlb = dimensione definitiva di lb
  (setq nlb (length lb))
  ; inizializzo la lista delle stringhe
  (setq lstr (list nil))
  (setq Index2 0)
  (setq nBlk 0)
  (repeat nlb
   (setq nome (nth Index2 lb))
   (setq INDEX 0)
   (setq nBlk 0)
   (repeat N
    (setq EL (entget (SSNAME SS INDEX)))
    (setq A (cdr (assoc 2 EL)))
    (if (= nome A) (setq nBlk (1+ nBlk)))       
    (setq INDEX (1+ INDEX))
   )
   ;|
     converto il numero in stringa e creo
     la stringa di testo per la legenda:
     NOME_BLOCCO n.X
   |;
   (setq cBlk (rtos nBlk 2 0))
   (setq stringa (strcat nome " n." cBlk))
   ; aggiungo la stringa alla lista lstr
   (setq lstr (append lstr (list stringa))) 
   (setq Index2 (1+ Index2))
  )
  ;|
    inserisco la legenda
    nel disegno
  |;
  (setq INDEX 0)
  (setq P1 (getpoint "\nPunto di inserzione"))
  ; elimino nil dalla lista lstr
  (setq lstr (cdr lstr))
  (repeat nlb
   (setq stringa (nth INDEX lstr))
   ; altezza testo = 0.3
   (command "_TEXT" P1 0.3 0 stringa)
   ; interlinea = 0.6
   (setq P1 (polar P1 (* 1.5 PI) 0.6)) 
   (setq INDEX (1+ INDEX))
  )
  (setvar "cmdecho" 1 )
  (princ)
)

Lisp »Tips 'n Tricks