UNPKG

gerber-to-svg

Version:

Gerber and NC drill file to SVG converter

108 lines (100 loc) 2.51 kB
/* @license copyright 2014 by mike cousins <mike@cousins.io> (http://cousins.io) shared under the terms of the MIT license view source at http://github.com/mcous/gerber-to-svg */ (function() { var DEFAULT_OPTS, Plotter, builder; builder = require('./obj-to-xml'); Plotter = require('./plotter'); DEFAULT_OPTS = { drill: false, pretty: false, object: false }; module.exports = function(gerber, options) { var Parser, Reader, a, error, height, key, opts, p, val, width, xml, xmlObject, _ref; if (options == null) { options = {}; } opts = {}; for (key in DEFAULT_OPTS) { val = DEFAULT_OPTS[key]; opts[key] = val; } for (key in options) { val = options[key]; opts[key] = val; } if (typeof gerber === 'object') { if (gerber.svg != null) { return builder(gerber, { pretty: opts.pretty }); } else { throw new Error("non SVG object cannot be converted to an SVG string"); } } if (opts.drill) { Reader = require('./drill-reader'); Parser = require('./drill-parser'); } else { Reader = require('./gerber-reader'); Parser = require('./gerber-parser'); } p = new Plotter(gerber, Reader, Parser); try { xmlObject = p.plot(); } catch (_error) { error = _error; throw new Error("Error at line " + p.reader.line + " - " + error.message); } if (!(p.bbox.xMin >= p.bbox.xMax)) { width = p.bbox.xMax - p.bbox.xMin; } else { p.bbox.xMin = 0; p.bbox.xMax = 0; width = 0; } if (!(p.bbox.yMin >= p.bbox.yMax)) { height = p.bbox.yMax - p.bbox.yMin; } else { p.bbox.yMin = 0; p.bbox.yMax = 0; height = 0; } xml = { svg: { xmlns: 'http://www.w3.org/2000/svg', version: '1.1', 'xmlns:xlink': 'http://www.w3.org/1999/xlink', width: "" + width + p.units, height: "" + height + p.units, viewBox: [p.bbox.xMin, p.bbox.yMin, width, height], _: [] } }; _ref = p.attr; for (a in _ref) { val = _ref[a]; xml.svg[a] = val; } if (p.defs.length) { xml.svg._.push({ defs: { _: p.defs } }); } if (p.group.g._.length) { xml.svg._.push(p.group); } if (!opts.object) { return builder(xml, { pretty: opts.pretty }); } else { return xml; } }; }).call(this);