cg-Cad

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