[TikZ] Flowchart

  • Creatore
    Topic
  • #99533
    Up
    0
    Down
    ::


    salve a tutti
    sto prendendo in mano il pacchetto TikZ per la prima volta, e devo dire che è tanto bello quanto difficile.
    in particolare sto tentanto di fare una flowchart, come riportato di seguito:

    fino ad ora quello che sono riuscito a fare è qui:

    `\documentclass[a4paper,11pt,openright,titlepage]{book}
    \usepackage{tikz}
    \usetikzlibrary{calc,positioning,shapes.geometric,shapes.symbols,shapes.misc, intersections, shadows, arrows}

    \begin{document}
    \tikzstyle{decision} = [diamond, draw,
    text width=4.5em, text badly centered, node distance=3cm, inner sep=0pt]
    \tikzstyle{block} = [rectangle, draw,
    text width=5em, text centered, rounded corners, minimum height=4em]
    \tikzstyle{line} = [draw, -latex']
    \tikzstyle{cloud} = [draw, ellipse, node distance=3cm,
    minimum height=2em]

    \begin{tikzpicture}[node distance = 2.5cm, auto]
    % Place nodes
    \node [cloud] (solve) {SolveProblem()};
    \node [decision, below of=solve] (time) {time$>$nextime};
    \node [block, below of=time] (nuovi) {newModel\\newNLproblem};
    \node [block, below of=nuovi] (mesh) {Meshproblem};
    \node [block, below of=mesh] (risolt) {Solved?};
    \node [block, below of=risolt] (processo) {Process Fracture};
    \node [block, left of=risolt] (end) {end};
    \node [decision, below of=processo] (sigma) {$\sigma>\sigma_{u}$};
    \node [block, below of=sigma] (nuovo) {New Apex};
    % Draw edges
    \path [line] (solve) — (time);
    \path [line] (time) — (nuovi);
    \path [line] (nuovi) — (mesh);
    \path [line] (mesh) — (risolt);
    \path [line] (risolt) — (end);
    \path [line] (risolt) — (processo);
    \path [line] (processo) — (sigma);
    \path [line] (sigma) — (nuovo);
    \path [line] (sigma) — (nuovo);
    \path [line] (time) -| (end);
    \end{tikzpicture}
    \end{document}`

    qualcuno sa aiutarmi a proseguire. inoltre, c’è un modo per adattare le varie forme al testo?
    Credo che per imparare ad usare bene TikZ servano mesi, e io sono un po’ stretto con i tempi. Chiedo quindi il vostro aiuto.

    grazie in anticipo
    Marco

Visualizzazione 3 filoni di risposte
  • Autore
    Risposte
    • #99534
      Up
      0
      Down
      ::


      Servono mesi (o magari anche di più) per imparare tikz (difatti io non lo so utilizzare 😉 )…..fortunatamente per imparare a fare un flowchart serve molto meno. La mia esperienza di tikz è iniziata (e finita visto che non ci ho mai fatto cose particolari) con un flowchart e l’approccio (seppur traumatico) mi ha richiesto un 3-4 ore.

      Tutto questo per dire che tikz è enorme e padroneggiarlo seriamente non è cosa facile e richiede uno studio costante.
      Fortunatamente un flowchart sono quadrati e frecce quindi anche i comuni mortali possono riuscire ad imparare a farli senza soffrire in maniera eccessiva 🙂

      `\documentclass[a4paper,11pt,openright,titlepage]{book}
      \usepackage{tikz}
      \usetikzlibrary{calc,positioning,shapes.geometric,shapes.symbols,shapes.misc, intersections, shadows, arrows}

      \begin{document}
      \tikzstyle{decision} = [diamond, draw, text width=2.5cm, text badly centered, node distance=3cm, inner sep=0pt]
      \tikzstyle{block} = [rectangle, draw, text centered, text width=2.8cm, rounded corners, minimum height=4em]
      \tikzstyle{line} = [draw, -latex']
      \tikzstyle{cloud} = [draw, ellipse, node distance=3cm,
      minimum height=2em]

      \begin{tikzpicture}[node distance = 2.5cm, auto]
      % Place nodes
      \node [cloud] (solve) {SolveProblem()};
      \node [decision, below of=solve] (time) {time$>$nextime};
      \node [block, below= .5cm of time] (nuovi) {newModel \\newNLproblem};
      \node [block, below of=nuovi] (mesh) {Meshproblem};
      \node [block, below of=mesh] (risolt) {Solved?};
      \node [block, below of=risolt] (processo) {Process Fracture};
      \node [block, text width=1.5cm, left=2cm of risolt] (end) {end};
      \node [decision, below of=processo] (sigma) {$\sigma>\sigma_{u}$};
      \node [block, below= 0.5cm of sigma] (nuovo) {New Apex};
      % Draw edges
      \path [line] (solve) — (time);
      \path [line] (time) — (nuovi);
      \path [line] (nuovi) — (mesh);
      \path [line] (mesh) — (risolt);
      \path [line] (risolt) — (end)
      node[auto,above left,pos=0,text centered] {yes};
      \path [line] (risolt) — (processo)
      node[auto, right,pos=0.3,text centered] {yes};
      \path [line] (processo) — (sigma);
      \path [line] (sigma) — (nuovo);
      \path [line] (sigma) — (nuovo)
      node[auto, right,pos=0.3,text centered] {yes};
      \path [line] (time) -| (end)
      node[auto,above left,pos=0,text centered] {no};
      \path[line](sigma.east) — ($(sigma.east)+(1,0)$) node[auto,above right,pos=0,text centered] {no} — ($(mesh.east)+(1,0)$) — (mesh.east);
      \path[line](nuovo.east) — ($(nuovo.east)+(2,0)$) — ($(time.east)+(2,0)$) — (time.east);

      \end{tikzpicture}
      \end{document}`

      Per adattare le varie forme al testo devi togliere l’indicazione di text width nella definizione dello stile della figura. Però poi ti escono i blocchi tutti diversi e personalmente non mi piace.
      Io cambierei anche il blocco del diamond perché verticalmente occupa troppo spazio (anche rispetto agli altri blocchi). Cercherei piuttosto di metterci un rombo, magari non troppo schiacciato.

    • #99535
      Up
      0
      Down
      ::


      grazie ! quindi per i trapezi ho fatto così:

      `\documentclass[a4paper,11pt,openright,titlepage]{book}
      \usepackage{tikz}
      \usetikzlibrary{calc,positioning,shapes.geometric,shapes.symbols,shapes.misc, intersections, shadows, arrows}

      \begin{document}
      %————————————————————————————————
      \tikzstyle{startstop} = [rectangle, rounded corners, minimum width=3cm, minimum height=1cm,text centered, draw=black]
      \tikzstyle{cloud} = [trapezium, trapezium left angle=70, trapezium right angle=110, minimum width=3cm, minimum height=1cm, text centered, draw=black]
      \tikzstyle{block} = [rectangle, minimum width=3cm, minimum height=1cm, text centered, draw=black]
      \tikzstyle{decision} = [diamond, shape aspect=2, minimum width=3cm, minimum height=1cm, text centered, draw=black]
      \tikzstyle{arrow} = [thick,->,>=stealth] %stile per le frecce
      \tikzstyle{line} = [draw, -latex']
      %————————————————————————————————

      \begin{tikzpicture}[node distance = 2.5cm, auto]
      % Place nodes
      \node [cloud] (solve) {SolveProblem()};
      \node [decision, below of=solve] (time) {$t=t_{i+1}$};
      \node [block, below= .5cm of time] (nuovi) {newModel \\newNLproblem};
      \node [block, below of=nuovi] (mesh) {Meshproblem};
      \node [decision, below of=mesh] (risolt) {Solved};
      \node [block, below of=risolt] (processo) {Process Fracture};
      \node [block, text width=1.5cm, left=2cm of risolt] (end) {end};
      \node [decision, below of=processo] (sigma) {$\sigma>\sigma_{u}$};
      \node [block, below= 0.5cm of sigma] (nuovo) {New Apex};
      % Draw edges
      \path [line] (solve) — (time);
      \path [line] (time) — (nuovi)
      node[auto,pos=0.3,text centered] {yes};
      \path [line] (nuovi) — (mesh);
      \path [line] (mesh) — (risolt);
      \path [line] (risolt) — (end)
      node[auto,above left,pos=0,text centered] {no};
      \path [line] (risolt) — (processo)
      node[auto, right,pos=0.3,text centered] {yes};
      \path [line] (processo) — (sigma);
      %\path [line] (sigma) — (nuovo);
      \path [line] (sigma) — (nuovo)
      node[auto, right,pos=0.3,text centered] {yes};
      \path [line] (time) -| (end)
      node[auto,above left,pos=0,text centered] {no};
      \path[line](sigma.east) — ($(sigma.east)+(1,0)$) node[auto,above right,pos=0,text centered] {no} — ($(mesh.east)+(1,0)$) — (mesh.east);
      \path[line](nuovo.east) — ($(nuovo.east)+(2,0)$) — ($(time.east)+(2,0)$) — (time.east);

      \end{tikzpicture}
      \end{document}
      `

      un’ultima cosa: in merito alla dimensione, ok, teniamo la stessa larghezza, ma c’è un modo per mandare a capo dopo newModel con newNLproblem ? cioè mantenere la stessa larghezza ma variare l’altezza dei blocchi.

      ancora grazie
      Marco

    • #99536
      Up
      0
      Down
      ::


      Se serve, tempo fa avevo definito una sorta di libreria con stili per diverse forme.

      Ricordati che si preferisce [tt]tikzset[/tt] al deprecato [tt]tikzstyle[/tt] e per andare a capo ti basta dare un \\ nel testo del nodo, a patto che sia specificato un tipo di allineamento.

      Ciao
      Claudio

    • #99537
      Up
      0
      Down
      ::


      le avevo trovate cercando informazioni in merito alle flowchart, complimenti per il lavoro !

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

Go to top