%% symbol library for TikZ track schematics
%
% Copyright (c) 2018 - 2022, Martin Scheidt (ISC license)
%
% Permission to use, copy, modify, and/or distribute this file for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
%
\ProvidesFileRCS{tikzlibrarytrackschematic.construction.code.tex}%
%
%%%%%%%%%%%%%%%
% global settings
%%%%%%%%%%%%%%%
\RequirePackage{tikz,etoolbox}%
\usetikzlibrary{calc}%
%
\ifdeflength{\objectlength}{}{% Not defined, so define it!
  \newlength{\objectlength}%
}%
\setlength{\objectlength}{4cm}%
%
%%%%%%%%%%%%%%%
% tikz keys for multiple use
%%%%%%%%%%%%%%%
\pgfkeys{%
  /tikz/trackschematic/.is family,%
  /tikz/trackschematic/.cd,%
  %% length
  length/.store in=\objectlength,% default length 4cm
  /tikz/length/.forward to=/tikz/trackschematic/length,%
  %% traffic practice
  traffic practice/.value required,% left OR right
  traffic practice/.store in=\trafficpractice,%
  traffic practice=right,% DEFAULT
  /tikz/traffic practice/.forward to=/tikz/trackschematic/traffic practice,%
  /tikz/position/.forward to=/tikz/trackschematic/traffic practice,%
}%
\newlength{\objectwidth}\setlength{\objectwidth}{0.5cm}%
\pgfkeys{%
  /tikz/trackschematic/constructions/.is family,%
  /tikz/trackschematic/constructions/.cd,%
  %% side
  side/.value required,% left, right OR both
  side/.store in=\side,% left, right OR both
  side=right,% DEFAULT
  /tikz/side/.forward to=/tikz/trackschematic/constructions/side,%
  %% width
  width/.store in=\objectwidth,% default width 0.5cm
  /tikz/width/.forward to=/tikz/trackschematic/constructions/width,%
}%
%
%%%%%%%%%%%%%%%
% symbol platform
%%%%%%%%%%%%%%%
%
%% command
\newcommand\platform{}% just for safety
\def\platform[#1]#2(#3){% \platform[options] at (coord);
  \pic[#1] at (#3) {platform={#2}}% symbol
}%
%% symbol definition
\tikzset{%
  pics/platform/.default=,%
  pics/platform/.style args={#1}{code={%
    %% settings
    \def\coordcommand{#1}% beware of leading and tailing spaces!
    %
    \ifdefstring{\side}{left}{% side
      \pgfmathsetmacro{\sidefactor}{1}%
    }{%
      \ifdefstring{\side}{right}{% side
        \pgfmathsetmacro{\sidefactor}{-1}%
      }{%
        \ifdefstring{\side}{both}{% side
        }{% error message
          \pgfkeys{/errors/unknown choice value={/tikz/trackschematic/constructions/side}{“left“, “right“ OR “both“ as key required}}%
        }%
      }%
    }% end \ifdefstring{\side}
    %% platform shape
    \tikzset{every path/.style={draw=foreground,line width=0.75pt}};%
    \ifdefstring{\side}{both}{% double side
      \path ($-0.5*(\objectlength,0) + (0, \objectwidth)$) --%
            ($-0.5*(\objectlength,0) + (0, 0.2)$) --%
            ($ 0.5*(\objectlength,0) + (0, 0.2)$) --%
            ($ 0.5*(\objectlength,0) + (0, \objectwidth)$);% part 1
      \path ($-0.5*(\objectlength,0) + (0, 0.3)$) --%
            ($ 0.5*(\objectlength,0) + (0, 0.3)$);% part 2
      \path ($-0.5*(\objectlength,0) + (0,-\objectwidth)$) --%
            ($-0.5*(\objectlength,0) + (0,-0.2)$) --%
            ($ 0.5*(\objectlength,0) + (0,-0.2)$) --%
            ($ 0.5*(\objectlength,0) + (0,-\objectwidth)$);% part 3
      \path ($-0.5*(\objectlength,0) + (0,-0.3)$) --%
            ($ 0.5*(\objectlength,0) + (0,-0.3)$);% part 4
    }{% single side
      \path ($-0.5*(\objectlength,0) + \sidefactor*(0,\objectwidth)$) --%
            ($-0.5*(\objectlength,0) + \sidefactor*(0,0.2)$) --%
            ($ 0.5*(\objectlength,0) + \sidefactor*(0,0.2)$) --%
            ($ 0.5*(\objectlength,0) + \sidefactor*(0,\objectwidth)$);% part 1
      \path ($-0.5*(\objectlength,0) + \sidefactor*(0,0.3)$) --%
            ($ 0.5*(\objectlength,0) + \sidefactor*(0,0.3)$);% part 2
    }%
  }},% END pics/platform/.style args={#1}
  % symbology entry
  symbology_platform/.pic = {%
    \maintrack (0,0) -- (6,0);%
    \platform[side=left] at (3,0);%
  },%
}%
%
%%%%%%%%%%%%%%%
% symbol level crossing
%%%%%%%%%%%%%%%
%
%% command
\newcommand\levelcrossing{}% just for safety
\def\levelcrossing[#1]#2(#3){% \levelcrossing[options] at (coord);
  \pic[side=both,#1] at (#3) {level_crossing={#2}}% symbol
}%
%% tikz keys
\newlength{\roadwidth}\setlength{\roadwidth}{0.4cm}%
\newtoggle{show_road}\settoggle{show_road}{true}%
\pgfkeys{%
  /tikz/trackschematic/constructions/level crossing/.is family,%
  /tikz/trackschematic/constructions/level crossing/.cd,%
  %% barrier
  barrier/.store in=\barrier,% full, semi OR none
  barrier=none,% DEFAULT
  /tikz/barrier/.forward to=/tikz/trackschematic/constructions/level crossing/barrier,%
  /tikz/barrier side/.forward to=/tikz/trackschematic/constructions/side,%
  %% show road
  no road/.value forbidden,%
  no road/.code={\settoggle{show_road}{false}},%
  /tikz/no road/.forward to=/tikz/trackschematic/constructions/level crossing/no road,%
  %% road width
  road width/.store in=\roadwidth,% default width 0.4cm
  /tikz/road width/.forward to=/tikz/trackschematic/constructions/level crossing/road width,%
}%
%% symbol definition
\tikzset{%
  pics/level_crossing/.default=,%
  pics/level_crossing/.style args={#1}{code={%
    %% settings
    \def\coordcommand{#1} % beware of leading and tailing spaces!
    %% traffic practice setup
    \ifdefstring{\trafficpractice}{left}{% branch
      \pgfmathsetmacro{\trafficfactor}{-1}%
    }{%
      \ifdefstring{\trafficpractice}{right}{% branch
        \pgfmathsetmacro{\trafficfactor}{1}%
      }{% error message
        \pgfkeys{/errors/unknown choice value={/tikz/trackschematic/trafficcontrol/traffic practice}{“left“ OR “right“ as key required}}%
      }%
    }% end \ifdefstring{\trafficpractice}
    %% symbol
    \tikzset{every path/.style={draw=foreground,line width=1pt}};%
    \iftoggle{show_road}{% true
      \path ($0.5*(-\roadwidth,0) + (0,-0.1)$) --%
            ++($(0,-\objectwidth)$);% road part 1
      \path ($0.5*( \roadwidth,0) + (0,-0.1)$) --%
            ++($(0,-\objectwidth)$);% road part 2
      \path ($0.5*(-\roadwidth,0) + (0, 0.1)$) --%
            ++($(0, \objectwidth)$);% road part 3
      \path ($0.5*( \roadwidth,0) + (0, 0.1)$) --%
            ++($(0, \objectwidth)$);% road part 4
    }{}% END \iftoggle{show_road}
    \ifdefstring{\barrier}{full}{% full barrier
      \ifdefstring{\side}{both}{%
        \filldraw[foreground]% left barrier part 1
          ($(-0.5\roadwidth,0)+(-0.2,0)+(0,0.35)$) circle (0.05);%
        \filldraw[foreground]% left barrier part 2
          ($( 0.5\roadwidth,0)+( 0.2,0)+(0,0.35)$) circle (0.05);%
        \path ($(-0.5\roadwidth,0)+(-0.2,0)+(0,0.35)$) --%
              ++($( 0.45\roadwidth,0)+( 0.2,0)$);% left barrier part 3
        \path ($( 0.5\roadwidth,0)+( 0.2,0)+(0,0.35)$) --%
              ++($(-0.45\roadwidth,0)+(-0.2,0)$);% left barrier part 4
        %
        \filldraw[foreground]% right barrier part 1
          ($( 0.5\roadwidth,0)+( 0.2,0)+(0,-0.35)$) circle (0.05);%
        \filldraw[foreground]% right barrier part 2
          ($(-0.5\roadwidth,0)+(-0.2,0)+(0,-0.35)$) circle (0.05);%
        \path ($( 0.5\roadwidth,0)+( 0.2,0)+(0,-0.35)$) --%
              ++($(-0.45\roadwidth,0)+(-0.2,0)$);% right barrier part 3
        \path ($(-0.5\roadwidth,0)+(-0.2,0)+(0,-0.35)$) --%
              ++($( 0.45\roadwidth,0)+( 0.2,0)$);% right barrier part 4
      }{%
        \ifdefstring{\side}{left}{%
          \filldraw[foreground]% left barrier part 1
            ($(-0.5\roadwidth,0)+(-0.2,0)+(0,0.35)$) circle (0.05);%
          \filldraw[foreground]% left barrier part 2
            ($( 0.5\roadwidth,0)+( 0.2,0)+(0,0.35)$) circle (0.05);%
          \path ($(-0.5\roadwidth,0)+(-0.2,0)+(0,0.35)$) --%
                ++($( 0.45\roadwidth,0)+( 0.2,0)$);% left barrier part 3
          \path ($( 0.5\roadwidth,0)+( 0.2,0)+(0,0.35)$) --%
                ++($(-0.45\roadwidth,0)+(-0.2,0)$);% left barrier part 4
        }{%
          \ifdefstring{\side}{right}{%
            \filldraw[foreground]% right barrier part 1
              ($( 0.5\roadwidth,0)+( 0.2,0)+(0,-0.35)$) circle (0.05);%
            \filldraw[foreground]% right barrier part 2
              ($(-0.5\roadwidth,0)+(-0.2,0)+(0,-0.35)$) circle (0.05);%
            \path ($( 0.5\roadwidth,0)+( 0.2,0)+(0,-0.35)$) --%
                  ++($(-0.45\roadwidth,0)+(-0.2,0)$);% right barrier part 3
            \path ($(-0.5\roadwidth,0)+(-0.2,0)+(0,-0.35)$) --%
                  ++($( 0.45\roadwidth,0)+( 0.2,0)$);% right barrier part 4
          }{%% error message
            \pgfkeys{/errors/unknown choice value={/tikz/trackschematic/constructions/side}{“left“, “right“ OR “both“ as key required}}%
          }% END \ifdefstring{\side}{right}
        }% END \ifdefstring{\side}{left}
      }% END \ifdefstring{\side}{both}
    }{%
      \ifdefstring{\barrier}{semi}{% semi barrier
        \ifdefstring{\side}{both}{%
          \filldraw[foreground]% left barrier part 1
            ($\trafficfactor*(-0.5\roadwidth,0)+\trafficfactor*(-0.2,0)+(0,0.35)$) circle (0.05);%
          \path ($\trafficfactor*(-0.5\roadwidth,0)+\trafficfactor*(-0.2,0)+(0,0.35)$) --%
                ++($\trafficfactor*(0.5\roadwidth,0)+\trafficfactor*(0.2,0)$);% left barrier part 2
          %
          \filldraw[foreground]% right barrier part 1
            ($\trafficfactor*(0.5\roadwidth,0)+\trafficfactor*(0.2,0)+(0,-0.35)$) circle (0.05);%
          \path ($\trafficfactor*(0.5\roadwidth,0)+\trafficfactor*(0.2,0)+(0,-0.35)$) --%
                ++($\trafficfactor*(-0.5\roadwidth,0)+\trafficfactor*(-0.2,0)$);% right barrier part 2
        }{%
          \ifdefstring{\side}{left}{%
            \filldraw[foreground]% left barrier part 1
              ($\trafficfactor*(-0.5\roadwidth,0)+\trafficfactor*(-0.2,0)+(0,0.35)$) circle (0.05);%
            \path ($\trafficfactor*(-0.5\roadwidth,0)+\trafficfactor*(-0.2,0)+(0,0.35)$) --%
                  ++($\trafficfactor*(0.5\roadwidth,0)+\trafficfactor*(0.2,0)$);% left barrier part 2
          }{%
            \ifdefstring{\side}{right}{%
              \filldraw[foreground]% right barrier part 1
                ($\trafficfactor*(0.5\roadwidth,0)+\trafficfactor*(0.2,0)+(0,-0.35)$) circle (0.05);%
              \path ($\trafficfactor*(0.5\roadwidth,0)+\trafficfactor*(0.2,0)+(0,-0.35)$) --%
                    ++($\trafficfactor*(-0.5\roadwidth,0)+\trafficfactor*(-0.2,0)$);% right barrier part 2
            }{%% error message
              \pgfkeys{/errors/unknown choice value={/tikz/trackschematic/constructions/side}{“left“, “right“ OR “both“ as key required}}%
            }% END \ifdefstring{\side}{right}
          }% END \ifdefstring{\side}{left}
        }% END \ifdefstring{\side}{both}
      }{%
        \ifdefstring{\barrier}{none}{% no barriers
        }{% error message
          \pgfkeys{/errors/unknown choice value={/tikz/trackschematic/constructions/level crossing/barrier}{“full“, “semi“ OR “none“ as key required}}%
        }%
      }% END \ifdefstring{\barrier}{semi}
    }% END \ifdefstring{\barrier}{full}
  }},% END pics/level_crossing/.style args={#1}
  % symbology entry
  symbology_level_crossing/.pic = {%
    \maintrack (0,0) -- (6,0);%
    \levelcrossing[barrier=semi] at (3,0);%
  },%
}%
%
%%%%%%%%%%%%%%%
% symbol bridge
%%%%%%%%%%%%%%%
%
%% command
\newcommand\bridge{}% just for safety
\def\bridge[#1]#2(#3){% \bridge[options] at (coord);
  \pic[side=both,#1] at (#3) {bridge={#2}}% symbol
}%
\newlength{\shiftleft}\setlength{\shiftleft}{0cm}%
\newlength{\shiftright}\setlength{\shiftright}{0cm}%
\newtoggle{show_background}\settoggle{show_background}{true}%
%% tikz keys
\pgfkeys{%
  /tikz/trackschematic/constructions/bridge/.is family,%
  /tikz/trackschematic/constructions/bridge/.cd,%
  % shift
  shift left/.store in=\shiftleft,% default shift 0cm
  /tikz/shift left/.forward to=/tikz/trackschematic/constructions/bridge/shift left,%
  shift right/.store in=\shiftright,% default shift 0cm
  /tikz/shift right/.forward to=/tikz/trackschematic/constructions/bridge/shift right,%
  %% show road
  no background/.value forbidden,%
  no background/.code={\settoggle{show_background}{false}},%
  /tikz/no background/.forward to=/tikz/trackschematic/constructions/bridge/no background,%
}%
%% symbol definition
\tikzset{%
  pics/bridge/.default=,%
  pics/bridge/.style args={#1}{code={%
    %% settings
    \def\coordcommand{#1} % beware of leading and tailing spaces!
    %% symbol
    \iftoggle{show_background}{% true
      \fill[background]%
        ($(-0.5\objectlength,\objectwidth)+(0,-0.1)$) rectangle%
        ($(0.5\objectlength,-\objectwidth)+(0,0.1)$);%
    }{}%
    \tikzset{every path/.style={draw=foreground,line width=0.75pt}};%
    \ifdefstring{\side}{both}{%
      \path ($-0.5*(\objectlength,0)+(-0.1,0)+(\shiftleft,\objectwidth)$) --%
            ++($(0.1,-0.1)$) --%
            ++($(\objectlength,0)$) --%
            ++($(0.1,0.1)$);% left bridge
      \path ($-0.5*(\objectlength,0)+(-0.1,0)+(\shiftright,-\objectwidth)$) --%
            ++($(0.1,0.1)$) --%
            ++($(\objectlength,0)$) --%
            ++($(0.1,-0.1)$);% right bridge
    }{%
      \ifdefstring{\side}{left}{%
        \path ($-0.5*(\objectlength,0)+(-0.1,0)+(\shiftleft,\objectwidth)$) --%
              ++($(0.1,-0.1)$) --%
              ++($(\objectlength,0)$) --%
              ++($(0.1,0.1)$);% left bridge
      }{%
        \ifdefstring{\side}{right}{%
          \path ($-0.5*(\objectlength,0)+(-0.1,0)+(\shiftright,-\objectwidth)$) --%
                ++($(0.1,0.1)$) --%
                ++($(\objectlength,0)$) --%
                ++($(0.1,-0.1)$);% right bridge
        }{%% error message
          \pgfkeys{/errors/unknown choice value={/tikz/trackschematic/constructions/side}{“left“, “right“ OR “both“ as key required}}%
        }% END \ifdefstring{\side}{right}
      }% END \ifdefstring{\side}{left}
    }% END \ifdefstring{\side}{both}
  }},% END pics/bridge/.style args={#1}
  % symbology entry
  symbology_bridge/.pic = {%
    \bridge[] at (3,0);% first
    \maintrack (0,0) -- (6,0);%% secound
  },%
}%
%
%%%%%%%%%%%%%%%
% symbol interlocking
%%%%%%%%%%%%%%%
%
%% command
\newcommand\interlocking{}% just for safety
\def\interlocking#1(#2){% \interlocking at (coord);
  \pic at (#2) {interlocking={#1}}% symbol
}%
%% tikz keys
% \pgfkeys{%
%   /tikz/trackschematic/.is family,%
%   /tikz/trackschematic/.cd,%
% }%
%% symbol definition
\tikzset{%
  pics/interlocking/.default=,%
  pics/interlocking/.style args={#1}{code={%
    %% settings
    \def\coordcommand{#1} % beware of leading and tailing spaces!
    %% symbol
    \tikzset{every path/.style={draw=foreground,line width=1pt}};%
    \path (-0.6,-0.4 ) rectangle ++(1.2,0.8); % building
    \path[fill=foreground] (-0.5,-0.3 ) rectangle ++(1.0,0.2); % table
    \path[fill=foreground] ( 0  , 0.15) circle      (0.15); % human dot
  }},% END pics/interlocking/.style args={#1}
  % symbology entry
  symbology_interlocking/.pic = {
    \interlocking at (3,0);%
  },%
}%
%
%%%%%%%%%%%%%%%
% symbol hump
%%%%%%%%%%%%%%%
%
%% command
\newcommand\hump{}% just for safety
\def\hump#1(#2){% \hump at (coord);
  \pic at (#2) {hump={#1}}% symbol
}%
%% tikz keys
% \pgfkeys{%
%   /tikz/trackschematic/.is family,%
%   /tikz/trackschematic/.cd,%
% }%
%% symbol definition
\tikzset{%
  pics/hump/.default=,%
  pics/hump/.style args={#1}{code={%
    %% settings
    \def\coordcommand{#1} % beware of leading and tailing spaces!
    %% symbol
    \tikzset{every path/.style={draw=foreground,line width=0.75pt}};%
    % left side
    \path (-0.3, 0.1) -- ++(0,0.05);
    \path (-0.2, 0.1) -- ++(0,0.15);
    \path (-0.1, 0.1) -- ++(0,0.25);
    \path ( 0.0, 0.1) -- ++(0,0.35);
    \path ( 0.1, 0.1) -- ++(0,0.25);
    \path ( 0.2, 0.1) -- ++(0,0.15);
    \path ( 0.3, 0.1) -- ++(0,0.05);
    % right side
    \path (-0.3,-0.1) -- ++(0,-0.05);
    \path (-0.2,-0.1) -- ++(0,-0.15);
    \path (-0.1,-0.1) -- ++(0,-0.25);
    \path ( 0.0,-0.1) -- ++(0,-0.35);
    \path ( 0.1,-0.1) -- ++(0,-0.25);
    \path ( 0.2,-0.1) -- ++(0,-0.15);
    \path ( 0.3,-0.1) -- ++(0,-0.05);
  }},% END pics/hump/.style args={#1}
  % symbology entry
  symbology_hump/.pic = {%
    \secondarytrack (0,0) -- (6,0);%
    \hump at (3,0);%
  },%
}%
%
%
%%%%%%%%%%%%%%%
% symbol pylon
%%%%%%%%%%%%%%%
%
%% command
\newcommand\pylon{}% just for safety
\def\pylon[#1]#2(#3){% \pylon[options] at (coord);
  \pic[#1] at (#3) {pylon={#2}}% symbol
}%
%% symbol definition
\tikzset{%
  pics/pylon/.default=,%
  pics/pylon/.style args={#1}{code={%
    %% settings
    \def\coordcommand{#1}% beware of leading and tailing spaces!
    %
    \ifdefstring{\side}{left}{% side
      \pgfmathsetmacro{\sidefactor}{1}%
    }{%
      \ifdefstring{\side}{right}{% side
        \pgfmathsetmacro{\sidefactor}{-1}%
      }{%
        \ifdefstring{\side}{both}{% side
        }{% error message
          \pgfkeys{/errors/unknown choice value={/tikz/trackschematic/constructions/side}{“left“, “right“ OR “both“ as key required}}%
        }%
      }%
    }% end \ifdefstring{\side}
    %% pylon shape
    \tikzset{every path/.style={draw=foreground,line width=0.5pt}};%
    \ifdefstring{\side}{both}{% double side
      \path (0,-0.5) circle [radius=0.075];% part 1
      \path (0, 0.5) circle [radius=0.075];% part 2
      \path (0,-0.425) -- (0, 0.425);% part 3
    }{% single side
      \path ($\sidefactor*(0,0.5)$) circle [radius=0.075];% part 1
      \path ($\sidefactor*(0,0.425)$) -- ++($\sidefactor*(0,-0.7)$);% part 2
    }%
  }},% END pics/pylon/.style args={#1}
  % symbology entry
  symbology_pylon/.pic = {%
    \maintrack (0,0) -- (6,0);%
    \pylon[side=left] at (1,0);%
    \pylon[side=left] at (3,0);%
    \pylon[side=left] at (5,0);%
  },%
}%
%
%%%%%%%%%%%%%%%
\endinput%
%