This repository has been archived on 2023-03-25. You can view files and clone it, but cannot push or open issues or pull requests.
mightyscape-1.1-deprecated/extensions/fablabchemnitz/papercraft/openjscad/node_modules/@jscad/gcode-deserializer/index.js

104 lines
2.9 KiB
JavaScript

function deserialize (gcode, fn, options) {
// http://reprap.org/wiki/G-code
const defaults = {version: '0.0.0'}
options = Object.assign({}, defaults, options)
const {version} = options
// just as experiment ...
var l = gcode.split(/[\n]/) // for now just GCODE ASCII
var srci = ''
var d = 0
var pos = []
var lpos = []
var le = 0
var p = []
var origin = [-100, -100]
var layers = 0
var lh = 0.35
var lz = 0
var ld = 0
for (var i = 0; i < l.length; i++) {
var val = ''
var k
var e = 0
if (l[i].match(/^\s*;/)) { continue }
var c = l[i].split(/\s+/)
for (var j = 0; j < c.length; j++) {
if (c[j].match(/G(\d+)/)) {
var n = parseInt(RegExp.$1)
if (n === 1) d++
if (n === 90) pos.type = 'abs'
if (n === 91) pos.type = 'rel'
} else if (c[j].match(/M(\d+)/)) {
let n = parseInt(RegExp.$1)
if (n === 104 || n === 109) { k = 'temp' }
} else if (c[j].match(/S([\d\.]+)/)) {
var v = parseInt(RegExp.$1)
if (k !== undefined) {
val[k] = v
}
} else if (c[j].match(/([XYZE])([\-\d\.]+)/)) {
var a = RegExp.$1
let v = parseFloat(RegExp.$2)
if (pos.type === 'abs') {
if (d) pos[a] = v
} else {
if (d) pos[a] += v
}
// console.log(d,a,pos.E,lpos.E);
if (d && a === 'E' && lpos.E === undefined) {
lpos.E = pos.E
}
if (d && a === 'E' && (pos.E - lpos.E) > 0) {
// console.log(pos.E,lpos.E);
e++
}
}
}
if (d && pos.X && pos.Y) {
if (e) {
if (!le && lpos.X && lpos.Y) {
// console.log(lpos.X,lpos.Y);
p.push('[' + (lpos.X + origin[0]) + ',' + (lpos.Y + origin[1]) + ']')
}
p.push('[' + (pos.X + origin[0]) + ',' + (pos.Y + origin[1]) + ']')
}
if (!e && le && p.length > 1) {
if (srci.length) srci += ',\n\t\t'
if (pos.Z !== lz) {
lh = pos.Z - lz
layers++
}
srci += 'EX([' + p.join(', ') + '],{w: ' + lh * 1.1 + ', h:' + lh * 1.02 + ', fn:1, closed: false}).translate([0,0,' + pos['Z'] + '])'
p = []
lz = pos.Z
// if(layers>2)
// break;
}
le = e
lpos.X = pos.X
lpos.Y = pos.Y
lpos.Z = pos.Z
lpos.E = pos.E
}
ld = d
}
var src = ''
src += '// producer: OpenJSCAD Compatibility (' + version + ') GCode Importer\n'
src += '// date: ' + (new Date()) + '\n'
src += '// source: ' + fn + '\n'
src += '\n'
// if(err) src += "// WARNING: import errors: "+err+" (some triangles might be misaligned or missing)\n";
src += '// layers: ' + layers + '\n'
src += 'function main() {\n\tvar EX = function(p,opt) { return rectangular_extrude(p,opt); }\n\treturn ['
src += srci
src += '\n\t];\n}\n'
return src
}
module.exports = {
deserialize
}