checkpoint belt multi-extruder work
This commit is contained in:
parent
333d3b2b88
commit
92599a4dfc
5 changed files with 66 additions and 31 deletions
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue