;|

  LBLK.LSP versione 1.1
  Copyright © 2003 by
  Michele Ingenuo (www.3eye.biz)
  Claudio Piccini (www.cg-cad.com)

  Inserisce una legenda con disegno, nome e 
  numero dei blocchi selezionati
  (Non funziona con blocchi con attributi!)

|;

(defun c:lblk (/   SS EL A lb N INDEX 
                   nlb Index2 nBlk nome 
                   cBlk stringa lstr 
                   P1 P2 P3
                   hTxt dTxt aTxt
  )

  (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)

  (repeat N
   (setq EL (entget (SSNAME SS INDEX)))
   (setq A (cdr (assoc 2 EL)))
   (if (/= (substr A 1 1) "*") ; ignora i blocchi anonimi: *cad
    (progn
     ; 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
   |;
   (setq cBlk (rtos nBlk 2 0))
   (setq stringa (strcat cBlk  " "  nome ))
   ; aggiungo la stringa alla lista lstr
   (setq lstr (append lstr (list stringa))) 
   (setq Index2 (1+ Index2))
  )
  ; elimino nil dalla lista lstr
  (setq lstr (cdr lstr))
  ;
  ; inserisco la legenda nel disegno
  ;
  (setq P1 (getpoint "\nPunto di inserzione"))
  (setq hTxt (getvar "TEXTSIZE")) ; TEXTSIZE = altezza del testo nel disegno corrente
  (setq dTxt (getdist "\nDistanza del testo dal blocco: "))
  (setq aTxt (getdist "\nAltezza interlinea testo: "))
  (setq INDEX 0)
  (repeat nlb
   (setq stringa (nth INDEX lstr))            ; estraggo la stringa
   (setq nome (nth INDEX lb))                 ; estraggo il blocco
   (command "_insert" nome P1 1 "" "") 
   (setq P2 (polar P1 (* pi 1.5) (/ hTxt 2))) ; punto d'inserimento della stringa
   (setq P3 (polar P2 0 dTxt))
   (command "_text" P3 hTxt 0 stringa)
   (setq P1 (polar P1 (* pi 1.5) aTxt))
   (setq INDEX (1+ INDEX))
  )

  (setvar "cmdecho" 1)
  (princ)

)