1

For the sake of training my self on PGF, I want to create such node shape having multiply ports with a selecting switch as shown below

enter image description here

This is my attempt to create this node for a particular number of anchors (3 inputs + 1 output) and initially it's satisfying

\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}

However, I failed to draw anchor border for this node in spite of taking hours to read pgf manual to use the command \anchorborder{}, maybe I couldn't understand how it works. Anyway, bypassing my problem with anchor border, My next step is to control the number of input ports (anchor) by a key \pgfkeys{/tikz/number of input ports/.initial = 4} like that in logic gates. I know it's often requred to use commands like \csname ..... \endcsname and \expandafter which are confusing for me and besides I have already tried to use them but in vain.

Finally, any side suggestion to modify my code is welcomed except using predefined nodes.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.