checkpoint belt multi-extruder work

This commit is contained in:
Stewart Allen 2021-11-16 22:07:49 -05:00
commit 92599a4dfc
5 changed files with 66 additions and 31 deletions

View file

@ -693,16 +693,24 @@
* scale polygon around origin * scale polygon around origin
*/ */
PRO.scale = function(scale, round) { PRO.scale = function(scale, round) {
let x,y,z;
if (typeof(scale) === 'number') {
x = y = z = scale;
} else {
x = scale.x;
y = scale.y;
z = scale.z;
}
this._bounds = undefined; this._bounds = undefined;
this.points = this.points.map(point => { this.points.forEach(point => {
if (round) { if (round) {
point.x = (point.x * scale).round(round); point.x = (point.x * x).round(round);
point.y = (point.y * scale).round(round); point.y = (point.y * y).round(round);
point.z = (point.z * scale).round(round); point.z = (point.z * z).round(round);
} else { } else {
point.x = point.x * scale; point.x = point.x * x;
point.y = point.y * scale; point.y = point.y * y;
point.z = point.z * scale; point.z = point.z * z;
} }
}); });
if (this.inner) { if (this.inner) {

View file

@ -1094,6 +1094,7 @@
if (MODE === MODES.SLA && !callback) { if (MODE === MODES.SLA && !callback) {
callback = preparePreview; callback = preparePreview;
} }
// force layout in belt mode when widget exceeds bed length // force layout in belt mode when widget exceeds bed length
if (WIDGETS.length && settings.device.bedBelt) { if (WIDGETS.length && settings.device.bedBelt) {
let doLayout = false; let doLayout = false;
@ -1109,6 +1110,15 @@
} }
} }
let process = settings.process,
device = settings.device,
isBelt = device.bedBelt,
mode = settings.mode,
now = Date.now(),
totvert = 0,
track = {},
totalProgress;
// clear completion marks // clear completion marks
complete = {}; complete = {};
@ -1119,42 +1129,49 @@
API.conf.save(); API.conf.save();
API.event.emit('slice.begin', getMode()); API.event.emit('slice.begin', getMode());
let slicing = WIDGETS.slice().filter(w => !w.track.ignore), let slicing = WIDGETS.slice().filter(w => !w.track.ignore);
totalProgress,
track = {},
mode = settings.mode,
now = Date.now(),
totvert = 0,
defvert;
// determing this widgets % of processing time estimated by vertex count // determing this widgets % of processing time estimated by vertex count
for (let widget of slicing) { for (let widget of slicing) {
totvert += widget.getVertices().count; totvert += widget.getVertices().count;
} }
defvert = totvert / slicing.length; let defvert = totvert / slicing.length;
setOpacity(color.slicing_opacity); setOpacity(color.slicing_opacity);
STACKS.clear();
if (settings.device.bedBelt) {
KIRI.client.clear();
}
KIRI.client.sync();
KIRI.client.rotate(settings);
let segtimes = {}, let segtimes = {},
segNumber = 0, segNumber = 0,
errored = false, errored = false,
startTime = Date.now(), startTime = Date.now(),
toSlice = slicing.slice(), toSlice = slicing.slice(),
camOrLaser = mode === 'CAM' || mode === 'LASER', camOrLaser = mode === 'CAM' || mode === 'LASER',
extruders = {},
lastMsg; lastMsg;
for (let widget of toSlice) { for (let widget of toSlice) {
widget.stats.progress = 0; widget.stats.progress = 0;
widget.setColor(color.slicing); widget.setColor(color.slicing);
extruders[widget.anno.extruder] = widget.anno.extruder;
} }
// in multi-material belt mode, the anchor needs to be extended
// to allow room for the purge tower to be built. calculate here
extruders = Object.values(extruders);
if (isBelt && extruders.length > 1 && process.outputPurgeTower) {
process.beltAnchor = Math.max(
process.firstLayerBeltLead,
Math.sqrt(process.outputPurgeTower) * extruders.length * (1/Math.sqrt(2)));
} else {
process.beltAnchor = process.firstLayerBeltLead;
}
STACKS.clear();
if (isBelt) {
KIRI.client.clear();
}
KIRI.client.sync();
KIRI.client.rotate(settings);
sliceNext(); sliceNext();
function sliceNext() { function sliceNext() {

View file

@ -313,7 +313,7 @@ KIRI.worker = {
let ypos = settings.device.bedDepth / 2 + track.pos.y + miny; let ypos = settings.device.bedDepth / 2 + track.pos.y + miny;
let rotation = (Math.PI / 180) * 45; let rotation = (Math.PI / 180) * 45;
// move to accomodate anchor // move to accomodate anchor
ypos += (settings.process.firstLayerBeltLead || 0); ypos += (settings.process.beltAnchor || 0);
for (let w of group) { for (let w of group) {
w.moveMesh(0, miny, 0); w.moveMesh(0, miny, 0);
} }
@ -340,7 +340,7 @@ KIRI.worker = {
let { xpos, ypos } = widget.belt; let { xpos, ypos } = widget.belt;
let { dy, dz } = widget.belt; let { dy, dz } = widget.belt;
// move to accomodate anchor // move to accomodate anchor
dy -= (settings.process.firstLayerBeltLead || 0) ; dy -= (settings.process.beltAnchor || 0) ;
widget.rotinfo = { angle: 45, dy, dz, xpos, ypos }; widget.rotinfo = { angle: 45, dy, dz, xpos, ypos };
for (let others of group.slice(1)) { for (let others of group.slice(1)) {
others.rotinfo = widget.rotinfo; others.rotinfo = widget.rotinfo;

View file

@ -111,7 +111,7 @@
printPoint = null; printPoint = null;
let raft = function(height, angle, spacing, speed, extrude) { let raft = function(height, angle, spacing, speed, extrude) {
let 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();
@ -329,13 +329,23 @@
let box = rec.rect.clone().setZ(z); let box = rec.rect.clone().setZ(z);
let fill = (purgeOn ? rec.full : rec.sparse).clone().setZ(z); let fill = (purgeOn ? rec.full : rec.sparse).clone().setZ(z);
if (isBelt) { if (isBelt) {
let scale = z >= 0 ? 0 : 1 + ((z / blokw));
if (scale) {
box.scale({x:1, y:scale, z:1});
let inset = box.offset(rec.diameter/2);
if (inset) {
fill = linesToPoly(POLY.fillArea(inset, 90, rec.diameter * 5));
} else {
fill = undefined;
}
}
// offset by nozzle diameter + half step (shell) then angled // offset by nozzle diameter + half step (shell) then angled
let exo = rec.diameter * (1/Math.sqrt(2)) * 1.5; let exo = rec.diameter * beltfact * 1.5;
box.move({x:0, y:z - exo, z:0}); box.move({x:0, y:z - exo, z:0});
fill.move({x:0, y:z - exo, z:0}); if (fill) fill.move({x:0, y:z - exo, z:0});
if (offset) { if (offset) {
box.move(offset); box.move(offset);
fill.move(offset); if (fill) fill.move(offset);
} }
} }
start = print.polyPrintPath(box, start, layer, { start = print.polyPrintPath(box, start, layer, {
@ -344,7 +354,7 @@
simple: true, simple: true,
open: false, open: false,
}); });
start = print.polyPrintPath(fill, start, layer, { if (fill) start = print.polyPrintPath(fill, start, layer, {
tool, tool,
rate, rate,
simple: true, simple: true,
@ -451,6 +461,7 @@
layerout.anchor = slice.belt && slice.belt.anchor; layerout.anchor = slice.belt && slice.belt.anchor;
// detect extruder change and print purge block // detect extruder change and print purge block
if (!lastOut || lastOut.extruder !== slice.extruder) { if (!lastOut || lastOut.extruder !== slice.extruder) {
if (slice.extruder >= 0)
printPoint = purge(slice.extruder, track, layerout, printPoint, slice.z, undefined, offset); printPoint = purge(slice.extruder, track, layerout, printPoint, slice.z, undefined, offset);
} }
let wtb = slice.widget.track.box; let wtb = slice.widget.track.box;

View file

@ -385,8 +385,7 @@
} }
// array of added top.fill_sparse arrays // array of added top.fill_sparse arrays
let adds = []; let adds = [];
// add enough lead in layers to fill anchor area let anchorlen = process.beltAnchor * beltfact;
let anchorlen = process.firstLayerBeltLead * beltfact;
while (anchorlen && start && anchorlen >= sliceHeight) { while (anchorlen && start && anchorlen >= sliceHeight) {
let addto = start.down; let addto = start.down;
if (!addto) { if (!addto) {