
\chapter{Image-to-gcode: Milling {}``depth maps''}

\begin{center}
\includegraphics[width=1\textwidth]{gui/image-to-gcode}
\par\end{center}


\section{What is a depth map?}

A depth map is a greyscale image where the brightness of each pixel
corresponds to the depth (or height) of the object at each point.


\section{Integrating image-to-gcode with the AXIS user interface}

Add the following lines to the \texttt{{[}FILTER{]}} section of your
.ini file to make AXIS automatically invoke image-to-gcode when you
open a .png, .gif, or .jpg image:
\begin{quote}
PROGRAM\_EXTENSION = .png,.gif,.jpg Grayscale Depth Image\\
png = image-to-gcode\\
gif = image-to-gcode\\
jpg = image-to-gcode
\end{quote}
The standard \texttt{sim/axis.ini} configuration file is already configured
this way.


\section{Using image-to-gcode}

Start image-to-gcode either by opening an image file in AXIS, or by
invoking image-to-gcode from the terminal, as follows:
\begin{quote}
image-to-gcode torus.png > torus.ngc
\end{quote}
Verify all the settings in the right-hand column, then press OK to
create the gcode. Depending on the image size and options chosen,
this may take from a few seconds to a few minutes. If you are loading
the image in AXIS, the gcode will automatically be loaded and previewed
once image-to-gcode completes. In AXIS, hitting reload will show the
image-to-gcode option screen again, allowing you to tweak them.


\section{Option Reference}


\subsection{Units}

Specifies whether to use G20 (inches) or G21 (mm) in the generated
g-code and as the units for each option labeled \textbf{(units)}.


\subsection{Invert Image}

If {}``no'', the black pixel is the lowest point and the white pixel
is the highest point. If {}``yes'', the black pixel is the highest
point and the white pixel is the lowest point.


\subsection{Normalize Image}

If {}``yes'', the darkest pixel is remapped to black, the lightest
pixel is remapped to white.


\subsection{Expand Image Border}

If {}``None'', the input image is used as-is, and details which
are at the very edges of the image may be cut off. If {}``White''
or {}``Black'', then a border of pixels equal to the tool diameter
is added on all sides, and details which are at the very edges of
the images will not be cut off.


\subsection{Tolerance (units)}

When a series of points are within \textbf{tolerance} of being a straight
line, they are output as a straight line. Increasing tolerance can
lead to better contouring performance in emc, but can also remove
or blur small details in the image.


\subsection{Pixel Size (units)}

One pixel in the input image will be this many units--usually this
number is much smaller than 1.0. For instance, to mill a 2.5x2.5-inch
object from a 400x400 image file, use a pixel size of .00625, because
2.5 / 400 = .00625.


\subsection{Plunge Feed Rate (units per minute)}

The feed rate for the initial plunge movement


\subsection{Feed Rate (units per minute)}

The feed rate for other parts of the path


\subsection{Spindle Speed (RPM)}


\subsection{Scan Pattern}

Possible scan patterns are:
\begin{itemize}
\item Rows
\item Columns
\item Rows, then Columns
\item Columns, then Rows
\end{itemize}

\subsection{Scan Direction}

Possible scan directions are:
\begin{itemize}
\item Positive: Start milling at a low X or Y axis value, and move towards
a high X or Y axis value
\item Negative: Start milling at a high X or Y axis value, and move towards
a low X or Y axis value
\item Alternating: Start on the same end of the X or Y axis travel that
the last move ended on. This reduces the amount of traverse movements
\item Up Milling: Start milling at low points, moving towards high points
\item Down Milling: Start milling at high points, moving towards low points
\end{itemize}

\subsection{Depth (units)}

The top of material is always at \textbf{Z=0}. The deepest cut into
the material is \textbf{Z=-depth.}


\subsection{Step Over (pixels)}

The distance between adjacent rows or columns. To find the number
of pixels for a given units distance, compute \textbf{distance/pixel
size} and round to the nearest whole number\textbf{\emph{.}} For example,
if \textbf{pixel size=.006} and the desired step over \textbf{distance=.015},
then use a Step Over of 2 or 3 pixels, because \textbf{.015/.006=2.5}\textbf{\emph{.}}


\subsection{Tool Diameter}

The diameter of the cutting part of the tool.


\subsection{Safety Height}

The height to move to for traverse movements. image-to-gcode always
assumes the top of material is at \textbf{Z=0}.


\subsection{Tool Type}

The shape of the cutting part of the tool. Possible tool shapes are:
\begin{itemize}
\item Ball End
\item Flat End
\item 45 degree {}``vee''
\item 60 degree {}``vee''
\end{itemize}

\subsection{Lace bounding}

This controls whether areas that are relatively flat along a row or
column are skipped. This option only makes sense when both rows and
columns are being milled. Possible bounding options are:
\begin{itemize}
\item None: Rows and columns are both fully milled.
\item Secondary: When milling in the second direction, areas that do not
strongly slope in that direction are skipped.
\item Full: When milling in the first direction, areas that strongly slope
in the second direction are skipped. When milling in the second direction,
areas that do not strongly slope in that direction are skipped.
\end{itemize}

\subsection{Contact angle}

When \textbf{Lace bounding} is not None, slopes greater than \textbf{Contact
angle} are considered to be {}``strong'' slopes, and slopes less
than that angle are considered to be weak slopes.


\subsection{Roughing offset and depth per pass}

Image-to-gcode can optionally perform rouging passes. The depth of
successive roughing passes is given by {}``Roughing depth per pass''.
For instance, entering 0.2 will perform the first roughing pass with
a depth of 0.2, the second roughing pass with a depth of 0.4, and
so on until the full Depth of the image is reached. No part of any
roughing pass will cut closer than Roughing Offset to the final part.
Figure \ref{cap:Roughing-passes-and} shows a tall vertical feature
being milled. In this image, Roughing depth per pass is 0.2 inches
and roughing offset is 0.1 inches.

%
\begin{figure}[H]
\caption{Roughing passes and final pass\label{cap:Roughing-passes-and}}


\centering{}\includegraphics{gui/i2g-roughing}
\end{figure}

