TikZ。有没有办法根据某些条件来替代绘制路径?

TikZ。有没有办法根据某些条件来替代绘制路径?

我想要的是,如果节点有不同的 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
            }
        }
    }
} 

相关内容