Files
teachingtechYT.github.io/js/gcodeprocessing.js
lawgicau 37752fd6df Merge gcode processing into one function
Instead of functions for each gcode generator, one function that processes common changes plus specific for each test. Much less code and easier to add future tests.
2021-07-15 00:25:56 +10:00

1415 lines
69 KiB
JavaScript

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(/M140 S60/g, "; no heated bed");
gcode = gcode.replace(/M190 S60/g, "; no heated bed");
} else {
gcode = gcode.replace(/M140 S60/g, "M140 S"+bedTemp+" ; custom bed temp");
gcode = gcode.replace(/M190 S60/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 L1 ; 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);
}