svg-to-gcode
Version:
Convert SVG files to G-code for plotter
82 lines (75 loc) • 3.1 kB
JavaScript
/**
* "This project is based on the exportSVGtoGCODE (https://github.com/o0morgan0o/exportSVGtoGCODE) repository, a Node.js CLI tool.
* I have adapted and modified the code to work as a frontend website.
* Credit goes to the original authors for their work on exportSVGtoGCODE."
*/
import { XMLParser } from './xmlParser.js';
import { getRepresentation } from './getRepresentation.js';
import { svg2gcode } from './svg2gcode.js';
import SVGO from 'svgo';
class Converter {
constructor(Settings) {
const defaultSettings = {
zOffset: 3,
feedRate: 1400,
seekRate: 1100,
zValue: 10,
tolerance: 0.01,
minimumArea: 0,
bedSize: null,
pathPlanning: 'minimumTravel',
quadrant: 1,
xOffset: 0,
yOffset: 0,
zMoveTime: 0.5,
};
this.settings = { ...defaultSettings, ...Settings };
const { zValue, zOffset } = this.settings;
this.settings.start = `\nG0 Z${(zValue - zOffset) > 0 ? (zValue - zOffset) : '0'}`;
this.settings.zUpCommand = `\nG0 Z${ zValue < 0 ? zValue + zOffset : zValue - zOffset }`;
this.settings.zDownCommand = `\nG0 Z${zValue}`;
}
async convert(svgData) {
const svgoConfig = {
js2svg: { indent: 2, pretty: true },
plugins: [
"cleanupIds",
"removeDoctype",
"removeXMLProcInst",
"removeComments",
"removeXMLNS",
"convertStyleToAttrs",
"moveGroupAttrsToElems",
"convertEllipseToCircle",
"convertShapeToPath",
// "removeDimensions",
"removeEditorsNSData",
"removeRasterImages",
"removeUselessDefs",
"removeUnknownsAndDefaults",
"removeDesc",
"convertColors",
"sortAttrs",
"removeUselessStrokeAndFill",
"removeXMLNS",
"convertTransform",
"removeEmptyAttrs",
"removeEmptyContainers" ,
"collapseGroups",
"cleanupNumericValues",
]
}
const { data: optimizedSvg } = SVGO.optimize(svgData, svgoConfig);
return new Promise((resolve, reject) => {
let tree = new XMLParser(optimizedSvg, {})
const treeView = tree.getTree()
let XMLRepresentation = getRepresentation(treeView)
XMLRepresentation.viewBox = treeView.viewBox ? treeView.viewBox.split(' ') : '';
let result = svg2gcode(XMLRepresentation, this.settings)
const gcodeLines = result.gcode.split('\n')
const filteredGCode = gcodeLines.filter((item, pos) => pos === 0 || item !== gcodeLines[pos - 1]).join('\n');
resolve({ time: result.estimatedTime, gcode: filteredGCode})
})
}
}
export { Converter }