checkpoint belt work
This commit is contained in:
parent
d89674f1d5
commit
44d54491d7
6 changed files with 103 additions and 116 deletions
|
|
@ -978,9 +978,9 @@
|
||||||
if (settings.device.bedBelt && WIDGETS[0].rotinfo) {
|
if (settings.device.bedBelt && WIDGETS[0].rotinfo) {
|
||||||
let ri = WIDGETS[0].rotinfo;
|
let ri = WIDGETS[0].rotinfo;
|
||||||
// console.log(ri)
|
// console.log(ri)
|
||||||
ri.dy = ri.dz = 0;
|
// ri.dy = ri.dz = 0;
|
||||||
ri.dy = settings.device.bedDepth / 2 - ri.ypos;
|
// ri.dy = settings.device.bedDepth / 2 - ri.ypos;
|
||||||
stack.obj.rotate(WIDGETS[0].rotinfo);
|
// stack.obj.rotate(WIDGETS[0].rotinfo);
|
||||||
}
|
}
|
||||||
segtimes[`${segNumber}_draw`] = Date.now() - startTime;
|
segtimes[`${segNumber}_draw`] = Date.now() - startTime;
|
||||||
}
|
}
|
||||||
|
|
@ -1688,7 +1688,7 @@
|
||||||
if (isBelt) {
|
if (isBelt) {
|
||||||
let bounds = platformUpdateBounds(),
|
let bounds = platformUpdateBounds(),
|
||||||
movey = -(dev.bedDepth / 2 + bounds.min.y);
|
movey = -(dev.bedDepth / 2 + bounds.min.y);
|
||||||
forAllWidgets(widget => widget.move(0, movey + 10, 0));
|
forAllWidgets(widget => widget.move(0, movey + 0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
platform.update_origin();
|
platform.update_origin();
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,7 @@
|
||||||
|
|
||||||
const scope = this,
|
const scope = this,
|
||||||
morph = false,
|
morph = false,
|
||||||
|
// morph = true,
|
||||||
bounds = scope.bounds = {
|
bounds = scope.bounds = {
|
||||||
max: { x:-Infinity, y:-Infinity, z:-Infinity},
|
max: { x:-Infinity, y:-Infinity, z:-Infinity},
|
||||||
min: { x:Infinity, y:Infinity, z:Infinity}
|
min: { x:Infinity, y:Infinity, z:Infinity}
|
||||||
|
|
@ -166,8 +167,8 @@
|
||||||
);
|
);
|
||||||
|
|
||||||
if (morph && belt) {
|
if (morph && belt) {
|
||||||
point.z *= beltfact;
|
|
||||||
point.y -= point.z * beltfact;
|
point.y -= point.z * beltfact;
|
||||||
|
point.z *= beltfact;
|
||||||
}
|
}
|
||||||
|
|
||||||
const retract = (fdm && pos.E < 0) || undefined;
|
const retract = (fdm && pos.E < 0) || undefined;
|
||||||
|
|
@ -226,16 +227,23 @@
|
||||||
lastPos = Object.assign({}, pos);
|
lastPos = Object.assign({}, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
lines.forEach(function(line) {
|
lines.forEach(function(line, idx) {
|
||||||
|
if (idx < 10) console.log({line})
|
||||||
|
if (line.indexOf(';LAYER:') === 0) {
|
||||||
|
newlayer = true;
|
||||||
|
if (idx < 100) console.log({newlayer});
|
||||||
|
}
|
||||||
if (line.indexOf('- LAYER ') > 0) {
|
if (line.indexOf('- LAYER ') > 0) {
|
||||||
seq.height = defh;
|
seq.height = defh;
|
||||||
const hd = line.replace('(','').replace(')','').split(' ');
|
const hd = line.replace('(','').replace(')','').split(' ');
|
||||||
defh = parseFloat(hd[4]);
|
defh = parseFloat(hd[4]);
|
||||||
if (fdm) dz = -defh / 2;
|
if (fdm) dz = -defh / 2;
|
||||||
newlayer = true;
|
newlayer = true;
|
||||||
|
if (idx < 100) console.log({layer: defh});
|
||||||
}
|
}
|
||||||
if (line.indexOf("BED TYPE: BELT") > 0) {
|
if (line.indexOf("BED TYPE: BELT") > 0) {
|
||||||
belt = true;
|
belt = true;
|
||||||
|
if (idx < 100) console.log({isbelt: belt});
|
||||||
}
|
}
|
||||||
line = line.split(";")[0].split(" ").filter(v => v);
|
line = line.split(";")[0].split(" ").filter(v => v);
|
||||||
let cmd = line.shift();
|
let cmd = line.shift();
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,9 @@ KIRI.worker = {
|
||||||
|
|
||||||
let rotation = (Math.PI/180) * (settings.device.bedBelt ? 45 : 0);
|
let rotation = (Math.PI/180) * (settings.device.bedBelt ? 45 : 0);
|
||||||
if (rotation) {
|
if (rotation) {
|
||||||
|
let bounds = widget.getBoundingBox(true);
|
||||||
let track = widget.track;
|
let track = widget.track;
|
||||||
|
// console.log(widget.id, '\n', track.pos, '\n', track.box, '\n', '\n---\n')
|
||||||
xpos = track.pos.x;
|
xpos = track.pos.x;
|
||||||
ypos = track.pos.y + settings.device.bedDepth / 2 - track.box.h / 2;
|
ypos = track.pos.y + settings.device.bedDepth / 2 - track.box.h / 2;
|
||||||
widget.mesh = null;
|
widget.mesh = null;
|
||||||
|
|
@ -83,7 +85,7 @@ KIRI.worker = {
|
||||||
widget._rotate(rotation,0,0,true);
|
widget._rotate(rotation,0,0,true);
|
||||||
widget.center(false, true);
|
widget.center(false, true);
|
||||||
widget.getBoundingBox(true);
|
widget.getBoundingBox(true);
|
||||||
widget.belt = { ypos };
|
widget.belt = { xpos, ypos };
|
||||||
}
|
}
|
||||||
|
|
||||||
widget.slice(settings, function(error) {
|
widget.slice(settings, function(error) {
|
||||||
|
|
@ -106,9 +108,11 @@ KIRI.worker = {
|
||||||
widget.setPoints(null);
|
widget.setPoints(null);
|
||||||
widget._rotate(-rotation,0,0,true);
|
widget._rotate(-rotation,0,0,true);
|
||||||
let wbb = widget.getBoundingBox(true);
|
let wbb = widget.getBoundingBox(true);
|
||||||
|
widget.center(false, true);
|
||||||
let dy = (wbb.max.y + wbb.min.y)/2;
|
let dy = (wbb.max.y + wbb.min.y)/2;
|
||||||
let dz = wbb.min.z;
|
let dz = wbb.min.z;
|
||||||
widget.rotinfo = { angle: 45, dy, dz, xpos, ypos };
|
widget.rotinfo = { angle: 45, dy, dz, xpos, ypos };
|
||||||
|
// console.log(widget.id, '\n', widget.belt, '\n', widget.rotinfo, '\n===\n')
|
||||||
send.data({ rotinfo: widget.rotinfo });
|
send.data({ rotinfo: widget.rotinfo });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@
|
||||||
gcodeLayer = device.gcodeLayer,
|
gcodeLayer = device.gcodeLayer,
|
||||||
gcodeTrack = device.gcodeTrack,
|
gcodeTrack = device.gcodeTrack,
|
||||||
tool = 0,
|
tool = 0,
|
||||||
isBelt = false && device.bedBelt,
|
isBelt = device.bedBelt,
|
||||||
bedType = isBelt ? "belt" : "fixed",
|
bedType = isBelt ? "belt" : "fixed",
|
||||||
extruder = extruders[tool],
|
extruder = extruders[tool],
|
||||||
offset_x = extruder.extOffsetX,
|
offset_x = extruder.extOffsetX,
|
||||||
|
|
@ -77,7 +77,7 @@
|
||||||
bytes = 0,
|
bytes = 0,
|
||||||
bcos = Math.cos(Math.PI/4),
|
bcos = Math.cos(Math.PI/4),
|
||||||
icos = 1 / bcos;
|
icos = 1 / bcos;
|
||||||
|
console.log({isBelt, offset});
|
||||||
(process.gcodePauseLayers || "").split(",").forEach(function(lv) {
|
(process.gcodePauseLayers || "").split(",").forEach(function(lv) {
|
||||||
let v = parseInt(lv);
|
let v = parseInt(lv);
|
||||||
if (v >= 0) pause.push(v);
|
if (v >= 0) pause.push(v);
|
||||||
|
|
@ -199,14 +199,11 @@
|
||||||
}
|
}
|
||||||
let epos = isBelt ? { x: pos.x, y: pos.y, z: pos.z } : pos;
|
let epos = isBelt ? { x: pos.x, y: pos.y, z: pos.z } : pos;
|
||||||
if (isBelt) {
|
if (isBelt) {
|
||||||
// let rpos = new THREE.Vector3(pos.x, pos.y, pos.z);
|
|
||||||
// rpos.applyAxisAngle( taxis, angle );
|
|
||||||
// epos.x = rpos.x;
|
|
||||||
// epos.y = rpos.z * icos;
|
|
||||||
// epos.z = rpos.y + (bcos * rpos.z);
|
|
||||||
epos.x = pos.x;
|
epos.x = pos.x;
|
||||||
epos.z = pos.z * icos;
|
epos.z = pos.z * icos;
|
||||||
epos.y = pos.y + epos.z * bcos;
|
epos.y = pos.y + epos.z * bcos;
|
||||||
|
// epos.z = pos.y * icos;
|
||||||
|
// epos.y = pos.z + (pos.y * icos) * bcos;
|
||||||
}
|
}
|
||||||
if (emit.x) o.append(" X").append(epos.x.toFixed(decimals));
|
if (emit.x) o.append(" X").append(epos.x.toFixed(decimals));
|
||||||
if (emit.y) o.append(" Y").append(epos.y.toFixed(decimals));
|
if (emit.y) o.append(" Y").append(epos.y.toFixed(decimals));
|
||||||
|
|
@ -253,7 +250,8 @@
|
||||||
path.layer === 0 ?
|
path.layer === 0 ?
|
||||||
(process.firstSliceHeight || process.sliceHeight) : path.height);
|
(process.firstSliceHeight || process.sliceHeight) : path.height);
|
||||||
|
|
||||||
subst.z = (zpos + path.height).toFixed(3);
|
subst.z = zpos = path.z;
|
||||||
|
// subst.z = (zpos + path.height).toFixed(3);
|
||||||
subst.Z = subst.z;
|
subst.Z = subst.z;
|
||||||
subst.layer = layer;
|
subst.layer = layer;
|
||||||
subst.height = path.height.toFixed(3);
|
subst.height = path.height.toFixed(3);
|
||||||
|
|
@ -293,7 +291,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// move Z to layer height
|
// move Z to layer height
|
||||||
zpos += path.height;
|
|
||||||
if (layer > 0 || !isBelt) {
|
if (layer > 0 || !isBelt) {
|
||||||
moveTo({z:zpos}, seekMMM);
|
moveTo({z:zpos}, seekMMM);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,9 @@
|
||||||
isThin = settings.controller.lineType === "line",
|
isThin = settings.controller.lineType === "line",
|
||||||
isFlat = settings.controller.lineType === "flat",
|
isFlat = settings.controller.lineType === "flat",
|
||||||
isBelt = device.bedBelt,
|
isBelt = device.bedBelt,
|
||||||
beltYoff = device.bedDepth / 2;
|
beltYoff = device.bedDepth / 2,
|
||||||
|
bcos = Math.cos(Math.PI/4),
|
||||||
|
icos = 1 / bcos;
|
||||||
|
|
||||||
// compute bounds if missing
|
// compute bounds if missing
|
||||||
if (!bounds) {
|
if (!bounds) {
|
||||||
|
|
@ -285,42 +287,45 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const center = {x:0, y:0, z:0};
|
// establish offsets
|
||||||
|
for (let widget of widgets) {
|
||||||
// increment layer count until no widget has remaining slices
|
let offset = widget.mesh ? Object.clone(widget.mesh.position) : {x:0, y:0, z:0};
|
||||||
for (;;) {
|
|
||||||
// create list of mesh slice arrays with their platform offsets
|
|
||||||
for (meshIndex = 0; meshIndex < widgets.length; meshIndex++) {
|
|
||||||
let mesh = widgets[meshIndex].mesh;
|
|
||||||
if (!mesh.widget) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
let widget = mesh.widget;
|
|
||||||
let mslices = widget.slices;
|
|
||||||
if (mslices && mslices[layer]) {
|
|
||||||
let offset = Object.clone(mesh.position || center);
|
|
||||||
if (isBelt) {
|
if (isBelt) {
|
||||||
offset = center;
|
|
||||||
offset.x = widget.rotinfo.xpos;
|
offset.x = widget.rotinfo.xpos;
|
||||||
offset.y = widget.rotinfo.dz;
|
offset.y = widget.belt.miny;
|
||||||
offset.z = widget.rotinfo.ypos;
|
offset.y += widget.rotinfo.ypos * bcos;
|
||||||
|
offset.z = widget.rotinfo.ypos * bcos;
|
||||||
} else {
|
} else {
|
||||||
// when rafts used this is non-zero
|
// when rafts used this is non-zero
|
||||||
offset.z = zoff;
|
offset.z = zoff;
|
||||||
}
|
}
|
||||||
slices.push({
|
widget.offset = offset;
|
||||||
slice: mslices[layer],
|
}
|
||||||
offset: offset,
|
|
||||||
widget: widget
|
// create shuffled slice cake by z offset (slice.z + offset.z)
|
||||||
|
let cake = [];
|
||||||
|
let zrec = {};
|
||||||
|
for (let widget of widgets) {
|
||||||
|
// skip synthesized support widget(s)
|
||||||
|
if (!widget.mesh) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (let slice of widget.slices) {
|
||||||
|
slice.widget = widget;
|
||||||
|
let z = slice.z + widget.offset.z;
|
||||||
|
let rec = zrec[z] = zrec[z] || {z, slices:[]};
|
||||||
|
if (rec.slices.length === 0) {
|
||||||
|
cake.push(rec);
|
||||||
|
}
|
||||||
|
rec.slices.push(slice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cake.sort((a, b) => {
|
||||||
|
return a.z - b.z;
|
||||||
});
|
});
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// exit if no slices
|
|
||||||
if (slices.length === 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// walk cake layers bottom up
|
||||||
|
for (let layer of cake) {
|
||||||
// track purge blocks generated for each layer
|
// track purge blocks generated for each layer
|
||||||
let track = extruders.slice();
|
let track = extruders.slice();
|
||||||
let lastOut;
|
let lastOut;
|
||||||
|
|
@ -328,58 +333,55 @@
|
||||||
|
|
||||||
// iterate over layer slices, find closest widget, print, eliminate
|
// iterate over layer slices, find closest widget, print, eliminate
|
||||||
for (;;) {
|
for (;;) {
|
||||||
closest = null;
|
|
||||||
mindist = Infinity;
|
|
||||||
let order = [];
|
let order = [];
|
||||||
// select slices of the same extruder type first then distance
|
// select slices of the same extruder type first then distance
|
||||||
for (meshIndex = 0; meshIndex < slices.length; meshIndex++) {
|
for (let slice of layer.slices) {
|
||||||
sliceEntry = slices[meshIndex];
|
if (slice.prep) {
|
||||||
if (sliceEntry) {
|
continue;
|
||||||
find = sliceEntry.slice.findClosestPointTo(printPoint.sub(sliceEntry.offset));
|
}
|
||||||
|
let offset = slice.widget.offset;
|
||||||
|
let find = slice.findClosestPointTo(printPoint.sub(offset));
|
||||||
if (find) {
|
if (find) {
|
||||||
let ext = sliceEntry.slice.extruder;
|
let ext = slice.extruder;
|
||||||
let lex = lastOut ? lastOut.extruder : ext;
|
let lex = lastOut ? lastOut.extruder : ext;
|
||||||
let dst = Math.abs(find.distance);
|
let dst = Math.abs(find.distance);
|
||||||
if (ext !== lex) dst *= 10000;
|
// penalize extruder swaps
|
||||||
order.push({dst,sliceEntry,meshIndex});
|
if (ext !== lex) {
|
||||||
|
dst *= 10000;
|
||||||
|
}
|
||||||
|
order.push({dst, slice, offset, z: layer.z});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (order.length === 0) {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
order.sort((a,b) => {
|
order.sort((a,b) => {
|
||||||
return a.dst - b.dst;
|
return a.dst - b.dst;
|
||||||
});
|
});
|
||||||
if (order.length) {
|
let { z, slice, offset } = order[0];
|
||||||
let find = order.shift();
|
slice.prep = true;
|
||||||
closest = find.sliceEntry;
|
|
||||||
minidx = find.meshIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!closest) {
|
|
||||||
if (sliceEntry) lastOut = sliceEntry.slice;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// retract between widgets
|
// retract between widgets
|
||||||
if (layerout.length && minidx !== lastIndex) {
|
if (layerout.length && minidx !== lastIndex) {
|
||||||
layerout.last().retract = true;
|
layerout.last().retract = true;
|
||||||
}
|
}
|
||||||
layerout.height = layerout.height || closest.slice.height;
|
layerout.z = z;
|
||||||
slices[minidx] = null;
|
layerout.height = layerout.height || slice.height;
|
||||||
// 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 !== slice.extruder) {
|
||||||
printPoint = purge(closest.slice.extruder, track, layerout, printPoint, closest.slice.z);
|
printPoint = purge(slice.extruder, track, layerout, printPoint, 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(
|
||||||
closest.slice,
|
slice,
|
||||||
printPoint.sub(closest.offset),
|
printPoint.sub(offset),
|
||||||
closest.offset,
|
offset,
|
||||||
layerout,
|
layerout,
|
||||||
{
|
{
|
||||||
first: closest.slice.index === 0,
|
first: slice.index === 0,
|
||||||
support: closest.widget.support
|
support: slice.widget.support
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
lastOut = closest.slice;
|
lastOut = slice;
|
||||||
lastExt = lastOut.ext
|
lastExt = lastOut.ext
|
||||||
lastIndex = minidx;
|
lastIndex = minidx;
|
||||||
}
|
}
|
||||||
|
|
@ -393,7 +395,9 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
// 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);
|
||||||
|
}
|
||||||
|
|
||||||
// retract after last layer
|
// retract after last layer
|
||||||
if (layer === maxLayers && layerout.length) {
|
if (layer === maxLayers && layerout.length) {
|
||||||
|
|
@ -411,30 +415,6 @@
|
||||||
|
|
||||||
print.output = output;
|
print.output = output;
|
||||||
|
|
||||||
// if belt, adjust z and y to baselines
|
|
||||||
function beltSkew() {
|
|
||||||
let bcos = Math.cos(Math.PI/4);
|
|
||||||
let icos = 1/bcos;
|
|
||||||
let miny = Infinity, minz = Infinity;
|
|
||||||
for (let layer of output) {
|
|
||||||
for (let rec of layer) {
|
|
||||||
rec.point.z = rec.point.z * icos;
|
|
||||||
rec.point.y = rec.point.y + rec.point.z * bcos;
|
|
||||||
miny = Math.min(miny, rec.point.y);
|
|
||||||
minz = Math.min(minz, rec.point.y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (miny || minz) {
|
|
||||||
console.log({miny, minz})
|
|
||||||
for (let layer of output) {
|
|
||||||
for (let rec of layer) {
|
|
||||||
rec.point.y -= minz;
|
|
||||||
rec.point.z -= miny;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// render if not explicitly disabled
|
// render if not explicitly disabled
|
||||||
if (render) {
|
if (render) {
|
||||||
print.render = FDM.prepareRender(output, (progress, layer) => {
|
print.render = FDM.prepareRender(output, (progress, layer) => {
|
||||||
|
|
@ -442,10 +422,6 @@
|
||||||
}, { tools: device.extruders, thin: isThin, flat: isFlat, fdm: true });
|
}, { tools: device.extruders, thin: isThin, flat: isFlat, fdm: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isBelt) {
|
|
||||||
beltSkew();
|
|
||||||
}
|
|
||||||
|
|
||||||
return print.render;
|
return print.render;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -273,11 +273,13 @@
|
||||||
for (let top of slices[0].tops) {
|
for (let top of slices[0].tops) {
|
||||||
bounds.merge(top.poly.bounds);
|
bounds.merge(top.poly.bounds);
|
||||||
}
|
}
|
||||||
widget.belt = {
|
widget.belt.miny = -bounds.miny;
|
||||||
offset_y: bounds.miny,
|
// widget.belt.yy2 = sdev.bedDepth / 2 + widget.track.pos.y;
|
||||||
pos_y: sdev.bedDepth / 2 + widget.track.pos.y,
|
// widget.belt = {
|
||||||
ypos: widget.belt.ypos
|
// offset_y: bounds.miny,
|
||||||
};
|
// pos_y: sdev.bedDepth / 2 + widget.track.pos.y,
|
||||||
|
// ypos: widget.belt.ypos
|
||||||
|
// };
|
||||||
}
|
}
|
||||||
|
|
||||||
// report slicing complete
|
// report slicing complete
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue