% Copyright 2018 by Till Tantau and others Wibrow
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
%
% See the file doc/generic/pgf/licenses/LICENSE for more details.


%
% Resistor shape based on a zig-zag-line
%

\pgfdeclareshape{var resistor IEC}
{%
  \inheritsavedanchors[from=rectangle ee]%
  \inheritanchor[from=rectangle ee]{center}%
  \inheritanchor[from=rectangle ee]{north}%
  \inheritanchor[from=rectangle ee]{south}%
  \inheritanchor[from=rectangle ee]{east}%
  \inheritanchor[from=rectangle ee]{west}%
  \inheritanchor[from=rectangle ee]{north east}%
  \inheritanchor[from=rectangle ee]{north west}%
  \inheritanchor[from=rectangle ee]{south east}%
  \inheritanchor[from=rectangle ee]{south west}%
  \inheritanchor[from=rectangle ee]{input}%
  \inheritanchor[from=rectangle ee]{output}%
  \inheritanchorborder[from=rectangle ee]%

  \backgroundpath{
    \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
    \pgf@xa=\pgf@x \pgf@ya=\pgf@y
    \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
    \pgf@xb=\pgf@x \pgf@yb=\pgf@y
    % Middle line
    \pgf@yc=.5\pgf@ya
    \advance\pgf@yc by.5\pgf@yb
    % Height
    \pgf@xc=-.5\pgf@ya
    \advance\pgf@xc by.5\pgf@yb
    % Start point
    \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yc}}
    % Lines
    \advance\pgf@xb by.1pt%
    \pgfutil@loop%
      \advance\pgf@xa by4\pgf@xc\relax%
    \ifdim\pgf@xa<\pgf@xb%
      \advance\pgf@xa by-3\pgf@xc%
      \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}%
      \advance\pgf@xa by2\pgf@xc%
      \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
      \advance\pgf@xa by\pgf@xc%
      \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yc}}%
    \pgfutil@repeat%
    \advance\pgf@xb by-.1pt%
    \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yc}}%
  }%
}%



%
% Inductor shape based on a bumpy line
%

\pgfdeclareshape{inductor IEC}
{%
  \savedanchor\northeast{%
    \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
    \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
    \pgf@x=\pgf@xa%
    \advance\pgf@x by .5\pgf@xb%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
    \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
    \pgf@y=\pgf@ya%
    \advance\pgf@y by\pgf@yb%
  }%
  \savedanchor\southwest{%
    \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
    \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
    \pgf@x=-\pgf@xa%
    \advance\pgf@x by -.5\pgf@xb%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
    \pgf@y=-\pgf@ya%
  }%

  \anchor{center}{\pgfpointorigin}%
  \inheritanchor[from=rectangle ee]{north}%
  \inheritanchor[from=rectangle ee]{south}%
  \inheritanchor[from=rectangle ee]{east}%
  \inheritanchor[from=rectangle ee]{west}%
  \inheritanchor[from=rectangle ee]{north east}%
  \inheritanchor[from=rectangle ee]{north west}%
  \inheritanchor[from=rectangle ee]{south east}%
  \inheritanchor[from=rectangle ee]{south west}%
  \inheritanchor[from=rectangle ee]{input}%
  \inheritanchor[from=rectangle ee]{output}%

  \anchorborder{%
    \ifdim\pgf@y<0pt%
      % tricky... simpilfy to the origin...
      \pgf@xc=\pgf@x%
      \pgf@yc=\pgf@y%
      \pgf@process{\southwest}%
      \advance\pgf@y by-0.5pt%
      \pgf@xa=\pgf@x%
      \pgf@ya=\pgf@y%
      \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\pgfqpoint{-\pgf@xa}{-\pgf@ya}}}%
    \else%
      \pgf@xc=\pgf@x%
      \pgf@yc=\pgf@y%
      \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\northeast}}%
    \fi%
  }%

  \backgroundpath{
    \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
    \pgf@xa=-\pgf@x \pgf@ya=0pt
    \pgf@xb=\pgf@x \pgf@yb=\pgf@y
    % Height
    \pgf@xc=\pgf@yb%
    % Start point
    \pgfpathmoveto{\pgfqpoint{\pgf@xa}{0pt}}
    % Lines
    \advance\pgf@xb by.1pt%
    \pgfutil@loop%
      \advance\pgf@xa by2\pgf@xc\relax%
    \ifdim\pgf@xa<\pgf@xb%
      \pgfpatharc{180}{0}{\pgf@xc}%
    \pgfutil@repeat%
    \advance\pgf@xb by-.1pt%
    \pgfpathlineto{\pgfqpoint{\pgf@xb}{0pt}}%
  }%
}%




%
% Simple capacitor, consisting of two parallel lines
%

\pgfdeclareshape{capacitor IEC}
{%
  \inheritsavedanchors[from=rectangle ee]%
  \inheritanchor[from=rectangle ee]{center}%
  \inheritanchor[from=rectangle ee]{north}%
  \inheritanchor[from=rectangle ee]{south}%
  \inheritanchor[from=rectangle ee]{east}%
  \inheritanchor[from=rectangle ee]{west}%
  \inheritanchor[from=rectangle ee]{north east}%
  \inheritanchor[from=rectangle ee]{north west}%
  \inheritanchor[from=rectangle ee]{south east}%
  \inheritanchor[from=rectangle ee]{south west}%
  \inheritanchor[from=rectangle ee]{input}%
  \inheritanchor[from=rectangle ee]{output}%
  \inheritanchorborder[from=rectangle ee]%

  \backgroundpath{
    \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
    \pgf@xa=\pgf@x \pgf@ya=\pgf@y
    \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
    \pgf@xb=\pgf@x \pgf@yb=\pgf@y
    \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
    \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
    \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
    \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
  }%
}%




%
% Simple ground, consisting of three lines, getting smaller
%

\pgfdeclareshape{ground IEC}
{%
  \inheritsavedanchors[from=rectangle ee]%
  \inheritanchor[from=rectangle ee]{center}%
  \inheritanchor[from=rectangle ee]{north}%
  \inheritanchor[from=rectangle ee]{south}%
  \inheritanchor[from=rectangle ee]{east}%
  \inheritanchor[from=rectangle ee]{west}%
  \inheritanchor[from=rectangle ee]{north east}%
  \inheritanchor[from=rectangle ee]{north west}%
  \inheritanchor[from=rectangle ee]{south east}%
  \inheritanchor[from=rectangle ee]{south west}%
  \inheritanchor[from=rectangle ee]{input}%
  \inheritanchor[from=rectangle ee]{output}%
  \inheritanchorborder[from=rectangle ee]%

  \backgroundpath{
    \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
    \pgf@xa=\pgf@x \pgf@ya=\pgf@y
    \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
    \pgf@xb=\pgf@x \pgf@yb=\pgf@y
    % First line, simple
    \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
    \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
    % Advance to middle
    \pgfmathsetlength\pgf@xa{.5\pgf@xa+.5\pgf@xb}
    % Make smaller
    \pgfmathsetlength\pgf@yc{.16666\pgf@yb-.16666\pgf@ya}
    \advance\pgf@ya by\pgf@yc
    \advance\pgf@yb by-\pgf@yc
    \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
    \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
    % Make even smaller
    \advance\pgf@ya by\pgf@yc
    \advance\pgf@yb by-\pgf@yc
    \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
    \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
  }%
}%



%
% Battery, consisting of two parallel lines, one smaller than
% the other
%

\pgfdeclareshape{battery IEC}
{%
  \inheritsavedanchors[from=rectangle ee]%
  \inheritanchor[from=rectangle ee]{center}%
  \inheritanchor[from=rectangle ee]{north}%
  \inheritanchor[from=rectangle ee]{south}%
  \inheritanchor[from=rectangle ee]{east}%
  \inheritanchor[from=rectangle ee]{west}%
  \inheritanchor[from=rectangle ee]{north east}%
  \inheritanchor[from=rectangle ee]{north west}%
  \inheritanchor[from=rectangle ee]{south east}%
  \inheritanchor[from=rectangle ee]{south west}%
  \inheritanchor[from=rectangle ee]{input}%
  \inheritanchor[from=rectangle ee]{output}%
  \inheritanchorborder[from=rectangle ee]%

  \backgroundpath{
    \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
    \pgf@xa=\pgf@x \pgf@ya=\pgf@y
    \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
    \pgf@xb=\pgf@x \pgf@yb=\pgf@y
    % First line, simple
    \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
    \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
    % Make smaller
    \pgfmathsetlength\pgf@yc{.25\pgf@yb-.25\pgf@ya}
    \advance\pgf@ya by\pgf@yc
    \advance\pgf@yb by-\pgf@yc
    \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
    \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
  }%
}%


%
% Special diodes
%


\pgfdeclareshape{breakdown diode IEC}
{%
  \inheritsavedanchors[from=rectangle ee]%
  \inheritanchor[from=rectangle ee]{center}%
  \inheritanchor[from=rectangle ee]{north}%
  \inheritanchor[from=rectangle ee]{south}%
  \inheritanchor[from=rectangle ee]{east}%
  \inheritanchor[from=rectangle ee]{west}%
  \inheritanchor[from=rectangle ee]{north east}%
  \inheritanchor[from=rectangle ee]{north west}%
  \inheritanchor[from=rectangle ee]{south east}%
  \inheritanchor[from=rectangle ee]{south west}%
  \inheritanchor[from=rectangle ee]{input}%
  \inheritanchor[from=rectangle ee]{output}%
  \inheritanchorborder[from=rectangle ee]%

  \backgroundpath{
    \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
    \pgf@xa=\pgf@x \pgf@ya=\pgf@y
    \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
    \pgf@xb=\pgf@x \pgf@yb=\pgf@y
    \pgf@xc=.5\pgf@xa \advance\pgf@xc by.5\pgf@xb
    \pgf@yc=.5\pgf@ya
    \advance\pgf@yc by .5\pgf@yb
    % Triangles:
    \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
    \pgfpathlineto{\pgfqpoint{\pgf@xc}{\pgf@yc}}
    \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
    \pgfpathclose
    \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
    \pgfpathlineto{\pgfqpoint{\pgf@xc}{\pgf@yc}}
    \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
    \pgfpathclose
  }%


  \beforebackgroundpath{
    {
      \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
      \pgf@xa=\pgf@x \pgf@ya=\pgf@y
      \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
      \pgf@xb=\pgf@x \pgf@yb=\pgf@y
      \pgf@yc=.5\pgf@ya
      \advance\pgf@yc by.5\pgf@yb
      \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yc}}
      \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yc}}
      \pgfusepathqstroke
      \pgf@xc=.5\pgf@xa
      \advance\pgf@xc by.5\pgf@xb
      \pgftransformshift{\pgfqpoint{\pgf@xc}{\pgf@yc}}
      \pgf@yc=.5\pgf@yb
      \advance\pgf@yc by-.5\pgf@ya
      \pgftransformscale{\pgf@sys@tonumber{\pgf@yc}}
      \pgfpathmoveto{\pgfqpoint{-.5pt}{-1pt}}
      \pgfpathlineto{\pgfqpoint{0pt}{-1pt}}
      \pgfpathlineto{\pgfqpoint{0pt}{1pt}}
      \pgfpathlineto{\pgfqpoint{.5pt}{1pt}}
      \pgfusepathqstroke
    }
  }%
}%






% Generic shapes
%
% When these shapes are used, you can set a key derived form the
% shapes name to some code that will be executed as the before
% background path. This means that the basic shape is fixed, but
% things like a special line inside the shape or at the border can be
% added without having to define a whole new shape.


\pgfdeclareshape{generic circle IEC}
{%
  % This shape is a generic circle, to which you can add something to
  % the before background path using the key
  % /pgf/generic circle IEC/before background
  % When this key is invoked, the transformation matrix will have been
  % setup such that the circle's center is at the origin and that the
  % position \pgfpoint{1pt}{0pt} lies exactly on the top of the circle
  % (and, there, on the middle of the line).

  \inheritsavedanchors[from=circle ee]%
  \inheritanchorborder[from=circle ee]%
  \inheritanchor[from=circle ee]{north}%
  \inheritanchor[from=circle ee]{north west}%
  \inheritanchor[from=circle ee]{north east}%
  \inheritanchor[from=circle ee]{center}%
  \inheritanchor[from=circle ee]{west}%
  \inheritanchor[from=circle ee]{east}%
  \inheritanchor[from=circle ee]{south}%
  \inheritanchor[from=circle ee]{south west}%
  \inheritanchor[from=circle ee]{south east}%
  \inheritanchor[from=circle ee]{input}%
  \inheritanchor[from=circle ee]{output}%
  \inheritbackgroundpath[from=circle ee]%

  \beforebackgroundpath{
    {
      \centerpoint%
      \pgf@xc=\pgf@x%
      \pgf@yc=\pgf@y%
      \pgftransformshift{}
      \pgfutil@tempdima=\radius%
      \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
      \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
      \ifdim\pgf@xb<\pgf@yb%
        \advance\pgfutil@tempdima by-\pgf@yb%
      \else%
        \advance\pgfutil@tempdima by-\pgf@xb%
      \fi%
      \pgftransformscale{\pgf@sys@tonumber{\pgfutil@tempdima}}
      \pgfkeysvalueof{/pgf/generic circle IEC/before background}
    }
  }%
}%



%
% Generic diode, based on a rectangle
%

\pgfdeclareshape{generic diode IEC}
{%
  % This shape is a generic diode, to which you can add something to
  % the before background path using the key
  % /pgf/generic diode IEC/before background
  % When this key is invoked, the transformation matrix will have been
  % setup such that the center is at the tip of the diode. The
  % position \pgfpoint{1pt}{0pt} lies exactly on the top of the
  % (suggested) line before the diode.

  \inheritsavedanchors[from=rectangle ee]%
  \inheritanchor[from=rectangle ee]{center}%
  \inheritanchor[from=rectangle ee]{north}%
  \inheritanchor[from=rectangle ee]{south}%
  \inheritanchor[from=rectangle ee]{east}%
  \inheritanchor[from=rectangle ee]{west}%
  \inheritanchor[from=rectangle ee]{north east}%
  \inheritanchor[from=rectangle ee]{north west}%
  \inheritanchor[from=rectangle ee]{south east}%
  \inheritanchor[from=rectangle ee]{south west}%
  \inheritanchor[from=rectangle ee]{input}%
  \inheritanchor[from=rectangle ee]{output}%
  \inheritanchorborder[from=rectangle ee]%

  \backgroundpath{
    \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
    \pgf@xa=\pgf@x \pgf@ya=\pgf@y
    \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
    \pgf@xb=\pgf@x \pgf@yb=\pgf@y
    % Move tip back a little bit
    \advance\pgf@xb by-.5\pgflinewidth
    % Triangle triangle:
    \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
    \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
    \pgf@yc=.5\pgf@ya
    \advance\pgf@yc by .5\pgf@yb
    \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yc}}
    \pgfpathclose
  }%


  \beforebackgroundpath{
    {
      \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
      \pgf@xa=\pgf@x \pgf@ya=\pgf@y
      \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
      \pgf@xb=\pgf@x \pgf@yb=\pgf@y
      \pgf@yc=.5\pgf@ya
      \advance\pgf@yc by.5\pgf@yb
      \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yc}}
      \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yc}}
      \pgfusepathqstroke
      \pgftransformshift{\pgfqpoint{\pgf@xb}{\pgf@yc}}
      \pgf@yc=.5\pgf@yb
      \advance\pgf@yc by-.5\pgf@ya
      \pgftransformscale{\pgf@sys@tonumber{\pgf@yc}}
      \pgfkeysvalueof{/pgf/generic diode IEC/before background}
    }
  }%
}%


\pgfkeys{
  /pgf/generic circle IEC/before background/.initial=,
  /pgf/generic diode IEC/before background/.initial=,
}%





%
% Contacts
%

\pgfdeclareshape{make contact IEC}
{%
  \savedanchor\northeast{%
    \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
    \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
    \pgf@x=\pgf@xa%
    \advance\pgf@x by .5\pgf@xb%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
    \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
    \pgf@y=\pgf@ya%
    \advance\pgf@y by\pgf@yb%
  }%
  \savedanchor\southwest{%
    \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
    \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
    \pgf@x=-.5\pgf@xa%
    \advance\pgf@x by -.5\pgf@xb%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
    \pgf@y=-\pgf@ya%
  }%

  \anchor{center}{\pgfpointorigin}%
  \inheritanchor[from=rectangle ee]{north}%
  \inheritanchor[from=rectangle ee]{south}%
  \inheritanchor[from=rectangle ee]{east}%
  \inheritanchor[from=rectangle ee]{west}%
  \inheritanchor[from=rectangle ee]{north east}%
  \inheritanchor[from=rectangle ee]{north west}%
  \inheritanchor[from=rectangle ee]{south east}%
  \inheritanchor[from=rectangle ee]{south west}%
  \inheritanchor[from=rectangle ee]{input}%
  \inheritanchor[from=rectangle ee]{output}%

  \anchorborder{%
    \ifdim\pgf@y<0pt%
      % tricky... simplify to the origin...
      \pgf@xc=\pgf@x%
      \pgf@yc=\pgf@y%
      \pgf@process{\southwest}%
      \advance\pgf@y by-0.5pt%
      \pgf@xa=\pgf@x%
      \pgf@ya=\pgf@y%
      \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\pgfqpoint{-\pgf@xa}{-\pgf@ya}}}%
    \else%
      \pgf@xc=\pgf@x%
      \pgf@yc=\pgf@y%
      \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\northeast}}%
    \fi%
  }%

  \backgroundpath{
    \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
    \pgf@xa=-\pgf@x \pgf@ya=0pt
    \pgf@xb=\pgf@x \pgf@yb=\pgf@y
    % Start point
    \pgfpathmoveto{\pgfqpoint{\pgf@xa}{0pt}}
    \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
  }%
}%



%
% Contacts
%

\pgfdeclareshape{var make contact IEC}
{%
  \savedanchor\northeast{%
    \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
    \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
    \pgf@x=\pgf@xa%
    \advance\pgf@x by .5\pgf@xb%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
    \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
    \pgf@y=\pgf@ya%
    \advance\pgf@y by\pgf@yb%
  }%
  \savedanchor\southwest{%
    \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
    \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
    \pgf@x=-.5\pgf@xa%
    \advance\pgf@x by -.5\pgf@xb%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
    \pgf@y=-\pgf@ya%
    \pgf@xc=0.083333\pgf@x%
    \advance\pgf@y by\pgf@xc%
  }%

  \anchor{center}{\pgfpointorigin}%
  \inheritanchor[from=rectangle ee]{north}%
  \inheritanchor[from=rectangle ee]{south}%
  \inheritanchor[from=rectangle ee]{east}%
  \inheritanchor[from=rectangle ee]{west}%
  \inheritanchor[from=rectangle ee]{north east}%
  \inheritanchor[from=rectangle ee]{north west}%
  \inheritanchor[from=rectangle ee]{south east}%
  \inheritanchor[from=rectangle ee]{south west}%
  \inheritanchor[from=rectangle ee]{input}%
  \inheritanchor[from=rectangle ee]{output}%

  \anchorborder{%
    \ifdim\pgf@y<0pt%
      % tricky... simplify to the origin...
      \pgf@xc=\pgf@x%
      \pgf@yc=\pgf@y%
      \pgf@process{\southwest}%
      \pgf@xa=\pgf@x%
      \pgf@ya=\pgf@y%
      \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\pgfqpoint{-\pgf@xa}{-\pgf@ya}}}%
    \else%
      \pgf@xc=\pgf@x%
      \pgf@yc=\pgf@y%
      \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\northeast}}%
    \fi%
  }%

  \backgroundpath{
    \pgf@process{\pgfpointadd{\northeast}{
        \pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
    \pgf@xa=-\pgf@x \pgf@ya=0pt
    \pgf@xb=\pgf@x \pgf@yb=\pgf@y
    \pgf@xc=\pgf@xa
    \pgfutil@tempdima=2\pgf@xb%
    \pgfutil@tempdima=0.083333\pgfutil@tempdima%
    \advance\pgf@xa by \pgfutil@tempdima
    % Circle
    {\pgfpathcircle{\pgfqpoint{\pgf@xa}{0pt}}{\pgfutil@tempdima}}
    % Height
    % Start point
    \pgf@process{\pgfpointnormalised{\pgfpointdiff{\pgfqpoint{\pgf@xa}{0pt}}{\pgfqpoint{\pgf@xb}{\pgf@yb}}}}
    \pgf@xc=\pgf@x
    \pgf@yc=\pgf@y
    \pgfpathmoveto{\pgfpointadd{\pgfqpoint{\pgf@xa}{0pt}}{%
        \pgfpointscale{\pgfutil@tempdima}{\pgfqpoint{\pgf@xc}{\pgf@yc}}}}
    \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
  }%
}%



\pgfdeclareshape{break contact IEC}
{%
  \savedanchor\northeast{%
    \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
    \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
    \pgf@x=\pgf@xa%
    \advance\pgf@x by .5\pgf@xb%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
    \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
    \pgf@y=\pgf@ya%
    \advance\pgf@y by\pgf@yb%
  }%
  \savedanchor\southwest{%
    \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
    \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
    \pgf@x=-.5\pgf@xa%
    \advance\pgf@x by -.5\pgf@xb%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
    \pgf@y=-\pgf@ya%
  }%

  \anchor{center}{\pgfpointorigin}%
  \inheritanchor[from=rectangle ee]{north}%
  \inheritanchor[from=rectangle ee]{south}%
  \inheritanchor[from=rectangle ee]{east}%
  \inheritanchor[from=rectangle ee]{west}%
  \inheritanchor[from=rectangle ee]{north east}%
  \inheritanchor[from=rectangle ee]{north west}%
  \inheritanchor[from=rectangle ee]{south east}%
  \inheritanchor[from=rectangle ee]{south west}%
  \inheritanchor[from=rectangle ee]{input}%
  \inheritanchor[from=rectangle ee]{output}%

  \anchorborder{%
    \ifdim\pgf@y<0pt%
      % tricky... simplify to the origin...
      \pgf@xc=\pgf@x%
      \pgf@yc=\pgf@y%
      \pgf@process{\southwest}%
      \advance\pgf@y by-0.5pt%
      \pgf@xa=\pgf@x%
      \pgf@ya=\pgf@y%
      \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\pgfqpoint{-\pgf@xa}{-\pgf@ya}}}%
    \else%
      \pgf@xc=\pgf@x%
      \pgf@yc=\pgf@y%
      \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\northeast}}%
    \fi%
  }%

  \backgroundpath{
    \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
    \pgf@xa=-\pgf@x \pgf@ya=0pt
    \pgf@xb=\pgf@x \pgf@yb=\pgf@y
    % Start point
    \pgfpathmoveto{\pgfqpoint{\pgf@xa}{0pt}}
    \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
    % Break point
    \pgf@xc=.2\pgf@xb
    \advance\pgf@xc by-.2\pgf@xa
    \pgfpathmoveto{\pgfqpoint{\pgf@xb}{0pt}}
    \advance\pgf@xb by-\pgf@xc
    \pgfpathlineto{\pgfqpoint{\pgf@xb}{0pt}}
    \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
  }%
}%





\endinput