Создание пользовательской формы узла с переменным количеством якорей

Создание пользовательской формы узла с переменным количеством якорей

Для самообучения работе с PGF я хочу создать такую ​​форму узла, имеющую несколько портов с переключателем выбора, как показано ниже.

введите описание изображения здесь

Это моя попытка создать этот узел для определенного количества якорей (3 входа + 1 выход), и поначалу он меня вполне устраивает.

\documentclass[border=5pt]{standalone}
\usepackage{blindtext}
\usepackage{calc} 
\usepackage{ifthen}
\usepackage{tikz}
\usepackage{lipsum}
    \usetikzlibrary{calc,shapes,arrows,positioning,patterns,fit,shapes.arrows, fadings,arrows.meta}
    \usetikzlibrary{decorations.text}
        \usetikzlibrary{decorations.pathmorphing,calc,shadows.blur,shadings, , backgrounds}
        \usepackage{circuitikz}

        \pgfdeclarelayer{background layer}
        \pgfdeclarelayer{foreground layer}
        \pgfsetlayers{background,background layer,main,foreground layer}

\makeatletter
\pgfkeys{/tikz/ilength/.initial = 2cm}
\pgfkeys{/tikz/olength/.initial = 2cm}
\pgfkeys{/tikz/hspace/.initial = 1.5cm}
\pgfkeys{/tikz/port length ratio/.initial = 0.2}
\pgfkeys{/tikz/output len to output port ratio/.initial = 0.6}
\pgfkeys{/tikz/select/.initial = 1} %for multiswitch control
\newlength\portlen
\pgfdeclareshape{killer}{
    \anchor{center}{\pgfpointorigin}
    \anchor{middle}{\pgfpointorigin}
    \anchor{text}{\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
    %-------------------
    %----------------------
    \savedanchor\kcenter{\pgfpointorigin}
    \savedanchor\knorthwest{\pgfpoint{-0.5*\pgfkeysvalueof{/tikz/hspace}}{0.5*\pgfkeysvalueof{/tikz/ilength}}}%
    \savedanchor\ksouthwest{\pgfpoint{-0.5*\pgfkeysvalueof{/tikz/hspace}}{-0.5*\pgfkeysvalueof{/tikz/ilength}}}%
    \savedanchor\knortheast{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{0.5*\pgfkeysvalueof{/tikz/olength}}}%
    \savedanchor\ksoutheast{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{-0.5*\pgfkeysvalueof{/tikz/olength}}}%
    \anchor{north west}{\knorthwest}
    \anchor{south west}{\ksouthwest}    
    \anchor{north east}{\knortheast}
    \anchor{south east}{\ksoutheast}
    \savedanchor\knorth{\pgfpoint{0cm}{0.25*\pgfkeysvalueof{/tikz/ilength}+0.25*\pgfkeysvalueof{/tikz/olength}}}%
    \savedanchor\ksouth{\pgfpoint{0cm}{-0.25*\pgfkeysvalueof{/tikz/ilength}-0.25*\pgfkeysvalueof{/tikz/olength}}}%
    \savedanchor\keast{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{0cm}}%
    \savedanchor\kwest{\pgfpoint{-0.5*\pgfkeysvalueof{/tikz/hspace}}{0cm}}%
    \anchor{north}{\knorth}
    \anchor{north}{\knorth}
    \anchor{east}{\keast}
    \anchor{west}{\kwest}
    
    %--------------------------
    
    \savedanchor\porti{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{
        0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio} - 0*0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio}}
        }%
    \savedanchor\portii{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{
        0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio} - 1*0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio}}
        }%
    \savedanchor\portiii{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{
        0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio} - 2*0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio}}
        }%

    \savedanchor\inp{\pgfpoint{-0.5*\pgfkeysvalueof{/tikz/hspace}}{0cm}
        }%
    \anchor{port 1}{\porti}
    \anchor{port 2}{\portii}
    \anchor{port 3}{\portiii}
    \anchor{input}{\inp}
\backgroundpath{%
        %
        \pgfpathmoveto{\knorthwest}%
        \pgfpathlineto{\ksouthwest}%
        \pgfpathlineto{\ksoutheast}%
        \pgfpathlineto{\knortheast}%
        \pgfpathclose%
        %----------------
    }
\foregroundpath{
        \pgfmathsetlength{\portlen}{\pgfkeysvalueof{/tikz/hspace}*0.5*\pgfkeysvalueof{/tikz/port length ratio}}
        \pgfpathmoveto{\inp}
        \pgfpathlineto{\inp \advance \pgf@x by \portlen}
        \pgfsetarrows{{Stealth[width=1.5mm]}-}
        \pgfpathlineto{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}-\portlen}{
            0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio} - (\pgfkeysvalueof{/tikz/select}-1)*0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio}
        }}
        \pgfusepath{stroke}
        \pgfsetarrows{-}
        \pgfpathmoveto{\porti}
        \pgfpathlineto{\porti \advance \pgf@x by -\portlen}
        \pgfpathmoveto{\portii}
        \pgfpathlineto{\portii \advance \pgf@x by -\portlen}
        \pgfpathmoveto{\portiii}
        \pgfpathlineto{\portiii \advance \pgf@x by -\portlen}
}}    

\makeatother
\begin{document}
\begin{tikzpicture}
    \node [killer,draw=blue,scale=1, port length ratio=0.4,ilength=1.2cm] (A) {};
    \node [killer,draw=blue,fill=green,scale=1,select=3, port length ratio=0.4, left = of A] (B) {};
\end{tikzpicture}
\end{document}

Однако мне не удалось нарисовать границу якоря для этого узла, несмотря на то, что я потратил часы на чтение руководства pgf по использованию команды \anchorborder{}, возможно, я не мог понять, как она работает. В любом случае, обойдя мою проблему с границей якоря, мой следующий шаг — контролировать количество входных портов (якорь) с помощью ключа, \pgfkeys{/tikz/number of input ports/.initial = 4}подобного тому, что используется в логических вентилях. Я знаю, что часто требуется использовать команды типа \csname ..... \endcsnameи \expandafter, которые сбивают меня с толку, и, кроме того, я уже пытался использовать их, но тщетно.

Наконец, любые сторонние предложения по изменению моего кода приветствуются, за исключением использования предопределенных узлов.

Связанный контент