Haskell SVG to G-code converter that aims to support most SVG features. The flavor of the generated G-Code can be influenced providing a configuration file. Juicy-gcode, in contrast to most SVG to G-Code converters, approximates bezier curves with biarcs instead of line segments that results in much better curve fit.
The easiest way is to download one of the pre-built binaries from the releases page. Alternatively, you can build from source code as follows:
- Install Stack if you do not have it yet
$ git clone https://github.com/domoszlai/juicy-gcode.git
$ stack build
$ stack install
$ juicy-gcode --help
juicy-gcode - The SVG to G-Code converter
Usage: juicy-gcode.exe SVGFILE [-f|--flavor CONFIGFILE] [-o|--output OUTPUTFILE]
[-d|--dpi DPI]
Convert SVGFILE to G-Code
Available options:
-h,--help Show this help text
SVGFILE The SVG file to be converted
-f,--flavor CONFIGFILE Configuration of G-Code flavor
-o,--output OUTPUTFILE The output G-Code file (default is standard output)
-d,--dpi DPI Density of the SVG file (default is 72 DPI)
The default G-Code flavor configuration file is the following:
gcode
{
begin = "G17;G90;G0 Z10;G0 X0 Y0;M3;G4 P2000.000000"
end = "G0 Z10;M5;M2"
toolon = "G00 Z10"
tooloff = "G01 Z0 F10.00"
}
A new configuration file can be set by the --flavor
or -f
command line option.
Another configurable property is the resolution of the SVG image in DPI (dot per inch). It can be given by the --dpi
or -d
command line option. Default value is 72 DPI.
Missing features:
- text (easy with e.g. FontyFruity, maybe once, you can convert text to curves easily anyway)
- filling (moderately difficult)
- clipping (probably not easy, maybe once)
- images (not planned)
There is a JavaScript hanging plotter simulator mainly developed to test the generated gcode. Please file an issue if you run into a problem (or drop me an email to dlacko @ gmail.com).
SVG images are built using the following shapes (all of these are subject of an arbitrary affine transformation):
- lines
- circles
- ellipses
- elliptic arcs with optional x axis rotation
- quadratic and cubic bezier curves
In contrast G-Code implements only
- lines
- non-elliptical arcs
That means that only lines, circles and some arcs (non-elliptic ones without rotation) can be translated to G-Code directly. If transformations are also counted, then only lines can be translated to G-Code directly as circles are not invariant under affine transformations. Because of this, the converter is implemented in two stages.
All the SVG drawing operations are translated to a list of MoveTo, LineTo and CubicBezierTo operations as these are invariant under affine transformations. Arcs, circles and ellipses can be easily approximated with bezier curves with a small error.
Cubic bezier curves are approximated with Biarcs using the algorithm described in [1] and explained here.