#CAD #Lisp #Programmazione

Lisp, scambiare dati tra documenti

Come condividere i dati tra disegni diversi

Scritto da Roberto Rossi il 05-2020 (maggio 2020)

Oggi parliamo di due funzioni particolari presenti nel linguaggio Lisp presente nei software CAD come AutoCAD, progeCAD o simili.

In particolare faremo la conoscenza di vl-bb-set e vl-bb-ref.

Grazie a queste due funzioni sarà possibile condividere dati tra disegni diversi.

Iniziamo...

Le variabili in Lisp

Nella maggior parte dei casi le variabili, in Lisp, vengono utilizzate senza particolari accorgimenti e vengono scritte utilizzando le normali funzioni set e setq.

Particolare è il fatto che, normalmente, qualsiasi variabile che si scrive o si legge è relativa esclusivamente al disegno corrente.

In pratica le variabili Lisp, nel CAD, sono locali al disegno. Ad esempio, supponiamo di impostare la variabile a:

(setq a "Ciao Mondo!")

A questo punto possiamo mostrare il contenuto di a con:

(alert a)

Questo però vale solo nel disegno corrente. Se cambiamo disegno ed eseguiamo (alert a) senza prima aver eseguito il setq il software ci segnalerà un errore in quanto la variabile a, nel nuovo disegno, non esiste.

In pratica ogni disegno ha le sue variabile, diverse ed indipendenti dalle variabili usate negli altri dwg aperti.

Quel'è il problema?

La separazione delle variabili in vari contesti, uno per disegno, solitamente è un grande vantaggio in quanto permette di rendere i disegni aperti completamente indipendenti gli uni dagli altri.

Questo però può, in alcuni casi, rappresentare un limite se ci si trova nella situazione di dover condividere gli stessi dati tra contesti/disegni differenti.

Pensiamo, ad esempi, ad un software con configurazioni uniche per tutti i disegni. Oppure pensiamo ad un software che legge dati da un disegno ma li deve utilizzare per creare qualcosa in un disegno diverso.

Si potrebbe procedere salvando i dati esternamente per poi rileggerli oppure, si potrebbe sfruttare quello che AutoCAD chiama blackboard namespace.

Blackboard Namespace

Il blackboard namespace, detto in parole semplice, è una scatola!

Una scatola che contiene delle variabili che possono essere lette, scritte e condivise tra disegni diversi. Una scatola unica per tutti i disegni.

Si può interagire con il blackboard namespace tramite due funzioni:

  • vl-bb-set. Permette di impostare una variabile.
  • vl-bb-ref. Legge il valore di una variabile.

Il loro funzionamento è particolarmente semplice. La prima scrive e la seconda legge. Vediamo alcuni esempi.

Iniziamo da vl-bb-set:

(vl-bb-set 'a "Ciao Mondo!")

Questa istruzione scrive nella variabile a la stringa specificata. In questo modo la nostra variabile sarà memorizzata all'interno del blackboard namespace. Nel momento in cui sarà necessario leggere il valore di a si potrò ricorrere a vl-bb-ref in questo modo:

(vl-bb-ref 'a)

Questa istruzione restituirà il contenuto della variabile a precedentemente impostata. Ricordando che il blackboard namespace è unico per tutti i disegni, sarà possibile leggere il valore della variabile indipendentemente dal disegno aperto al momento. Sarà quindi possibile cambiare disegno o aprirne uno nuovo leggendo sempre lo stesso valore.

Naturalmente è possibile utilizzare vl-bb-set per salvare una o più variabili, senza limiti.

All'intero delle variabili impostate si potranno utilizzare tutti i tipi di dato supportati normalmente ad esclusione delle funzioni.

I nomi delle variabili

Come abbiamo già visto abbiamo questa "scatola" comune adibita a contenere le nostre variabili, condivisa tra tutti i disegni.

Una cosa importante da comprendere è il fatto che una ipotetica variabile a memorizzata nella nostra "scatola" condivisa è diversa dalla variabile a impostata con una normale funzione setq.

Supponiamo di avere questo codice:

(setq a "Variabile A Standard")
(vl-bb-set 'a "Variabile A Condivisa")
(alert a)

In questo caso il CAD mostrerà una piccola finestra con il messaggio "Variabile A Standard". Questo accade perchè l'uso della semplice a farà riferimento alla variabile presente nel contesto del disegno corrente.

Se desiderassi visualizzare il contenuto della variabile a presente nel blackboard namespace dovrei scrivere:

(setq a "Variabile A Standard")
(vl-bb-set 'a "Variabile A Condivisa")
(alert (vl-bb-ref 'a))

In questo caso verrebbe letto il valore della variabile a producendo il messaggio "Variabile A Condivisa".

Per evitare di generare confusione nell'utilizzo dei nomi delle variabile è buona regola, anche se non obbligatoria, di differenziare sempre gli identificativi in modo da differenziarli con chiarezza, ad esempio:

(setq a "Variabile A Standard")
(vl-bb-set 'a-bb "Variabile A Condivisa")
(alert a)
(alert (vl-bb-ref 'a-bb))

In questo modo sarà impossibile confondere una variabile con l'altra.

Un esempio

Vediamo un piccolo programma esplicativo.

Qui costruiremo un software per il disegno di una singola linea tra due punti. Prima di effettuare il disegno il programma chiederà di indicare il colore(indicato con un numero intero) da usare per la nuova entità oppure, nel caso si prema invio, assumerà come colore l'ultimo utilizzato.

Il valore del colore usato sarà comune a tutti i disegni aperti.

Ecco il codice del programma:

Codice Sorgente

L'utilizzo del programma è semplicissimo. Proviamolo cosi:

  • Scarichiamo il programma cliccando qui.
  • Apriamo il nostro CAD.
  • Lanciamo il comando _APPLOAD e carichiamo il file dislin.lsp.
  • Lanciamo il comando DISLIN.
  • Inseriamo il colore (ad esempio 1, colore rosso).
  • Indichiamo due punti.

Comparirà una linea rossa tra i due punti indicati. Andiamo oltre:

  • Creiamo un nuovo disegno con il comando _NEW.
  • Lanciamo il comando _APPLOAD e carichiamo il file dislin.lsp.
  • Lanciamo il comando DISLIN.
  • Invece di inserire il numero del colore premiamo semplicemente Invio. In questo modo verrà usato l'ultimo colore specificato, quindi quello utilizzato nel disegno precedente.
  • Indichiamo due punti.

Il software, dopo aver letto il valore del colore condiviso, disegnerà la nostra linea.

La possibilità di condividere i dati in modo tanto semplice può fornire, sicuramente, nuove opportunità a chi sviluppa procedure Lisp per automatizzare il disegno.

Riferimenti

Alcune pagine utili per comprendere meglio gli argomenti trattati:

Scrivimi

Per qualsiasi commento, domanda, o se vuoi esprimere la tua opinione... scrivimi usando i collegamenti/link di contatto presenti in tutte le pagine

Licenza di questo articolo

Autore : Roberto Rossi

Licenza Creative Commons
Questo articolo è distribuito con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale.