Creare una tabella del contenuto dei testi presenti nei blocchi

Riccardo_Ferrari

Utente poco attivo
Professione: libero professionista
Software: AutoCAD
Regione: Liguria
Ho provato il programma Count.lsp link http://www.lee-mac.com/blockcounter.html di Lee Mac.
Ho poca conoscenza di AutoLisp e ho provato a modificare il software per il mio uso personale come segue, ma non sono riuscito:
Ho molti blocchi (molti, l'ultima volta ho avuto 3.000 blocchi) ognuno di essi contiene tre mtext (mtext molto semplice, potrebbe essere un text ma l'hanno fatto mtext) su tre diversi layer (esempio che vedo ora: 968, pf, 2.337, due sono numerici, uno alfabetico) e un punto, le coordinate del punto sono anche l'inserimento del blocco.
Allego il dwg dell’esempio.
Devo creare una tabella su ogni riga i tre testi e le coordinate del punto.
E’ possibile?
Grazie, Riccardo Ferrari
 

Allegati

Tristan

Moderatore Civil 3D
Membro dello Staff
Professione: Application Engineer
Software: AutoCAD Civil 3D, Revit e altre amenità
Regione: Trentino
Se invece di usare MTEXT avessi usato attributi di blocco, il tutto si faceva semplicemente con ESTRDATI
 

Riccardo_Ferrari

Utente poco attivo
Professione: libero professionista
Software: AutoCAD
Regione: Liguria
Se invece di usare MTEXT avessi usato attributi di blocco, il tutto si faceva semplicemente con ESTRDATI
Ti ringrazio per la risposta, ma se l'avessi fatto io non avrei fatto quel tipo di blocco, che non mi piace e lo gestisco male. M arrivano spesso dwg con quei blocchi dentro, appunto per quello voglio estrarre i dati da passare al mio sistema. Per ora l’ho fatto a mano, esplodendo il blocco, cercavo di fare un lisp. Se hai qualche idea di come fare te ne sarei grato. Comunque ti chiedo il nome del comando originale la cui traduzione è ESTRDATI. Grazie
 

Riccardo_Ferrari

Utente poco attivo
Professione: libero professionista
Software: AutoCAD
Regione: Liguria
... tutto si faceva semplicemente con ESTRDATI
Grazie per l’indicazione. Ho trovato il nome del comando la cui traduzione è ESTRDATI, comando EATTEXT. Estrae i dati che chiedevo. Text o Mtext estrae ugualmente. Non è esattamente quello che mi serve, perché genera un file con molti dati che devo filtrare, ma è un grande passo avanti. I filtri preventivi che il comando consente filtrano anche i dati che mi servono. Per cui estraggo tutto e filtro a valle. Grazie ancora
 

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
comando ElencoTesti
Crea file .txt nella stessa directory del dwg con nome dwg + MTEXT
 

Allegati

Riccardo_Ferrari

Utente poco attivo
Professione: libero professionista
Software: AutoCAD
Regione: Liguria
E te pareva che non dimenticavo qualcosa.....
rpor66, in un primo momento ho pensato che avevi un lisp già pronto che funzionava anche per me. Leggendo il codice, invece, ho capito che l’hai scritto appositamente. Grazie. Troppo disturbo.

Mi permetto di modificare il tuo codice per mio solo uso personale in alcune semplici parti che so modificare. Per esempio la selezione di specifici blocchi e non di tutti, e il formato del testo di output. Quando avrò fatto quelle due modifiche non saprei proprio cosa aggiungere.

PS.: Scrivendo mi è venuto in mente cosa aggiungere: cambio di layer, vedi sotto

Invece non so risolvere i seguenti due problemi riguardanti il tuo lisp, ripetendo che hai fatto anche troppo te li segnalo, se fosse possibile risolverli magari imparo qualcosa.

Primo problema

E' sufficiente la presenza di un blocco (per esempio quello cerchiato nel dwg allegato) che arresta il programma con il messaggio

error: bad argument type: stringp nil

Succede che alcuni utenti esplodano i blocchi e quindi generano un ulteriore blocco nello stesso layer, diverso da quello standard

Né è possibile pensare di non selezionare quelli esplosi, sono mischiati finemente. SI tratta di trascuratezza di chi ha fatto il dwg, ma una volta che il dwg arriva già fatto occorre gestirlo.

Basterebbe che il lisp ignorasse i blocchi non standard, magari cambiando layer agli uni o agli altri, sarebbe meglio ai blocchi corretti, tipo “<nome_originario>_Fatto” così si spegne ed emergono quelli da fare

Forse questo (forse) riesco a farlo da solo, dopo che la gestione dell’errore sia stata superata

Secondo problema

Il tuo lisp funziona egregiamente quando non ci sono blocchi sullo stesso layer diversi dal blocco standard (nel caso, non è colpa del lisp ma di chi lascia in giro quei blocchi)

In alcuni, per fortuna rari, casi ha un comportamento anomalo, ma non riesco a capire perche’:

In alcuni dwg ci sono dei blocchi che generano liste ridondanti

Esempi di liste da cui il lisp estrae i dati:

(-12.654 -12.654 chiodo 1300 -12.654 chiodo 1300 )

(-17.696 -17.696 -17.696 -17.696 pf 1500 -17.696 pf 1500 )

Il lisp estrae il primo, il secondo e il terzo, per cui alcuni dati vengono trascurati

Ottengo, rispettivamente:

-4.74203926,-2.94334927,0|Quota:-12.654|Quota:-12.654|Quota:chiodo

-4.13995449,-5.0876663,0|Quota:-17.696|Quota:-17.696|Quota:-17.696

Allego un dwg anche per questa situazione

Questo secondo problema mi preoccupa meno, perché è raro e perché penso di saperlo risolvere gestendo a valle la lista da cui il tuo lisp estrae i dati (cioè modifico il lisp, scrivo tutti i dati e poi vedo), ma resta la domanda di come possa accadere. Ammesso che interessi.

Viceversa il primo ho capito perché accade (blocco non standard) ma non saprei risolverlo.

Grazie ancora per il tuo egregio lavoro

Riccardo
 

Allegati

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
Ho controllato il problema relativo al Bug1; i blocchi contengono gli mtext ricopiati più volte su se stessi. Appena posso vedo di sistemare il problema.
Bye
 

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
Ok, risolti i 2 problemi
Testi sovrapposti con uguale valore vengono memorizzati una sola volta, blocchi senza mtext non vengono esportati.
Con MEMBER si analizza la lista e se il valore non è presente lo memorizza.
Se dopo aver analizzato il blocco la lista dei testi è vuota, non vengono elaborati i dati da scrivere nel file.
Bye
 

Allegati

Riccardo_Ferrari

Utente poco attivo
Professione: libero professionista
Software: AutoCAD
Regione: Liguria
Ok, risolti i 2 problemi
Ma chi sei, Babbo Natale?
Grazie
Non so che dire
Ho provato al volo e va bene.
Con MEMBER si analizza la lista e se il valore non è presente lo memorizza.
Se dopo aver analizzato il blocco la lista dei testi è vuota, non vengono elaborati i dati da scrivere nel file.
Ora provo un po' piu' a fondo specie questa faccenda del MEMBER, per ora non l'ho capita.
Ci lavoro su.
Ancora grazie, Riccardo
 

Riccardo_Ferrari

Utente poco attivo
Professione: libero professionista
Software: AutoCAD
Regione: Liguria
Ok, risolti i 2 problemi
Dunque, caro rpor66

Il MEMBER non l’ho ancora capito, anche perché non l’ho studiato, Ho fatto due modifiche al tuo Lisp. O meglio una modifica e un’aggiunta. Allego il Lisp modificato

1) Qui ho tolto la X
(if (setq ss (ssget "X" (list (cons 0 "INSERT") (cons 8 "Punto"))))
Per selezionare solo alcuni blocchi

2) Ho aggiunto la linea seguente
(entmod (subst (cons 8 "Punto-Done") (assoc 8 (entget sn)) (entget sn)))
Per mandare in un layer a parte i blocchi già esportati

Per la modifica 1 ancora ancora, la 2 l'ho presa da un codice trovato in rete, ma non ho ben capito cosa ho fatto, però funziona. Che razza di lamer

Saluti e ti ringrazio per l'attenzione

Riccardo
 

Allegati

Riccardo_Ferrari

Utente poco attivo
Professione: libero professionista
Software: AutoCAD
Regione: Liguria
Non ho avuto modo di provare a fondo il codice, ma c’è qualcosa che non va.
Non ho ancora capito cosa, cerco di capire e poi riposto.
Sia chiaro che il problema sarà dei blocchi -pessimi- e non del tuo codice.

Allora perché hai scritto? Ti chiederai giustamente. Perché nel frattempo mi sono capitati dei blocchi completamente diversi, che sembrano fatti meglio. Sono anche con gli attributi, se si dice così.

Immagino che un lisp che scriva il text come l’altro sia da riscrivere da capo.
Allego il file con i blocchi diversi, vedi cosa puoi fare, grazie.

Riccardo
 

Allegati

Riccardo_Ferrari

Utente poco attivo
Professione: libero professionista
Software: AutoCAD
Regione: Liguria
Mi riferisco a rpor66, ma ovviamente sarei felice di leggere altri interventi.

Dunque, Si tratta di ListaDaBlock_MText.Lsp da rpor66 postato sul forum l'8 luglio (link https://www.cad3d.it/forum1/attachments/listadablock_mtext-lsp.58658) Il codice, per il quale ringrazio, non funziona su tutti i punti, ma è colpa dei punti, o meglio di chi ha fatto il dwg.

Alcuni punti sono blocchi con all’interno tre Mtext (e il codice li legge bene) altri punti sono blocchi ma all’interno, invece di tre Mtext, ci sono nidificati altri tre blocchi ognuno dei quali contiene un Text. Non so perché della differenza: il dwg arriva così e bisogna lavorare su quello. Allego un esempio Misti.Dwg

Per capire ciò ho impiegato un po', come un bel po’ per capire dove è il problema nel codice. Ho visto che alla linea numero 20 la condizione (eq (vla-get-objectname x) "AcDbMText") filtra giustamente solo gli Mtext mentre per gli altri punti (vla-get-objectname x) restituisce “AcDbBlockReference”.

Tentativi più o meno maldestri di modificare il codice sono stati vani, ovviamente per mia ignoranza. Se oltre agli Mtext fai passare anche gli altri genera un errore nel momento in cui applichi (vla-get-TextString x), le ho provate tutte: niente da fare. Bisogna entrare nel blocco nidificato, è una parola …

Dopo molti tentativi ho deciso di tentare un’altra strada. Non so come ma ci sono riuscito, ma funziona. Ho modificato il codice BlockCountV1-5.lsp che ho trovato qui http://www.lee-mac.com/nestedblockcounter.html

Allego la mia modifica, legge i blocchi nidificati ma non quelli Mtext, forse lavorandoci molto riuscirei anche con gli Mtext (forse) ma preferirei il contrario, cioè completare il codice postato da rpor66. Quello che ho modificato (ma anche il lisp originario) è lentissimo, con 1.000 punti impiega alcuni minuti, con 3.000 ho fermato prima della fine)

Quindi, ricapitolo, ci sono quattro file:
1) Codice ListaDaBlock_MText.Lsp (https://www.cad3d.it/forum1/attachments/listadablock_mtext-lsp.58658/)
2) Codice BlockCountV1-5.lsp (http://www.lee-mac.com/lisp/BlockCountV1-5.lsp)
3) Mia modifica del precedente (Count.Lsp allegato qui)
4) Dwg di test (Misti.Dwg allegato qui)

Saluti

Riccardo Ferrari
 

Allegati

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
Ho aggiunto la lettura dei blocchi nidificati, riadattati il lisp con le tue aggiunte.
Bye
 

Allegati