function generateGCode(xMovement, yMovement, zMovement, stepDown, feedrate) { if (zMovement <= 0 || stepDown <= 0) return; var x0 = 0 var y0 = 0 var z0 = 0 var zSafe = 7 var x = x0 var y = y0 var z = z0 var xyFeed = feedrate var zFeed = feedrate / 2 var gCode = '' gCode += `; GCODE Generated by ???? on ?????\n` gCode += `; linear pocket movement from 0/0/0 to ${xMovement}/${yMovement}/${zMovement} in ${stepDown}mm steps\n` gCode += 'G21; mm-mode\n' gCode += 'G54; Work Coordinates\n' gCode += 'G21; mm-mode\n' gCode += 'G90; Absolute Positioning\n' gCode += 'M3 S1000; Spindle On\n' gCode += '\n' gCode += '; Begin of linear pocket / cut loop\n' gCode += '; Endmill Diameter: any\n' gCode += `G0 Z${z0 + zSafe}; move to z-safe height\n` gCode += `G0 F1000 X${x0} Y${y0}; move to x/y zeropoint\n` gCode += '\n' var forwardDir = 1 while (z >= -zMovement) { // step down z -= stepDown if (z < -zMovement) z = -zMovement gCode += `G1 F${zFeed} Z${z}; step down on current position\n` // x/y movement if (forwardDir) { x = x0 + xMovement y = y0 + yMovement } else { x = x0 y = y0 } gCode += `G1 F${xyFeed} X${x} Y${y}; linear x/y movement\n` // check for endCondition if (z <= -zMovement) break forwardDir = !forwardDir } // move tool back to save z gCode += '\n' gCode += '; End of linear pockt / cut loop\n' gCode += '; retracting back to z-safe\n' gCode += `G0 Z${z0 + zSafe}\n` gCode += '\n' gCode += 'M5 S0; Spindle Off\n' gCode += '; Job completed\n' // replace code in G-Code editor editor.session.setValue(gCode); // refresh 3D view parseGcodeInWebWorker(editor.getValue()) // required for testing return gCode; } function genInputHtml(label, id, value, icon, descr) { var html = '' html += '
\n' html += ` \n` html += '
\n' html += ` \n` html += '
\n' html += '
\n' html += '
\n' if (descr) html += ` ${descr} ` return html } // Dialog creation Metro.dialog.create({ title: 'Linear Pocket / Cut', content: genInputHtml('X movement', 'xMovement', 100, 'fa-ruler-horizontal', '') + genInputHtml('Y movement', 'yMovement', 0, 'fa-ruler-vertical', '') + genInputHtml('Cutting deepth', 'zMovement', 10, 'fa-ruler', '') + genInputHtml('Step-down', 'stepDown', 1, 'fa-align-justify', '') + genInputHtml('Feedrate', 'feedrate', 100, 'fa-running', 'How fast to move the endmill in milling operation'), actions: [ { caption: "Generate G-Code", cls: "js-dialog-close success", onclick: function () { const xMovement = parseFloat($("#xMovement").val()) const yMovement = parseFloat($("#yMovement").val()) const zMovement = parseFloat($("#zMovement").val()) const stepDown = parseFloat($("#stepDown").val()) const feedrate = parseInt($("#feedrate").val()) generateGCode(xMovement, yMovement, zMovement, stepDown, feedrate) } }, { caption: "Cancel", cls: "js-dialog-close alert", onclick: function () { } } ] }); // required for jest test if (process.env.JEST_WORKER_ID !== undefined) module.exports = generateGCode;