/** Copyright Stewart Allen -- All Rights Reserved */ "use strict"; (function() { let KIRI = self.kiri, BASE = self.base, POLY = BASE.polygons, UTIL = BASE.util, CAM = KIRI.driver.CAM, PRO = CAM.process, MODES = [ "unset", "level", "rough", "outline", "contour-x", "contour-y", "trace", "drill" ]; /** * @returns {Array} gcode lines */ CAM.export = function(print, online) { let widget = print.widgets[0]; if (!widget) return; let i, time = 0, lines = 0, bytes = 0, factor = 1, output = [], spindle = 0, settings = print.settings, device = settings.device, gcodes = settings.device || {}, tools = settings.tools, space = gcodes.gcodeSpace ? ' ' : '', stripComments = gcodes.gcodeStrip || false, cmdToolChange = gcodes.gcodeChange || [ "M6 T{tool}" ], cmdSpindle = gcodes.gcodeSpindle || [ "M3 S{speed}" ], cmdDwell = gcodes.gcodeDwell || [ "G4 P{time}" ], dev = settings.device, spro = settings.process, maxZd = spro.camFastFeedZ, maxXYd = spro.camFastFeed, decimals = BASE.config.gcode_decimals || 4, pos = { x:null, y:null, z:null, f:null, t:null }, line, cidx, mode = 0, point, points = 0, stock = settings.stock, hasStock = spro.camStockOn && stock.x && stock.y && stock.z, ztOff = hasStock ? spro.camZTopOffset : 0, bounds = widget.getBoundingBox(), zmax = hasStock ? stock.z : bounds.max.z, runbox = { max: { x:-Infinity, y:-Infinity, z:-Infinity}, min: { x:Infinity, y:Infinity, z:Infinity} }, offset = { x: -settings.origin.x, y: settings.origin.y }, consts = { tool: 0, tool_name: "unknown", top: (offset ? dev.bedDepth : dev.bedDepth/2), left: (offset ? 0 : -dev.bedWidth/2), right: (offset ? dev.bedWidth : dev.bedWidth/2), bottom: (offset ? 0 : -dev.bedDepth/2), time_sec: 0, time_ms: 0, time: 0 }, append; append = function(line) { if (line) { lines++; bytes += line.length; output.append(line); } if (!line || output.length > 1000) { online(output.join("\r\n")); output = []; } }; function filterEmit(array, consts) { if (!array) return; for (i=0; i= 0) { line = line.substring(0, cidx).trim(); if (line.length === 0) continue; } if (line.indexOf('G20') === 0) { factor = 1/25.4; consts.top = (offset ? dev.bedDepth : dev.bedDepth/2) * factor; consts.left = (offset ? 0 : -dev.bedWidth/2) * factor; consts.right = (offset ? dev.bedWidth : dev.bedWidth/2) * factor; consts.bottom = (offset ? 0 : -dev.bedDepth/2) * factor; } else if (line.indexOf('G21') === 0) { factor = 1; } append(line); } } function add0(val, opt) { let s = val.toString(), d = s.indexOf("."); if (d < 0) { return opt ? s : s + '.0'; } else { return val.toFixed(decimals); } } function toolByNumber(number) { for (let i=0; i { let tool = toolz[tn]; append(`; tool=${tn} flute=${tool.flute_diam} len=${tool.flute_len} metric=${tool.metric}`); }); } // emit gcode preamble filterEmit(gcodes.gcodePre, consts); // emit all points in layer/point order print.output.forEach(function (layerout) { if (mode !== layerout.mode) { if (mode && !stripComments) append("; ending " + MODES[mode] + " pass after " + Math.round(time/60) + " seconds"); mode = layerout.mode; if (!stripComments) append("; starting " + MODES[mode] + " pass"); } if (layerout.spindle && layerout.spindle !== spindle) { spindle = layerout.spindle; if (spindle > 0) { filterEmit(cmdSpindle, {speed: Math.abs(spindle)}); } else { append("M4"); } // append((spindle > 0 ? "M3" : "M4") + " S" + Math.abs(spindle)); } layerout.forEach(function(out) { moveTo(out); }); }); if (mode && !stripComments) append("; ending " + MODES[mode] + " pass after " + Math.round(time/60) + " seconds"); // emit gcode post filterEmit(gcodes.gcodePost, consts); // flush buffered gcode append(); print.time = time; print.lines = lines; print.bytes = bytes + lines - 1; print.bounds = runbox; }; })();