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
*/
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.points = this.points.map(point => {
this.points.forEach(point => {
if (round) {
point.x = (point.x * scale).round(round);
point.y = (point.y * scale).round(round);
point.z = (point.z * scale).round(round);
point.x = (point.x * x).round(round);
point.y = (point.y * y).round(round);
point.z = (point.z * z).round(round);
} else {
point.x = point.x * scale;
point.y = point.y * scale;
point.z = point.z * scale;
point.x = point.x * x;
point.y = point.y * y;
point.z = point.z * z;
}
});
if (this.inner) {

View file

@ -1094,6 +1094,7 @@
if (MODE === MODES.SLA && !callback) {
callback = preparePreview;
}
// force layout in belt mode when widget exceeds bed length
if (WIDGETS.length && settings.device.bedBelt) {
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
complete = {};
@ -1119,42 +1129,49 @@
API.conf.save();
API.event.emit('slice.begin', getMode());
let slicing = WIDGETS.slice().filter(w => !w.track.ignore),
totalProgress,
track = {},
mode = settings.mode,
now = Date.now(),
totvert = 0,
defvert;
let slicing = WIDGETS.slice().filter(w => !w.track.ignore);
// determing this widgets % of processing time estimated by vertex count
for (let widget of slicing) {
totvert += widget.getVertices().count;
}
defvert = totvert / slicing.length;
let defvert = totvert / slicing.length;
setOpacity(color.slicing_opacity);
STACKS.clear();
if (settings.device.bedBelt) {
KIRI.client.clear();
}
KIRI.client.sync();
KIRI.client.rotate(settings);
let segtimes = {},
segNumber = 0,
errored = false,
startTime = Date.now(),
toSlice = slicing.slice(),
camOrLaser = mode === 'CAM' || mode === 'LASER',
extruders = {},
lastMsg;
for (let widget of toSlice) {
widget.stats.progress = 0;
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();
function sliceNext() {

View file

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

View file

@ -111,7 +111,7 @@
printPoint = null;
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) {
// use first point of first brim as start point
if (printPoint === null) printPoint = brim.first();
@ -329,13 +329,23 @@
let box = rec.rect.clone().setZ(z);
let fill = (purgeOn ? rec.full : rec.sparse).clone().setZ(z);
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
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});
fill.move({x:0, y:z - exo, z:0});
if (fill) fill.move({x:0, y:z - exo, z:0});
if (offset) {
box.move(offset);
fill.move(offset);
if (fill) fill.move(offset);
}
}
start = print.polyPrintPath(box, start, layer, {
@ -344,7 +354,7 @@
simple: true,
open: false,
});
start = print.polyPrintPath(fill, start, layer, {
if (fill) start = print.polyPrintPath(fill, start, layer, {
tool,
rate,
simple: true,
@ -451,6 +461,7 @@
layerout.anchor = slice.belt && slice.belt.anchor;
// detect extruder change and print purge block
if (!lastOut || lastOut.extruder !== slice.extruder) {
if (slice.extruder >= 0)
printPoint = purge(slice.extruder, track, layerout, printPoint, slice.z, undefined, offset);
}
let wtb = slice.widget.track.box;

View file

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