tikz-trackschematic/src/tikzlibrarytrackschematic.c...

463 lines
18 KiB
TeX

%% 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,%
%% color foreground
foreground/.store in=\foreground,%
foreground=black,% DEFAULT
/tikz/foreground/.forward to=/tikz/trackschematic/foreground,%
%% color background
background/.store in=\background,%
background=white,% DEFAULT
/tikz/background/.forward to=/tikz/trackschematic/background,%
%% 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%
%