[TIKZ][RISOLTO] Macchina a stati finiti… gerarchica

  • Creatore
    Topic
  • #78996
    Up
    0
    Down
    ::


    Salve a tutti,

    Sto cercando un modo per rappresentare in LaTeX una macchina a stati finiti gerarchica (e.g. http://www.cis.upenn.edu/~alur/Fse98.pdf pag 5 fig 1). Ho cercato nel manuale di TIKZ qualcosa che potesse aiutarmi, ma a parte la rappresentazione di una macchina a stati finiti “classica”, non riesco a capire come posso disegnare rettangoli e frecce in modo così preciso come nell’esempio su riportato (che credo non sia stato fatto con TIKZ, ma potrei sbagliarmi).

    Qualcuno può fornirmi degli esempi già esistenti o indicarmi quali pagine del manuale (o di altri manuali) possono aiutarmi?

    Grazie in anticipo

Visualizzazione 13 filoni di risposte
  • Autore
    Risposte
    • #78997
      Up
      0
      Down
      ::


      Ciao,
      davvero ti riferisci alla figura 1 di pagina 5 quando dici “non capisco come posso disegnare rettangoli e frecce in modo così preciso”?? Quel disegno mi sembra proprio brutto. Tutto non allineato, roba che esce dai rettangoli, è fatto proprio male. Nel manuale di TikZ ci sono vari tutorial. Prova a dare un’occhiata a quello che inizia a pagina 60, credo faccia al caso tuo. Se poi hai problemi, possiamo lavorarci insieme.

      Ciao
      Fra

    • #78998
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::

        Quel disegno mi sembra proprio brutto.

        Quello è un eufemismo; quel disegno non è nemmeno presentabile; TikZ, anche usandolo per la prima volta, fa certamente meglio

      • #78999
        Up
        0
        Down
        ::


        Magari sarà uno scarsissimo disegnatore di Latex (sempre se TIKZ esisteva nel 1998), ma stiamo comunque parlando di un grandissimo scienziato informatico contemporaneo :P.

        Comunque grazie della dritta, mi ci metto e vi aggiorno 🙂

      • #79000
        Up
        0
        Down
        ::


        In effetti quei disegni sono orribili… ma occorre anche precisare che con TikZ l’occhio si abitua all’eccellenza. 🙂

        In questo intervento si realizzerà una delle figure a cui l’OP faceva riferimento e può essere inteso come tutorial valido per tutti gli schemi in quanto si utilizzano diverse TikZ-tecniche.

        Le basi

        Quando si inizia è fondamentale fare una scelta di base: quale tecnica usare per posizionare i nodi. I metodi non sono infiniti: posizionamento manuale con le coordinate assolute, posizionamento manuale con le coordinate relative oppure posizionare i nodi su una matrice. Il primo metodo è, in genere, da scartare, a meno che si sia abituati a vedere il proprio disegno su un piano cartesiano e quindi sia abbastanza facile determinare a mente le coordinate.

        Per realizzare il disegno e per mostrare insieme un paio di tecniche si utilizzeranno sia i riferimenti relativi che il posizionamento con matrici.

        Disegnare rettangoli

        Il disegno dei rettangoli non deve spaventare, anzi è una delle cose più semplici da realizzare. Con TikZ è possibile definire stili da applicare ai nodi, le varie label del disegno. Ecco cosa si utilizzerà per la figura:
        `
        \tikzset{blocco/.style={draw,rounded corners}}
        `La definizione degli stili, un consiglio, va preferibilmente inserita nel preambolo.

        Creare i collegamenti

        Mentre si posizionano i nodi, è consigliabile etichettarli con label, in modo tale da poter utilizzare successivamente le label come riferimenti. Le frecce, quindi, saranno dei segmenti originati da un nodo e diretti verso un altro. Ad esempio, per collegare (a) e (b) sapendo che (b) è a destra di (a) si può scrivere:
        `\draw[->](a.east)–(b.west); `in questo modo il segmento è originato dall’ancora posizionata a destra ([tt]east[/tt]) di (a) verso il punto contraddistinto dall’ancora a sinistra ([tt]west[/tt]) di (b). Le ancore strettamente indispensabili sono [tt]north[/tt], [tt]south[/tt], [tt]east[/tt] e [tt]west[/tt].

        Posizionamento dei nodi ed allineamenti

        Iniziamo a posizionare il primo nodo, lo [tt]start[/tt]. Il codice è semplice:
        `\node[blocco] (start) {start}; `Utilizzando i riferimenti relativi non serve definire dove posizionare il primo nodo. Si noti che il nostro nodo è di tipo [tt]blocco[/tt] perciò sarà evidenziato dal rettangolo, come si vuole e il nodo ha come label [tt](start)[/tt], la stessa che deve comparire in figura. Ovviamente, però, la label può essere definita a piacere.

        A destra del nodo [tt]start[/tt], nella figura campione sono presenti quattro nodi. Cosa meglio di una matrice per definirli? L’idea base è definire una matrice di questo tipo:
        `\matrix (m1) [blocco, right= 2.5cm of start]{
        try1 & \node[blocco](fail1){fail};\\
        $K_2$ & \node[blocco](ok1){ok};\\
        };` Con questa definizione si otterrebbero i quattro nodi delimitati da un rettangolo come, all’interno della matrice, i nodi (fail) e (ok); il problema sarebbe l’allineamento dei nodi stessi: in genere, con matrici, posizionamento dei nodi con riferimenti relativi ecc.. l’allineamento dei nodi va farsi benedire senza un intervento manuale. Inoltre, la spaziatura dei nodi nella matrice è pensata per elementi senza niente altro ed evidenziare con un rettangolo alcuni di essi fa sì che il risultato non sia dei migliori. Entrambi i problemi si risolvono specificando a mano il punto di ancoraggio e la spaziatura dei nodi, ad esempio:
        `
        \matrix (m1) [matrix of nodes,blocco, right= 2.5cm of start ,column sep=0.25cm,row sep =0.25 cm, every column/.style={anchor=center},minimum height=1ex,]{
        try1 & \node[blocco](fail1){fail};\\
        $K_2$ & \node[blocco](ok1){ok};\\
        };
        `Si noti che anche la matrice ha la propria label, (m1), esattamente come gli altri nodi, ma serve solo al posizionamento dei nodi, non per le frecce.

        In maniera analoga a questa, andiamo a definire una seconda matrice per il secondo gruppo di nodi:
        `
        \matrix (m2) [matrix of nodes,blocco, right= 3cm of m1 ,column sep=0.25cm,row sep =0.25 cm, every column/.style={anchor=center},minimum height=1ex,]{
        try2 & \node[blocco](fail2){fail};\\
        $K_2$ & \node[blocco](ok2){ok};\\
        };
        ` Il posizionamento di (m2) è chiaramente a destra di (m1) come si evince da [tt]right= 3cm of m1[/tt]. Per i nodi [tt]fail[/tt] ed [tt]ok[/tt] si sono usate label diverse rispetto a quelle definite per gli stessi nodi in (m1).

        La terza matrice è un po’ diversa rispetto alle due precedenti. In realtà non servirebbe neppure una matrice per definire i nodi (abort) e (success), ma viene comodo utilizzare la spaziatura delle righe per posizionare in maniera fedele alla figura riferimento di due nodi. Ecco la definizione:
        `
        \matrix (m3) [matrix of nodes, right= 3cm of m2,row sep =1.5 cm, every column/.style={anchor=center},minimum height=3ex,minimum width=4em]{
        \node[blocco](abort){abort};\\
        \node[blocco](success){success};\\
        };
        ` Si noti che in ogni matrice si è specificato almeno [tt]minimum height[/tt]: la chiave contribuisce, come l’ancoraggio, all’allineamento dei nodi. In genere si usa [tt]text height[/tt], ma in questo caso occorre tenere in considerazione che un nodo può anche avere il rettangolo al proprio bordo.

        Posizionamento dei collegamenti

        In questa sezione si discute come disegnare effettivamente le frecce da un nodo ad un altro. Un comodo strumento è la libreria [tt]calc[/tt] che permetterà di effettuare calcoli per meglio caratterizzare i segmenti. È comodo definire il tipo di freccia da usare nelle opzioni dell’ambiente [tt]tikzpicture[/tt], in modo tale da non ripeterlo ad ogni passaggio; nel nostro caso:
        `\begin{tikzpicture}[-stealth]` che è la mia preferita.

        Iniziamo con la freccia a destra del nodo (start):
        `\path[draw]($(start.west)-(1,0)$)–(start.west);` Come si può notare, con la sintassi della libreria calc si può disegnare un segmento a partire da un singolo nodo conosciuto: in questo caso il punto a sinistra del nodo (start.west). Il punto iniziale è 1cm a sinistra della coordinata (start.west) infatti la sintassi indica che a (start.west) si sottrae 1cm sull’asse x e 0cm sull’asse y.

        Colleghiamo i nodi start e m1 con:
        `\path[draw](start.east)–(m1);` mentre con:
        `\path[draw](fail1.east)–(fail1.east-|m2.west);` colleghiamo i nodi (fail1) della prima matrice con la seconda matrice. Si noti la sintassi [tt](fail1.east-|m2.west)[/tt]: in questo modo si sta dicendo che la coordinata di arrivo ha lo stesso valore sull’asse x di (fail1) e quello dell’asse y di (m2). Scrivere:
        `\path[draw](fail1.east)–(m2.west);` avrebbe disegnato un segmento il cui punto di arrivo sarebbe stato il centro esatto del rettangolo della seconda matrice.

        Proseguendo, si commenteranno solo gli altri collegamenti con particolarità evidenti. Ad esempio:
        `\path[draw](ok1.east)–($(ok1.east|-success.west)!0.5!(m2.west|-success.west)$)–(success.west);` che collega il punto (ok1) della prima matrice verso (success). La particolarità è il calcolo del punto intermedio [tt]($(ok1.east|-success.west)!0.5!(m2.west|-success.west)$)[/tt] in cui il segmento si divide: partendo da (ok1.east) verso il punto indicato in direzione obliqua e dal punto intermedio verso (success) in direzione orizzontale.

        Invece, con:
        `
        \path[draw](ok2.east)–(success.170);
        ` è possibile spostare il punto di arrivo (per evitare sovrapposizioni con la freccia già disegnata che parte da (ok1)) riferendosi all’angolo del rettangolo del nodo (success). 170, infatti, rappresentano i gradi. Attenzione: l’uso degli angoli per fare riferimento al bordo di un nodo può essere pericoloso se non si è sicuri al 100% di cosa si fa; gli angoli infatti cambiano rispetto alle dimensioni del nodo, perciò in generale non è vero che per due distinti nodi i riferimenti (x.170) e (y.170) siano uguali (lo so per esperienza perché ci sono cascato come un pollo 😀 – si veda qui).

        Il rettangolo in background

        Dopo aver posizionato i nodi e disegnato tutti i collegamenti, il tocco finale è rappresentato dalla definizione del rettangolo che comprende tutta la figura. Ho pensato di posizionare tale rettangolo in background; in questo caso è un passaggio superfulo, ma conoscere questa libreria a volte è veramente utile (e qui bisogna ringraziare Liverpool che è stato il primo a suggerirla- si veda qui). La libreria infatti permette di definire vari “livelli” in cui apporre parte dell’immagine, ad esempio colorare un sfondo in modo tale che il contenuto da tenere in primo piano non sia reso opaco. In questo caso, comunque, si è utilizzato il livello “predefinito” [tt]background[/tt] reso già disponibile dalla libreria; in generale l’utilizzo è:

        `\begin{pgfonlayer}{background}

        \end{pgfonlayer}` Dove i [tt]…[/tt] rappresentano il codice da inserire in background.

        Nel nostro caso codice necessario è:
        `
        \begin{pgfonlayer}{background}
        \node[scale=0.02] (mywest) at ($(start.west)-(0.5,0)$){};
        \node[scale=0.02] (mynorth) at ($(abort.north)+(0,0.5)$){};
        \node[scale=0.02] (myeast) at ($(abort.east)+(0.5,0)$){};
        \node[scale=0.02] (mysouth) at ($(success.south)-(0,0.5)$){};

        \draw[rounded corners,-] (mywest)|-(mynorth)-|(myeast)|-(mysouth)-| (mywest);
        \end{pgfonlayer}
        ` I primi comandi servono per creare nodi “aiuto”, ovvero dei nodi le cui posizioni, definite a partire dai nodi già esistenti, saranno la base per il disegno del rettangolo. Si consideri, ad esempio:
        `\node[scale=0.02] (mywest) at ($(start.west)-(0.5,0)$){};` È molto simile alla sintassi usata per definire la freccia a sinistra del nodo (start) e infatti con questa sintassi si definisce il punto intermedio di quel collegamento. Tutto ciò, ovviamente, perché nella figura campione il rettangolo globale aveva come particolarità il fatto di “tagliare” le frecce entranti ed uscenti dalla figura. I nodi “aiuto” definiti sono stati tutti scalati: questo fa sì che nel disegno del rettangolo non siano visibili “buchi bianchi”. In genere, infatti, ogni nodo, anche se non ha una label, occupa dello spazio; ad esempio, il codice:
        `
        \node (x) at (1,0) {};
        \draw (0,0)–(x)–(2,1);
        ` non produce un segmento continuo.

        Codice completo

        Ecco il codice con un esempio compilabile:
        `\documentclass{article}

        \usepackage{tikz}
        \usetikzlibrary{positioning,matrix,calc,backgrounds}

        \tikzset{blocco/.style={draw,rounded corners}}

        \begin{document}

        \begin{tikzpicture}[-stealth,on grid, node distance=1cm,scale=0.95,transform shape]

        % Blocchi

        \node[blocco] (start) {start};

        \matrix (m1) [matrix of nodes,blocco, right= 2.5cm of start ,column sep=0.25cm,row sep =0.25 cm, every column/.style={anchor=center},minimum height=1ex,]{
        try1 & \node[blocco](fail1){fail};\\
        $K_2$ & \node[blocco](ok1){ok};\\
        };

        \matrix (m2) [matrix of nodes,blocco, right= 3cm of m1 ,column sep=0.25cm,row sep =0.25 cm, every column/.style={anchor=center},minimum height=1ex,]{
        try2 & \node[blocco](fail2){fail};\\
        $K_2$ & \node[blocco](ok2){ok};\\
        };

        \matrix (m3) [matrix of nodes, right= 3cm of m2,row sep =1.5 cm, every column/.style={anchor=center},minimum height=3ex,minimum width=4em]{
        \node[blocco](abort){abort};\\
        \node[blocco](success){success};\\
        };

        % Collegamenti
        \path[draw]($(start.west)-(1,0)$)–(start.west);
        \path[draw](start.east)–(m1);
        \path[draw](fail1.east)–(fail1.east-|m2.west);
        \path[draw](ok1.east)–($(ok1.east|-success.west)!0.5!(m2.west|-success.west)$)–(success.west);
        \path[draw](fail2.east)–(abort.west);
        \path[draw](ok2.east)–(success.170);

        \path[draw](abort.east)–($(abort.east)+(1,0)$);
        \path[draw](success.east)–($(success.east)+(1,0)$);

        % background
        \begin{pgfonlayer}{background}
        \node[scale=0.02] (mywest) at ($(start.west)-(0.5,0)$){};
        \node[scale=0.02] (mynorth) at ($(abort.north)+(0,0.5)$){};
        \node[scale=0.02] (myeast) at ($(abort.east)+(0.5,0)$){};
        \node[scale=0.02] (mysouth) at ($(success.south)-(0,0.5)$){};

        \draw[rounded corners,-] (mywest)|-(mynorth)-|(myeast)|-(mysouth)-| (mywest);
        \end{pgfonlayer}

        \end{tikzpicture}

        \end{document}`

        Il risultato grafico

        [attachment=462]Immagine_2012-09-23.jpg[/attachment]

        E ora… il gran premio 😎

        Ciao
        Claudio

        Attachments:
        You must be logged in to view attached files.
      • #79001
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Bravo Claudio!
          Old Claudio

        • #79002
          Up
          0
          Down
          ::


          Spettacolare Claudio! Ti ringrazio molto ora ci lavoro (il mio lavoro dovrà essere leggermente diverso) e vi farò avere un feedback (o altre domandine :roll:)

          Grazie ancora!

        • #79003
          Up
          0
          Down
          ::

          konda” post=78155Spettacolare Claudio! Ti ringrazio molto ora ci lavoro (il mio lavoro dovrà essere leggermente diverso) e vi farò avere un feedback (o altre domandine :roll:)

          Grazie ancora!

          Figurati 🙂

          Ho palesemente rubato l’idea da un utente su TeX.SX, ma credo che rispondere per tutorial sia altamente istruttivo non solo per chi ha bisogno di capire il funzionamento del programma, ma anche a chi scrive per raccogliere bene le idee e fissarle. 🙂

          Ciao
          Claudio

        • #79004
          Up
          0
          Down
          ::


          Ho solo un problema. Il tuo esempio compila e funziona, ma ho notato che durante la compilazione Kile mi dà errore durante la generazione della bibliografia (exit code 2). Invece se cancello il tuo esempio compila anche la bibliografia. C’è qualche effetto collaterale?

        • #79005
          Up
          0
          Down
          ::

          konda” post=78431Ho solo un problema. Il tuo esempio compila e funziona, ma ho notato che durante la compilazione Kile mi dà errore durante la generazione della bibliografia (exit code 2). Invece se cancello il tuo esempio compila anche la bibliografia. C’è qualche effetto collaterale?

          Non mi viene in mente.

          Inserendo
          `\usepackage{etex}`come primo pacchetto del preambolo risolve?

          In caso contrario sarebbe opportuno vedere almeno il preambolo che stai usando. 🙂

          Ciao
          Claudio

        • #79006
          Up
          0
          Down
          ::


          niente da fare, identico comportamento.

          Il preambolo è il seguente:

          `\documentclass[a4paper]{book}
          \oddsidemargin=1cm
          \evensidemargin=1cm
          \linespread{1.8} %interlinea

          \usepackage{etex} %inserito ora dopo il tuo commento
          \usepackage[utf8x]{inputenc}
          \usepackage[italian]{babel}
          \usepackage{epsfig}
          \usepackage{hyperref}
          \usepackage{stmaryrd}
          \usepackage{tipa}
          \usepackage{amsmath}
          \usepackage{amssymb}
          \usepackage{listings}
          \usepackage{color}

          \usepackage{tikz}
          \usetikzlibrary{positioning,matrix,calc,backgrounds}

          \tikzset{blocco/.style={draw,rounded corners}}

          \linespread{1.8} %interlinea

          \lstset{ %
          % the language of the code
          basicstyle=\small, % the size of the fonts that are used for the code
          numbers=left, % where to put the line-numbers
          stepnumber=1, % the step between two line-numbers. If it's 1, each line
          emph={procedure, if, then, break, fi, foreach, do, od, else, end, print, function, while, return, endwhile, True, False},
          emphstyle=\bf,
          numbersep=5pt, % how far the line-numbers are from the code
          backgroundcolor=\color{white}, % choose the background color. You must add \usepackage{color}
          showspaces=false, % show spaces adding particular underscores
          showstringspaces=false, % underline spaces within strings
          showtabs=false, % show tabs within strings adding particular underscores
          frame=lines, % adds a frame around the code
          rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. commens (green here))
          tabsize=2, % sets default tabsize to 2 spaces
          captionpos=b, % sets the caption-position to bottom
          breaklines=true, % sets automatic line breaking
          breakatwhitespace=false, % sets if automatic breaks should only happen at whitespac % show the filename of files included with \lstinputlisting;
          % also try caption instead of title
          keywordstyle=\color{black}, % keyword style
          commentstyle=\color{dkgreen}, % comment style
          stringstyle=\color{black}, % string literal style
          escapeinside={\%*}{//)}, % if you want to add a comment within your code
          morekeywords={*,…}, % if you want to add more keywords to the set
          mathescape=true,
          escapechar=°
          }

          \renewcommand{\lstlistingname}{Algoritmo}
          \newtheorem{mydef}{Definizione}`

        • #79007
          Up
          0
          Down
          ::

          konda” post=78435niente da fare, identico comportamento.

          Il preambolo è il seguente:

          `\documentclass[a4paper]{book}
          \oddsidemargin=1cm
          \evensidemargin=1cm
          \linespread{1.8} %interlinea

          \usepackage{etex} %inserito ora dopo il tuo commento
          \usepackage[utf8x]{inputenc}
          \usepackage[italian]{babel}
          \usepackage{epsfig}
          \usepackage{hyperref}
          \usepackage{stmaryrd}
          \usepackage{tipa}
          \usepackage{amsmath}
          \usepackage{amssymb}
          \usepackage{listings}
          \usepackage{color}

          \usepackage{tikz}
          \usetikzlibrary{positioning,matrix,calc,backgrounds}

          \tikzset{blocco/.style={draw,rounded corners}}

          \linespread{1.8} %interlinea

          \lstset{ %
          % the language of the code
          basicstyle=\small, % the size of the fonts that are used for the code
          numbers=left, % where to put the line-numbers
          stepnumber=1, % the step between two line-numbers. If it's 1, each line
          emph={procedure, if, then, break, fi, foreach, do, od, else, end, print, function, while, return, endwhile, True, False},
          emphstyle=\bf,
          numbersep=5pt, % how far the line-numbers are from the code
          backgroundcolor=\color{white}, % choose the background color. You must add \usepackage{color}
          showspaces=false, % show spaces adding particular underscores
          showstringspaces=false, % underline spaces within strings
          showtabs=false, % show tabs within strings adding particular underscores
          frame=lines, % adds a frame around the code
          rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. commens (green here))
          tabsize=2, % sets default tabsize to 2 spaces
          captionpos=b, % sets the caption-position to bottom
          breaklines=true, % sets automatic line breaking
          breakatwhitespace=false, % sets if automatic breaks should only happen at whitespac % show the filename of files included with \lstinputlisting;
          % also try caption instead of title
          keywordstyle=\color{black}, % keyword style
          commentstyle=\color{dkgreen}, % comment style
          stringstyle=\color{black}, % string literal style
          escapeinside={\%*}{//)}, % if you want to add a comment within your code
          morekeywords={*,…}, % if you want to add more keywords to the set
          mathescape=true,
          escapechar=°
          }

          \renewcommand{\lstlistingname}{Algoritmo}
          \newtheorem{mydef}{Definizione}`

          Il preambolo lo hai scritto tu oppure lo hai preso da documenti già esistenti (e quindi magari qualche pacchetto non ti serve)? Potresti provare a commentare la chiamata a tipa e stmaryrd… probabilmente non c’entrano nulla, ma a me non viene in mente altro. Non usi nemmeno una lingua che renda attivo il carattere [tt];[/tt] quindi è davvero difficile capire il perché di questo problema.

          Ciao
          Claudio

        • #79008
          Up
          0
          Down
          ::


          Il preambolo lo hai scritto tu oppure lo hai preso da documenti già esistenti (e quindi magari qualche pacchetto non ti serve)? Potresti provare a commentare la chiamata a tipa e stmaryrd… probabilmente non c’entrano nulla, ma a me non viene in mente altro. Non usi nemmeno una lingua che renda attivo il carattere [tt];[/tt] quindi è davvero difficile capire il perché di questo problema.

          Ciao
          Claudio[/quote]

          L’ho scritto io, alcuni di quei pacchetti erano per alcuni simboli matematici particolari. Li ho rimpiazzati (e quindi eliminati dal preambolo) ma il problema persiste. C’è un modo in Kile per ottenere un output un po’ più significativo per l’errore?

        • #79009
          Up
          0
          Down
          ::

          konda” post=78479Il preambolo lo hai scritto tu oppure lo hai preso da documenti già esistenti (e quindi magari qualche pacchetto non ti serve)? Potresti provare a commentare la chiamata a tipa e stmaryrd… probabilmente non c’entrano nulla, ma a me non viene in mente altro. Non usi nemmeno una lingua che renda attivo il carattere [tt];[/tt] quindi è davvero difficile capire il perché di questo problema.

          Ciao
          Claudio

          L’ho scritto io, alcuni di quei pacchetti erano per alcuni simboli matematici particolari. Li ho rimpiazzati (e quindi eliminati dal preambolo) ma il problema persiste. C’è un modo in Kile per ottenere un output un po’ più significativo per l’errore?[/quote]
          E come inserisci la bibliografia?

          Puoi riportare anche una citazione di esempio per fare una prova?

          Ciao
          Claudio

        • #79010
          Up
          0
          Down
          ::


          Risolto! Semplicemente un errore di chiusura ambiente. Grazie mille 🙂

      Visualizzazione 13 filoni di risposte
      • Devi essere connesso per rispondere a questo topic.

      Go to top