Tikz: ritardare esecuzione di chiave /.code

  • Creatore
    Topic
  • #79507
    Up
    0
    Down
    ::


    Buonasera a tutti,
    sto cercando di creare delle chiavi in tikz che permettano di disegnare semplicemente dei carichi distribuiti su una struttura. Il codice che ho prodotto finora è il seguente:
    `\documentclass[a4paper]{article}

    \usepackage{tikz}
    \usetikzlibrary{calc,positioning}
    \makeatletter
    \tikzset{load start/.style={insert path={coordinate (mec@start@load)}},%
    load end/.style={insert path={coordinate (mec@end@load)}},
    load distance/.initial=1em,
    force distance/.initial=10pt,
    force length/.initial=.7cm}
    \tikzset{forze/.code={%
    \coordinate (mec@X1) at ($(mec@start@load)!\pgfkeysvalueof{/tikz/load distance}!90:(mec@end@load)$);
    \coordinate (mec@X2) at ($(mec@end@load)!\pgfkeysvalueof{/tikz/load distance}!-90:(mec@start@load)$);
    \draw (mec@X1) — (mec@X2);
    \pgfpointdiff{\pgfpointanchor{mec@X1}{center}}{\pgfpointanchor{mec@X2}{center}}
    \pgfmathsetmacro{\mec@force@distrib@lenght}{veclen(\pgf@x,\pgf@y)}
    \pgfmathsetmacro{\mec@force@number}{round(\mec@force@distrib@lenght/\pgfkeysvalueof{/tikz/force distance})}
    \pgfmathsetmacro{\mec@force@distance}{1/\mec@force@number}
    \pgfmathparse{1-\mec@force@distance}
    \foreach \i in {0,\mec@force@distance,…,\pgfmathresult}{
    \coordinate (endarrow) at ($(mec@X1)!\i!(mec@X2)$);
    \coordinate (startarrow) at ($(endarrow)!\pgfkeysvalueof{/tikz/force length}!90:(mec@X2)$);
    \draw[-latex] (startarrow) — (endarrow);
    }
    \coordinate (endarrow) at ($(mec@X1)!1!(mec@X2)$);
    \coordinate (startarrow) at ($(mec@X2)!\pgfkeysvalueof{/tikz/force length}!-90:(mec@X1)$);
    \draw[-latex] (startarrow) — (endarrow);
    }}%}
    \makeatother
    \begin{document}
    \begin{tikzpicture}[node distance=1mm]
    \coordinate (a) at (0,0) node

    {A};
    \coordinate (b) at (0,3) node

    {B};
    \coordinate (c) at (3,3) node

    {C};
    \coordinate (d) at (3,0) node

    {D};
    \draw[thick] (a) — (b) [load start] — (c) [load end] — (d);
    \path[forze] (a);
    \draw (d) [load start] — (b) [load end];
    \path[forze] (a);
    \end{tikzpicture}
    \begin{tikzpicture}[node distance=1mm]
    \coordinate (a1) at (0,0) node

    {A1};
    \coordinate (b1) at (0,3) node

    {B1};
    \coordinate (c1) at (3,3) node

    {C1};
    \coordinate (d1) at (3,0) node

    {D1};
    \draw[thick] (a1) — (b1) [load start] — (c1) [load end,forze] — (d1);
    \draw[forze] (a1) — (d1);
    \end{tikzpicture}
    \end{document}`
    Le chiavi [tt]load start[/tt] e [tt]load end[/tt] servono semplicemente per salvare le coordinate di inizio e fine del carico distribuito, mentre la chiave [tt]forze[/tt] è quella che prende tali coordinate e disegna in maniera opportuna la linea di base e le singole forze (rappresentate dalle frecce). Nel primo esempio tutto funziona bene però, come vedete, è necessario definire un altro path con la sola chiave [tt]forze[/tt] per ottenere il risultato corretto. Quel che vorrei evitare è proprio questo. L’ideale sarebbe ottenere il risultato della figura di sinistra usando la notazione della figura di destra, cioè utilizzando la chiave [tt]forze[/tt] all’interno dello stesso path in cui vengono usate le chiavi [tt]load start[/tt] e [tt]load end[/tt].
    Quel che ottengo, invece, è:
    – nel primo caso le forze vengono disegnate, ma il path definito no (la struttura scompare).
    – nel secondo caso il path è disegnato (riga da d1 a a1) ma le forze compaiono sovrapposte alle precedenti.

    Mi sono fatto l’idea che ciò avvenga in quanto il codice definito all’interno della chiave [tt]forze[/tt] venga inserito all’interno della compilazione troppo presto, quando le due coordinate di inizio e fine non sono ancora state memorizzate correttamente.
    Ho provato a fare uso delle chiavi [tt]append after command[/tt], [tt]execute at end to[/tt], [tt]execute at end node[/tt], ma il risultato non cambia. Sto forse sbagliando approccio?

    Una domanda supplementare: è corretto definire delle macro come [tt]\mec@force@number[/tt] tramite [tt]\pgfmathsetmacro[/tt] all’interno delle chiavi, oppure sarebbe più corretto definirle fuori e poi usare [tt]\pgfmathsetmacro[/tt] per cambiarne il valore? Si verifica forse il problema che potrebbero finire i registri a disposizione se la chiave viene chiamata troppe volte?

    Grazie
    Francesco

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


      Un piccolo up (anche per la domanda supplementare), magari a qualcuno è sfuggito

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

Go to top