
Betrachten Sie das folgende MWE:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\usetikzlibrary{fit}
\usetikzlibrary{3d}
\makeatletter
\tikzset{
fitting node/.style={
inner sep=0pt,
fill=none,
draw=none,
reset transform,
fit={(\pgf@pathminx,\pgf@pathminy) (\pgf@pathmaxx,\pgf@pathmaxy)}
},
reset transform/.code={\pgftransformreset},
}
\makeatother
\tikzstyle{dr} = [draw, rectangle, line width=1pt, font=\Huge, align=left]
\tikzstyle{cl} = [>=latex,->,line width=1pt]
\begin{document}
\begin{tikzpicture}[
% x={(0.5cm,0.5cm)}, y={(1cm,0cm)}, z={(0cm,1cm)},
% every node/.append style={transform shape},
]
\draw[very thick] (0,0) rectangle (18,8) node[fitting node] (starter) {};
\begin{scope}[
shift={(1,1)},
% canvas is yx plane at z=0.25,
]
\node[dr] (NodeA) at (1,5) {Node A};
\draw[dr] (4.5,2.5) rectangle (11,6.5) node [fitting node] (NodeB) {Node B\\Slightly bigger};
\node[dr] (NodeC) [above=10pt of NodeB.south, anchor=south] {Node C};
\draw[cl] (NodeA) -- (NodeB);
\draw[cl] (NodeA) |- ($(NodeB.north west)-(10pt,10pt)$) -- ($(NodeB.south west)-(10pt,7.5pt)$) -| ($(NodeC.south west)+(10pt,0)$);
\end{scope}
\end{tikzpicture}
\end{document}
Wenn ich es so kompiliere wie es ist, erhalte ich die erwartete Anordnung der Knoten und Verbindungslinien:
Wenn ich aber 3D aktiviere, indem ich die kommentierten Zeilen im MWE auskommentiere, erhalte ich Folgendes:
Dass der NodeB-Text nicht perspektivisch dargestellt ist, stört mich nicht so sehr; was mich stört, ist, dass Koordinaten, die auf dem passenden NodeB-Knotenrechteck basieren, bei 3D-Transformationen nicht richtig funktionieren (beachten Sie, dass zwischen „richtigen“ Knoten alles in Ordnung ist, z. B. das Stück der Linie, das direkt in NodeC hineinführt).
(Mir ist bewusst, dass insbesondere dieses Beispiel auch ohne das passende Knotenrechteck durchgeführt werden kann – und damit wäre das Problem gelöst. Die Sache ist die, dass diese für die GUI-Bearbeitung in TikzEdt recht nützlich sind, und ich habe daher überall Code mit einer Menge davon, weshalb ich stattdessen lieber eine Lösung wie eine Korrektur des „passenden Knoten“-Stils hätte.)
Antwort1
Ich weiß nicht, wo das Problem liegt, vielleicht transform shape
wird es nicht auf Knoten angewendet fit
. Hier ist ein Workaround, falls niemand eine bessere Lösung anbietet.
label={center:{node text}}
Als Option für fitting
Knoten verwenden :
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\usetikzlibrary{fit}
\usetikzlibrary{3d}
\makeatletter
\tikzset{
fitting node/.style={
inner sep=0pt,
fill=none,
draw=none,
reset transform,
fit={(\pgf@pathminx,\pgf@pathminy) (\pgf@pathmaxx,\pgf@pathmaxy)}
},
reset transform/.code={\pgftransformreset},
}
\makeatother
\tikzstyle{dr} = [draw, rectangle, line width=1pt, font=\Huge, align=left]
\tikzstyle{cl} = [>=latex,->,line width=1pt]
\begin{document}
\begin{tikzpicture}[
x={(0.5cm,0.5cm)}, y={(1cm,0cm)}, z={(0cm,1cm)},
every node/.append style={transform shape},
]
\draw[very thick] (0,0) rectangle (18,8) node[fitting node] (starter) {};
\begin{scope}[
shift={(1,1)},
canvas is yx plane at z=0.25,
]
\node[dr] (NodeA) at (1,5) {Node A};
\draw[dr] (4.5,2.5) rectangle (11,6.5) node [fitting node, label={center:{Node B\\Slightly bigger}}] (NodeB) {};
\node[dr] (NodeC) [above=10pt of NodeB.south, anchor=south] {Node C};
\draw[cl] (NodeA) -- (NodeB);
\draw[cl] (NodeA) |- ($(NodeB.north west)-(10pt,10pt)$) -- ($(NodeB.south west)-(10pt,7.5pt)$) -| ($(NodeC.south west)+(10pt,0)$);
\end{scope}
\end{tikzpicture}
\end{document}
Antwort2
BEARBEITEN: Beachten Sie, dass diese Antwort in Texlive 2014 eingefroren wurde:
Ok, ich glaube, ich habe es verstanden, verstehe im Moment aber nicht wirklich, warum.
Zunächst besteht das Problem darin, dass es genau das tut, was ihm gesagt wird. Wir sagen ihm, dass es die letzten minimalen und maximalen x- und y-Werte von pgf anpassen soll, und genau das tut es (kann man sehen, wenn man es in of fit
ändert ):draw=red
fitting node
Das Problem scheint zu sein, dass das Rechteck bereits transformiert ist, wenn es erreicht wird fit
, und dennoch fit
nichts von der 3D-Transformation weiß.
Ich habe also versucht, die Transformation zu stoppen, dann den Knoten zum Anpassen des Rechtecks auszuführen und dann die Transformation wiederherzustellen – hat nicht funktioniert; habe versucht, nach einer Möglichkeit zu suchen, PGF-Zeichenbefehle zu gruppieren und dann eine Transformation auf alle anzuwenden – konnte sie nicht finden.
Dann fand ich#47797 Wie erstelle ich Knotenanker-ähnliche Punkte auf einem (Tikz-)Rechteckpfad (gibt es eine bessere Methode als die beschriebene)?, und habe das verwendet, damit dem Rechteck Koordinatenanker hinzugefügt werden - und habe unter anderem versucht, fit
die Anker des Rechtecks zu ändern... Und plötzlich funktioniert es?? Und ich kann nicht erkennen, wie das die Koordinatentransformation unterbrechen würde, wie es meine Theorie für das obige Problem war??
Trotzdem lautet die Ausgabe jetzt:
... und obwohl ich leider nicht einfach den Stil ändern und weitermachen kann fitting node
(ich muss überall Verweise auf Rechtecke und entsprechende passende Knoten hinzufügen) -- funktioniert der Code auch genauso wie in der TikzEdt-GUI, also ist das gut. Der Code lautet:
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\usetikzlibrary{fit}
\usetikzlibrary{3d}
\makeatletter
%https://tex.stackexchange.com/a/47797/2595
\tikzset{add reference/.style={insert path={%
coordinate [pos=0,xshift=-0.5\pgflinewidth,yshift=-0.5\pgflinewidth] (#1 south west)
coordinate [pos=1,xshift=0.5\pgflinewidth,yshift=0.5\pgflinewidth] (#1 north east)
coordinate [pos=.5] (#1 center)
(#1 south west |- #1 north east) coordinate (#1 north west)
(#1 center |- #1 north east) coordinate (#1 north)
(#1 center |- #1 south west) coordinate (#1 south)
(#1 south west -| #1 north east) coordinate (#1 south east)
(#1 center -| #1 south west) coordinate (#1 west)
(#1 center -| #1 north east) coordinate (#1 east)
}}}
\tikzset{
fitting node/.style={
inner sep=0pt,
fill=none,
draw=red,
fit={(#1 south west) (#1 north east)},
},
}
\makeatother
\tikzstyle{dr} = [draw, rectangle, line width=1pt, font=\Huge, align=left]
\tikzstyle{cl} = [>=latex,->,line width=1pt]
\begin{tikzpicture}[
x={(0.5cm,0.5cm)}, y={(1cm,0cm)}, z={(0cm,1cm)},
every node/.append style={transform shape},
]
\draw[very thick] (0,0) rectangle (18,8) [add reference=R1] node[fitting node=R1] (starter) {};
\begin{scope}[
shift={(1,1)},
canvas is yx plane at z=0.25,
]
\node[dr] (NodeA) at (1,5) {Node A};
\draw[dr] (4.5,2.5) rectangle (11,6.5) [add reference=R2] node [fitting node=R2] (NodeB) {Node B\\Slightly bigger};
\node[dr] (NodeC) [above=10pt of NodeB.south, anchor=south] {Node C};
\draw[cl] (NodeA) -- (NodeB);
\draw[cl] (NodeA) |- ($(NodeB.north west)-(10pt,10pt)$) -- ($(NodeB.south west)-(10pt,7.5pt)$) -| ($(NodeC.south west)+(10pt,0)$);
\end{scope}
\end{tikzpicture}