checkpoint multi-extruder work

This commit is contained in:
Stewart Allen 2020-04-10 19:11:20 -04:00
commit 24b7a6456b
3 changed files with 157 additions and 97 deletions

View file

@ -56,7 +56,6 @@ let gs_kiri_conf = exports;
extFilament: device.filamentSize, extFilament: device.filamentSize,
extNozzle: device.nozzleSize, extNozzle: device.nozzleSize,
extSelect: ["T0"], extSelect: ["T0"],
extDeselect: [],
extOffsetX: 0, extOffsetX: 0,
extOffsetY: 0 extOffsetY: 0
}]; }];
@ -113,7 +112,6 @@ let gs_kiri_conf = exports;
if (rec.offset_x) e.extOffsetX = rec.offset_x; if (rec.offset_x) e.extOffsetX = rec.offset_x;
if (rec.offset_y) e.extOffsetY = rec.offset_y; if (rec.offset_y) e.extOffsetY = rec.offset_y;
if (rec.select) e.extSelect = rec.select; if (rec.select) e.extSelect = rec.select;
if (rec.deselect) e.extDeselect= rec.deselect;
device.extruders.push(e); device.extruders.push(e);
}); });
} else { } else {
@ -476,7 +474,6 @@ let gs_kiri_conf = exports;
extFilament: 1.75, extFilament: 1.75,
extNozzle: 0.4, extNozzle: 0.4,
extSelect: ["T0"], extSelect: ["T0"],
extDeselect: [],
extOffsetX: 0, extOffsetX: 0,
extOffsetY: 0 extOffsetY: 0
}] }]

View file

@ -2,7 +2,7 @@
"use strict"; "use strict";
var gs_kiri_fdm = exports; let gs_kiri_fdm = exports;
(function() { (function() {
@ -10,7 +10,7 @@ var gs_kiri_fdm = exports;
if (!self.kiri.driver) self.kiri.driver = { }; if (!self.kiri.driver) self.kiri.driver = { };
if (self.kiri.driver.FDM) return; if (self.kiri.driver.FDM) return;
var KIRI = self.kiri, let KIRI = self.kiri,
BASE = self.base, BASE = self.base,
DBUG = BASE.debug, DBUG = BASE.debug,
UTIL = BASE.util, UTIL = BASE.util,
@ -43,7 +43,7 @@ var gs_kiri_fdm = exports;
* @param {Function} ondone (called when complete with an array of Slice objects) * @param {Function} ondone (called when complete with an array of Slice objects)
*/ */
function slice(settings, widget, onupdate, ondone) { function slice(settings, widget, onupdate, ondone) {
var spro = settings.process, let spro = settings.process,
sdev = settings.device, sdev = settings.device,
update_start = Date.now(), update_start = Date.now(),
minSolid = spro.sliceSolidMinArea, minSolid = spro.sliceSolidMinArea,
@ -116,12 +116,12 @@ var gs_kiri_fdm = exports;
slice.invalidateSupports(); slice.invalidateSupports();
}); });
var supportEnabled = spro.sliceSupportEnable && spro.sliceSupportDensity > 0.0, let supportEnabled = spro.sliceSupportEnable && spro.sliceSupportDensity > 0.0,
supportMinArea = spro.sliceSupportArea; supportMinArea = spro.sliceSupportArea;
// create shells and diff inner fillable areas // create shells and diff inner fillable areas
forSlices(0.0, 0.2, function(slice) { forSlices(0.0, 0.2, function(slice) {
var solid = ( let solid = (
slice.index < spro.sliceBottomLayers || slice.index < spro.sliceBottomLayers ||
slice.index > slices.length - spro.sliceTopLayers-1 || slice.index > slices.length - spro.sliceTopLayers-1 ||
spro.sliceFillSparse > 0.95 spro.sliceFillSparse > 0.95
@ -372,13 +372,14 @@ var gs_kiri_fdm = exports;
* @param {Function} update incremental callback * @param {Function} update incremental callback
*/ */
function printSetup(print, update) { function printSetup(print, update) {
var widgets = print.widgets, let widgets = print.widgets,
settings = print.settings, settings = print.settings,
device = settings.device, device = settings.device,
nozzle = device.extruders[0].extNozzle, nozzle = device.extruders[0].extNozzle,
process = settings.process, process = settings.process,
mode = settings.mode, mode = settings.mode,
output = print.output, output = print.output,
bounds = settings.bounds,
printPoint = newPoint(0,0,0), printPoint = newPoint(0,0,0),
firstLayerHeight = process.firstSliceHeight || process.sliceHeight, firstLayerHeight = process.firstSliceHeight || process.sliceHeight,
maxLayers = 0, maxLayers = 0,
@ -386,7 +387,7 @@ var gs_kiri_fdm = exports;
zoff = 0, zoff = 0,
meshIndex, meshIndex,
lastIndex, lastIndex,
lastOut, // lastOut,
closest, closest,
mindist, mindist,
minidx, minidx,
@ -398,12 +399,12 @@ var gs_kiri_fdm = exports;
// create brim, skirt, raft if specificed in FDM mode (code shared by laser) // create brim, skirt, raft if specificed in FDM mode (code shared by laser)
if (process.outputBrimCount || process.outputRaft) { if (process.outputBrimCount || process.outputRaft) {
var brims = [], let brims = [],
offset = process.outputBrimOffset || (process.outputRaft ? 4 : 0); offset = process.outputBrimOffset || (process.outputRaft ? 4 : 0);
// compute first brim // compute first brim
widgets.forEach(function(widget) { widgets.forEach(function(widget) {
var tops = []; let tops = [];
// collect top outer polygons // collect top outer polygons
widget.slices[0].tops.forEach(function(top) { widget.slices[0].tops.forEach(function(top) {
tops.push(top.poly.clone()); tops.push(top.poly.clone());
@ -425,27 +426,27 @@ var gs_kiri_fdm = exports;
// merge brims // merge brims
brims = POLY.union(brims); brims = POLY.union(brims);
// if brim is offset, the expand and shrink to cause brims to merge // if brim is offset, over-expand then shrink to induce brims to merge
if (offset && brims.length) { if (offset && brims.length) {
var extra = process.sliceSupportExtra + 2; let extra = process.sliceSupportExtra + 2;
brims = POLY.expand(brims, extra, 0, null, 1); brims = POLY.expand(brims, extra, 0, null, 1);
brims = POLY.expand(brims, -extra, 0, null, 1); brims = POLY.expand(brims, -extra, 0, null, 1);
} }
// if raft is specified // if raft is specified
if (process.outputRaft) { if (process.outputRaft) {
var offset = newPoint(0,0,0), let offset = newPoint(0,0,0),
height = nozzle; height = nozzle;
// cause first point of raft to be used // cause first point of raft to be used
printPoint = null; printPoint = null;
var raft = function(height, angle, spacing, speed, extrude) { let raft = function(height, angle, spacing, speed, extrude) {
var slice = kiri.newSlice(zoff + height / 2); let slice = kiri.newSlice(zoff + height / 2);
brims.forEach(function(brim) { brims.forEach(function(brim) {
// use first point of first brim as start point // use first point of first brim as start point
if (printPoint === null) printPoint = brim.first(); if (printPoint === null) printPoint = brim.first();
var t = slice.addTop(brim); let t = slice.addTop(brim);
t.traces = [ brim ]; t.traces = [ brim ];
t.inner = POLY.expand(t.traces, -nozzle * 0.5, 0, null, 1); t.inner = POLY.expand(t.traces, -nozzle * 0.5, 0, null, 1);
// tweak bounds for fill to induce an offset // tweak bounds for fill to induce an offset
@ -481,7 +482,7 @@ var gs_kiri_fdm = exports;
else else
// if using brim vs raft // if using brim vs raft
if (process.outputBrimCount) { if (process.outputBrimCount) {
var polys = [], let polys = [],
preout = []; preout = [];
// expand brims // expand brims
@ -508,13 +509,58 @@ var gs_kiri_fdm = exports;
preout.last().retract = true; preout.last().retract = true;
} }
} }
// TODO recompute bounds for purge block offsets
} }
let extruders = [];
let extcount = 0;
// find max layers (for updates) // find max layers (for updates)
// generate list of used extruders for purge blocks
widgets.forEach(function(widget) { widgets.forEach(function(widget) {
maxLayers = Math.max(maxLayers, widget.slices.length); maxLayers = Math.max(maxLayers, widget.slices.length);
let extruder = settings.widget[widget.id].extruder;
if (extruders.indexOf(extruder) < 0) {
extruders[extruder] = {};
extcount++;
}
}); });
let blokpos, walkpos;
if (bounds.min.x < bounds.min.y) {
let dx = ((bounds.max.x - bounds.min.x) - (extcount * 5)) / 2;
blokpos = { x:bounds.min.x + dx, y: bounds.max.y + 5};
walkpos = { x:10, y: 0};
} else {
let dy = ((bounds.max.y - bounds.min.y) - (extcount * 5)) / 2;
blokpos = { x:bounds.max.x + 5, y: bounds.min.y + dy};
walkpos = { x:0, y: 10};
}
// compute purge blocks
extruders = extruders.map((ext,i) => {
if (!ext) return ext;
let pos = {x:blokpos.x, y:blokpos.y, z:0},
rec = {
extruder: i,
poly: BASE.newPolygon().centerRectangle(pos, 8, 8)
};
blokpos.x += walkpos.x;
blokpos.y += walkpos.y;
return rec;
});
// generate purge block for given nozzle
function purge(nozzle, track, layer, start, z, using) {
let rec = track[nozzle];
if (rec) {
track[nozzle] = null;
return print.polyPrintPath(rec.poly.clone().setZ(z), start, layer, {tool:using || nozzle});
} else {
console.log({already_purged: nozzle, from: track, layer});
}
}
// for each layer until no layers are found // for each layer until no layers are found
for (;;) { for (;;) {
// create list of mesh slice arrays with their platform offsets // create list of mesh slice arrays with their platform offsets
@ -530,6 +576,10 @@ var gs_kiri_fdm = exports;
// exit if no slices // exit if no slices
if (slices.length === 0) break; if (slices.length === 0) break;
// track purge blocks generated for each layer
let track = extruders.slice();
let lastOut;
// iterate over layer slices, find closest widget, print, eliminate // iterate over layer slices, find closest widget, print, eliminate
for (;;) { for (;;) {
found = 0; found = 0;
@ -555,8 +605,8 @@ var gs_kiri_fdm = exports;
slices[minidx] = null; slices[minidx] = null;
closest.offset.z = zoff; closest.offset.z = zoff;
// detect extruder change and print purge block // detect extruder change and print purge block
if (lastOut && lastOut.extruder !== closest.slice.extruder) { if (!lastOut || lastOut.extruder !== closest.slice.extruder) {
console.log({extruder_swap: closest.slice.extruder, from: lastOut.extruder}); printPoint = purge(closest.slice.extruder, track, layerout, printPoint, closest.slice.z);
} }
// output seek to start point between mesh slices if previous data // output seek to start point between mesh slices if previous data
printPoint = print.slicePrintPath( printPoint = print.slicePrintPath(
@ -570,15 +620,22 @@ var gs_kiri_fdm = exports;
lastIndex = minidx; lastIndex = minidx;
} }
layerout.layer = layer;
// if layer produced output, append to output array // if layer produced output, append to output array
if (layerout.length) output.append(layerout); if (layerout.length) output.append(layerout);
// notify progress // notify progress
layer++; layerout.layer = layer++;
update(layer / maxLayers); update(layer / maxLayers);
// if a declared extruder isn't used in a layer, use selected
// extruder to fill the relevant purge blocks for later support
track.forEach(ext => {
if (ext) {
console.log({purge_block_unused: ext.extruder, using: lastOut.extruder});
printPoint = purge(ext.extruder, track, layerout, printPoint, lastOut.z, lastOut.extruder);
}
});
// retract after last layer // retract after last layer
if (layer === maxLayers && layerout.length) { if (layer === maxLayers && layerout.length) {
layerout.last().retract = true; layerout.last().retract = true;
@ -586,6 +643,7 @@ var gs_kiri_fdm = exports;
slices = []; slices = [];
layerout = []; layerout = [];
lastOut = undefined;
} }
}; };
@ -593,18 +651,19 @@ var gs_kiri_fdm = exports;
* @returns {Array} gcode lines * @returns {Array} gcode lines
*/ */
function printExport(print, online) { function printExport(print, online) {
var layers = print.output, let layers = print.output,
settings = print.settings, settings = print.settings,
device = settings.device, device = settings.device,
extruders = device.extruders, extruders = device.extruders,
process = settings.process, process = settings.process,
fan_power = device.gcodeFan, fan_power = device.gcodeFan,
trackLayers = device.gcodeLayer, gcodeLayer = device.gcodeLayer,
trackProgress = device.gcodeTrack, gcodeTrack = device.gcodeTrack,
tool = 0, tool = 0,
extruder = extruders[tool], extruder = extruders[tool],
offset_x = extruder.extOffsetX, offset_x = extruder.extOffsetX,
offset_y = extruder.extOffsetY, offset_y = extruder.extOffsetY,
extrudeAbs = device.extrudeAbs,
time = 0, time = 0,
layer = 0, layer = 0,
pause = [], pause = [],
@ -621,16 +680,23 @@ var gs_kiri_fdm = exports;
last = null, last = null,
zpos = 0, zpos = 0,
zhop = process.zHopDistance || 0, zhop = process.zHopDistance || 0,
seekMMM = process.outputSeekrate * 60,
retDist = process.outputRetractDist,
retSpeed = process.outputRetractSpeed * 60,
retDwell = process.outputRetractDwell || 0,
timeDwell = retDwell / 1000,
offset = process.outputOriginCenter ? null : { offset = process.outputOriginCenter ? null : {
x: device.bedWidth/2, x: device.bedWidth/2,
y: device.bedDepth/2 y: device.bedDepth/2
}, },
consts = { subst = {
retract_speed: retSpeed,
retract_distance: retDist,
temp: process.firstLayerNozzleTemp || process.outputTemp, temp: process.firstLayerNozzleTemp || process.outputTemp,
temp_bed: process.firstLayerBedTemp || process.outputBedTemp, temp_bed: process.firstLayerBedTemp || process.outputBedTemp,
bed_temp: process.firstLayerBedTemp || process.outputBedTemp, bed_temp: process.firstLayerBedTemp || process.outputBedTemp,
fan_speed: process.outputFanMax, fan_speed: process.outputFanMax,
speed: process.outputFanMax, speed: process.outputFanMax, // legacy
top: offset ? device.bedDepth : device.bedDepth/2, top: offset ? device.bedDepth : device.bedDepth/2,
left: offset ? 0 : -device.bedWidth/2, left: offset ? 0 : -device.bedWidth/2,
right: offset ? device.bedWidth : device.bedWidth/2, right: offset ? device.bedWidth : device.bedWidth/2,
@ -640,16 +706,7 @@ var gs_kiri_fdm = exports;
nozzle: 0, nozzle: 0,
tool: 0 tool: 0
}, },
seekMMM = process.outputSeekrate * 60,
retDist = process.outputRetractDist,
retSpeed = process.outputRetractSpeed * 60,
retDwell = process.outputRetractDwell || 0,
timeDwell = retDwell / 1000,
constReplace = print.constReplace,
pidx, path, out, speedMMM, emitMM, emitPerMM, lastp, laste, dist, pidx, path, out, speedMMM, emitMM, emitPerMM, lastp, laste, dist,
appendAll = function(arr) {
arr.forEach(function(line) { append(line) });
},
append, append,
lines = 0, lines = 0,
bytes = 0; bytes = 0;
@ -657,7 +714,7 @@ var gs_kiri_fdm = exports;
// console.log({print: print.widgets, meta:settings.widget, extruders, nozzleSize, filamentSize}); // console.log({print: print.widgets, meta:settings.widget, extruders, nozzleSize, filamentSize});
(process.gcodePauseLayers || "").split(",").forEach(function(lv) { (process.gcodePauseLayers || "").split(",").forEach(function(lv) {
var v = parseInt(lv); let v = parseInt(lv);
if (v >= 0) pause.push(v); if (v >= 0) pause.push(v);
}); });
@ -682,21 +739,37 @@ var gs_kiri_fdm = exports;
} }
} }
append("; Generated by Kiri:Moto " + exports.VERSION); function appendSub(line) {
append("; "+new Date().toString()); append(print.constReplace(line, subst));
append(constReplace("; Bed left:{left} right:{right} top:{top} bottom:{bottom}", consts)); }
function appendAll(arr) {
arr.forEach(function(line) { append(line) });
}
function appendAllSub(arr) {
arr.forEach(function(line) { appendSub(line) });
}
append(`; Generated by Kiri:Moto ${exports.VERSION}`);
append(`; ${new Date().toString()}`);
appendSub("; Bed left:{left} right:{right} top:{top} bottom:{bottom}");
append("; --- process ---"); append("; --- process ---");
for (var pk in process) { for (let pk in process) {
append("; " + pk + " = " + process[pk]); append("; " + pk + " = " + process[pk]);
} }
append("; --- startup ---"); append("; --- startup ---");
var t0 = false; let t0 = false;
var t1 = false; let t1 = false;
for (var i=0; i<device.gcodePre.length; i++) { for (let i=0; i<device.gcodePre.length; i++) {
var line = device.gcodePre[i]; let line = device.gcodePre[i];
if (line.indexOf('T0') >= 0) t0 = true; if (line.indexOf('T0') >= 0) t0 = true; else
if (line.indexOf('T1') >= 0) t1 = true; if (line.indexOf('T1') >= 0) t1 = true; else
if (device.extrudeAbs && line.indexOf('E') > 0) { if (line.indexOf('M82') >= 0) extrudeAbs = true; else
if (line.indexOf('M83') >= 0) extrudeAbs = false; else
if (line.indexOf('G90') >= 0) extrudeAbs = true; else
if (line.indexOf('G91') >= 0) extrudeAbs = false; else
if (extrudeAbs && line.indexOf('E') > 0) {
line.split(";")[0].split(' ').forEach(function (tok) { line.split(";")[0].split(' ').forEach(function (tok) {
// use max E position from gcode-preamble // use max E position from gcode-preamble
if (tok[0] == 'E') { if (tok[0] == 'E') {
@ -704,17 +777,17 @@ var gs_kiri_fdm = exports;
} }
}); });
} }
append(constReplace(line, consts)); appendSub(line);
} }
function dwell(ms) { function dwell(ms) {
append("G4 P" + ms); append(`G4 P${ms}`);
time += timeDwell; time += timeDwell;
} }
function retract() { function retract() {
retracted = retDist; retracted = retDist;
moveTo({e:-retracted}, retSpeed, "retract " + retDist); moveTo({e:-retracted}, retSpeed, `retract ${retDist}`);
if (zhop) moveTo({z:zpos + zhop}, seekMMM, "zhop up"); if (zhop) moveTo({z:zpos + zhop}, seekMMM, "zhop up");
time += (retDist / retSpeed) * 60 * 2; // retraction time time += (retDist / retSpeed) * 60 * 2; // retraction time
} }
@ -723,7 +796,7 @@ var gs_kiri_fdm = exports;
if (comment) { if (comment) {
append(" ; " + comment); append(" ; " + comment);
} }
var o = [!rate && !newpos.e ? 'G0' : 'G1']; let o = [!rate && !newpos.e ? 'G0' : 'G1'];
if (typeof newpos.x === 'number') { if (typeof newpos.x === 'number') {
pos.x = UTIL.round(newpos.x,decimals); pos.x = UTIL.round(newpos.x,decimals);
o.append(" X").append(pos.x.toFixed(decimals)); o.append(" X").append(pos.x.toFixed(decimals));
@ -738,7 +811,7 @@ var gs_kiri_fdm = exports;
} }
if (typeof newpos.e === 'number') { if (typeof newpos.e === 'number') {
outputLength += newpos.e; outputLength += newpos.e;
if (device.extrudeAbs) { if (extrudeAbs) {
// for cumulative (absolute) extruder positions // for cumulative (absolute) extruder positions
o.append(" E").append(UTIL.round(outputLength, decimals)); o.append(" E").append(UTIL.round(outputLength, decimals));
} else { } else {
@ -749,7 +822,7 @@ var gs_kiri_fdm = exports;
o.append(" F").append(Math.round(rate)); o.append(" F").append(Math.round(rate));
pos.f = rate pos.f = rate
} }
var line = o.join(''); let line = o.join('');
if (last == line) { if (last == line) {
// console.log({dup:line}); // console.log({dup:line});
return; return;
@ -759,7 +832,7 @@ var gs_kiri_fdm = exports;
} }
// calc total distance traveled by head as proxy for progress // calc total distance traveled by head as proxy for progress
var allout = [], totaldistance = 0; let allout = [], totaldistance = 0;
layers.forEach(function(outs) { layers.forEach(function(outs) {
allout.appendAll(outs); allout.appendAll(outs);
}); });
@ -778,23 +851,19 @@ var gs_kiri_fdm = exports;
path.layer === 0 ? path.layer === 0 ?
(process.firstSliceHeight || process.sliceHeight) : path.height); (process.firstSliceHeight || process.sliceHeight) : path.height);
consts.z = zpos.toFixed(2); subst.z = zpos.toFixed(2);
consts.Z = consts.z; subst.Z = subst.z;
consts.layer = layer; subst.layer = layer;
consts.height = path.height.toFixed(3); subst.height = path.height.toFixed(3);
if (pauseCmd && pause.indexOf(layer) >= 0) { if (pauseCmd && pause.indexOf(layer) >= 0) {
for (var i=0; i<pauseCmd.length; i++) { appendAllSub(pauseCmd)
append(constReplace(pauseCmd[i], consts));
}
} }
if (trackLayers && trackLayers.length) { if (gcodeLayer) {
trackLayers.forEach(function(line) { appendAllSub(gcodeLayer);
append(constReplace(line, consts));
});
} else { } else {
append("; --- layer " + layer + " (" + consts.height + " @ " + consts.z + ") ---"); append(`; --- layer ${layer} (${subst.height} @ ${subst.z}) ---`);
} }
if (layer > 0 && process.layerRetract) { if (layer > 0 && process.layerRetract) {
@ -803,25 +872,21 @@ var gs_kiri_fdm = exports;
// enable fan at fan layer // enable fan at fan layer
if (fan_power && layer === process.outputFanLayer) { if (fan_power && layer === process.outputFanLayer) {
append(constReplace(fan_power, consts)); appendSub(fan_power);
} }
// second layer transitions // second layer transitions
if (layer === 1) { if (layer === 1) {
// update temps when first layer overrides are present // update temps when first layer overrides are present
if (process.firstLayerNozzleTemp) { if (process.firstLayerNozzleTemp) {
consts.temp = process.outputTemp; subst.temp = process.outputTemp;
if (t0) { if (t0) appendSub("M104 S{temp} T0");
append(constReplace("M104 S{temp} T0", consts)); if (t1) appendSub("M104 S{temp} T1");
} else if (t1) { if (!(t0 || t1)) appendSub("M104 S{temp} T{tool}");
append(constReplace("M104 S{temp} T1", consts));
} else {
append(constReplace("M104 S{temp} T{tool}", consts));
}
} }
if (process.firstLayerBedTemp) { if (process.firstLayerBedTemp) {
consts.bed_temp = consts.temp_bed = process.outputBedTemp; subst.bed_temp = subst.temp_bed = process.outputBedTemp;
append(constReplace("M140 S{temp_bed} T0", consts)); appendSub("M140 S{temp_bed} T0");
} }
} }
@ -836,8 +901,9 @@ var gs_kiri_fdm = exports;
// look for extruder change and recalc emit factor // look for extruder change and recalc emit factor
if (out.tool !== undefined && out.tool !== tool) { if (out.tool !== undefined && out.tool !== tool) {
appendAllSub(extruder.extSelect);
tool = out.tool; tool = out.tool;
consts.nozzle = consts.tool = tool; subst.nozzle = subst.tool = tool;
extruder = extruders[tool]; extruder = extruders[tool];
offset_x = extruder.extOffsetX; offset_x = extruder.extOffsetX;
offset_y = extruder.extOffsetY; offset_y = extruder.extOffsetY;
@ -853,7 +919,8 @@ var gs_kiri_fdm = exports;
dwell(out.speed); dwell(out.speed);
continue; continue;
} }
var x = out.point.x + offset_x,
let x = out.point.x + offset_x,
y = out.point.y + offset_y, y = out.point.y + offset_y,
z = out.point.z; z = out.point.z;
@ -872,7 +939,7 @@ var gs_kiri_fdm = exports;
// when enabled, resume previous Z // when enabled, resume previous Z
if (zhop) moveTo({z:zpos}, seekMMM, "zhop down"); if (zhop) moveTo({z:zpos}, seekMMM, "zhop down");
// re-engage retracted filament // re-engage retracted filament
moveTo({e:retracted}, retSpeed, "engage " + retracted); moveTo({e:retracted}, retSpeed, `engage ${retracted}`);
retracted = 0; retracted = 0;
// optional dwell after re-engaging filament to allow pressure to build // optional dwell after re-engaging filament to allow pressure to build
if (retDwell) dwell(retDwell); if (retDwell) dwell(retDwell);
@ -897,11 +964,11 @@ var gs_kiri_fdm = exports;
// update time and distance (should calc in moveTo() instead) // update time and distance (should calc in moveTo() instead)
time += (dist / speedMMM) * 60 * 1.5; time += (dist / speedMMM) * 60 * 1.5;
distance += dist; distance += dist;
consts.progress = progress = Math.round((distance / totaldistance) * 100); subst.progress = progress = Math.round((distance / totaldistance) * 100);
// emit tracked progress // emit tracked progress
if (trackProgress && progress != lastProgress) { if (gcodeTrack && progress != lastProgress) {
append(constReplace(trackProgress, consts)); appendSub(gcodeTrack);
lastProgress = progress; lastProgress = progress;
} }
@ -911,15 +978,13 @@ var gs_kiri_fdm = exports;
layer++; layer++;
} }
consts.material = UTIL.round(emitted,2); subst.time = UTIL.round(time,2);
consts.time = UTIL.round(time,2); subst.material = UTIL.round(emitted,2);
append("; --- shutdown ---"); append("; --- shutdown ---");
for (var i=0; i<device.gcodePost.length; i++) { appendAllSub(device.gcodePost);
append(constReplace(device.gcodePost[i], consts)); append(`; --- filament used: ${subst.material} mm ---`);
} append(`; --- print time: ${time}s ---`);
append("; --- filament used: " +consts.material + "mm ---");
append("; --- print time: " + consts.time + "s ---");
// force emit of buffer // force emit of buffer
append(); append();

View file

@ -553,8 +553,8 @@ var gs_kiri_init = exports;
b.onclick = function() { b.onclick = function() {
API.selection.for_widgets(w => { API.selection.for_widgets(w => {
current.widget[w.id] = {extruder: i}; current.widget[w.id] = {extruder: i};
API.platform.update_selected();
}); });
API.platform.update_selected();
}; };
selext.appendChild(b); selext.appendChild(b);
ext.push({id:i, name:i}); ext.push({id:i, name:i});
@ -597,8 +597,7 @@ var gs_kiri_init = exports;
UI.extDel, UI.extDel,
UI.extOffsetX, UI.extOffsetX,
UI.extOffsetY, UI.extOffsetY,
UI.extSelect, UI.extSelect
UI.extDeselect
].forEach(function(e) { ].forEach(function(e) {
e.disabled = !local; e.disabled = !local;
}); });
@ -1139,7 +1138,6 @@ var gs_kiri_init = exports;
extOffsetX: UC.newInput(LANG.dv_exox_s, {title:LANG.dv_exox_l, convert:UC.toFloat, modes:FDM, expert:true}), extOffsetX: UC.newInput(LANG.dv_exox_s, {title:LANG.dv_exox_l, convert:UC.toFloat, modes:FDM, expert:true}),
extOffsetY: UC.newInput(LANG.dv_exoy_s, {title:LANG.dv_exoy_l, convert:UC.toFloat, modes:FDM, expert:true}), extOffsetY: UC.newInput(LANG.dv_exoy_s, {title:LANG.dv_exoy_l, convert:UC.toFloat, modes:FDM, expert:true}),
extSelect: UC.newText(LANG.dv_exts_s, {title:LANG.dv_exts_l, modes:FDM, size:14, height:3, modes:FDM, expert:true}), extSelect: UC.newText(LANG.dv_exts_s, {title:LANG.dv_exts_l, modes:FDM, size:14, height:3, modes:FDM, expert:true}),
extDeselect: UC.newText(LANG.dv_extd_s, {title:LANG.dv_extd_l, modes:FDM, size:14, height:3, modes:FDM, expert:true}),
extrudeAbs: UC.newBoolean(LANG.dv_xtab_s, onBooleanClick, {title:LANG.dv_xtab_l, modes:FDM}), extrudeAbs: UC.newBoolean(LANG.dv_xtab_s, onBooleanClick, {title:LANG.dv_xtab_l, modes:FDM}),
extActions: UC.newTableRow([[ extActions: UC.newTableRow([[
UI.extPrev = UC.newButton("<"), UI.extPrev = UC.newButton("<"),