function downloadFile(filename, contents) { var blob = new Blob([contents], {type: 'text/plain'}); if (window.navigator && window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(blob, filename); } else{ var e = document.createEvent('MouseEvents'), a = document.createElement('a'); a.download = filename; a.href = window.URL.createObjectURL(blob); a.dataset.downloadurl = ['text/plain', a.download, a.href].join(':'); e.initEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); a.dispatchEvent(e); } } function toggle(ticked, target){ if(target == "first"){ if(ticked == false){ $("#firstlayerXY").show(); $("#firstlayerdia").hide(); } else { $("#firstlayerXY").hide(); $("#firstlayerdia").show(); } } else { if(ticked == true){ $(target).hide(); } else { $(target).show(); } } } function esteps(){ var oldSteps = document.estepsForm.oldSteps.value; var remainingFil = document.estepsForm.remainingFil.value; var actualExtrusion = 120 - remainingFil; var newSteps = (oldSteps/actualExtrusion*100).toFixed(2); $("#e1").html(remainingFil); $("#e2").html(actualExtrusion); $("#e3").html(newSteps); $("#e4").html(newSteps); $("#estepsresult").show(); } function xyzsteps(){ var targetAxis = document.xyzstepsForm.xyzAxis.value; var oldSteps = document.xyzstepsForm.oldXYZSteps.value; var requested = document.xyzstepsForm.requested.value; var measured = document.xyzstepsForm.measured.value; var newsteps = (oldSteps/measured*requested).toFixed(2); $("#xyzAxis1").html(targetAxis); $("#xyzAxis2").html(targetAxis); $("#xyz").html(newsteps); $("#xyz2").html(newsteps); $("#xyzstepsresult").show(); } function flowCalc1(){ var oldflow = document.flow1.oldFlow1.value; var targetwall = document.flow1.targetWall.value; var measuredwall = document.flow1.measuredWall.value; var newsteps = (oldflow/measuredwall*targetwall).toFixed(2); $("#f1").html(newsteps); $("#flow1result").show(); } function flowCalc2(){ var oldflow = document.flow2.oldFlow2.value; var targetwall = document.flow2.targetWall.value; var measuredwall = document.flow2.measuredWall.value; var newsteps = (oldflow/measuredwall*targetwall).toFixed(2); $("#f2").html(newsteps); $("#flow2result").show(); } var maxExtVol = 7.22; var maxFeedRate = 100; function maxExt(){ var dia = document.maxExtrusion.filDia.value; var max = document.maxExtrusion.maxFeed.value; var result = ((Math.pow(dia/2, 2))*Math.PI)*(max/60); var str = result.toFixed(2); maxExtVol = parseFloat(str); $('#maxExt').html(maxExtVol); } function maxFee(){ var layH = document.maxExtrusion.layerH.value; var layW = document.maxExtrusion.layerW.value; var maxFeedRate = Math.floor(maxExtVol/(layH*layW)); $('#maxFee').html(maxFeedRate); } function toggleJ() { var value = document.accelerationForm.jerk_or_jd.value; if(value == "jerk"){ $(".jdtd").hide(); $(".jerktd").show(); } else { $(".jdtd").show(); $(".jerktd").hide(); } } function processGcode(formName) { var name = formName.name; var description = formName.description.value; var nozzleLayer = formName.nozzleLayer.value; var bedTemp = formName.bedtemp.value; var centre = formName.centre.checked; if(name == "firstlayerForm"){ var bedX = formName.bedx.value - 50; var bedY = formName.bedy.value - 50; var bedRad = Math.round((formName.beddia.value)/2); } else { var bedX = Math.round((formName.bedx.value-100)/2); var bedY = Math.round((formName.bedy.value-100)/2); } var abl = formName.abl.value; var customStart = formName.startgcode.value; var customEnd = formName.endgcode.value; if(name != "firstlayerForm"){ var fanLayer = formName.fanLayer.value; var fanPercentage = formName.fanSpeed.value; var fanSpeed = Math.round(fanPercentage*2.55); } if(name == "temperatureForm"){ var hotendTemp = formName.temp_a0.value; var a1 = formName.temp_a1.value; var b1 = formName.temp_b1.value; var c1 = formName.temp_c1.value; var d1 = formName.temp_d1.value; var e1 = formName.temp_e1.value; } else { var hotendTemp = formName.hotendtemp.value; } // first layer test specifics if(name == "firstlayerForm"){ var margin = parseInt(formName.margin.value); var offsets = [0,0,0,0,0,0,0,0,0,0]; var delt = 30; var xy = 30; var squares; if(centre == true) { // left offsets[0] = (bedRad*-1) - 50 + delt + margin; offsets[1] = -50; // bottom offsets[2] = -50; offsets[3] = (bedRad*-1) - 50 + delt + margin; // centre offsets[4] = -50; offsets[5] = -50; // top offsets[6] = -50; offsets[7] = (bedRad - 50 - delt) - margin; //right offsets[8] = (bedRad - 50 - delt) - margin; offsets[9] = -50; } else { // bottom left offsets[0] = 0 + xy - 50 + margin; offsets[1] = 0 + xy - 50 + margin; // top left offsets[2] = 0 + xy - 50 + margin; offsets[3] = bedY - xy - margin; // centre offsets[4] = bedX/2 - 25; offsets[5] = bedY/2 - 25; // bottom right offsets[6] = bedX - xy - margin; offsets[7] = 0 + xy - 50 + margin; // top right offsets[8] = bedX - xy - margin; offsets[9] = bedY - xy - margin; } } // collect retraction inputs if(name == "retractionForm") { var a1 = formName.ret_a1.value; var a2 = formName.ret_a2.value*60; var a3 = formName.ret_a3.value; var a4 = formName.ret_a4.value*60; var a5 = formName.ret_a5.value; var b1 = formName.ret_b1.value; var b2 = formName.ret_b2.value*60; var b3 = formName.ret_b3.value; var b4 = formName.ret_b4.value*60; var b5 = formName.ret_b5.value; var c1 = formName.ret_c1.value; var c2 = formName.ret_c2.value*60; var c3 = formName.ret_c3.value; var c4 = formName.ret_c4.value*60; var c5 = formName.ret_c5.value; var d1 = formName.ret_d1.value; var d2 = formName.ret_d2.value*60; var d3 = formName.ret_d3.value; var d4 = formName.ret_d4.value*60; var d5 = formName.ret_d5.value; var e1 = formName.ret_e1.value; var e2 = formName.ret_e2.value*60; var e3 = formName.ret_e3.value; var e4 = formName.ret_e4.value*60; var e5 = formName.ret_e5.value; var f1 = formName.ret_f1.value; var f2 = formName.ret_f2.value*60; var f3 = formName.ret_f3.value; var f4 = formName.ret_f4.value*60; var f5 = formName.ret_f5.value; } else { var retDist = formName.retdist.value; var retDistExtra = formName.retdistextra.value; var retSpeed = formName.retspeed.value*60; var zhop = formName.zhop.value; } // collect acceleration inputs if(name == "accelerationForm"){ var feed = formName.feedrate.value*60; var jerk_or_jd = formName.jerk_or_jd.value; var a1 = formName.accel_a1.value; var a2 = formName.accel_a2.value; var a3 = formName.accel_a3.value; var a4 = formName.accel_a4.value; var a5 = formName.accel_a5.value; var b1 = formName.accel_b1.value; var b2 = formName.accel_b2.value; var b3 = formName.accel_b3.value; var b4 = formName.accel_b4.value; var b5 = formName.accel_b5.value; var c1 = formName.accel_c1.value; var c2 = formName.accel_c2.value; var c3 = formName.accel_c3.value; var c4 = formName.accel_c4.value; var c5 = formName.accel_c5.value; var d1 = formName.accel_d1.value; var d2 = formName.accel_d2.value; var d3 = formName.accel_d3.value; var d4 = formName.accel_d4.value; var d5 = formName.accel_d5.value; var e1 = formName.accel_e1.value; var e2 = formName.accel_e2.value; var e3 = formName.accel_e3.value; var e4 = formName.accel_e4.value; var e5 = formName.accel_e5.value; var f1 = formName.accel_f1.value; var f2 = formName.accel_f2.value; var f3 = formName.accel_f3.value; var f4 = formName.accel_f4.value; var f5 = formName.accel_f5.value; } // process start gcode // bed temp var gcode = commonStart; if(bedTemp == 0){ gcode = gcode.replace(/;bed0a/g, "; no heated bed"); gcode = gcode.replace(/;bed0b/g, "; no heated bed"); } else { gcode = gcode.replace(/;bed0a/g, "M140 S"+bedTemp+" ; custom bed temp"); gcode = gcode.replace(/;bed0b/g, "M190 S"+bedTemp+" ; custom bed temp"); } // start hot end emp if(abl != 4){ gcode = gcode.replace(/;temp0a/g, "M104 S"+hotendTemp+" T0 ; custom hot end temp"); gcode = gcode.replace(/;temp0b/g, "M109 S"+hotendTemp+" T0 ; custom hot end temp"); } else { gcode = gcode.replace(/;temp0a/g, "; Prusa Mini"); gcode = gcode.replace(/;temp0b\n/g, ""); } // abl if(abl == 1){ gcode = gcode.replace(/;G29 ; probe ABL/, "G29 ; probe ABL"); } if(abl == 2){ gcode = gcode.replace(/;M420 S1 ; restore ABL mesh/, "M420 S1 ; restore ABL mesh"); } if(abl == 3){ gcode = gcode.replace(/G28 ; home all axes/, "G28 W ; home all without mesh bed level"); gcode = gcode.replace(/;G29 ; probe ABL/, "G80 ; mesh bed leveling"); } if(abl == 4){ gcode = gcode.replace(/G28 ; home all axes/, "M109 S170 T0 ; probing temperature\nG28 ; home all"); gcode = gcode.replace(/;G29 ; probe ABL/, "G29 ; probe ABL"); gcode = gcode.replace(/;M420 S1 ; restore ABL mesh/, "M109 S"+hotendTemp+" T0 ; custom hot end temp"); } if(abl == 5){ gcode = gcode.replace(/;G29 ; probe ABL/, "G29 L0 ; Load the mesh stored in slot 1\nG29 J ; Probe 3 points to tilt mesh"); } if(abl == 6){ gcode = gcode.replace(/;G29 ; probe ABL/, "G29 L1 ; Load the mesh stored in slot 1\nG29 J ; Probe 3 points to tilt mesh"); } if(abl == 7){ gcode = gcode.replace(/;G29 ; probe ABL/, "G29 L2 ; Load the mesh stored in slot 1\nG29 J ; Probe 3 points to tilt mesh"); } // firstlayer test square array if(name == "firstlayerForm"){ var originalSquare = firstlayer[nozzleLayer]; for(var i = 0; i <= 4; i++){ var square = "; squarez "+(i+1)+"\n"+originalSquare; var firstlayerArray = square.split(/\n/g); var regexp = /X[0-9\.]+/; firstlayerArray.forEach(function(index, item){ if(firstlayerArray[item].search(/X/) > -1){ var value = parseFloat(firstlayerArray[item].match(regexp)[0].substring(1)) + offsets[i*2]; firstlayerArray[item] = firstlayerArray[item].replace(regexp, "X"+String(value)); } }); var regexp = /Y[0-9\.]+/; firstlayerArray.forEach(function(index, item){ if(firstlayerArray[item].search(/Y/) > -1){ var value = parseFloat(firstlayerArray[item].match(regexp)[0].substring(1)) + offsets[i*2+1]; firstlayerArray[item] = firstlayerArray[item].replace(regexp, "Y"+String(value)) } }); square = firstlayerArray.join("\n"); squares += square; } gcode = gcode+squares; } // assign correct gcode source if(name == "baselineForm"){ gcode += baseline[nozzleLayer]; } if(name == "retractionForm"){ gcode += retraction[nozzleLayer]; } if(name == "temperatureForm"){ gcode += temperature[nozzleLayer]; } if(name == "accelerationForm"){ gcode += acceleration[nozzleLayer]; } // add end common gcode gcode += commonEnd; if(name != "firstlayerForm"){ // strip original fan command gcode = gcode.replace(/M106 S3/, ";"); // insert user fan starting layer and speed switch(fanLayer){ case '2': gcode = gcode.replace(/;fan2;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 2"); break; case '3': gcode = gcode.replace(/;fan3;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 3"); break; case '5': gcode = gcode.replace(/;fan5;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 5"); break; } // insert user fan speed for resumption after 100% bridging gcode = gcode.replace(/M106 S3/g, "M106 S"+fanSpeed+"; custom fan "+fanSpeed+"%"); // process gcode to suit bed size and type if(centre == true){ var gcodeArray = gcode.split(/\n/g); var regexp = /X[0-9\.]+/; gcodeArray.forEach(function(index, item){ if(gcodeArray[item].search(/X/) > -1){ var value = parseFloat(gcodeArray[item].match(regexp)[0].substring(1)) - 50; gcodeArray[item] = gcodeArray[item].replace(regexp, "X"+String(value)); } }); var regexp = /Y[0-9\.]+/; gcodeArray.forEach(function(index, item){ if(gcodeArray[item].search(/Y/) > -1){ var value = parseFloat(gcodeArray[item].match(regexp)[0].substring(1)) - 50; gcodeArray[item] = gcodeArray[item].replace(regexp, "Y"+String(value)) } }); gcode = gcodeArray.join("\n"); } else { if(bedX > 0){ var gcodeArray = gcode.split(/\n/g); var regexp = /X[0-9\.]+/; gcodeArray.forEach(function(index, item){ if(gcodeArray[item].search(/X/) > -1){ var value = parseFloat(gcodeArray[item].match(regexp)[0].substring(1)) + bedX; gcodeArray[item] = gcodeArray[item].replace(regexp, "X"+String(value)); } }); gcode = gcodeArray.join("\n"); } if(bedY > 0){ var gcodeArray = gcode.split(/\n/g); var regexp = /Y[0-9\.]+/; gcodeArray.forEach(function(index, item){ if(gcodeArray[item].search(/Y/) > -1){ var value = parseFloat(gcodeArray[item].match(regexp)[0].substring(1)) + bedY; gcodeArray[item] = gcodeArray[item].replace(regexp, "Y"+String(value)) } }); gcode = gcodeArray.join("\n"); } } // changes for acceleration test if(name == "accelerationForm"){ // edit feedrates gcode = gcode.replace(/F3600/g, "F"+feed+" ; custom feedrate - full"); gcode = gcode.replace(/F2880/g, "F"+feed+" ; custom feedrate - full"); gcode = gcode.replace(/F2160/g, "F"+feed/2+" ; custom feedrate - half"); // add acceleration segments gcode = gcode.replace(/;process Process-1/, "M201 X50000 Y50000 Z50000; custom raise acceleration limits\nM204 P"+a1+" ; custom acceleration - A\n;j1"); gcode = gcode.replace(/;process Process-2/, "M204 P"+b1+" ; custom acceleration - B\n;j2"); gcode = gcode.replace(/;process Process-3/, "M204 P"+c1+" ; custom acceleration - C\n;j3"); gcode = gcode.replace(/;process Process-4/, "M204 P"+d1+" ; custom acceleration - D\n;j4"); gcode = gcode.replace(/;process Process-5/, "M204 P"+e1+" ; custom acceleration - E\n;j5"); gcode = gcode.replace(/;process Process-6/, "M204 P"+f1+" ; custom acceleration - F\n;j6"); // add jerk/junction deviation segments if(jerk_or_jd == "jerk"){ gcode = gcode.replace(/;j1/, "M205 X"+a2+" Y"+a3+" Z"+a5+" ; custom jerk - A"); gcode = gcode.replace(/;j2/, "M205 X"+b2+" Y"+b3+" Z"+b5+" ; custom jerk - B"); gcode = gcode.replace(/;j3/, "M205 X"+c2+" Y"+c3+" Z"+c5+" ; custom jerk - C"); gcode = gcode.replace(/;j4/, "M205 X"+d2+" Y"+d3+" Z"+d5+" ; custom jerk - D"); gcode = gcode.replace(/;j5/, "M205 X"+e2+" Y"+e3+" Z"+e5+" ; custom jerk - E"); gcode = gcode.replace(/;j6/, "M205 X"+f2+" Y"+f3+" Z"+f5+" ; custom jerk - F"); } else { gcode = gcode.replace(/;j1/, "M205 J"+a4+" ; custom junction deviation - A"); gcode = gcode.replace(/;j2/, "M205 J"+b4+" ; custom junction deviation - B"); gcode = gcode.replace(/;j3/, "M205 J"+c4+" ; custom junction deviation - C"); gcode = gcode.replace(/;j4/, "M205 J"+d4+" ; custom junction deviation - D"); gcode = gcode.replace(/;j5/, "M205 J"+e4+" ; custom junction deviation - E"); gcode = gcode.replace(/;j6/, "M205 J"+f4+" ; custom junction deviation - F"); } } // process user retraction if(name == "retractionForm"){ // A section gcode = gcode.replace(/;retract1\nG1 Z[0-9\.]+ F1200/g, ";retract1\n;zhop1"); if(a5 > 0){ gcode = gcode.replace(/;zhop1/g, "G91\nG1 Z"+a5+" F1200 ; custom z hop - A\nG90"); } gcode = gcode.replace(/;retract1/g, "G1 E-"+a1+" F"+a2+" ; custom retraction - A"); gcode = gcode.replace(/;unretract1/g, "G1 E"+a3+" F"+a4+" ; custom un-retraction/prime - A"); // B section gcode = gcode.replace(/;retract2\nG1 Z[0-9\.]+ F1200/g, ";retract2\n;zhop2"); if(b5 > 0){ gcode = gcode.replace(/;zhop2/g, "G91\nG1 Z"+b5+" F1200 ; custom z hop - B\nG90"); } gcode = gcode.replace(/;retract2/g, "G1 E-"+b1+" F"+b2+" ; custom retraction - B"); gcode = gcode.replace(/;unretract2/g, "G1 E"+b3+" F"+b4+" ; custom un-retraction/prime - B"); // C section gcode = gcode.replace(/;retract3\nG1 Z[0-9\.]+ F1200/g, ";retract3\n;zhop3"); if(c5 > 0){ gcode = gcode.replace(/;zhop3/g, "G91\nG1 Z"+c5+" F1200 ; custom z hop - C\nG90"); } gcode = gcode.replace(/;retract3/g, "G1 E-"+c1+" F"+c2+" ; custom retraction - C"); gcode = gcode.replace(/;unretract3/g, "G1 E"+c3+" F"+c4+" ; custom un-retraction/prime - C"); // D section gcode = gcode.replace(/;retract4\nG1 Z[0-9\.]+ F1200/g, ";retract4\n;zhop4"); if(d5 > 0){ gcode = gcode.replace(/;zhop4/g, "G91\nG1 Z"+d5+" F1200 ; custom z hop - D\nG90"); } gcode = gcode.replace(/;retract4/g, "G1 E-"+d1+" F"+d2+" ; custom retraction - D"); gcode = gcode.replace(/;unretract4/g, "G1 E"+d3+" F"+d4+" ; custom un-retraction/prime - D"); // E section gcode = gcode.replace(/;retract5\nG1 Z[0-9\.]+ F1200/g, ";retract5\n;zhop5"); if(e5 > 0){ gcode = gcode.replace(/;zhop5/g, "G91\nG1 Z"+e5+" F1200 ; custom z hop - E\nG90"); } gcode = gcode.replace(/;retract5/g, "G1 E-"+e1+" F"+e2+" ; custom retraction - E"); gcode = gcode.replace(/;unretract5/g, "G1 E"+e3+" F"+e4+" ; custom un-retraction/prime - E"); // F section gcode = gcode.replace(/;retract6\nG1 Z[0-9\.]+ F1200/g, ";retract6\n;zhop6"); if(f5 > 0){ gcode = gcode.replace(/;zhop6/g, "G91\nG1 Z"+f5+" F1200 ; custom z hop - F\nG90"); } gcode = gcode.replace(/;retract6/g, "G1 E-"+f1+" F"+f2+" ; custom retraction - F"); gcode = gcode.replace(/;unretract6/g, "G1 E"+f3+" F"+f4+" ; custom un-retraction/prime - F"); } else { gcode = gcode.replace(/;retract1\nG1 Z[0-9\.]+ F1200/g, ";retract1\n;zhop1"); if(zhop > 0){ gcode = gcode.replace(/;zhop1/g, "G91;\nG1 Z"+zhop+" F1200; custom z hop\nG90;"); } gcode = gcode.replace(/;retract1/g, "G1 E-"+retDist+" F"+retSpeed+" ; custom retraction"); gcode = gcode.replace(/;unretract1/g, "G1 E"+retDistExtra+" F"+retSpeed+" ; custom un-retraction/prime"); } // temperature test user inputs if(name == "temperatureForm"){ gcode = gcode.replace(/;layer 2(.*?)\n/, "M104 S"+a1+" T0 ; custom hot end temp - A\n"); gcode = gcode.replace(/;process Process-2/, "M104 S"+b1+" T0 ; custom hot end temp - B"); gcode = gcode.replace(/;process Process-3/, "M104 S"+c1+" T0 ; custom hot end temp - C"); gcode = gcode.replace(/;process Process-4/, "M104 S"+d1+" T0 ; custom hot end temp - D"); gcode = gcode.replace(/;process Process-5/, "M104 S"+e1+" T0 ; custom hot end temp - E"); } } // final tweaks for start and end gcode if(formName.psuon.checked == true) { gcode = gcode.replace(/;M80/, "M80"); } if(formName.removet0.checked == true) { gcode = gcode.replace(/T0\n/, ";T0\n"); } if(formName.start.checked == true) { gcode = gcode.replace(/;customstart/, "; custom start gcode\n"+customStart); } if(formName.end.checked == true) { gcode = gcode.replace(/;customend/, "; custom end gcode\n"+customEnd); } // process finished gcode file downloadFile(description+'.gcode', gcode); } function processFirstlayer(){ var nozzleLayer = document.firstlayerForm.nozzleLayer.value; var hotendTemp = document.firstlayerForm.hotendtemp.value; var bedTemp = document.firstlayerForm.bedtemp.value; var centre = document.firstlayerForm.centre.checked; var bedX = document.firstlayerForm.bedx.value - 50; var bedY = document.firstlayerForm.bedy.value - 50; var bedRad = Math.round((document.firstlayerForm.beddia.value)/2); var retDist = document.firstlayerForm.retdist.value; var retDistExtra = document.firstlayerForm.retdistextra.value; var retSpeed = document.firstlayerForm.retspeed.value*60; var zhop = document.firstlayerForm.zhop.value; var abl = document.firstlayerForm.abl.value; var customStart = document.firstlayerForm.startgcode.value; var customEnd = document.firstlayerForm.endgcode.value; var firstlayerStart = commonStart; var offsets = [0,0,0,0,0,0,0,0,0,0]; var delt = 30; var xy = 30; var margin = parseInt(document.firstlayerForm.margin.value); if(centre == true) { // left offsets[0] = (bedRad*-1) - 50 + delt + margin; offsets[1] = -50; // bottom offsets[2] = -50; offsets[3] = (bedRad*-1) - 50 + delt + margin; // centre offsets[4] = -50; offsets[5] = -50; // top offsets[6] = -50; offsets[7] = (bedRad - 50 - delt) - margin; //right offsets[8] = (bedRad - 50 - delt) - margin; offsets[9] = -50; } else { // bottom left offsets[0] = 0 + xy - 50 + margin; offsets[1] = 0 + xy - 50 + margin; // top left offsets[2] = 0 + xy - 50 + margin; offsets[3] = bedY - xy - margin; // centre offsets[4] = bedX/2 - 25; offsets[5] = bedY/2 - 25; // bottom right offsets[6] = bedX - xy - margin; offsets[7] = 0 + xy - 50 + margin; // top right offsets[8] = bedX - xy - margin; offsets[9] = bedY - xy - margin; } if(bedTemp == 0){ firstlayerStart = firstlayerStart.replace(/M140 S60/g, "; no heated bed"); firstlayerStart = firstlayerStart.replace(/M190 S60/g, "; no heated bed"); } else { firstlayerStart = firstlayerStart.replace(/M140 S60/g, "M140 S"+bedTemp+" ; custom bed temp"); firstlayerStart = firstlayerStart.replace(/M190 S60/g, "M190 S"+bedTemp+" ; custom bed temp"); } if(abl != 4){ firstlayerStart = firstlayerStart.replace(/M104 S210 T0/g, "M104 S"+hotendTemp+" T0 ; custom hot end temp"); firstlayerStart = firstlayerStart.replace(/M109 S210 T0/g, "M109 S"+hotendTemp+" T0 ; custom hot end temp"); } else { firstlayerStart = firstlayerStart.replace(/M104 S210 T0/g, "; Prusa Mini"); firstlayerStart = firstlayerStart.replace(/M109 S210 T0/g, "; Prusa Mini"); } if(abl == 1){ firstlayerStart = firstlayerStart.replace(/;G29 ; probe ABL/, "G29 ; probe ABL"); } if(abl == 2){ firstlayerStart = firstlayerStart.replace(/;M420 S1 ; restore ABL mesh/, "M420 S1 ; restore ABL mesh"); } if(abl == 3){ firstlayerStart = firstlayerStart.replace(/G28 ; home all axes/, "G28 W ; home all without mesh bed level"); firstlayerStart = firstlayerStart.replace(/;G29 ; probe ABL/, "G80 ; mesh bed leveling"); } if(abl == 4){ firstlayerStart = firstlayerStart.replace(/G28 ; home all axes/, "M109 S170 T0 ; probing temperature\nG28 ; home all"); firstlayerStart = firstlayerStart.replace(/;G29 ; probe ABL/, "G29 ; probe ABL"); firstlayerStart = firstlayerStart.replace(/;M420 S1 ; restore ABL mesh/, "M109 S"+hotendTemp+" T0 ; custom hot end temp"); } if(abl == 5){ firstlayerStart = firstlayerStart.replace(/;G29 ; probe ABL/, "G29 L1 ; Load the mesh stored in slot 1\nG29 J ; Probe 3 points to tilt mesh"); } for(var i = 0; i <= 4; i++){ var square = "; square "+(i+1)+"\n"+originalSquare; var firstlayerArray = square.split(/\n/g); var regexp = /X[0-9\.]+/; firstlayerArray.forEach(function(index, item){ if(firstlayerArray[item].search(/X/) > -1){ var value = parseFloat(firstlayerArray[item].match(regexp)[0].substring(1)) + offsets[i*2]; firstlayerArray[item] = firstlayerArray[item].replace(regexp, "X"+String(value)); } }); var regexp = /Y[0-9\.]+/; firstlayerArray.forEach(function(index, item){ if(firstlayerArray[item].search(/Y/) > -1){ var value = parseFloat(firstlayerArray[item].match(regexp)[0].substring(1)) + offsets[i*2+1]; firstlayerArray[item] = firstlayerArray[item].replace(regexp, "Y"+String(value)) } }); square = firstlayerArray.join("\n"); squares += square; } var firstlayer = firstlayerStart+squares+commonEnd; firstlayer = firstlayer.replace(/;retract1\nG1 Z[0-9\.]+ F1200/g, ";retract1\n;zhop1"); if(zhop > 0){ firstlayer = firstlayer.replace(/;zhop1/g, "G91;\nG1 Z"+zhop+" F1200; custom z hop\nG90;"); } firstlayer = firstlayer.replace(/;retract1/g, "G1 E-"+retDist+" F"+retSpeed+" ; custom retraction"); firstlayer = firstlayer.replace(/;unretract1/g, "G1 E"+retDistExtra+" F"+retSpeed+" ; custom un-retraction/prime"); if(document.firstlayerForm.psuon.checked == true) { firstlayer = firstlayer.replace(/;M80/, "M80"); } if(document.firstlayerForm.removet0.checked == true) { firstlayer = firstlayer.replace(/T0\n/, ";T0\n"); } if(document.firstlayerForm.start.checked == true) { firstlayer = firstlayer.replace(/;customstart/, "; custom start gcode\n"+customStart); } if(document.firstlayerForm.end.checked == true) { firstlayer = firstlayer.replace(/;customend/, "; custom end gcode\n"+customEnd); } downloadFile('firstlayer.gcode', firstlayer); } function processBaseline(){ var nozzleLayer = document.baselineForm.nozzleLayer.value; var hotendTemp = document.baselineForm.hotendtemp.value; var bedTemp = document.baselineForm.bedtemp.value; var centre = document.baselineForm.centre.checked; var bedX = Math.round((document.baselineForm.bedx.value-100)/2); var bedY = Math.round((document.baselineForm.bedy.value-100)/2); var retDist = document.baselineForm.retdist.value; var retDistExtra = document.baselineForm.retdistextra.value; var retSpeed = document.baselineForm.retspeed.value*60; var zhop = document.baselineForm.zhop.value; var abl = document.baselineForm.abl.value; var fanLayer = document.baselineForm.fanLayer.value; var fanPercentage = document.baselineForm.fanSpeed.value; var fanSpeed = Math.round(fanPercentage*2.55); var customStart = document.baselineForm.startgcode.value; var customEnd = document.baselineForm.endgcode.value; var baseline = commonStart; switch(nozzleLayer){ case '40_20': baseline += baseline_40_20; break; case '40_16': baseline += baseline_40_16; break; } baseline += commonEnd; baseline = baseline.replace(/M106 S3/, ";"); switch(fanLayer){ case '2': baseline = baseline.replace(/;fan2;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 2"); break; case '3': baseline = baseline.replace(/;fan3;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 3"); break; case '5': baseline = baseline.replace(/;fan5;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 5"); break; } baseline = baseline.replace(/M106 S3/g, "M106 S"+fanSpeed+"; custom fan "+fanSpeed+"%"); if(bedTemp == 0){ baseline = baseline.replace(/M140 S60/g, "; no heated bed"); baseline = baseline.replace(/M190 S60/g, "; no heated bed"); } else { baseline = baseline.replace(/M140 S60/g, "M140 S"+bedTemp+" ; custom bed temp"); baseline = baseline.replace(/M190 S60/g, "M190 S"+bedTemp+" ; custom bed temp"); } if(abl != 4){ baseline = baseline.replace(/M104 S210 T0/g, "M104 S"+hotendTemp+" T0 ; custom hot end temp"); baseline = baseline.replace(/M109 S210 T0/g, "M109 S"+hotendTemp+" T0 ; custom hot end temp"); } else { baseline = baseline.replace(/M104 S210 T0/g, "; Prusa Mini"); baseline = baseline.replace(/M109 S210 T0/g, "; Prusa Mini"); } baseline = baseline.replace(/;retract1\nG1 Z[0-9\.]+ F1200/g, ";retract1\n;zhop1"); if(zhop > 0){ baseline = baseline.replace(/;zhop1/g, "G91;\nG1 Z"+zhop+" F1200 ; custom z hop\nG90;"); } baseline = baseline.replace(/;retract1/g, "G1 E-"+retDist+" F"+retSpeed+" ; custom retraction"); baseline = baseline.replace(/;unretract1/g, "G1 E"+retDistExtra+" F"+retSpeed+" ; custom un-retraction/prime"); if(abl == 1){ baseline = baseline.replace(/;G29 ; probe ABL/, "G29 ; probe ABL"); } if(abl == 2){ baseline = baseline.replace(/;M420 S1 ; restore ABL mesh/, "M420 S1 ; restore ABL mesh"); } if(abl == 3){ baseline = baseline.replace(/G28 ; home all axes/, "G28 W ; home all without mesh bed level"); baseline = baseline.replace(/;G29 ; probe ABL/, "G80 ; mesh bed leveling"); } if(abl == 4){ baseline = baseline.replace(/G28 ; home all axes/, "M109 S170 T0 ; probing temperature\nG28 ; home all"); baseline = baseline.replace(/;G29 ; probe ABL/, "G29 ; probe ABL"); baseline = baseline.replace(/;M420 S1 ; restore ABL mesh/, "M109 S"+hotendTemp+" T0 ; custom hot end temp"); } if(abl == 5){ baseline = baseline.replace(/;G29 ; probe ABL/, "G29 L1 ; Load the mesh stored in slot 1\nG29 J ; Probe 3 points to tilt mesh"); } if(centre == true){ var baselineArray = baseline.split(/\n/g); var regexp = /X[0-9\.]+/; baselineArray.forEach(function(index, item){ if(baselineArray[item].search(/X/) > -1){ var value = parseFloat(baselineArray[item].match(regexp)[0].substring(1)) - 50; baselineArray[item] = baselineArray[item].replace(regexp, "X"+String(value)); } }); var regexp = /Y[0-9\.]+/; baselineArray.forEach(function(index, item){ if(baselineArray[item].search(/Y/) > -1){ var value = parseFloat(baselineArray[item].match(regexp)[0].substring(1)) - 50; baselineArray[item] = baselineArray[item].replace(regexp, "Y"+String(value)) } }); baseline = baselineArray.join("\n"); } else { if(bedX > 0){ var baselineArray = baseline.split(/\n/g); var regexp = /X[0-9\.]+/; baselineArray.forEach(function(index, item){ if(baselineArray[item].search(/X/) > -1){ var value = parseFloat(baselineArray[item].match(regexp)[0].substring(1)) + bedX; baselineArray[item] = baselineArray[item].replace(regexp, "X"+String(value)); } }); baseline = baselineArray.join("\n"); } if(bedY > 0){ var baselineArray = baseline.split(/\n/g); var regexp = /Y[0-9\.]+/; baselineArray.forEach(function(index, item){ if(baselineArray[item].search(/Y/) > -1){ var value = parseFloat(baselineArray[item].match(regexp)[0].substring(1)) + bedY; baselineArray[item] = baselineArray[item].replace(regexp, "Y"+String(value)) } }); baseline = baselineArray.join("\n"); } } if(document.baselineForm.psuon.checked == true) { baseline = baseline.replace(/;M80/, "M80"); } if(document.baselineForm.removet0.checked == true) { baseline = baseline.replace(/T0\n/, ";T0\n"); } if(document.baselineForm.start.checked == true) { baseline = baseline.replace(/;customstart/, "; custom start gcode\n"+customStart); } if(document.baselineForm.end.checked == true) { baseline = baseline.replace(/;customend/, "; custom end gcode\n"+customEnd); } downloadFile('baseline.gcode', baseline); } function processRetraction(){ var nozzleLayer = document.retractionForm.nozzleLayer.value; var hotendTemp = document.retractionForm.hotendtemp.value; var bedTemp = document.retractionForm.bedtemp.value; var centre = document.retractionForm.centre.checked; var bedX = Math.round((document.retractionForm.bedx.value-100)/2); var bedY = Math.round((document.retractionForm.bedy.value-100)/2); var abl = document.retractionForm.abl.value; var fanLayer = document.retractionForm.fanLayer.value; var fanPercentage = document.retractionForm.fanSpeed.value; var fanSpeed = Math.round(fanPercentage*2.55); var a1 = document.retractionForm.ret_a1.value; var a2 = document.retractionForm.ret_a2.value*60; var a3 = document.retractionForm.ret_a3.value; var a4 = document.retractionForm.ret_a4.value*60; var a5 = document.retractionForm.ret_a5.value; var b1 = document.retractionForm.ret_b1.value; var b2 = document.retractionForm.ret_b2.value*60; var b3 = document.retractionForm.ret_b3.value; var b4 = document.retractionForm.ret_b4.value*60; var b5 = document.retractionForm.ret_b5.value; var c1 = document.retractionForm.ret_c1.value; var c2 = document.retractionForm.ret_c2.value*60; var c3 = document.retractionForm.ret_c3.value; var c4 = document.retractionForm.ret_c4.value*60; var c5 = document.retractionForm.ret_c5.value; var d1 = document.retractionForm.ret_d1.value; var d2 = document.retractionForm.ret_d2.value*60; var d3 = document.retractionForm.ret_d3.value; var d4 = document.retractionForm.ret_d4.value*60; var d5 = document.retractionForm.ret_d5.value; var e1 = document.retractionForm.ret_e1.value; var e2 = document.retractionForm.ret_e2.value*60; var e3 = document.retractionForm.ret_e3.value; var e4 = document.retractionForm.ret_e4.value*60; var e5 = document.retractionForm.ret_e5.value; var f1 = document.retractionForm.ret_f1.value; var f2 = document.retractionForm.ret_f2.value*60; var f3 = document.retractionForm.ret_f3.value; var f4 = document.retractionForm.ret_f4.value*60; var f5 = document.retractionForm.ret_f5.value; var customStart = document.retractionForm.startgcode.value; var customEnd = document.retractionForm.endgcode.value; var retraction = commonStart; switch(nozzleLayer){ case "40_20": retraction += retraction_40_20; break; case "40_16": retraction += retraction_40_16; break; } retraction += commonEnd; retraction = retraction.replace(/M106 S3/, ";"); switch(fanLayer){ case '2': retraction = retraction.replace(/;fan2;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 2"); break; case '3': retraction = retraction.replace(/;fan3;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 3"); break; case '5': retraction = retraction.replace(/;fan5;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 5"); break; } retraction = retraction.replace(/M106 S3/g, "M106 S"+fanSpeed+"; custom fan "+fanSpeed+"%"); if(bedTemp == 0){ retraction = retraction.replace(/M140 S60/g, "; no heated bed"); retraction = retraction.replace(/M190 S60/g, "; no heated bed"); } else { retraction = retraction.replace(/M140 S60/g, "M140 S"+bedTemp+" ; custom bed temp"); retraction = retraction.replace(/M190 S60/g, "M190 S"+bedTemp+" ; custom bed temp"); } if(abl != 4){ retraction = retraction.replace(/M104 S210 T0/g, "M104 S"+hotendTemp+" T0 ; custom hot end temp"); retraction = retraction.replace(/M109 S210 T0/g, "M109 S"+hotendTemp+" T0 ; custom hot end temp"); } else { retraction = retraction.replace(/M104 S210/g, "; Prusa Mini"); retraction = retraction.replace(/M109 S210/g, "; Prusa Mini"); } if(abl == 1){ retraction = retraction.replace(/;G29 ; probe ABL/, "G29 ; probe ABL"); } if(abl == 2){ retraction = retraction.replace(/;M420 S1 ; restore ABL mesh/, "M420 S1 ; restore ABL mesh"); } if(abl == 3){ retraction = retraction.replace(/G28 ; home all axes/, "G28 W ; home all without mesh bed level") retraction = retraction.replace(/;G29 ; probe ABL/, "G80 ; mesh bed leveling") } if(abl == 4){ retraction = retraction.replace(/G28 ; home all axes/, "M109 S170 T0 ; probing temperature\nG28 ; home all"); retraction = retraction.replace(/;G29 ; probe ABL/, "G29 ; probe ABL"); retraction = retraction.replace(/;M420 S1 ; restore ABL mesh/, "M109 S"+hotendTemp+" T0 ; custom hot end temp"); } if(abl == 5){ retraction = retraction.replace(/;G29 ; probe ABL/, "G29 L1 ; Load the mesh stored in slot 1\nG29 J ; Probe 3 points to tilt mesh"); } if(centre == true){ var retractionArray = retraction.split(/\n/g); var regexp = /X[0-9\.]+/; retractionArray.forEach(function(index, item){ if(retractionArray[item].search(/X/) > -1){ var value = parseFloat(retractionArray[item].match(regexp)[0].substring(1)) - 50; retractionArray[item] = retractionArray[item].replace(regexp, "X"+String(value)); } }); var regexp = /Y[0-9\.]+/; retractionArray.forEach(function(index, item){ if(retractionArray[item].search(/Y/) > -1){ var value = parseFloat(retractionArray[item].match(regexp)[0].substring(1)) - 50; retractionArray[item] = retractionArray[item].replace(regexp, "Y"+String(value)) } }); retraction = retractionArray.join("\n"); } else { if(bedX > 0){ var retractionArray = retraction.split(/\n/g); var regexp = /X[0-9\.]+/; retractionArray.forEach(function(index, item){ if(retractionArray[item].search(/X/) > -1){ var value = parseFloat(retractionArray[item].match(regexp)[0].substring(1)) + bedX; retractionArray[item] = retractionArray[item].replace(regexp, "X"+String(value)); } }); retraction = retractionArray.join("\n"); } if(bedY > 0){ var retractionArray = retraction.split(/\n/g); var regexp = /Y[0-9\.]+/; retractionArray.forEach(function(index, item){ if(retractionArray[item].search(/Y/) > -1){ var value = parseFloat(retractionArray[item].match(regexp)[0].substring(1)) + bedY; retractionArray[item] = retractionArray[item].replace(regexp, "Y"+String(value)) } }); retraction = retractionArray.join("\n"); } } // A section retraction = retraction.replace(/;retract1\nG1 Z[0-9\.]+ F1200/g, ";retract1\n;zhop1"); if(a5 > 0){ retraction = retraction.replace(/;zhop1/g, "G91\nG1 Z"+a5+" F1200 ; custom z hop - A\nG90"); } retraction = retraction.replace(/;retract1/g, "G1 E-"+a1+" F"+a2+" ; custom retraction - A"); retraction = retraction.replace(/;unretract1/g, "G1 E"+a3+" F"+a4+" ; custom un-retraction/prime - A"); // B section retraction = retraction.replace(/;retract2\nG1 Z[0-9\.]+ F1200/g, ";retract2\n;zhop2"); if(b5 > 0){ retraction = retraction.replace(/;zhop2/g, "G91\nG1 Z"+b5+" F1200 ; custom z hop - B\nG90"); } retraction = retraction.replace(/;retract2/g, "G1 E-"+b1+" F"+b2+" ; custom retraction - B"); retraction = retraction.replace(/;unretract2/g, "G1 E"+b3+" F"+b4+" ; custom un-retraction/prime - B"); // C section retraction = retraction.replace(/;retract3\nG1 Z[0-9\.]+ F1200/g, ";retract3\n;zhop3"); if(c5 > 0){ retraction = retraction.replace(/;zhop3/g, "G91\nG1 Z"+c5+" F1200 ; custom z hop - C\nG90"); } retraction = retraction.replace(/;retract3/g, "G1 E-"+c1+" F"+c2+" ; custom retraction - C"); retraction = retraction.replace(/;unretract3/g, "G1 E"+c3+" F"+c4+" ; custom un-retraction/prime - C"); // D section retraction = retraction.replace(/;retract4\nG1 Z[0-9\.]+ F1200/g, ";retract4\n;zhop4"); if(d5 > 0){ retraction = retraction.replace(/;zhop4/g, "G91\nG1 Z"+d5+" F1200 ; custom z hop - D\nG90"); } retraction = retraction.replace(/;retract4/g, "G1 E-"+d1+" F"+d2+" ; custom retraction - D"); retraction = retraction.replace(/;unretract4/g, "G1 E"+d3+" F"+d4+" ; custom un-retraction/prime - D"); // E section retraction = retraction.replace(/;retract5\nG1 Z[0-9\.]+ F1200/g, ";retract5\n;zhop5"); if(e5 > 0){ retraction = retraction.replace(/;zhop5/g, "G91\nG1 Z"+e5+" F1200 ; custom z hop - E\nG90"); } retraction = retraction.replace(/;retract5/g, "G1 E-"+e1+" F"+e2+" ; custom retraction - E"); retraction = retraction.replace(/;unretract5/g, "G1 E"+e3+" F"+e4+" ; custom un-retraction/prime - E"); // F section retraction = retraction.replace(/;retract6\nG1 Z[0-9\.]+ F1200/g, ";retract6\n;zhop6"); if(f5 > 0){ retraction = retraction.replace(/;zhop6/g, "G91\nG1 Z"+f5+" F1200 ; custom z hop - F\nG90"); } retraction = retraction.replace(/;retract6/g, "G1 E-"+f1+" F"+f2+" ; custom retraction - F"); retraction = retraction.replace(/;unretract6/g, "G1 E"+f3+" F"+f4+" ; custom un-retraction/prime - F"); if(document.retractionForm.psuon.checked == true) { retraction = retraction.replace(/;M80/, "M80"); } if(document.retractionForm.removet0.checked == true) { retraction = retraction.replace(/T0\n/, ";T0\n"); } if(document.retractionForm.start.checked == true) { retraction = retraction.replace(/;customstart/, "; custom start gcode\n"+customStart); } if(document.retractionForm.end.checked == true) { retraction = retraction.replace(/;customend/, "; custom end gcode\n"+customEnd); } downloadFile('retraction.gcode', retraction); } function processTemperature(){ var nozzleLayer = document.temperatureForm.nozzleLayer.value; var bedTemp = document.temperatureForm.bedtemp.value; var centre = document.temperatureForm.centre.checked; var bedX = Math.round((document.temperatureForm.bedx.value-100)/2); var bedY = Math.round((document.temperatureForm.bedy.value-100)/2); var retDist = document.temperatureForm.retdist.value; var retDistExtra = document.temperatureForm.retdistextra.value; var retSpeed = document.temperatureForm.retspeed.value*60; var zhop = document.temperatureForm.zhop.value; var abl = document.temperatureForm.abl.value; var fanLayer = document.temperatureForm.fanLayer.value; var fanPercentage = document.temperatureForm.fanSpeed.value; var fanSpeed = Math.round(fanPercentage*2.55); var a0 = document.temperatureForm.temp_a0.value; var a1 = document.temperatureForm.temp_a1.value; var b1 = document.temperatureForm.temp_b1.value; var c1 = document.temperatureForm.temp_c1.value; var d1 = document.temperatureForm.temp_d1.value; var e1 = document.temperatureForm.temp_e1.value; var customStart = document.temperatureForm.startgcode.value; var customEnd = document.temperatureForm.endgcode.value; var temperature = commonStart; switch(nozzleLayer){ case '40_20': temperature += temperature_40_20; break; case '40_16': temperature += temperature_40_16; break; } temperature += commonEnd; temperature = temperature.replace(/M104 S210 T0/, "temp0a"); temperature = temperature.replace(/M109 S210 T0/, "temp0b"); temperature = temperature.replace(/M106 S3/, ";"); switch(fanLayer){ case '2': temperature = temperature.replace(/;fan2;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 2"); break; case '3': temperature = temperature.replace(/;fan3;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 3"); break; case '5': temperature = temperature.replace(/;fan5;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 5"); break; } temperature = temperature.replace(/M106 S3/g, "M106 S"+fanSpeed+"; custom fan "+fanSpeed+"%"); if(abl == 1){ temperature = temperature.replace(/;G29 ; probe ABL/, "G29 ; probe ABL"); } if(abl == 2){ temperature = temperature.replace(/;M420 S1 ; restore ABL mesh/, "M420 S1 ; restore ABL mesh"); } if(abl == 3){ temperature = temperature.replace(/G28 ; home all axes/, "G28 W ; home all without mesh bed level") temperature = temperature.replace(/;G29 ; probe ABL/, "G80 ; mesh bed leveling") } if(abl == 4){ temperature = temperature.replace(/G28 ; home all axes/, "M109 S170 T0 ; probing temperature\nG28 ; home all"); temperature = temperature.replace(/;G29 ; probe ABL/, "G29 ; probe ABL"); temperature = temperature.replace(/;M420 S1 ; restore ABL mesh/, "tempmini"); } if(abl == 5){ temperature = temperature.replace(/;G29 ; probe ABL/, "G29 L1 ; Load the mesh stored in slot 1\nG29 J ; Probe 3 points to tilt mesh"); } if(bedTemp == 0){ temperature = temperature.replace(/M140 S60/g, "; no heated bed"); temperature = temperature.replace(/M190 S60/g, "; no heated bed"); } else { temperature = temperature.replace(/M140 S60/g, "M140 S"+bedTemp+" ; custom bed temp"); temperature = temperature.replace(/M190 S60/g, "M190 S"+bedTemp+" ; custom bed temp"); } temperature = temperature.replace(/;retract1\nG1 Z[0-9\.]+ F1200/g, ";retract1\n;zhop1"); if(zhop > 0){ temperature = temperature.replace(/;zhop1/g, "G91;\nG1 Z"+zhop+" F1200 ; custom z hop\nG90;"); } temperature = temperature.replace(/;retract1/g, "G1 E-"+retDist+" F"+retSpeed+" ; custom retraction"); temperature = temperature.replace(/;unretract1/g, "G1 E"+retDistExtra+" F"+retSpeed+" ; custom un-retraction/prime"); if(centre == true){ var temperatureArray = temperature.split(/\n/g); var regexp = /X[0-9\.]+/; temperatureArray.forEach(function(index, item){ if(temperatureArray[item].search(/X/) > -1){ var value = parseFloat(temperatureArray[item].match(regexp)[0].substring(1)) - 50; temperatureArray[item] = temperatureArray[item].replace(regexp, "X"+String(value)); } }); var regexp = /Y[0-9\.]+/; temperatureArray.forEach(function(index, item){ if(temperatureArray[item].search(/Y/) > -1){ var value = parseFloat(temperatureArray[item].match(regexp)[0].substring(1)) - 50; temperatureArray[item] = temperatureArray[item].replace(regexp, "Y"+String(value)) } }); temperature = temperatureArray.join("\n"); } else { if(bedX > 0){ var temperatureArray = temperature.split(/\n/g); var regexp = /X[0-9\.]+/; temperatureArray.forEach(function(index, item){ if(temperatureArray[item].search(/X/) > -1){ var value = parseFloat(temperatureArray[item].match(regexp)[0].substring(1)) + bedX; temperatureArray[item] = temperatureArray[item].replace(regexp, "X"+String(value)); } }); temperature = temperatureArray.join("\n"); } if(bedY > 0){ var temperatureArray = temperature.split(/\n/g); var regexp = /Y[0-9\.]+/; temperatureArray.forEach(function(index, item){ if(temperatureArray[item].search(/Y/) > -1){ var value = parseFloat(temperatureArray[item].match(regexp)[0].substring(1)) + bedY; temperatureArray[item] = temperatureArray[item].replace(regexp, "Y"+String(value)) } }); temperature = temperatureArray.join("\n"); } } if(abl != 4){ temperature = temperature.replace(/temp0a/, "M104 S"+a0+" T0 ; custom hot end temp - first layer"); temperature = temperature.replace(/temp0b/, "M109 S"+a0+" T0 ; custom hot end temp - first layer"); } else { temperature = temperature.replace(/temp0a/, "; Prusa Mini"); temperature = temperature.replace(/temp0b/, "; Prusa Mini"); temperature = temperature.replace(/tempmini/, "M109 S"+a0+" T0 ; custom hot end temp - first layer"); } temperature = temperature.replace(/;layer 2(.*?)\n/, "M104 S"+a1+" T0 ; custom hot end temp - A\n"); temperature = temperature.replace(/;process Process-2/, "M104 S"+b1+" T0 ; custom hot end temp - B"); temperature = temperature.replace(/;process Process-3/, "M104 S"+c1+" T0 ; custom hot end temp - C"); temperature = temperature.replace(/;process Process-4/, "M104 S"+d1+" T0 ; custom hot end temp - D"); temperature = temperature.replace(/;process Process-5/, "M104 S"+e1+" T0 ; custom hot end temp - E"); if(document.temperatureForm.psuon.checked == true) { temperature = temperature.replace(/;M80/, "M80"); } if(document.temperatureForm.removet0.checked == true) { temperature = temperature.replace(/T0\n/, ";T0\n"); } if(document.temperatureForm.start.checked == true) { temperature = temperature.replace(/;customstart/, "; custom start gcode\n"+customStart); } if(document.temperatureForm.end.checked == true) { temperature = temperature.replace(/;customend/, "; custom end gcode\n"+customEnd); } downloadFile('temperature.gcode', temperature); } function processAcceleration(){ var nozzleLayer = document.accelerationForm.nozzleLayer.value; var hotendTemp = document.accelerationForm.hotendtemp.value; var bedTemp = document.accelerationForm.bedtemp.value; var centre = document.accelerationForm.centre.checked; var bedX = Math.round((document.accelerationForm.bedx.value-100)/2); var bedY = Math.round((document.accelerationForm.bedy.value-100)/2); var retDist = document.accelerationForm.retdist.value; var retDistExtra = document.accelerationForm.retdistextra.value; var retSpeed = document.accelerationForm.retspeed.value*60; var zhop = document.accelerationForm.zhop.value; var abl = document.accelerationForm.abl.value; var fanLayer = document.accelerationForm.fanLayer.value; var fanPercentage = document.accelerationForm.fanSpeed.value; var fanSpeed = Math.round(fanPercentage*2.55); var feed = document.accelerationForm.feedrate.value*60; var jerk_or_jd = document.accelerationForm.jerk_or_jd.value; var a1 = document.accelerationForm.accel_a1.value; var a2 = document.accelerationForm.accel_a2.value; var a3 = document.accelerationForm.accel_a3.value; var a4 = document.accelerationForm.accel_a4.value; var a5 = document.accelerationForm.accel_a5.value; var b1 = document.accelerationForm.accel_b1.value; var b2 = document.accelerationForm.accel_b2.value; var b3 = document.accelerationForm.accel_b3.value; var b4 = document.accelerationForm.accel_b4.value; var b5 = document.accelerationForm.accel_b5.value; var c1 = document.accelerationForm.accel_c1.value; var c2 = document.accelerationForm.accel_c2.value; var c3 = document.accelerationForm.accel_c3.value; var c4 = document.accelerationForm.accel_c4.value; var c5 = document.accelerationForm.accel_c5.value; var d1 = document.accelerationForm.accel_d1.value; var d2 = document.accelerationForm.accel_d2.value; var d3 = document.accelerationForm.accel_d3.value; var d4 = document.accelerationForm.accel_d4.value; var d5 = document.accelerationForm.accel_d5.value; var e1 = document.accelerationForm.accel_e1.value; var e2 = document.accelerationForm.accel_e2.value; var e3 = document.accelerationForm.accel_e3.value; var e4 = document.accelerationForm.accel_e4.value; var e5 = document.accelerationForm.accel_e5.value; var f1 = document.accelerationForm.accel_f1.value; var f2 = document.accelerationForm.accel_f2.value; var f3 = document.accelerationForm.accel_f3.value; var f4 = document.accelerationForm.accel_f4.value; var f5 = document.accelerationForm.accel_f5.value; var customStart = document.accelerationForm.startgcode.value; var customEnd = document.accelerationForm.endgcode.value; var acceleration = commonStart; switch(nozzleLayer){ case '40_20': acceleration += acceleration_40_20; break; case '40_16': acceleration += acceleration_40_16; break; } acceleration += commonEnd; acceleration = acceleration.replace(/M106 S3/, ";"); switch(fanLayer){ case '2': acceleration = acceleration.replace(/;fan2;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 2"); break; case '3': acceleration = acceleration.replace(/;fan3;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 3"); break; case '5': acceleration = acceleration.replace(/;fan5;/, "M106 S"+fanSpeed+"; custom fan "+fanPercentage+"% from layer 5"); break; } acceleration = acceleration.replace(/M106 S3/g, "M106 S"+fanSpeed+"; custom fan "+fanSpeed+"%"); if(bedTemp == 0){ acceleration = acceleration.replace(/M140 S60/g, "; no heated bed"); acceleration = acceleration.replace(/M190 S60/g, "; no heated bed"); } else { acceleration = acceleration.replace(/M140 S60/g, "M140 S"+bedTemp+" ; custom bed temp"); acceleration = acceleration.replace(/M190 S60/g, "M190 S"+bedTemp+" ; custom bed temp"); } if(abl != 4){ acceleration = acceleration.replace(/M104 S210 T0/g, "M104 S"+hotendTemp+" T0 ; custom hot end temp"); acceleration = acceleration.replace(/M109 S210 T0/g, "M109 S"+hotendTemp+" T0 ; custom hot end temp"); } else { acceleration = acceleration.replace(/M104 S210/g, "; Prusa Mini"); acceleration = acceleration.replace(/M109 S210/g, "; Prusa Mini"); } acceleration = acceleration.replace(/;retract1\nG1 Z[0-9\.]+ F1200/g, ";retract1\n;zhop1"); if(zhop > 0){ acceleration = acceleration.replace(/;zhop1/g, "G91;\nG1 Z"+zhop+" F1200 ; custom z hop\nG90;"); } acceleration = acceleration.replace(/;retract1/g, "G1 E-"+retDist+" F"+retSpeed+" ; custom retraction"); acceleration = acceleration.replace(/;unretract1/g, "G1 E"+retDistExtra+" F"+retSpeed+" ; custom un-retraction/prime"); if(abl == 1){ acceleration = acceleration.replace(/;G29 ; probe ABL/, "G29 ; probe ABL"); } if(abl == 2){ acceleration = acceleration.replace(/;M420 S1 ; restore ABL mesh/, "M420 S1 ; restore ABL mesh"); } if(abl == 3){ acceleration = acceleration.replace(/G28 ; home all axes/, "G28 W ; home all without mesh bed level") acceleration = acceleration.replace(/;G29 ; probe ABL/, "G80 ; mesh bed leveling") } if(abl == 4){ acceleration = acceleration.replace(/G28 ; home all axes/, "M109 S170 T0 ; probing temperature\nG28 ; home all"); acceleration = acceleration.replace(/;G29 ; probe ABL/, "G29 ; probe ABL"); acceleration = acceleration.replace(/;M420 S1 ; restore ABL mesh/, "M109 S"+hotendTemp+" T0 ; custom hot end temp"); } if(abl == 5){ acceleration = acceleration.replace(/;G29 ; probe ABL/, "G29 L1 ; Load the mesh stored in slot 1\nG29 J ; Probe 3 points to tilt mesh"); } if(centre == true){ var accelerationArray = acceleration.split(/\n/g); var regexp = /X[0-9\.]+/; accelerationArray.forEach(function(index, item){ if(accelerationArray[item].search(/X/) > -1){ var value = parseFloat(accelerationArray[item].match(regexp)[0].substring(1)) - 50; accelerationArray[item] = accelerationArray[item].replace(regexp, "X"+String(value)); } }); var regexp = /Y[0-9\.]+/; accelerationArray.forEach(function(index, item){ if(accelerationArray[item].search(/Y/) > -1){ var value = parseFloat(accelerationArray[item].match(regexp)[0].substring(1)) - 50; accelerationArray[item] = accelerationArray[item].replace(regexp, "Y"+String(value)) } }); acceleration = accelerationArray.join("\n"); } else { if(bedX > 0){ var accelerationArray = acceleration.split(/\n/g); var regexp = /X[0-9\.]+/; accelerationArray.forEach(function(index, item){ if(accelerationArray[item].search(/X/) > -1){ var value = parseFloat(accelerationArray[item].match(regexp)[0].substring(1)) + bedX; accelerationArray[item] = accelerationArray[item].replace(regexp, "X"+String(value)); } }); acceleration = accelerationArray.join("\n"); } if(bedY > 0){ var accelerationArray = acceleration.split(/\n/g); var regexp = /Y[0-9\.]+/; accelerationArray.forEach(function(index, item){ if(accelerationArray[item].search(/Y/) > -1){ var value = parseFloat(accelerationArray[item].match(regexp)[0].substring(1)) + bedY; accelerationArray[item] = accelerationArray[item].replace(regexp, "Y"+String(value)) } }); acceleration = accelerationArray.join("\n"); } } acceleration = acceleration.replace(/F3720/g, "F"+feed+" ; custom feedrate - full"); acceleration = acceleration.replace(/F2790/g, "F"+feed+" ; custom feedrate - full"); acceleration = acceleration.replace(/F1860/g, "F"+feed/2+" ; custom feedrate - half"); acceleration = acceleration.replace(/;process Process-1/, "M201 X50000 Y50000 Z50000; custom raise acceleration limits\nM204 P"+a1+" ; custom acceleration - A\n;j1"); acceleration = acceleration.replace(/;process Process-2/, "M204 P"+b1+" ; custom acceleration - B\n;j2"); acceleration = acceleration.replace(/;process Process-3/, "M204 P"+c1+" ; custom acceleration - C\n;j3"); acceleration = acceleration.replace(/;process Process-4/, "M204 P"+d1+" ; custom acceleration - D\n;j4"); acceleration = acceleration.replace(/;process Process-5/, "M204 P"+e1+" ; custom acceleration - E\n;j5"); acceleration = acceleration.replace(/;process Process-6/, "M204 P"+f1+" ; custom acceleration - F\n;j6"); if(jerk_or_jd == "jerk"){ acceleration = acceleration.replace(/;j1/, "M205 X"+a2+" Y"+a3+" Z"+a5+" ; custom jerk - A"); acceleration = acceleration.replace(/;j2/, "M205 X"+b2+" Y"+b3+" Z"+b5+" ; custom jerk - B"); acceleration = acceleration.replace(/;j3/, "M205 X"+c2+" Y"+c3+" Z"+c5+" ; custom jerk - C"); acceleration = acceleration.replace(/;j4/, "M205 X"+d2+" Y"+d3+" Z"+d5+" ; custom jerk - D"); acceleration = acceleration.replace(/;j5/, "M205 X"+e2+" Y"+e3+" Z"+e5+" ; custom jerk - E"); acceleration = acceleration.replace(/;j6/, "M205 X"+f2+" Y"+f3+" Z"+f5+" ; custom jerk - F"); } else { acceleration = acceleration.replace(/;j1/, "M205 J"+a4+" ; custom junction deviation - A"); acceleration = acceleration.replace(/;j2/, "M205 J"+b4+" ; custom junction deviation - B"); acceleration = acceleration.replace(/;j3/, "M205 J"+c4+" ; custom junction deviation - C"); acceleration = acceleration.replace(/;j4/, "M205 J"+d4+" ; custom junction deviation - D"); acceleration = acceleration.replace(/;j5/, "M205 J"+e4+" ; custom junction deviation - E"); acceleration = acceleration.replace(/;j6/, "M205 J"+f4+" ; custom junction deviation - F"); } if(document.accelerationForm.psuon.checked == true) { acceleration = acceleration.replace(/;M80/, "M80"); } if(document.accelerationForm.removet0.checked == true) { acceleration = acceleration.replace(/T0\n/, ";T0\n"); } if(document.accelerationForm.start.checked == true) { acceleration = acceleration.replace(/;customstart/, "; custom start gcode\n"+customStart); } if(document.accelerationForm.end.checked == true) { acceleration = acceleration.replace(/;customend/, "; custom end gcode\n"+customEnd); } downloadFile('acceleration.gcode', acceleration); } function outputSettings(formName) { var fileName; var string = "Settings for "; switch(formName.name) { case "firstlayerForm": string += "first layer" fileName = "firstlayersettings.txt"; break; case "baselineForm": string += "baseline print" fileName = "baselinesettings.txt"; break; case "retractionForm": string += "retraction tuning" fileName = "retractionsettings.txt"; break; case "temperatureForm": string += "temperature tuning" fileName = "temperaturesettings.txt"; break; case "accelerationForm": string += "acceleration and jerk/junction deviation tuning" fileName = "accelerationsettings.txt"; break; } string += " form\n_________________________________________________________________________\n\n"; string += "G-Code originally generated by Simplify3D(R) Version 4.1.2\nThis calibration test gcode modified by the Teaching Tech Calibration website: https://teachingtechyt.github.io/calibration.html\n"; string += "All changes are marked in the gcode with 'custom' at the end of each line. Open the gcode in a text editor and search for this to your check inputs if needed.\n\n"; if(formName.psuon.checked == true) { string += "Turn on PSU with M80 active\n" } if(formName.removet0.checked == true) { string += "T0 command removed\n" } if(formName.start.checked == true) { string += "Custom start gcode:\n"; string += formName.startgcode.value+"\n"; } string += "\nBed: "; if(formName.centre.checked == false) { string += formName.bedx.value+" x "+formName.bedy.value+" mm"; } else { string += "0,0 at centre"; if(formName.name == "firstlayerForm"){ string += ", "+formName.beddia.value+" mm diameter"; } } if(formName.name == "firstlayerForm") { string += "\nExtra margin from edge: "+formName.margin.value+" mm"; } string += "\n\nTemperatures:\n"; if(formName.name == "temperatureForm") { string += "Bed: "+formName.bedtemp.value+" deg C\n"; string += "Segement E: "+formName.temp_e1.value+" deg C\n"; string += "Segement D: "+formName.temp_d1.value+" deg C\n"; string += "Segement C: "+formName.temp_c1.value+" deg C\n"; string += "Segement B: "+formName.temp_b1.value+" deg C\n"; string += "Segement A: "+formName.temp_a1.value+" deg C\n"; string += "First Layer: "+formName.temp_a0.value+" deg C\n"; } else { string += "Bed: "+formName.bedtemp.value+" deg C\n"; string += "Hot end: "+formName.hotendtemp.value+" deg C\n"; } if(formName.name != "firstlayerForm") { var fanSpeed = formName.fanSpeed.value; var fanLayer = formName.fanLayer.value string += "\n\nPart Cooling: "+fanSpeed+"% from layer "+fanLayer+"\n"; } var ablSelected = formName.abl.value; string += "\n\nABL: "+formName.abl[ablSelected].text; if(formName.name == "retractionForm") { string += "\n\nSegment | Retraction distance | Retraction speed | Extra restart distance | Unretract speed | Z hop\n"; string += " F | "+formName.ret_f1.value+" mm | "+formName.ret_f2.value+" mm/sec | "+formName.ret_f3.value+" mm | "+formName.ret_f4.value+" mm/sec | "+formName.ret_f5.value+" mm\n"; string += " E | "+formName.ret_e1.value+" mm | "+formName.ret_e2.value+" mm/sec | "+formName.ret_e3.value+" mm | "+formName.ret_e4.value+" mm/sec | "+formName.ret_e5.value+" mm\n"; string += " D | "+formName.ret_d1.value+" mm | "+formName.ret_d2.value+" mm/sec | "+formName.ret_d3.value+" mm | "+formName.ret_d4.value+" mm/sec | "+formName.ret_d5.value+" mm\n"; string += " C | "+formName.ret_c1.value+" mm | "+formName.ret_c2.value+" mm/sec | "+formName.ret_c3.value+" mm | "+formName.ret_c4.value+" mm/sec | "+formName.ret_c5.value+" mm\n"; string += " B | "+formName.ret_b1.value+" mm | "+formName.ret_b2.value+" mm/sec | "+formName.ret_b3.value+" mm | "+formName.ret_b4.value+" mm/sec | "+formName.ret_b5.value+" mm\n"; string += " A | "+formName.ret_a1.value+" mm | "+formName.ret_a2.value+" mm/sec | "+formName.ret_a3.value+" mm | "+formName.ret_a4.value+" mm/sec | "+formName.ret_a5.value+" mm\n"; } else { string += "\n\nRetraction distance: "+formName.retdist.value+" mm\n"; string += "Retraction speed: "+formName.retspeed.value+" mm/sec\n"; string += "Extra restart distance: "+formName.retdistextra.value+" mm\n"; string += "Z hop: "+formName.zhop.value+" mm\n"; } if(formName.name == "accelerationForm") { string += "\nBase feedrate: "+formName.feedrate.value+" mm/s\n\n"; var jjd = formName.jerk_or_jd.value; if(jjd == "jerk") { string += "Segment | M204 P Acceleration | M205 Jerk X | M205 Jerk Y| M205 Jerk Z \n"; string += " F | "+formName.accel_f1.value+" mm/sec/sec | "+formName.accel_f2.value+" mm | "+formName.accel_f3.value+" mm | "+formName.accel_f5.value+" mm\n"; string += " E | "+formName.accel_e1.value+" mm/sec/sec | "+formName.accel_e2.value+" mm | "+formName.accel_e3.value+" mm | "+formName.accel_e5.value+" mm\n"; string += " D | "+formName.accel_d1.value+" mm/sec/sec | "+formName.accel_d2.value+" mm | "+formName.accel_d3.value+" mm | "+formName.accel_d5.value+" mm\n"; string += " C | "+formName.accel_c1.value+" mm/sec/sec | "+formName.accel_c2.value+" mm | "+formName.accel_c3.value+" mm | "+formName.accel_c5.value+" mm\n"; string += " B | "+formName.accel_b1.value+" mm/sec/sec | "+formName.accel_b2.value+" mm | "+formName.accel_b3.value+" mm | "+formName.accel_b5.value+" mm\n"; string += " A | "+formName.accel_a1.value+" mm/sec/sec | "+formName.accel_a2.value+" mm | "+formName.accel_a3.value+" mm | "+formName.accel_a5.value+" mm\n"; } else { string += "Segment | M204 P Acceleration | M205 Junction Deviation\n"; string += " F | "+formName.accel_f1.value+" mm/sec/sec | "+formName.accel_f4.value+"\n"; string += " E | "+formName.accel_e1.value+" mm/sec/sec | "+formName.accel_e4.value+"\n"; string += " D | "+formName.accel_d1.value+" mm/sec/sec | "+formName.accel_d4.value+"\n"; string += " C | "+formName.accel_c1.value+" mm/sec/sec | "+formName.accel_c4.value+"\n"; string += " B | "+formName.accel_b1.value+" mm/sec/sec | "+formName.accel_b4.value+"\n"; string += " A | "+formName.accel_a1.value+" mm/sec/sec | "+formName.accel_a4.value+"\n"; } } downloadFile(fileName, string); }