## SVG to Gcode converter for GRBL pen plotter Forked from [vishpat/svg2gcode](https://github.com/vishpat/svg2gcode) I found that the plugins for inkscape and illustrator would crash when I tried to convert SVG's with many thousands of lines to gcode. So I modified this to generate gcode for GRBL based pen plotter **Usage as cli:** >python convert.py source.svg destination.gcode **or in bash** copy 's2g' to your path and run from anywhere >s2g source.svg target.gcode **Convert all SVG files in `artwork/`** Run `make` from the repository root. Each `artwork/name.svg` is converted to `gcode/name.gcode`. Only files that are newer than their corresponding output are converted; changes to `config.py` or `svg2gcode.py` also rebuild all generated G-code. The directories and Python command can be overridden, for example: `make ARTWORK_DIR=my-art GCODE_DIR=out PYTHON=python3`. **There is a brute force path optimisator algorithm. Very slow for large files, can be disabled in config.py** Travel-distance measurements preserve all drawing shapes. Single-shape drawings have zero inter-shape travel; SVGs with no drawable shapes are rejected. Conversion raises Python's recursion limit to at least 100,000 as a temporary workaround for long SVG paths. Larger paths may still exceed this limit, and deep recursion can exhaust the stack on some Python versions and platforms. **Illustrator exports in points, not mm** regardless of your document settings. If units are set to points in the config file, we convert to mm on the fly. With `auto_scale = True` (the default), drawings outside `0 <= X <= bed_max_x` or `0 <= Y <= bed_max_y` are automatically fitted using their actual coordinate bounds after unit conversion and SVG transformations. Fitting preserves aspect ratio, never enlarges drawings, and shifts fitted drawings to start at X0/Y0. Drawings already in range remain unchanged. Set `auto_scale = False` to reject out-of-range drawings instead. The error reports the offending coordinate and bed limits; no output is created or overwritten on a size-check failure. These are work-coordinate limits, not a check of controller offsets or Z travel. There are various settings you can change in config.py. Most notably, you must set an upper and lower position for the z axis. The `preamble` is emitted after the header and before the feed rate and drawing moves. It currently homes with `$H`, selects millimeters, absolute positioning and G54, then resets only the G54 Z offset to zero. X/Y offsets are preserved. The controller or sender must support `$H` within a job. Regenerate existing G-code with `make` and upload the new files to apply this startup sequence. * zTravel is the height it will move to before traveling to the next stroke * zDraw should be the height at which the pen will make contact with the paper * zDraw should be the height at which the pen will make contact with the paper