#cad #lisp

Lisp e CAD. La creazione delle entità.

Semplice vs Efficiente

Scritto da Roberto Rossi il 11-2019

Oggi confronteremo due metodi per la creazione di oggetti grafici in progeCAD, AutoCAD e in tutti i CAD compatibili.

Utilizzando il linguaggio di programmazione Lisp confronteremo il sistema di creazione più semplice con quello più efficiente.

Iniziamo...

La creazione semplice

Parliamo del metodo più semplice per creare nuove entità con il linguaggio di programmazione Lisp e il nostro CAD.

In questo articolo utilizzerò progeCAD ma, la stessa cosa, sarebbe possibile con AutoCAD, BricsCAD, Draftsight e qualsiasi altro CAD compatibile.

Cosa possiamo usare, di semplice, per creare una nuova entità? Ad esempio, proviamo a creare una nuova linea dal punto 0,0 al punto 10,8:

(command "_line" 
         "0,0" 
         "10,8" 
         ""
)

In questo caso abbiamo usato la funzione command per richiamare il comando del CAD _line il quale si incarica di disegnare la linea passandogli i punti di inizio e fine della stessa.

Questo sistema è il più immediato, il piu facile. Riutilizzare un comando già esistente per generare ciò che ci serve.

Proviamo a disegnare un cerchio specificando il raggio:

(command "_circle" 
         "10,8" 
         "3"
)

Cosi facendo il CAD disegnerà un cerchio con centro in "10,8" e con raggio 3.

Facile, rapido, immediato, intuitivo.

C'è solo un problema. Questo sistema non è molto efficiente.

Il voler richiamare i comandi del CAD non fa altro che simulare ciò che l'utente farebbe a mano. Quindi il CAD riceverà il comando, simulerà le richieste all'utente, interpreterà i dati passati come se fossero inseriti manualmente dall'utente, infine terminerà, esattamente come se fosse un'operazione reale fatta da una persona di fronte allo schermo. Tutto questo processo richiede del tempo e molte elaborazioni che, alla fine, sono assolutamente superflue.

Se provassimo a creare migliaia o decine di migliaia di oggetti ci accorgeremmo che le procedure risulteranno particolarmente lente, anche in presenza di entità non complesse.

Ma c'è una alternativa.

La creazione efficiente

Torniamo a parlare della nostra linea, disegnata dal punto 0,0 al punto 10,8. Usiamo il sistema efficiente:

(entmake '((0 . "LINE") 
           (100 . "AcDbEntity")
           (10 0.0 0.0 0.0)
           (11 10.0 8.0 0.0)
          )
)

In questo caso è stata utilizzata la funzione Lisp entmake che, ovviamente, ha il compito di creare una nuova entità partendo da una lista che la definisce.

Ma cosa contiene la lista? Contiene elementi definiti dallo standard DXF, che permettono di specificare i dati necessari per la realizzazione della nostra entità.

Ad esempio, il campo 0 e quello 100 specificano, rispettivamente, il tipo di entità e la sua classe. Il campo 10 permette di indicare il punto di inizio (con la triade x,y,z), infine 11 rappresenta il punto finale.

Proviamo ora a creare il cerchio con centro in "10,8" e raggio 3:

(entmake '((0 . "CIRCLE")
           (100 . "AcDbCircle")
           (10 10.0 10.0 0.0)
           (40 . 3.0)
          )
)

In questo caso, come nel precedente, abbiamo il campo 10 e il 100. Il 10 questa volta rappresenta il centro dell'entità e il 40 indica il raggio.

Ma come si fa a sapere cosa significano tutti questi numeri?

Le specifiche DXF sono pubbliche e disponibili online:

Formato DXF dalla documentazione di AutoCAD 2020

Vediamo le specifiche per una linea:

LINE

E per il cerchio:

CIRCLE

Certo, utilizzare questo sistema è più complesso, meno intuitivo. Però è molto, molto, più efficiente.

Ma, c'è solo questo?

No.

In realtà ci sono altri metodi per creare nuove entità. Ci sono le funzioni legate a Visual Lisp, quelle il cui nome inizia con vl, si possono usare altri linguaggi di programmazione come tramite per la creazione, infine si possono usare una serie di sistemi creativi per una creazione indiretta.

Come sempre accade nello sviluppo di software qualsiasi operazione può essere fatta in molteplici modi. Quelli che ho mostrato qui sono i due sistemi che, probabilmente, sono i più comuni.

Commenti?

Grazie a tutti per aver letto questo articolo.

Per qualsiasi commento non esitate a scrivermi utilizzando i link/collegamenti di contatto presenti in tutte le pagine.