Autore |
Discussione |
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 06 ottobre 2009 : 08:07:39
|
sarebbe interessante trovare un lisp che ridefinisca i blocchi eliminando gli attributi invisibili, servirebbe per alleggerire disegni
|
Modificato da - arri in Data 06 ottobre 2009 08:11:07
|
|
GP
Utente Master
Regione: Piemonte
Prov.: Vercelli
2776 Messaggi |
Inserito il - 06 ottobre 2009 : 14:07:50
|
Arri, se non sei riuscito a trovarlo tu, siamo senza speranze... |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 06 ottobre 2009 : 14:15:53
|
Citazione: Messaggio inserito da GP
Arri, se non sei riuscito a trovarlo tu, siamo senza speranze...
è difficile trovarlo perchè sono quelle richieste strane che non interessano
|
|
|
MEM
Utente Master
Regione: Puglia
Prov.: Lecce
Città: Galatone
2235 Messaggi |
Inserito il - 06 ottobre 2009 : 17:15:22
|
Sicuramente avrai gia' letto questo. |
|
|
GP
Utente Master
Regione: Piemonte
Prov.: Vercelli
2776 Messaggi |
Inserito il - 06 ottobre 2009 : 17:24:34
|
Citazione: Messaggio inserito da MEM
Sicuramente avrai gia' letto questo.
Se è un surrogato di BURST ti esplode i blocchi. |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 06 ottobre 2009 : 18:49:30
|
Citazione: Messaggio inserito da GP
Citazione: Messaggio inserito da MEM
Sicuramente avrai gia' letto questo.
Se è un surrogato di BURST ti esplode i blocchi.
in fatti, il difficile è trovarne uno che non esplode i blocchi
Grazie MEM per il tentativo |
Modificato da - arri in data 06 ottobre 2009 18:50:17 |
|
|
Marco_AA
Nuovo Arrivato
2 Messaggi |
Inserito il - 07 ottobre 2009 : 09:41:33
|
Arri,
non ho niente di già fatto. Allegerire significa eliminare gli attributi o solo farli sparire dallo schermo anche se attivati? |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 07 ottobre 2009 : 09:45:57
|
Messaggio inserito da Marco_AA
Arri,
non ho niente di già fatto. Allegerire significa eliminare gli attributi o solo farli sparire dallo schermo anche se attivati?
proprio eliminare tutti gli attributi dalla tabella dei blocchi,
l'equivalente di quello che fa BATTMAN.
- scorrere tutta la tabella dei blocchi
- per ogni blocco scorrere gli attributi, se invisibili eliminare
- aggiornare la tabella
P.S.
penso che il problema può essere "terminato" da Terminator
allego un dwg semplice di esempio
Scarica allegato:
attr_invisib.rar 18,38 KB |
Modificato da - arri in data 22 maggio 2011 09:52:54 |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 22 maggio 2011 : 14:22:15
|
Con il VisualLISP si fanno cose che neanche mi sognavo con AutoLISP puro...
(defun C:ELIMATTIN (/ utility listablocks obj blocco index verifica)
(setq utility (vla-get-Utility
(vla-get-activedocument (vlax-get-acad-object))
)
listablocks (vla-get-Blocks
(vla-get-activedocument (vlax-get-acad-object))
)
)
(setq verifica (vl-catch-all-apply
'vla-getEntity
(list utility 'obj nil "\nSelezionare blocco: ")
)
)
(cond
((and (= verifica nil)
(= (vla-get-ObjectName obj)
"AcDbBlockReference"
)
(= (vla-get-HasAttributes obj)
:vlax-true
)
)
(setq blocco (vla-Item listablocks
(vla-get-Name obj)
)
)
(setq index 0)
(while (/= index (vla-get-Count blocco))
(if (and (= (vla-get-ObjectName (vla-Item blocco index))
"AcDbAttributeDefinition"
)
(= (vla-get-Invisible (vla-Item blocco index)) :vlax-true)
)
(progn
(vla-delete (vla-Item blocco index))
(setq index 0)
)
(setq index (1+ index))
)
)
(command "_ATTSYNC" "S" (vlax-vla-object->ename obj) "_YES")
)
((and (= verifica nil)
(/= (vla-get-ObjectName obj)
"AcDbBlockReference"
)
)
(alert "ERRORE FATALE! ENTITA' SBAGLIATA!")
)
(T
(alert "ERRORE FATALE! NESSUNA ENTITA' SELEZIONATA!")
)
)
(princ)
) |
Modificato da - Terminator in data 22 maggio 2011 15:34:39 |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 22 maggio 2011 : 16:14:12
|
Messaggio inserito da Terminator
Con il VisualLISP si fanno cose che neanche mi sognavo con AutoLISP puro...
(defun C:ELIMATTIN (/ utility listablocks obj blocco index verifica)
(setq utility (vla-get-Utility
(vla-get-activedocument (vlax-get-acad-object))
)
listablocks (vla-get-Blocks
(vla-get-activedocument (vlax-get-acad-object))
)
)
(setq verifica (vl-catch-all-apply
'vla-getEntity
(list utility 'obj nil "\nSelezionare blocco: ")
)
)
(cond
((and (= verifica nil)
(= (vla-get-ObjectName obj)
"AcDbBlockReference"
)
(= (vla-get-HasAttributes obj)
:vlax-true
)
)
(setq blocco (vla-Item listablocks
(vla-get-Name obj)
)
)
(setq index 0)
(while (/= index (vla-get-Count blocco))
(if (and (= (vla-get-ObjectName (vla-Item blocco index))
"AcDbAttributeDefinition"
)
(= (vla-get-Invisible (vla-Item blocco index)) :vlax-true)
)
(progn
(vla-delete (vla-Item blocco index))
(setq index 0)
)
(setq index (1+ index))
)
)
(command "_ATTSYNC" "S" (vlax-vla-object->ename obj) "_YES")
)
((and (= verifica nil)
(/= (vla-get-ObjectName obj)
"AcDbBlockReference"
)
)
(alert "ERRORE FATALE! ENTITA' SBAGLIATA!")
)
(T
(alert "ERRORE FATALE! NESSUNA ENTITA' SELEZIONATA!")
)
)
(princ)
)
grazie Terminator
Si potrebbe avere una versione che li elimina globalmente da tutti i blocchi ? (senza selezionarli)
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 22 maggio 2011 : 18:55:32
|
...et voilà!
(defun C:ELIMATTINGLO (/ utility listablocks obj blocco bloccovl index indexx)
(setq utility (vla-get-Utility
(vla-get-activedocument (vlax-get-acad-object))
)
listablocks (vla-get-Blocks
(vla-get-activedocument (vlax-get-acad-object))
)
)
(setq index 0)
(repeat (vla-get-Count listablocks)
(if (or
(equal (strcase
(substr (vla-get-Name (vla-Item listablocks index)) 1 6)
)
"*MODEL"
)
(equal (strcase
(substr (vla-get-Name (vla-Item listablocks index)) 1 6)
)
"*PAPER"
)
)
(princ)
(progn
(setq gruppoblocchi (ssget "x"
(list (cons 0 "INSERT")
(cons 2 (vla-get-Name (vla-Item listablocks index)))
)
)
blocco (ssname gruppoblocchi 0)
bloccovl (vlax-ename->vla-object blocco)
)
(cond
((= (vla-get-HasAttributes bloccovl)
:vlax-true
)
(setq indexx 0)
(while (/= indexx (vla-get-Count (vla-Item listablocks index)))
(if (and (= (vla-get-ObjectName
(vla-Item (vla-Item listablocks index) indexx)
)
"AcDbAttributeDefinition"
)
(= (vla-get-Invisible
(vla-Item (vla-Item listablocks index) indexx)
)
:vlax-true
)
)
(progn
(vla-delete
(vla-Item (vla-Item listablocks index) indexx)
)
(setq indexx 0)
)
(setq indexx (1+ indexx))
)
)
(command "_ATTSYNC" "S" blocco "_YES")
)
)
)
)
(setq index (1+ index))
)
(princ)
)
|
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 22 maggio 2011 : 22:02:30
|
Messaggio inserito da Terminator
...et voilà!
(defun C:ELIMATTINGLO (/ utility listablocks obj blocco bloccovl index indexx)
(setq utility (vla-get-Utility
(vla-get-activedocument (vlax-get-acad-object))
)
listablocks (vla-get-Blocks
(vla-get-activedocument (vlax-get-acad-object))
)
)
(setq index 0)
(repeat (vla-get-Count listablocks)
(if (or
(equal (strcase
(substr (vla-get-Name (vla-Item listablocks index)) 1 6)
)
"*MODEL"
)
(equal (strcase
(substr (vla-get-Name (vla-Item listablocks index)) 1 6)
)
"*PAPER"
)
)
(princ)
(progn
(setq gruppoblocchi (ssget "x"
(list (cons 0 "INSERT")
(cons 2 (vla-get-Name (vla-Item listablocks index)))
)
)
blocco (ssname gruppoblocchi 0)
bloccovl (vlax-ename->vla-object blocco)
)
(cond
((= (vla-get-HasAttributes bloccovl)
:vlax-true
)
(setq indexx 0)
(while (/= indexx (vla-get-Count (vla-Item listablocks index)))
(if (and (= (vla-get-ObjectName
(vla-Item (vla-Item listablocks index) indexx)
)
"AcDbAttributeDefinition"
)
(= (vla-get-Invisible
(vla-Item (vla-Item listablocks index) indexx)
)
:vlax-true
)
)
(progn
(vla-delete
(vla-Item (vla-Item listablocks index) indexx)
)
(setq indexx 0)
)
(setq indexx (1+ indexx))
)
)
(command "_ATTSYNC" "S" blocco "_YES")
)
)
)
)
(setq index (1+ index))
)
(princ)
)
purtroppo su dwg più complessi esce questo errore
; errore: tipo di argomento errato: lselsetp nil
|
Modificato da - arri in data 22 maggio 2011 23:16:43 |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 22 maggio 2011 : 22:57:07
|
Ecco fatto!
Bastava eseguire un Purge per eliminare i riferimenti dei blocchi non utilizzati. In ogni caso ho inserito una condizione if se esiste la selezione dei blocchi interessati.
PS: Mi ero preparato lo zip e ho allegato il lsp, scusa...
Scarica allegato:
elimattinglo.zip 1,16 KB |
Modificato da - Terminator in data 22 maggio 2011 23:06:39 |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 22 maggio 2011 : 23:20:08
|
Messaggio inserito da Terminator
Ecco fatto!
Bastava eseguire un Purge per eliminare i riferimenti dei blocchi non utilizzati. In ogni caso ho inserito una condizione if se esiste la selezione dei blocchi interessati.
Scarica allegato:
elimattinglo.zip 1,16 KB
perfetto !!!! Magico grazie Terminator |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 27 settembre 2011 : 08:34:15
|
prima di usare il lisp, assicurarsi di avere gli attributi sincronizzati per non avere modifiche inaspettate |
Modificato da - arri in data 27 settembre 2011 08:39:14 |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 30 novembre 2011 : 10:41:54
|
in pratica il lisp dovrebbe controllare prima gli attributi:
- se è fuori sincronismo, lascialo stare
- se è sincronizzato, procedi |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 30 novembre 2011 : 14:20:38
|
(defun C:ELIMATTINGLO (/ utility listablocks blocco bloccvl index indexx)
(vl-load-com)
(setvar "CMDECHO" 0)
(setq utility (vla-get-Utility
(vla-get-activedocument (vlax-get-acad-object))
)
listablocks (vla-get-Blocks
(vla-get-activedocument (vlax-get-acad-object))
)
)
(setq index 0)
(repeat (vla-get-Count listablocks)
(setq gruppoblocchi
(ssget "x"
(list (cons 0 "INSERT")
(cons 2 (vla-get-Name (vla-Item listablocks index)))
)
)
)
(if gruppoblocchi
(progn
(setq blocco (ssname gruppoblocchi 0)
bloccovl (vlax-ename->vla-object blocco)
)
(cond
((= (vla-get-HasAttributes bloccovl)
:vlax-true
)
(setq indexx 0)
(while (/= indexx (vla-get-Count (vla-Item listablocks index)))
(if (and (= (vla-get-ObjectName
(vla-Item (vla-Item listablocks index) indexx)
)
"AcDbAttributeDefinition"
)
(= (vla-get-Invisible
(vla-Item (vla-Item listablocks index) indexx)
)
:vlax-true
)
)
(progn
(vla-delete
(vla-Item (vla-Item listablocks index) indexx)
)
(setq indexx 0)
)
(setq indexx (1+ indexx))
)
)
;;;(command "_ATTSYNC" "S" blocco "_YES")
)
)
)
)
(setq index (1+ index))
)
(princ)
)
(princ "\nDigitare ELIMATTINGLO per far partire il LISP")
(princ "\n ***** vers.3 by Terminator *****")
(princ)
|
Modificato da - Terminator in data 30 novembre 2011 14:25:01 |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 30 novembre 2011 : 15:03:50
|
grazie Terminator
ora non ci sono più sincronizzazioni non volute |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 30 novembre 2011 : 15:37:14
|
Semplicemente non esistono più sincronizzazioni, ho solo commentato la riga (command "_ATTSYNC" "S" blocco "_YES"). In effetti la sincronizzazione non serviva mai, dato che eliminavo gli attributi invisibili direttamente nella tabella dei blocchi, quella ottenuta con vla-get-blocks per intenderci. Invece gli attributi invisibili non venivano eliminati dal blocco con vla-delete, anche se non li avevo più visibili nella variabile listaattr.
|
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 30 novembre 2011 : 18:43:31
|
oltretutto è diventato velocissimo |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 30 novembre 2011 : 18:51:31
|
Si potrebbe aprire una nuova frontiera di modifica attributi senza sincronizzare più nulla. Comando che porta più rogne che benefici. |
|
|
Discussione |
|