[image]https://leganerd.com/wp-content/uploads/LEGANERD_042303.jpg[/image]

Salve salvino!
Approfitto del fatto che per lavoro mi sto documentando sull’argomento, per buttare giù un post separato dalla rubrica [url=https://leganerd.com/tag/colorama/]Colorama[/url], sul formato DXF.

Molti di voi saranno sicuramente, grafici o disegnatori che conoscono Autocad. Altri saranno programmatori abituati a lavorare con i files.
Questo articolo cerca di porsi a metà strada tra entrambi i campi, fornendo ai primi un’infarinatura di “cosa c’è sotto al cofano” dei loro disegni, e ai secondi alcune nozioni di base su come vengono rappresentati a livello di codice.

[title]Cos’è un file DXF[/title]
Il formato DXF è lo standard più utilizzato per lo scambio di dati tra i diversi programmi di disegno e di grafica vettoriale.
Inizialmente nato per AutoCAD, è divenuto rapidamente uno standard de facto, adottato in modo universale nel campo della grafica tecnica.

I file DXF sono normali file di testo che possono essere aperti e modificati con semplici editor ASCII (come il bRocco note di Windows, per capirci).

[more]

Nel caso di disegni particolarmente grossi, è possibile ridurre la dimensione del file (di circa il 25%) e aumentarne la velocità di lettura, compilandolo in formato binario. Il file mantiene la stessa estensione DXF, ma l’opzione va specificata esplicitamente dal CAD al momento del salvataggio.
I dxf binari possono essere letti solo dalle versioni Autocad successive alla r10 e da eventuali altri CAD che li supportano. Per massimizzare la compatibilità comunque, conviene sempre salvare nel normale formato testuale.

Un file dxf è una rappresentazione testuale del database di ciascun disegno, e contiene tutti gli oggetti (grafici e non grafici) e le impostazioni necessarie a ricreare l’esatta situazione di partenza del disegno, in un CAD.

In un dxf quindi, non saranno contenuti solo gli elementi che compongono il disegno vero e proprio, ma anche tutte le tabelle dei tratteggi, dei colori, dei layer, delle viste, degli stili di quota, i parametri che indicano su quale programma è stato creato e come deve essere visualizzato, le immagini di anteprima, eccetera.

Poiché nelle nuove versioni di AutoCAD spesso vengono aggiunte nuove funzioni, nuovi parametri o perfino nuove entità, può capitare di trovare elementi o perfino sezioni sconosciute in un dxf generato da una versione più recente del programma, o da altri programmi.
In questo caso il software che apre il dxf si limita a ignorare le sezioni che non conosce, interpretando le altre.
Ecco quindi che la retrocompatibilità con le precedenti versioni del formato viene mantenuta.

[/more]

Di seguito useremo, come nel gergo del disegno tecnico, la parola “[b]entità[/b]” per indicare tutti gli elementi GRAFICI del disegno, e la parola “[b]oggetti[/b]” per tutti gli altri elementi NON GRAFICI.

[title]I group codes[/title]
Il file è strutturato come una sequenza di coppie di valori, ognuno su una riga separata.
Il primo valore e’ chiamato [b]codice di gruppo[/b], e specifica a quale tipo di dati appartiene il secondo valore (stringa, intero, valore a virgola mobile, eccetera).

[more]

Ad esempio i codici da 0 a 9 rappresentano il tipo stringa. Quindi la sequenza

[quote][i]0
SECTION[/i][/quote]

indica che il valore che segue lo zero è la stringa “[i]SECTION[/i]”.

[/more]

Oltre a rappresentare il tipo di dati, ALCUNI particolari codici di gruppo (non tutti), sono [b]fixed[/b], associati a significati fissi ben precisi. Ecco quindi che il [b]codice 2[/b] diventa un id per il nome degli oggetti e delle entità, l’[b]8[/b] per il layer, il [b]6[/b] per l’ltype (tipo di linea, o tratteggio), il [b]39[/b] per lo spessore, il [b]62[/b] per il colore, eccetera.

Alcuni codici acquisiscono un significato fisso solo all’interno di una particolare sezione. Ad esempio il codice 0 rappresenta semplicemente una stringa, ma se usato dentro alla sezione ENTITIES, come vedremo, indica il tipo di entità geometrica che si sta descrivendo, e funge da tag di apertura del gruppo.

[title]Le sezioni[/title]
Un file dxf è articolato in 7 sezioni.

[more]

– [b]HEADER[/b]. In questa sezione sono precisate le variabili generali associate al disegno (limiti, estensione, variabili di quotatura, ecc.)

– [b]CLASSES[/b]. Qui vengono definite le classi (dizionario, tratteggio, immagini raster, ecc.)

– [b]TABLES[/b]. La sezione tables contiene delle tabelle con le caratteristiche specifiche di diversi oggetti. Vediamone alcune:

– [i]APPID[/i] (tabella di identificazione delle applicazioni)
– [i]BLOCK_RECORD[/i] (tabella dei riferimenti di blocco)
– [i]DIMSTYLE[/i] (tabella degli stili di quota)
– [i]LAYER[/i] (tabella dei layer)
– [i]LTYPE[/i] (tabella dei tipi di linea, o tratteggi)
– [i]STYLE[/i] (tabella degli stili di testo)
– [i]UCS[/i] (tabella dei sistemi UCS)
– [i]VIEW[/i] (tabella delle viste)
– [i]VPORT[/i] (tabella delle configurazioni delle finestre).

– [b]BLOCKS[/b]. Questa sezione contiene le singole descrizioni, uno per uno, dei blocchi importati nel disegno.

– [b]ENTITIES[/b]. È la sezione più importante: riporta tutte le entità (oggetti grafici) presenti nel disegno (linee, polilinee, archi, cerchi, ellissi, ecc…) e anche i riferimenti ai blocchi (oggetto INSERT).

– [b]OBJECTS[/b]. Contiene tutti gli oggetti non grafici associati al disegno (ad esempio un dizionario).

– [b]THUMBNAILIMAGE[/b]. Contiene i dati dell’immagine di anteprima del disegno (e’ presente solo nelle ultime versioni del formato).

[/more]

Non è necessaria la presenza di tutte le sezioni. La sezione HEADER ad esempio può essere omessa se non ci interessa specificare nel file nessuna impostazione particolare. Allo stesso modo possiamo omettere la sezione BLOCKS se non utilizziamo blocchi, la sezione TABLES se non usiamo nessuna delle tabelle in essa contenute, e così via.

[more]

Ogni sezione deve iniziare con la stringa [b]SECTION[/b] seguita da una stringa che specifica il tipo di sezione e deve terminare col terminatore di sezione [b]ENDSEC[/b].

All’interno di una sezione, tutte le entità, gli oggetti, le classi, le tabelle, le voci di tabella e i separatori di file devono sempre iniziare con un [b]codice 0[/b] seguito da una stringa col nome del gruppo.
Non è necessario nessun terminatore di gruppo: il gruppo viene considerato chiuso quando si arriva alla fine della sezione, o al codice 0 del gruppo successivo.

Alcuni altri vincoli sulla struttura:

– Il file deve sempre terminare con la stringa [b]EOF[/b].
– se è presente, la sezione BLOCKS deve trovarsi prima della sezione ENTITIES;
– se si definiscono dei tipi di linea nella tabella LTYPE, quest’ultima deve essere inserita prima della tabella LAYER;
– all’interno della sezione ENTITIES, è possibile fare riferimento a nomi di layer anche se non sono stati definiti nella tabella LAYER. Tali layer vengono automaticamente creati con il colore 7 e il tipo di linea CONTINUOUS.

[/more]

Non è necessaria nemmeno la presenza di tutte le entità del disegno.
Ad esempio, se si utilizza l’opzione “Seleziona oggetti” del comando “Salva” o “Salva come”, la sezione ENTITIES del file dxf risultante conterrà solo le entità selezionate.

[title]Le entità geometriche[/title]
La sezione [b]ENTITIES[/b], come abbiamo visto, contiene le entità geometriche che compongono il disegno.

Ciascuna entità geometrica è definita da una serie di coppie di valori, che inizia con un codice 0 seguito dal nome dell’entità, e termina col codice 0 della serie successiva, oppure con un tag ENDSEC di fine sezione.

All’interno di ciascuna serie, l’ordine e il significato dei codici dipende dall’entità che si sta rappresentando. Ognuna ha la sua sintassi particolare, ma in generale, alcuni codici di base sono in comune tra tutte.

[more]

I codici da [b]10[/b] a [b]39[/b] ad esempio, sono utilizzati per indicare le tre [b]coordinate[/b] di un punto. Vengono usati con una differenza di 10 tra ogni coordinata.
Il primo punto di un segmento, quindi, è caratterizzato dai codici di gruppo 10 (x), 20 (y), 30 (z); il secondo punto dai codici 11(x), 21 (y), 31 (z).

[quote][i]0
LINE
10
(x punto iniziale)
20
(y punto iniziale)
30
(z punto iniziale)
11
(x punto finale)
21
(y punto iniziale)
31
(z punto iniziale)[/i][/quote]

Allo stesso modo, per altre entità, la sintassi rimane simile:

[quote][i]POINT 10 (x), 20 (y), 30 (z)
CIRCLE 10 (x centro), 20 (y centro), 30 (z centro), 40 (raggio).
ARC 10 (x centro), 20 (y centro), 30 (z centro), 40 (raggio), 50 (angolo iniziale), 51 (angolo finale).[/i][/quote]

E così via.

[/more]

Vediamo in approfondimento un semplice DXF di esempio basato sulla sola sezione ENTITIES.

[more]

Il disegno parte dall’origine degli assi, e traccia un quadrato di lato 5.

[image]https://leganerd.com/wp-content/uploads/LEGANERD_042304.jpg[/image]

Ovviamente la sintassi usata sopra è molto semplificata, e non tiene conto di altri codici aggiuntivi quali, come abbiamo visto, quello per il layer (8), per il tratteggio (6), per il colore (62), eccetera.

[/more]

[title]I blocchi[/title]
Per complicare le cose, anche i blocchi (rappresentati nella sezione BLOCKS) sono composti da entità geometriche, che seguono la stessa sintassi di gruppo di quelli della sezione ENTITIES.

Ogni blocco ha un oggetto [b]INSERT[/b] posto nella sezione ENTITIES che funge da puntatore al pezzo di codice corrispondente nella sezione BLOCKS.

[more]

Quando il CAD traccia il disegno, inizia a scorrere la sezione ENTITIES, e disegna tutte le entità grafiche man mano che le trova. Quando trova un elemento INSERT, salta alla sezione BLOCKS, cerca il punto corrispondente a quel blocco, e inizia a disegnare tutte le entità che lo compongono(LINE, ARC, CIRCLE, eccetera).
Poi torna al punto dove era rimasto nella sezione ENTITIES, e ricomincia a scorrere.

[/more]

Chiudiamo qua questa breve panoramica, per forza di cose tutt’altro che esauriente.
Le entità e gli oggetti di Autocad sono tantissimi, ed è praticamente impossibile conoscere tutti i codici di gruppo e tutte le sintassi.
L’idea alla base di questo post era solo di fornire una visione introduttiva all’argomento. Potrete poi approfondire sui [url=http://usa.autodesk.com/adsk/servlet/item?siteID=123112&id=12272454&linkID=10809853]manuali ufficiali[/url] della Autodesk.

A presto ! :)

[b]Fonti:[/b]
[url=http://usa.autodesk.com/adsk/servlet/item?siteID=123112&id=12272454&linkID=10809853] Autodesk DXF Reference [/url]
[url=http://web.tiscali.it/Didattica/vb/dxf.htm] Esempio parser DXF in VB [/url]