- Questo topic ha 8 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 13 anni, 7 mesi fa da .
-
Topic
-
Il recente articolo di Roberto Giacomelli “Grafica ad oggetti” su ArsTeXnica mi ha incuriosito parecchio e mi sono ricordato di avere sfogliato qualcosa al riguardo nel pgfmanual. In effetti, nella versione del 25 Ottobre 2010 la sezione 67 Object-Oriented Programming è interamente dedicata a questo tipo di programmazione.Per alcuni tipi di applicazione (grafica) credo sia molto più facile ed immediata rispetto al paradigma tradizionale di TikZ, come possono essere diagrammi di flusso o diagrammi ER. Certo, per chi ha un po’ di esperienza con TikZ, il primo impatto è chiedersi: “Che fine hanno fatto nodi e path?”. La risposta è: “In background, nascosti all’utente, ma ci sono”. Anzi, la risposta vera sarebbe: “Da nessuna parte perché non esiste implementazione pratica ad oggi”. Infatti non ci sono, che io conosca, librerie create con questo paradigma di programmazione: occorre costruirsele.
Un esempio semplice.
Nel documento occorre dichiarare:`\usepgfmodule{oo}` per accedere alla programmazione ad oggetti. Andiamo ora a dichiarare una nostra classe rettangolo, che molto semplicemente creerà un rettangolo con testo. La dichiarazione di classe avviene con: `\pgfooclass{nome-classe}{
codice-classe
}` Nel nostro caso: `pgfooclass{rettangolo}{
codice-classe
}`Gli attributi privati di classe vanno definiti con: `\attribute attributo;` oppure: `\attribute attributo=valore;` nel caso l’attributo abbia un valore di default. I metodi, invece, con: `\method nome-metodo(parametri) {
codice-metodo
}` Esiste un metodo speciale, il costruttore, che deve avere il nome della classe e nessun parametro. Nel nostro caso quindi:`\method rettangolo() {
}
` Supponiamo di creare un metodo per inserire il testo nel rettangolo. Per prima cosa è necessario creare un attributo di classe: `\attribute testo;` Successivamente, serve un metodo in modo tale che l’oggetto che si andrà a creare possa scrivere il testo nel rettangolo. In modo molto semplice: `\method add text(#1) {
\pgfooset{testo}{#1}
}` Per inserire il testo nel rettangolo sarà quindi sufficiente usare una sintassi tipo [tt]oggetto.add text(testo)[/tt]. Si noti che il nome del metodo può essere intervallato da spazi senza che il compilatore si lamenti. Attraverso il comando [tt]\pgfooset[/tt] il metodo [tt]add text[/tt] andrà a definire l’attributo [tt]testo[/tt] che non ha un valore di default suo.Definiamo ora un metodo per disegnare il rettangolo con il testo. Il codice: `\method draw(#1,#2) {
\node [rectangle,draw]
at (#1,#2) {\pgfoovalueof{testo}};
}` Il nostro metodo riceve come parametri le coordinate x e y della posizione e disegna un rettangolo (opzioni [tt]rectangle,draw[/tt]) con il testo che abbiamo definito: il comando [tt]\pgfoovalueof{attributo}[/tt] semplicemente restituisce il valore di un attributo. A questo punto, con [tt]oggetto.draw(coordinate)[/tt] si potrà disegnare il rettangolo. Nel nostro caso: `\pgfoonew \rect=new rettangolo()`
Resta solo da capire come definire nuovi oggetti. La sintassi è questa: `\pgfoonew \oggetto=new costruttore` La definizione non deve avvenire necessariamente in un ambiente [tt]tikzpicture[/tt] e si noti che i nomi degli oggetti sono preceduti da [tt]\[/tt] come la normali macro.Nel nostro esempio minimale, quindi, possiamo usare l’oggetto e i metodi descritti in questo modo:`\begin{document}
\pgfoonew \rect=new rettangolo() % nuovo oggetto
\begin{tikzpicture}
\rect.add text(Testo)
\rect.draw(0,0)
\end{tikzpicture}
\end{document}`Un esempio più complesso. `
\documentclass{article}
\usepackage{tikz}\usepgfmodule{oo}
% dichiarazione di classe
\pgfooclass{rettangolo}{\attribute larghezza=2cm;
\attribute altezza=0.75cm;
\attribute testo;
\attribute bordo=black;
\attribute sfondo=none;
\attribute coltesto=black;% costruttore di classe
\method rettangolo() {
}\method add text(#1) {
\pgfooset{testo}{#1}
}\method set larghezza(#1) {
\pgfooset{larghezza}{#1}
}\method set altezza(#1) {
\pgfooset{altezza}{#1}
}\method set bordo(#1) {
\pgfooset{bordo}{#1}
}\method set sfondo(#1) {
\pgfooset{sfondo}{#1}
}\method set colore testo(#1) {
\pgfooset{coltesto}{#1}
}\method draw(#1,#2) {
\node [rectangle,draw,
minimum width=\pgfoovalueof{larghezza},
minimum height=\pgfoovalueof{altezza},
draw=\pgfoovalueof{bordo},
fill=\pgfoovalueof{sfondo},
text=\pgfoovalueof{coltesto},
]
at (#1,#2) {\pgfoovalueof{testo}};
}% Un metodo che richiama altri metodi:
% si usa la macro \pgfoothis per
% fare riferimento all'oggetto corrente
\method set dimensioni(#1,#2){
\pgfoothis.set larghezza(#1)
\pgfoothis.set altezza(#2)
}\method set stile(#1,#2,#3){
\pgfoothis.set bordo(#1)
\pgfoothis.set sfondo(#2)
\pgfoothis.set colore testo(#3)
}}
\begin{document}
\pgfoonew \rect=new rettangolo()
\begin{tikzpicture}
\rect.add text(Testo)
\rect.set bordo(red)
\rect.draw(0,0)% erediterà il testo e il bordo
\rect.draw(2,2)% cambiamo dimensioni, stile e testo
\rect.set stile(blue,blue!50!cyan!20,blue)
\rect.set dimensioni(3cm,1cm)
\rect.add text(Altro testo)
\rect.draw(4,4)
\end{tikzpicture}
\end{document}
` Il risultato:[attachment=581]Senzanome.jpg[/attachment]
Per chi ha avuto la pazienza di seguire fino a questo punto, vorrei segnalare che da poco ho creato una libreria per disegnare diagrammi ER (molto semplice) proprio con questo paradigma di programmazione: https://github.com/cfiandra/er-oo. È disponibile una breve guida e un primo esempio di utilizzo.
Ciao
Claudio
- Devi essere connesso per rispondere a questo topic.