• This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Leggi altro.

Contare blocchi dinamici e xref

Professione: *
Software: AutoCAD
Regione: Lombardia
#1
a differenza del bcount degli Express, il lisp allegato conta anche i blocchi dinamici e gli Xref

;;; CADALYST 05/07 Tip 2210: BlkQnt.lsp Block Quantify (c) 2007 Brock Narum

;Written by Brock Narum 6-7-05; updated 2-1-07; blkqnt routine will:
; (1) list all blocks, dynamic blocks and xrefs defined in current dwg.
; (2) give quantity for each block and dynamic block definition.
; (3) indicates if xref is not loaded.
(Defun
c:blkqnt (/ olderr echo doc refn refs dblkn dblks blkn
blks qnt1 qnt2 lst1 lst2 lst3 dblk1 qntd blk1
qntb
)
(vl-load-com)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(princ "\nPlease wait for list... \n") ; searches for blks/dynamic blks
(vlax-for
lays (vla-get-layouts doc)
(vlax-for
blk (vla-get-block lays)
(if (and (= (vla-get-objectname blk) "AcDbBlockReference")
(vlax-property-available-p blk 'IsDynamicBlock)
)
(if (= (vlax-get-property blk 'IsDynamicBlock) :vlax-true)
(setq dblkn (vla-get-effectivename blk)
dblks (cons dblkn dblks)
)
(setq blkn (vla-get-name blk)
blks (cons blkn blks)
)
)
)
)
) ; searches for xrefs
(vlax-for
itm (vla-get-blocks doc)
(if (= (vla-get-isxref itm) :vlax-true)
(if (vl-catch-all-error-p
(vl-catch-all-apply 'vla-get-xrefdatabase (list itm))
)
(setq refn (strcat (vla-get-name itm) " - *Not loaded* ")
refs (cons refn refs)
)
(setq refn (vla-get-name itm)
refs (cons refn refs)
)
)
)
)
(if (and (= refs nil) (= blks nil) (= dblks nil))
(princ "\nNo blocks in Dwg...")
(progn ; sorts blks dyn blks and xrefs if found
(if blks
(setq blks (acad_strlsort blks))
)
(if dblks
(setq dblks (acad_strlsort dblks))
)
(if refs
(setq refs (acad_strlsort refs))
)
(setq qnt1 (length blks)
qnt2 (length dblks)
lst1 "====== Block(s) ========"
lst2 "======= Xref(s) ========="
lst3 "=== Dynamic Block(s) ===="
) ; creates list of xrefs
(foreach itm refs (setq lst2 (strcat lst2 "\n" itm)))
; cycles thru to get qnt of dyn blks
(while (> qnt2 0)
(setq dblk1 (car dblks)
dblks (vl-remove dblk1 dblks)
qntd (- qnt2 (length dblks))
qnt2 (length dblks)
lst3 (strcat lst3 "\n" dblk1 " = (" (rtos qntd 2 0) ") ")
)
) ; cycles thru to get qnt of blks
(while (> qnt1 0)
(setq blk1 (car blks)
blks (vl-remove blk1 blks)
qntb (- qnt1 (length blks))
qnt1 (length blks)
lst1 (strcat lst1 "\n" blk1 " = (" (rtos qntb 2 0) ") ")
)
)
(princ (strcat lst1 "\n" lst3 "\n" lst2))
(textscr)
)
)
(vlax-release-object doc)
(princ)
)
 

emastrantuono

Utente poco attivo
Professione: libero professionista
Software: autodesk 10
Regione: emilia romagna
#2
scusate scaricato il file l'ho lanciato se poi do' istruzione blkqnt, autocad mi dice programma sconosciuto
 

Ezio Olivato

Utente Standard
Professione: Creative designer
Software: Autocad, Rhinoceros, Extracad, NanoCAD
Regione: Piemonte
#5
Si GP, ma se il comando pretende di farglielo riconoscere con le minuscole!!!!!
 

andr_ea3d

Utente poco attivo
Professione: progettista
Software: autocad - 3dMax
Regione: veneto - treviso
#6
...vi espongo un piccolo quesito...
ho caricato il lisp e funziona perfettamente, il mio problema è che quando faccio il conteggio dei blocchi dinamici, mi vengono calcolati anche i blocchi nascosti.
:mad: mi spiego meglio, il mio blocco contiene dei sottoblocchi che vado a spegnere con il parametro visibilità. mi piacerebbe che il lisp contasse solo quelli visibili e non anche quelli nascosti.
Sapete per caso indirizzarmi o dirmi come risolvere questo problema?
vi ringrazio fin da ora, buona giornata a tutti. Andr_Ea
 

andr_ea3d

Utente poco attivo
Professione: progettista
Software: autocad - 3dMax
Regione: veneto - treviso
#8
Grazie TIR, gentilissimo ed è proprio quello che mi servia :finger:
 

andr_ea3d

Utente poco attivo
Professione: progettista
Software: autocad - 3dMax
Regione: veneto - treviso
#9
...con questo lisp riesco a contare benissimo tutti i blocchi dinamici all'inerno del dwg, ma se volessi selezionare solo una porzione di disegno e fare il conteggio esclusivamente sui blocchi selezionati, chè funzione devo aggiungere all'autolisp? fatto questo credo che il "DBCount" sia perfetto :)
grazie ancora in anticipo a tutti.
 

GP.

Utente Senior
Professione: Nientologo
Software: uozapp
Regione: Vercelli
#10
Cerca il testo in nero ed incollagli davanti il testo in rosso, compreso il punto e virgola, potrai selezionare anche altri oggetti ma verranno filtrati solo i blocchi:

(prompt "\nSelezionare oggetti")
(if (ssget (list '(0 . "INSERT") (cons 410 (getvar 'CTAB))))

; (if (ssget "_X" (list '(0 . "INSERT") (cons 410 (getvar 'CTAB))))


Sperando che il buon Lee non si arrabbi. :tongue:
 

andr_ea3d

Utente poco attivo
Professione: progettista
Software: autocad - 3dMax
Regione: veneto - treviso
#11
ottimoooo, gentilissimo GP. l'ho provato ed è funzionante....ma sarebbe strepitoso se si potesse sceglie se l'intero foglio o la selezione ;) heheheheh son un rompiscatole lo so ;)
intanto grazie, poi se vi va di fare la doppia opzione, benvenga :) buona giornata