% ********************************************************************************
% Creates a therion protractor of set size and scale
% ********************************************************************************

\documentclass[12pt,border=0pt]{standalone}

% packages
\usepackage{tikz}
\usepackage[outline]{contour}

\begin{document}
\begin{tikzpicture}[scale=1]

\contourlength{1.2pt}

% ********************************************************************************
% Set the coordinates and dimensions to draw from
% ********************************************************************************

% Origin
\coordinate (O) at (0,0);

% Size and scale of the protractor
\pgfmathsetmacro{\scaleto}{250}			% 1:scaleto
\pgfmathsetmacro{\radius}{10}			% size in meters
\pgfmathsetmacro{\majordivision}{1}		% size in meters
\pgfmathsetmacro{\minordivision}{0.5}	% size in meters

% Size of the text numbers
\newcommand{\textsize}{\tiny}

% Intrinisc dimensions and conversion factors
\pgfmathsetmacro{\convert}{100}			% conversion from meters to centimeters
\pgfmathsetmacro{\mintick}{0.1}			% size in centimeters
\pgfmathsetmacro{\majtick}{0.2}			% size in centimeters
\pgfmathsetmacro{\minradii}{0.5}		% fractional radius where dotted radial lines start
\pgfmathsetmacro{\minradiiend}{1-\minradii}	% remainder

% Size and scale of the drawing
\pgfmathsetmacro{\rad}{\radius*\convert/\scaleto}
\pgfmathsetmacro{\majdiv}{\majordivision*\convert/\scaleto}
\pgfmathsetmacro{\mindiv}{\minordivision*\convert/\scaleto}

% Slightly reduced radii for the scale bar
\pgfmathsetmacro{\radscale}{\rad-\mindiv}


% ********************************************************************************
% Draw the foreshortening lines
% ********************************************************************************

% Vertical lines
\foreach \var in {0,\mindiv,...,\radscale}
{
	\draw[gray] (O) ++ (\var,0) -- ++ (0,\rad);
	\draw[gray] (O) ++ (-\var,0) -- ++ (0,\rad);
}

% White out the excess length
\draw[thick,white,fill=white] (O) ++ (\rad,0) arc(0:180:\rad) -- ++ (0,\rad) -- ++ (2*\rad,0) -- cycle;


% ********************************************************************************
% Draw the circumcircles
% ********************************************************************************

\foreach \var in {0,\mindiv,...,\rad}
{
	\draw[gray] (O) ++ (\var,0) arc (0:180:\var);
}


% ********************************************************************************
% Draw the radii
% ********************************************************************************

\foreach \theta in {10,40,...,160}
{
	\draw[red] (O) ++ (\theta:\mindiv) -- ++ (\theta:\radscale);
}

\foreach \theta in {20,50,...,170}
{
	\draw[blue] (O) ++ (\theta:\mindiv) -- ++ (\theta:\radscale);
}

\foreach \theta in {30,60,...,150}
{
	\draw[black] (O) ++ (\theta:\mindiv) -- ++ (\theta:\radscale);
}

\foreach \theta in {5,15,...,175}
{
	\draw[black,dotted] (O) ++ (\theta:\minradii*\rad) -- ++ (\theta:\minradiiend*\rad);
}


% ********************************************************************************
% Draw the angular scale
% ********************************************************************************

\foreach \theta in {1,2,...,179}
{
	\draw[black,thick] (O) ++ (\theta:\rad) -- ++ (\theta:-\mintick);
}

\foreach \theta in {5,10,...,175}
{
	\draw[black,thick] (O) ++ (\theta:\rad) -- ++ (\theta:-\majtick);
}


% ********************************************************************************
% Draw the linear scale
% ********************************************************************************


\foreach \var in {0,\mindiv,...,\radscale}
{
	\draw[black,thick] (O) ++ (\var,0) -- ++ (0,\mintick);
	\draw[black,thick] (O) ++ (-\var,0) -- ++ (0,\mintick);
}



% ********************************************************************************
% Draw the outline
% ********************************************************************************

\draw[black,thick] (O) ++ (\rad,0) arc (0:180:\rad) -- cycle;
\draw[black,thick] (O) -- ++ (0,\majtick);


% ********************************************************************************
% Draw the angle numbers
% ********************************************************************************

\foreach \theta in {10,20,...,80}
{
	\pgfmathsetmacro{\thetaopposite}{\theta+180}
	
	\draw[black] (O) ++ (\theta:\rad) -- ++ (\theta:-\majtick) node[anchor=south,near start,sloped,rotate=90,text=black] {
		\textsize
		\begin{tabular}{c}
			\contour{white}{\pgfmathprintnumber{\theta}}\\
			\contour{white}{\pgfmathprintnumber{\thetaopposite}}
		\end{tabular}
	};
}

\foreach \theta in {90,100,...,170}
{
	\pgfmathsetmacro{\thetaopposite}{\theta+180}
	
	\draw[black] (O) ++ (\theta:\rad) -- ++ (\theta:-\majtick) node[anchor=south,near start,sloped,rotate=-90,text=black] {
		\textsize
		\begin{tabular}{c}
			\contour{white}{\pgfmathprintnumber{\theta}}\\
			\contour{white}{\pgfmathprintnumber{\thetaopposite}}
		\end{tabular}
	};
};


% ********************************************************************************
% Draw the linear numbers
% ********************************************************************************

\pgfmathsetmacro{\labmax}{\radius-\majordivision}
\pgfmathsetmacro{\labsecond}{\majordivision+\majordivision}

\foreach \var in {\majordivision,\labsecond,...,\labmax}
{
	\pgfmathsetmacro{\varpos}{\var*\convert/\scaleto}
	
	\draw[black,thick] (O) ++ (\varpos,0) -- ++ (0,\mintick) node [above=-2pt] {\contour{white}{\textsize\pgfmathprintnumber{\var}}};
	\draw[black,thick] (O) ++ (-\varpos,0) -- ++ (0,\mintick) node [above=-2pt] {\contour{white}{\textsize\pgfmathprintnumber{\var}}};
}


% ********************************************************************************
% Draw the scale number
% ********************************************************************************

\draw[black] (O) ++ (0,\rad/3) -- ++ (0,\rad/3) node [midway,anchor=center,sloped,text=black] {\contour{white}{\textsize $1$:\pgfmathprintnumber{\scaleto}}};


\end{tikzpicture}
\end{document}