![TikZ。有没有办法根据某些条件来替代绘制路径?](https://linux22.com/image/235999/TikZ%E3%80%82%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E6%A0%B9%E6%8D%AE%E6%9F%90%E4%BA%9B%E6%9D%A1%E4%BB%B6%E6%9D%A5%E6%9B%BF%E4%BB%A3%E7%BB%98%E5%88%B6%E8%B7%AF%E5%BE%84%EF%BC%9F.png)
我想要的是,如果节点有不同的 y 坐标,则通过阶梯式(水平-垂直-水平,hvh)路径连接节点,如果它们位于同一水平,则通过直线连接节点。
在任何情况下,唯一的 hvh 路径的共同构建都会在应该发生步进的点处产生不必要的曲线偏差,就好像节点有不同的 y 坐标一样。
请参阅下面我尝试的 LaTeX 代码(我还测试过不同的方法,但现在已被注释掉):
\documentclass[landscape]{article}
\usepackage{etoolbox, ifthen}
\usepackage{tikz}
\usetikzlibrary{scopes,chains,shapes.multipart,backgrounds,positioning,fit,calc}
\newcommand{\setup}{
\tikzset{
node distance=5mm and 3cm,
block/.style={rectangle, draw, thick},
every edge/.style={->, rounded corners, thick, draw,
to path={
let \p1=(\tikztostart.east),
\p2=($ (\tikztostart.east) + (1cm,0) $),
\p3=(\tikztotarget.west) in
%\ifnumequal{\y1}{\y2}{(\p1) -- (\p3)}{(\p1) -- (\p2) |- (\p3)}
%(\p1) -- (\p2) \ifnumcomp{\y2}{=}{\y3}{-- (\p3)}{|- (\p3)}
%\ifthenelse{\equal{\y1}{\y2}}{(\p1) -- (\p3)}{(\p1) -- (\p2) |- (\p3)}
(\p1) -- (\p2) |- (\p3)
\tikztonodes
}
}
}
}
\begin{document}
\begin{tikzpicture}
\setup
\node[block] (A) {System A};
\node[block] (B) [above right=of A] {System B};
\node[block] (C) [right=of A] {System C};
\node[block] (D) [below right=of A] {System D};
\path
(A) edge (B)
edge (C)
edge (D);
\end{tikzpicture}
\end{document}
重要的是,我希望保持 tikzpicture 环境中主代码的简洁性。因此,节点处于同一级别的测试应该封装在边缘样式中的某个地方(可能是 .code?)。图片的主代码中不应该暴露任何此类逻辑,因为我倾向于声明式。
提前致谢。
编辑:感谢 Altermundus 和 Martin Scharrer。我最终得到了以下变体:
(\p1) -- (\p2) \ifdim\y2=\y3 -- \else |- \fi (\p3)
答案1
也许是这个:(我不知道etoolbox
)我在马丁的帮助下修改了代码!
\newcommand{\setup}{
\tikzset{
node distance=5mm and 3cm,
block/.style={rectangle, draw, thick},
every edge/.style={->, rounded corners, thick, draw,
to path={
let \p1=(\tikztostart.east),
\p2=($ (\tikztostart.east) + (1cm,0) $),
\p3=(\tikztotarget.west) in
\ifdim\y1=\y2 (\p1) -- (\p3) \else (\p1) -- (\p2) |- (\p3)\fi
(\p1) -- (\p2)
\ifdim\y2=\y3 -- (\p3) \else |- (\p3)\fi
(\p1) -- (\p2) |- (\p3)
\tikztonodes
}
}
}
}