- Questo topic ha 1 risposta, 1 partecipante ed è stato aggiornato l'ultima volta 13 anni, 11 mesi fa da .
-
Topic
-
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
- Devi essere connesso per rispondere a questo topic.