Tikz/PGF-访问自定义形状的\backgroundpath中的自定义锚点

Tikz/PGF-访问自定义形状的\backgroundpath中的自定义锚点

我正在尝试创建一个自定义的 TikZ 形状,该形状由一个边框上有小箭头的矩形组成(代表信号输入/输出端口)。

在大多数情况下,我可以从矩形继承,但在创建输入/输出端口箭头时遇到了一些问题。理想情况下,我会在端口位置定义锚点,然后使用这些锚点在 backgroundpath 部分绘制箭头。问题是,backgroundpath 不能使用普通锚点。

一个选项是将港口位置保存为锚点,但这样我就无法访问 \northeast 和 \southwest。如果没有这些,我就无法将锚点置于实际边界上。

另一种选择是仅重复到达每个锚点所需的步骤,但我不太喜欢这样。

下面是我想要做的一个例子:

\makeatletter
\pgfdeclareshape{MyShape}
{
    \inheritsavedanchors[from=rectangle]
    \inheritanchorborder[from=rectangle]

    \inheritanchor[from=rectangle]{center}
    \inheritanchor[from=rectangle]{south}
    \inheritanchor[from=rectangle]{west}
    \inheritanchor[from=rectangle]{north}
    \inheritanchor[from=rectangle]{east}
    % etc.

    \inheritbeforebackgroundpath[from=rectangle]
    \inheritforegroundpath[from=rectangle]
    \inheritbeforeforegroundpath[from=rectangle]

    \anchor{inputA}{%
        \southwest 
        \pgf@y = \advance \pgf@y by 3mm
    }

    \backgroundpath
    {
        \pgfsetarrowsend{Latex[length=3pt]}
        \pgfpathmoveto{\inputA}
        \pgfpathlineto{\northeast}
        \pgfusepath{stroke}
    }
}
\makeatother

注意:我知道该代码不起作用因为inputA只是一个普通的锚点;

答案1

\savedanchor首先,无论如何你都需要,inputA但我认为这对你来说不是问题。相对引用其他锚点的一个原因是它们必须完全收集,这至少相当麻烦,因为框大小是唯一可用的信息。相反,我会做以下事情

\documentclass[tikz]{standalone}
\usetikzlibrary{arrows.meta}
\makeatletter
\pgfdeclareshape{MyShape}
{
    \inheritsavedanchors[from=rectangle]
    \inheritanchorborder[from=rectangle]
    \inheritanchor[from=rectangle]{center}
    \inheritanchor[from=rectangle]{south}
    \inheritanchor[from=rectangle]{west}
    \inheritanchor[from=rectangle]{north}
    \inheritanchor[from=rectangle]{east}
    % etc.
    \inheritbeforebackgroundpath[from=rectangle]
    \inheritforegroundpath[from=rectangle]
    \inheritbeforeforegroundpath[from=rectangle]
    %
    \backgroundpath
    {%
        \pgfsetarrowsend{Latex[length=3pt]}%
        \southwest\advance\pgf@y by3mm\relax\pgfpathmoveto{\pgfpoint{\pgf@x}{\pgf@y}}%
        \northeast\pgfpathlineto{\pgfpoint{\pgf@x}{\pgf@y}}%
        \pgfusepath{stroke}%
    }%
}
\makeatother

\begin{document}
\begin{tikzpicture}
\draw[style=help lines] (-2,-2) grid[step=1] (2,2);
\node[MyShape,minimum size=1cm,text=red]{A B C};
\node[draw,minimum size=1cm,text=red]{A B C};
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容