diff --git a/js/kiri-print.js b/js/kiri-print.js index bef3b4ec..bfd31347 100644 --- a/js/kiri-print.js +++ b/js/kiri-print.js @@ -57,6 +57,36 @@ var gs_kiri_print = exports; PRO.addPrintPoints = addPrintPoints; PRO.poly2polyDepthFirstEmit = poly2polyDepthFirstEmit; + PRO.parseSVG = function(code, offset) { + let scope = this, + output = scope.output = [], + bounds = scope.bounds = { + max: { x:-Infinity, y:-Infinity, z:-Infinity}, + min: { x:Infinity, y:Infinity, z:Infinity} + }; + let svg = new DOMParser().parseFromString(code, 'text/xml'); + let lines = [...svg.getElementsByTagName('polyline')]; + lines.forEach(line => { + let seq = []; + let points = [...line.points]; + points.forEach(point => { + if (offset) { + point.x += offset.x; + point.y += offset.y; + } + if (point.x) bounds.min.x = Math.min(bounds.min.x, point.x); + if (point.x) bounds.max.x = Math.max(bounds.max.x, point.x); + if (point.y) bounds.min.y = Math.min(bounds.min.y, point.y); + if (point.y) bounds.max.y = Math.max(bounds.max.y, point.y); + if (point.z) bounds.min.z = Math.min(bounds.min.z, point.z); + if (point.z) bounds.max.z = Math.max(bounds.max.z, point.z); + addOutput(seq, point, seq.length > 0); + }); + output.push(seq); + }); + scope.lines = lines.length; + }; + PRO.parseGCode = function(gcode, offset) { var lines = gcode .toUpperCase() diff --git a/js/kiri.js b/js/kiri.js index 9addece5..14c40776 100644 --- a/js/kiri.js +++ b/js/kiri.js @@ -899,22 +899,36 @@ self.kiri.license = exports.LICENSE; SPACE.update(); } - function loadGCode(gcode) { + function loadCode(code, type) { setViewMode(VIEWS.PREVIEW); clearPrint(); setOpacity(0); currentPrint = kiri.newPrint(settings, []); - currentPrint.parseGCode(gcode, settings.process.outputOriginCenter ? null : { + let offset = settings.process.outputOriginCenter ? null : { x: -settings.device.bedWidth / 2, y: -settings.device.bedDepth / 2, - }); + }; + switch (type) { + case 'svg': + currentPrint.parseSVG(code, offset); + break; + default: + currentPrint.parseGCode(code, offset); + break; + } currentPrint.render(); SPACE.platform.add(currentPrint.group); SPACE.update(); UI.layerPrint.checked = true; updateSliderMax(true); showSlices(); - exportGCode(gcode); + switch (type) { + case 'svg': + break; + default: + exportGCode(code); + break; + } } function preparePrint(callback) { @@ -1879,19 +1893,20 @@ self.kiri.license = exports.LICENSE; function loadFiles(files) { for (var i=0; i 0, + issvg = lower.indexOf(".svg") > 0, isgcode = lower.indexOf(".gcode") > 0 || lower.indexOf(".nc") > 0; reader.file = files[i]; reader.onloadend = function (e) { - if (isstl) - platformAdd( + if (isstl) platformAdd( newWidget() .loadVertices(new MOTO.STL().parse(e.target.result)) .saveToCatalog(e.target.file.name) ); - if (isgcode) loadGCode(e.target.result); + if (isgcode) loadCode(e.target.result, 'gcode'); + if (issvg) loadCode(e.target.result, 'svg'); }; reader.readAsBinaryString(reader.file); } diff --git a/js/license.js b/js/license.js index f6d85baa..f8285bd0 100644 --- a/js/license.js +++ b/js/license.js @@ -1,7 +1,7 @@ var exports = { COPYRIGHT:"Copyright (C) 2014-2019 Stewart Allen - All Rights Reserved", LICENSE:"See the license.md file included with the source distribution", - VERSION:"1.4.5" + VERSION:"1.4.6" }; if (!module) var module = {}; module.exports = exports;