gerber-to-svg
Version:
Gerber and NC drill file to SVG converter
108 lines (100 loc) • 2.51 kB
JavaScript
/*
@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);