使用节点形状定义中的长度

使用节点形状定义中的长度

这个问题有点棘手。我正在尝试构建气动回路流程图的符号。我不需要那么多元素,但我希望能够扩展我的集合pgfcirkuitz(尽管不是那么复杂)。因此,我编写了几个绘制常见符号的定义,并构建了一个宏,将它们组合成一个特定的节点形状。我将一个特定长度存储在 中tikzset。整个流程在绘制符号的意义上有效,但我收到了类似 的错误消息illegal unit of measure。有人能指出我犯的错误吗?

下面是我的代码,不幸的是,由于尝试使这个东西可定制,对于这个特定的问题来说,它相当长。

\documentclass[tikz]{standalone}

\usetikzlibrary{arrows.meta}

\makeatletter

\def\storecenter#1{%
    \pgf@process{#1}%
    \pgfutil@tempdima=\pgf@x%
    \pgfutil@tempdimb=\pgf@y%
}%

% empty flowpath square {centerpoint}{half sidelength}
\def\addemptyflowpath#1#2{%
    \storecenter{#1}
    \pgfpathrectanglecorners%
    {\pgf@x=\pgfutil@tempdima%
        \pgf@y=\pgfutil@tempdimb%
        \advance\pgf@x by-#2%
        \advance\pgf@y by-#2}%
    {\pgf@x=\pgfutil@tempdima%
        \pgf@y=\pgfutil@tempdimb%
        \advance\pgf@x by #2%
        \advance\pgf@y by #2}%
    \pgfusepath{draw}
}

\def\addflowpathbothways#1#2{%
    \storecenter{#1}
    % rectangle
    \addemptyflowpath{#1}{#2}
    % symbol
    \pgfpathmoveto{\pgfpoint{\pgfutil@tempdima}{\pgfutil@tempdimb-#2}}
    \pgfpathlineto{\pgfpoint{\pgfutil@tempdima}{\pgfutil@tempdimb+#2}}
%    \pgfsetarrows{<->}
%    \pgfusepath{draw}
%    \pgfsetarrows{-}
}%

\long\def\declarecombindedflow#1#2#3#4{%
    \pgfdeclareshape{#1}{%
        \savedanchor{\centerpoint}{\pgfpointorigin}
        \saveddimen\numberofelements{\pgf@x=#2}
        \saveddimen\halfside{%
            \pgfmathsetlength\pgf@x{.5*\pgfkeysvalueof{/tikz/pneumatic/flow path size}}%
        }
        \saveddimen\halfwidth{%
            \pgfmathsetlength\pgf@x{#2*0.5*\pgfkeysvalueof{/tikz/pneumatic/flow path size}}%
        }
        \anchor{center}{\centerpoint}

        #3

        \backgroundpath{
            #4
        }%
    }%
}%

\makeatother

\tikzset{
    pneumatic/flow path size/.initial=20 cm,
}

\declarecombindedflow{combindedtest}{2}{}{%
    \newlength\shiftelement
    \pgfmathsetlength\shiftelement{(-(2+1)+1*2)*\halfside}
    \addflowpathbothways{\pgfpointadd{\centerpoint}{\pgfpoint{-\shiftelement}{0pt}}}{\halfside}
    \pgfmathsetlength\shiftelement{(-(2+1)+2*2)*\halfside}
    \addflowpathbothways{\pgfpointadd{\centerpoint}{\pgfpoint{-\shiftelement}{0pt}}}{\halfside}
}

\begin{document}
\begin{tikzpicture}
    \node[combindedtest, name=a] at (2,2) {};
\end{tikzpicture}
\end{document}

答案1

\declarecombindedflow您的用途定义#2

\pgf@x=#2

这意味着,#2需要有一个长度。因此,当您使用宏时,您需要使用:

\declarecombindedflow{combindedtest}{2pt}{}{% i.e. `2pt` instead of `2`.

不过,由于\numberofelements听起来不像长度,所以最好使用\savedmacro, IE

\savedmacro\numberofelements{\pgfmathtruncatemacro\numberofelements{#2}}

然后你可以使用

\declarecombindedflow{combindedtest}{2}{}{%

再次(甚至\declarecombindedflow{foo}{5*3-13}…)并且\numberofelements将可用并将扩展到2
(如果您不需要 PGFmath,您可以简单地执行\savedmacro\numberofelements{\edef\numberofelement{#2}}。)

相关内容