Programma DrawScript

Di leonardo maffi
Versione 1.16 del 29 Aprile 2000.
 

Sorgenti ed eseguibili per Win98: drawscript.zip (265KB)
(Mail me if you want some infos in English).



Per i programmi  complessi, grafici e non, Delphi5 è buono, e in futuro probabilmente imparerò ad usarlo un po'.
Ma spesso devo fare programmi molto piccoli o piccolissimi che mostrano ed utilizzano un poco di grafica, in tal caso i macchinari immani del Delphi risultano un poco pesanti.

Per cui ho sviluppato un piccolo programma, DrawScript, che prende uno script Ascii dalla console e lo plotta. Lo script contiene comandi grafici standard, per la geometria cartesiana assoluta, per quella polare relativa (detta anche Geometria della Tartaruga, usata in LOGO, molto comoda), e per quella cartesiana relativa all'ultima coppia di coordinate data (il suffisso R nei comandi indica Relativa).
 

Tale programma utilizza le routine Graphics32 Version 0.96, April 5, 2000, by Alex Denissov, http://www.geocities.com/den_alex  , che permettono di avere grafica velocissima, ed anche con antialiasing e trasparenze. E' necessaria tale liberia per ricomplare il codice Delphi allegato di DrawScript.
 

Utilizzo:

Dalla linea di comando:

DrawScript NomeScript

O cliccando sul programma, e poi scegliendio il file da caricare.

Decommentando una riga del codice sorgente di DrawScript (la {$define fromstdinput}) e poi ricompilandolo (serve la Graphics32 di Denissov, qui non allegata) si può utilizzare il programma in modo che accetti lo script nello Standard Input, ad esempio con:

DrawScript < NomeScript

O con una Pipe, ad esempio generato da un'altro programma:

GeneraScriptEsempio | DrawScript

O perfino dando i comandi da tastiera (intervallati da frequenti "show"):

DrawScript

Lo script può essere generato in un file da un programma, e poi DrawScript può essere invocato all'interno di tale programma.
 

Per ora il programma contiene poche primitive, ed è lento, ma è sufficiente per il mio scopo, dato che ho un K6-2 400 che compensa molte altrimenti imperdonabili lentezze del mio programma.
Si noti che il parsing dello script è fatto con una semplice sequenza di IF, dato che i comandi possibili sono pochi.
In futuro non sarà difficile aggiungere altri comandi al programma.
 

Note sullo script:

- I comandi sono fatti da parole speciali, seguite di solito da numeri, che possono essere sempre interi o reali.
- Se ad un comando sono dati più paramentri di quelli richiesti, i successivi li ignora.
- i comandi possono avere lettere indifferentemente in minuscolo o maiuscolo
- i valori sono separati da spazi
- le righe ovviamente da a capi.
- attualmente non normalizza le coordinate, ma tutte le coordinate x/scalax e y/scalay sono assolute. in futuro ciò potrà cambiare.
- tutte le primitive sono plottate con controllo sulle coordinate, e se possibile con clipping.
- volendo all'inizio degli script grandi si può inserire una legenda compatta per far capire la sintassi dei comandi a chi non la sa.
 

Comandi dello script:

Dim x y
Dimensiona la finestra di visualizzazione. Obligatorio. Solo il primo comando come questo è accettato. Tutto ciò che precede il primo DIM viene ignorato. Se il primo Dim non ha parematri allora inizializza la finestra a 100,100 per default.

#commento
Riga di commento che viene ignorata. Può essere posta anche alla fine di una riga di comando.

Scale x y
X e Y sono i valori per i quali le coordinate vengono moltiplicate. Se si mette 0.1 0.1 ad esempio si può avere coordinate molto precise usando solo numeri interi a quattro-cinque cifre per le coordinate. Sono permessi un numero a piacere di questi comandi, messi in punti a piacere. E' un comando opzionale. Per default la scala è inizializzata a 1 1.

Anti
Noanti
Attiva e disattiva l'antialiasing nelle successive primitive. Di default all'inizio è disattivato.

End
Fine dello script. Opzionale. Tutto quello che segue viene ignorato. Si consiglia di metterlo sempre, dato che la versione compilata usa lo standard input.

P x y
RP x y
Plotta un punto e sposta il cursore virtuale su x,y. PR è la versione relativa.

L x1 y1 x2 y2
LR x1 y1 x2 y2
Plotta un linea e sposta il cursore virtuale su x2,y2. LR è la versione relativa.

M x y
MR x y
Sta per "Move to", sposta il cursore virtuale su x,y. Mr è la versone che funziona a coordinate relative.

LT x y
LTR x y
Sta per "Line to", traccia una linea tra la posizione attuale del cursore virtuale e x,y.  LTR è la versione relativa.

C r g b
Sceglie il colore con cui tracciare le primitive successive

Clear r g b
Pulisce schermo. Se non è spacificato il colore, lo rende nero. All'inizio lo schermo è inizializzato a nero per default.

T a
Setta la trasparenza delle primitive successive. Inizializzata a 0 (no trasparenza).
 

Comandi della geometria della tartaruga:

D a = destra
S a = sinistra
A n = avanti
I n = indietro
PS, PG = penna su giu
H = home = tana
Go x y
Nord

(Tutte le geometrie condividono le coordinate Px, Py del cursore viruale)

Show
Rinfresca la fienestra.

Wait n
Attende n centesimi di secondo

R x1 t1 x2 y2
Rf x1 t1 x2 y2
Rettangoli vuoti e riempti (Filled). Non utilizza l'antialiasing.
 

Stato del programma di plot (=x è l'inizializzazione per default):

ColoreR (=255, in [0,255]), ColoreG (=255, in [0,255]), ColoreB (=255, in [0,255]), Trasparenza (=0, in [0,255]), DimX (=100, >0), DimY (=100, >0) = interi.

Px (=DimX div 2), Py (=DimY div 2), Alfa (=0), ScalaX (=1), ScalaY (=1)  = reali a 32 o 64 bit.

Nello script tutti i numeri possono avere la virgola, se necessario vengono arrotondati.
 

Gestione Errori nello script

I comandi errati vengono ignorati. Una versione futura del programma potrà generare uno script con gli errori.

L'unico comando critico (per ora che non c'è normalizzazione), è Dim, obbligatorio. Considera solo il primo che trova. Se trova comando grafico prima del Dim allora lo ignora. Se Dim non ha parematri inizializza a 100,100 per default.
 

Possibili aggiunte future:

In seguito si potrebbero aggiungere i comandi per salvare lo stato  della tartaruga Logo (S=stato = Px,Py,Alfa, ColoreRGB, Trasparenza):
PushS  |  PopS.
O in alternativa gestire un vettore di degli stati [1..100] da usarsi come buffer:
WriteS n   |   ReadS n        1<=n<=100

Poi serviranno comandi per fare poligoni, cerchi, rettangoli antialesati (per ora non ci sono), fill, scritte di testo, ellissi, primitive riempite.
 

Versioni compilate:

Quelle con suffisso RL sono più corte, ma necessitano delle liberie runtime del Delphi5.

329 KB per la versione stan-alone del DrawScript mi sembra un'esagerazione (solo la VCL del Delphi5 compilata richiede circa 270-300KB).

Ho allegato anche un piccolo programma di prova GeneraScript, (sorgenti inclusi) che mostra anche la qualità dell'antialiasing delle linee.

Note:

- Per bloccare il tracciamento cliccare sulla X della finestra. Un altro click la fa chiudere.
- Per girare su NT o Win95 o certi Win95, il programma necessita della "Msimg32.dll", qui allegata.

Sorgenti ed eseguibili per Win98: drawscript.zip (265KB)
 
 

- Torna all'indice -