gerber-to-svg
Version:
Gerber and NC drill file to SVG converter
111 lines (96 loc) • 2.87 kB
JavaScript
(function() {
var ABS_COMMAND, DrillParser, INCH_COMMAND, INC_COMMAND, METRIC_COMMAND, PLACES_BACKUP, ZERO_BACKUP, parseCoord, reCOORD;
parseCoord = require('./coord-parser');
INCH_COMMAND = {
'FMAT,1': 'M70',
'FMAT,2': 'M72'
};
METRIC_COMMAND = 'M71';
ABS_COMMAND = 'G90';
INC_COMMAND = 'G91';
reCOORD = /[XY]{1,2}/;
ZERO_BACKUP = 'L';
PLACES_BACKUP = [2, 4];
DrillParser = (function() {
function DrillParser() {
this.format = {
zero: null,
places: null
};
this.fmat = 'FMAT,2';
}
DrillParser.prototype.parseCommand = function(block) {
var code, command, dia, k, v, _ref, _ref1, _ref2;
command = {};
if (block[0] === ';') {
return command;
}
if (block === 'FMAT,1') {
this.fmat = block;
} else if (block === 'M30' || block === 'M00') {
command.set = {
done: true
};
} else if (block === INCH_COMMAND[this.fmat] || block.match(/INCH/)) {
this.format.places = [2, 4];
command.set = {
units: 'in'
};
} else if (block === METRIC_COMMAND || block.match(/METRIC/)) {
this.format.places = [3, 3];
command.set = {
units: 'mm'
};
} else if (block === ABS_COMMAND) {
command.set = {
notation: 'abs'
};
} else if (block === INC_COMMAND) {
command.set = {
notation: 'inc'
};
} else if ((code = (_ref = block.match(/T\d+/)) != null ? _ref[0] : void 0)) {
while (code[1] === '0') {
code = code[0] + code.slice(2);
}
if ((dia = (_ref1 = block.match(/C[\d\.]+(?=.*$)/)) != null ? _ref1[0] : void 0)) {
dia = Number(dia.slice(1));
command.tool = {};
command.tool[code] = {
dia: dia
};
} else {
command.set = {
currentTool: code
};
}
}
if (block.match(/TZ/)) {
this.format.zero = 'L';
} else if (block.match(/LZ/)) {
this.format.zero = 'T';
}
if (block.match(reCOORD)) {
command.op = {
"do": 'flash'
};
if (this.format.zero == null) {
console.warn('no drill file zero suppression specified. assuming leading zero suppression (same as no zero suppression)');
this.format.zero = ZERO_BACKUP;
}
if (this.format.places == null) {
console.warn('no drill file units specified; assuming 2:4 inches format');
this.format.places = PLACES_BACKUP;
}
_ref2 = parseCoord(block, this.format);
for (k in _ref2) {
v = _ref2[k];
command.op[k] = v;
}
}
return command;
};
return DrillParser;
})();
module.exports = DrillParser;
}).call(this);