如何在 pgf-tikz 中构建已保存的锚点而无需重复计算

如何在 pgf-tikz 中构建已保存的锚点而无需重复计算

我在 PGF-Ti 中制作了一个新形状Z 带有一个锚点(banchor),它取决于一些选项。以下代码有效,但我需要重复计算以在形状中绘制线条并放置锚点:

\documentclass[border=2mm]{standalone}
\usepackage{tikz,makeshape}
\usetikzlibrary{calc}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage{filecontents}
\begin{filecontents*}{manometro.tex}

\makeatletter

\def\unidad@medicion{mm}
\newdimen\radio@medidor \radio@medidor=2.5\unidad@medicion
% \pgfmathsetmacro quita la unidad pero lo da en puntos. Hay que convertir a mm.
\pgfmathsetmacro\largo@terminal@defecto{0.351459804\radio@medidor} % sin unidades

\newdimen\largo@recta
\pgfkeys{
    /tikz/rotacion recta/.initial=270, % para manómetros, etc.
    /tikz/longitud recta/.initial=\largo@terminal@defecto
}

\makeatother

\makeatletter

%% Anchor path:

\def\generalanchor{} % No es necesario, el nodo no llevará texto.

%% Background path:

\def\manometroborder{ % Obtiene la caja de texto correcta:

  % Círculo:
    %
  \pgfcircle{\pgfpointorigin}{\radio@medidor}
  \ifx\tikz@fillcolor\empty
    \pgfusepath{stroke}
  \else
    \pgfsetfillcolor{\tikz@fillcolor}
    % La opción clip evita los picos de la válvula saliendo el círculo.
    \pgfusepath{fill,stroke}
  \fi
  %
  % Línea de conexión:
    %
  \largo@recta=\pgfkeysvalueof{/tikz/longitud recta}\unidad@medicion
  \advance\largo@recta\radio@medidor
  \pgftransformrotate{\pgfkeysvalueof{/tikz/rotacion recta}}
  \pgfpathmoveto{\pgfpointpolar{0}{\radio@medidor}}
  \pgfpathlineto{\pgfpointpolar{0}{\largo@recta}}
  \pgfusepath{stroke}

}

%% Declaración de la forma:

\pgfdeclareshape{manometro}{

  \setpaths{\generalanchor}{\manometroborder}

  \savedanchor{\centerpoint}{
      \pgf@x = \ctbnex
      \pgf@y = \ctbney
      %\advance\pgf@x by \gap
      %\advance\pgf@y by \gap
      \mincorrect{\pgf@x}{\pgfshapeminwidth}
      \mincorrect{\pgf@y}{\pgfshapeminheight}
      \advance\pgf@x\pgfshapeouterxsep
      \advance\pgf@y\pgfshapeouterysep
  }

  \savedanchor{\basepoint}{
    \largo@recta=\pgfkeysvalueof{/tikz/longitud recta}\unidad@medicion
    \advance\largo@recta\radio@medidor
    \pgfextractx{\pgf@x}{
      \pgfpointpolar{\pgfkeysvalueof{/tikz/rotacion recta}}{\largo@recta}
    }
    \pgfextracty{\pgf@y}{
      \pgfpointpolar{\pgfkeysvalueof{/tikz/rotacion recta}}{\largo@recta}
    }
  }

  % Anchors:
  \anchor{c}{\centerpoint \pgf@x=0pt \pgf@y=0pt}
  %
  \anchor{u}{\centerpoint \pgf@x=0pt \pgf@y= \radio@medidor}
  \anchor{d}{\centerpoint \pgf@x=0pt \pgf@y=-\radio@medidor}
  \anchor{r}{\centerpoint \pgf@x= \radio@medidor \pgf@y=0pt}
  \anchor{l}{\centerpoint \pgf@x=-\radio@medidor \pgf@y=0pt}
  %
  % Del terminal:
  \anchor{b}{\basepoint}

}

\makeatother

\end{filecontents*}

\tikzset{
    st texto/.style={
        font=\sffamily\footnotesize,
        circle,black,inner sep=0.0em
    },
    st valvula/.style={
        node contents={},
        draw,minimum width=3mm,minimum height=2.85mm,line width=0.1mm,inner sep=0em,scale=2
    },
    st linea nodo/.style={line width=0.1mm,latex-,orange,shorten >= 0.5em},
}

\input{manometro.tex}

\begin{document}

    \begin{tikzpicture}[x=1mm,y=1mm,remember picture]

    \path (0,0) node (v) [%
    manometro,st valvula,
    fill=yellow!50,
    rotacion recta=45,
    longitud recta=5
  ];

  \draw[st linea nodo] (v.b) -- ++(0:5) node[st texto] {b};

    \end{tikzpicture}

\end{document}

在此处输入图片描述

\savedanchor{\basepoint}{...

我必须做出与

\def\manometroborder{...

请问有什么方法可以避免这种情况吗?提前谢谢!

相关内容