fix brim z, fix zhop for purges. disable polish code

This commit is contained in:
Stewart Allen 2020-04-11 20:02:39 -04:00
commit 0358527254
3 changed files with 215 additions and 205 deletions

View file

@ -279,8 +279,8 @@ let gs_kiri_conf = exports;
// detectThinWalls: 1,
antiBacklash: 1,
zHopDistance: 1,
polishLayers: 1,
polishSpeed: 1,
// polishLayers: 1,
// polishSpeed: 1,
outputLayerRetract: 1,
gcodePauseLayers: 1,
outputClockwise: 1,
@ -538,8 +538,8 @@ let gs_kiri_conf = exports;
detectThinWalls: false,
antiBacklash: 1,
zHopDistance: 0.2,
polishLayers: 0,
polishSpeed: 40,
// polishLayers: 0,
// polishSpeed: 40,
outputLayerRetract: false,
gcodePauseLayers: "",

View file

@ -177,190 +177,190 @@ let gs_kiri_fdm = exports;
}, "infill");
}
let polish = spro.polishLayers;
// experimental polishing
if (polish) {
let polish_layer = Math.floor(polish);
let polish_step = Math.max(polish - polish_layer || 1, 0.25);
widget.polish = {};
let px = [];
let py = [];
// compute x polishing slices
SLICER.sliceWidget(widget, {
height: nozzleSize * polish_step,
swapX: true,
swapY: false,
simple: true
}, (polish_done => {
widget.polish.x = polish_done
.filter(s => s.groups.length)
.map(s => s.groups)
.forEach(p => px.appendAll(p));
}), (polish_update) => {
// console.log({polish_update});
});
// compute y polishing slices
SLICER.sliceWidget(widget, {
height: nozzleSize * polish_step,
swapX: false,
swapY: true,
simple: true
}, (polish_done => {
widget.polish.y = polish_done
.filter(s => s.groups.length)
.map(s => s.groups)
.forEach(p => py.appendAll(p));
}), (polish_update) => {
// console.log({polish_update});
});
// apply polishing finishes to layers
forSlices(1.0, 1.0, (slice) => {
if (polish_layer >= 2) {
let sai = (slice.index - polish_layer);
if (sai % (polish_layer-1) !== 0) {
return;
}
}
if (slice.index >= polish_layer) {
let sd = slice;
for (let i=0; i<polish_layer; i++) {
sd = sd.down;
}
let zb = sd.z;
let zt = slice.z;
let pout = [];
let cont = 0;
[px, py].forEach(pa => {
let polys = [];
pa.forEach(p => {
// rotate and test for self-intersection (points under model)
p.ensureXY();
let ox = p._aligned == 'yz' ? 0.1 : 0;
let oy = p._aligned == 'yz' ? 0 : 0.1;
p.forEachPoint(pt => {
let int = p.intersections(
pt.offset(ox,oy,0),
pt.offset(ox*10000,oy*10000,0));
if (int.length > 0) {
pt._under = true;
}
});
p.restoreXY();
let lastp = undefined;
let poly = [];
// look for qualifying segments
p.forEachSegment((p1, p2) => {
// eliminate segments that projected up
// intersect with the polygon (bottom faces)
if (p1._under || p2._under) {
return;
}
// skip when both below layer range
if (p1.z < zb && p2.z < zb) {
return;
}
// skip when both above layer range
if (p1.z > zt && p2.z > zt) {
return;
}
// skip vertical
if (p1.x === p2.x && p1.y === p2.y) {
return;
}
// skip horizontal
// if (p1.z === p2.z) {
// return;
// }
// order points lowest to highest
let swap = false;
if (p1.z > p2.z) {
let t = p2;
p2 = p1;
p1 = t;
swap = true;
}
let trimlo = false;
let trimhi = false;
if (p1.z < zb) {
trimlo = true;
}
if (p2.z > zt) {
trimhi = true;
}
let xaxis = p1.x === p2.x;
if (xaxis) {
p1 = BASE.newPoint(p1.y,p1.z,p1.x);
p2 = BASE.newPoint(p2.y,p2.z,p2.x);
} else {
p1 = BASE.newPoint(p1.x,p1.z,p1.y);
p2 = BASE.newPoint(p2.x,p2.z,p2.y);
}
let slope = BASE.newSlope(p1, p2);
let angle = slope.angle;
if (angle > 80 && angle < 100) {
return;
}
let len = p1.distTo2D(p2);
let np1 = p1;
if (trimlo) {
let zunder = zb - p1.y;
let zover = p2.y - zb;
let zdelt = p2.y - p1.y;
let pct = zunder / zdelt;
np1 = p1.follow(slope, len * pct);
}
if (trimhi) {
let zunder = zt - p1.y;
let zover = p2.y - zt;
let zdelt = p2.y - p1.y;
let pct = zover / zdelt;
p2 = p2.follow(slope.invert(), len * pct);
}
p1 = np1;
if (xaxis) {
p1 = BASE.newPoint(p1.z,p1.x,p1.y);
p2 = BASE.newPoint(p2.z,p2.x,p2.y);
} else {
p1 = BASE.newPoint(p1.x,p1.z,p1.y);
p2 = BASE.newPoint(p2.x,p2.z,p2.y);
}
if (!lastp) {
poly.push(p1);
poly.push(p2);
} else if (p1.isMergable2D(lastp)) {
// } else if (p1.isEqual(lastp)) {
poly.push(p2);
cont++;
} else if (poly.length) {
polys.push(poly);
poly = [p1, p2];
}
lastp = p2;
});
if (poly.length) {
polys.push(poly);
}
});
pout.push(polys);
polys = [];
});
if (pout.length && slice.tops.length) {
slice.tops[0].polish = {
x: pout[0]
.map(a => BASE.newPolygon(a).setOpen())
// .filter(p => p.perimeter() > nozzleSize)
,
y: pout[1]
.map(a => BASE.newPolygon(a).setOpen())
// .filter(p => p.perimeter() > nozzleSize)
};
}
}
});
}
// let polish = spro.polishLayers;
// // experimental polishing
// if (polish) {
// let polish_layer = Math.floor(polish);
// let polish_step = Math.max(polish - polish_layer || 1, 0.25);
// widget.polish = {};
// let px = [];
// let py = [];
// // compute x polishing slices
// SLICER.sliceWidget(widget, {
// height: nozzleSize * polish_step,
// swapX: true,
// swapY: false,
// simple: true
// }, (polish_done => {
// widget.polish.x = polish_done
// .filter(s => s.groups.length)
// .map(s => s.groups)
// .forEach(p => px.appendAll(p));
// }), (polish_update) => {
// // console.log({polish_update});
// });
// // compute y polishing slices
// SLICER.sliceWidget(widget, {
// height: nozzleSize * polish_step,
// swapX: false,
// swapY: true,
// simple: true
// }, (polish_done => {
// widget.polish.y = polish_done
// .filter(s => s.groups.length)
// .map(s => s.groups)
// .forEach(p => py.appendAll(p));
// }), (polish_update) => {
// // console.log({polish_update});
// });
// // apply polishing finishes to layers
// forSlices(1.0, 1.0, (slice) => {
// if (polish_layer >= 2) {
// let sai = (slice.index - polish_layer);
// if (sai % (polish_layer-1) !== 0) {
// return;
// }
// }
// if (slice.index >= polish_layer) {
// let sd = slice;
// for (let i=0; i<polish_layer; i++) {
// sd = sd.down;
// }
// let zb = sd.z;
// let zt = slice.z;
// let pout = [];
// let cont = 0;
// [px, py].forEach(pa => {
//
// let polys = [];
// pa.forEach(p => {
// // rotate and test for self-intersection (points under model)
// p.ensureXY();
// let ox = p._aligned == 'yz' ? 0.1 : 0;
// let oy = p._aligned == 'yz' ? 0 : 0.1;
// p.forEachPoint(pt => {
// let int = p.intersections(
// pt.offset(ox,oy,0),
// pt.offset(ox*10000,oy*10000,0));
// if (int.length > 0) {
// pt._under = true;
// }
// });
// p.restoreXY();
//
// let lastp = undefined;
// let poly = [];
// // look for qualifying segments
// p.forEachSegment((p1, p2) => {
// // eliminate segments that projected up
// // intersect with the polygon (bottom faces)
// if (p1._under || p2._under) {
// return;
// }
// // skip when both below layer range
// if (p1.z < zb && p2.z < zb) {
// return;
// }
// // skip when both above layer range
// if (p1.z > zt && p2.z > zt) {
// return;
// }
// // skip vertical
// if (p1.x === p2.x && p1.y === p2.y) {
// return;
// }
// // skip horizontal
// // if (p1.z === p2.z) {
// // return;
// // }
// // order points lowest to highest
// let swap = false;
// if (p1.z > p2.z) {
// let t = p2;
// p2 = p1;
// p1 = t;
// swap = true;
// }
// let trimlo = false;
// let trimhi = false;
// if (p1.z < zb) {
// trimlo = true;
// }
// if (p2.z > zt) {
// trimhi = true;
// }
// let xaxis = p1.x === p2.x;
// if (xaxis) {
// p1 = BASE.newPoint(p1.y,p1.z,p1.x);
// p2 = BASE.newPoint(p2.y,p2.z,p2.x);
// } else {
// p1 = BASE.newPoint(p1.x,p1.z,p1.y);
// p2 = BASE.newPoint(p2.x,p2.z,p2.y);
// }
// let slope = BASE.newSlope(p1, p2);
// let angle = slope.angle;
// if (angle > 80 && angle < 100) {
// return;
// }
// let len = p1.distTo2D(p2);
// let np1 = p1;
// if (trimlo) {
// let zunder = zb - p1.y;
// let zover = p2.y - zb;
// let zdelt = p2.y - p1.y;
// let pct = zunder / zdelt;
// np1 = p1.follow(slope, len * pct);
// }
// if (trimhi) {
// let zunder = zt - p1.y;
// let zover = p2.y - zt;
// let zdelt = p2.y - p1.y;
// let pct = zover / zdelt;
// p2 = p2.follow(slope.invert(), len * pct);
// }
// p1 = np1;
// if (xaxis) {
// p1 = BASE.newPoint(p1.z,p1.x,p1.y);
// p2 = BASE.newPoint(p2.z,p2.x,p2.y);
// } else {
// p1 = BASE.newPoint(p1.x,p1.z,p1.y);
// p2 = BASE.newPoint(p2.x,p2.z,p2.y);
// }
// if (!lastp) {
// poly.push(p1);
// poly.push(p2);
// } else if (p1.isMergable2D(lastp)) {
// // } else if (p1.isEqual(lastp)) {
// poly.push(p2);
// cont++;
// } else if (poly.length) {
// polys.push(poly);
// poly = [p1, p2];
// }
// lastp = p2;
// });
// if (poly.length) {
// polys.push(poly);
// }
// });
// pout.push(polys);
// polys = [];
// });
//
// if (pout.length && slice.tops.length) {
// slice.tops[0].polish = {
// x: pout[0]
// .map(a => BASE.newPolygon(a).setOpen())
// // .filter(p => p.perimeter() > nozzleSize)
// ,
// y: pout[1]
// .map(a => BASE.newPolygon(a).setOpen())
// // .filter(p => p.perimeter() > nozzleSize)
// };
// }
// }
// });
// }
// report slicing complete
ondone();
@ -432,8 +432,9 @@ let gs_kiri_fdm = exports;
// if brim is offset, over-expand then shrink to induce brims to merge
if (offset && brims.length) {
let extra = process.sliceSupportExtra + 2;
brims = POLY.expand(brims, extra, 0, null, 1);
brims = POLY.expand(brims, -extra, 0, null, 1);
let zheight = brims[0].getZ();
brims = POLY.expand(brims, extra, zheight, null, 1);
brims = POLY.expand(brims, -extra, zheight, null, 1);
}
// if raft is specified
@ -488,7 +489,7 @@ let gs_kiri_fdm = exports;
let polys = [],
preout = [];
// expand brims
// expand specified # of brims
brims.forEach(function(brim) {
POLY.trace2count(brim, polys, -nozzle, process.outputBrimCount, 0);
});
@ -509,6 +510,7 @@ let gs_kiri_fdm = exports;
print.addPrintPoints(preout, layerout, null);
if (preout.length) {
// retract between brims and print
preout.last().retract = true;
}
}
@ -572,11 +574,14 @@ let gs_kiri_fdm = exports;
let rec = track[nozzle];
if (rec) {
track[nozzle] = null;
return print.polyPrintPath(rec.poly.clone().setZ(z), start, layer, {
if (layer.last()) layer.last().retract = true;
start = print.polyPrintPath(rec.poly.clone().setZ(z), start, layer, {
tool: using || nozzle,
open: true,
simple: true
});
layer.last().retract = true;
return start;
} else {
console.log({already_purged: nozzle, from: track, layer});
}
@ -812,7 +817,7 @@ let gs_kiri_fdm = exports;
time += timeDwell;
}
function retract() {
function retract(zhop) {
retracted = retDist;
moveTo({e:-retracted}, retSpeed, `retract ${retDist}`);
if (zhop) moveTo({z:zpos + zhop}, seekMMM, "zhop up");
@ -825,24 +830,26 @@ let gs_kiri_fdm = exports;
}
let o = [!rate && !newpos.e ? 'G0' : 'G1'];
if (typeof newpos.x === 'number') {
pos.x = UTIL.round(newpos.x,decimals);
pos.x = newpos.x;//UTIL.round(newpos.x,decimals);
o.append(" X").append(pos.x.toFixed(decimals));
}
if (typeof newpos.y === 'number') {
pos.y = UTIL.round(newpos.y,decimals);
pos.y = newpos.y;//UTIL.round(newpos.y,decimals);
o.append(" Y").append(pos.y.toFixed(decimals));
}
if (typeof newpos.z === 'number') {
pos.z = UTIL.round(newpos.z,decimals);
pos.z = newpos.z;//UTIL.round(newpos.z,decimals);
o.append(" Z").append(pos.z.toFixed(decimals));
}
if (typeof newpos.e === 'number') {
outputLength += newpos.e;
if (extrudeAbs) {
// for cumulative (absolute) extruder positions
o.append(" E").append(UTIL.round(outputLength, decimals));
// o.append(" E").append(UTIL.round(outputLength, decimals));
o.append(" E").append(outputLength.toFixed(decimals));
} else {
o.append(" E").append(UTIL.round(newpos.e, decimals));
// o.append(" E").append(UTIL.round(newpos.e, decimals));
o.append(" E").append(newpos.e.toFixed(decimals));
}
}
if (rate && rate != pos.f) {
@ -964,7 +971,7 @@ let gs_kiri_fdm = exports;
// re-engage post-retraction before new extrusion
if (out.emit && retracted) {
// when enabled, resume previous Z
if (zhop) moveTo({z:zpos}, seekMMM, "zhop down");
if (zhop && pos.z != zpos) moveTo({z:zpos}, seekMMM, "zhop down");
// re-engage retracted filament
moveTo({e:retracted}, retSpeed, `engage ${retracted}`);
retracted = 0;
@ -978,14 +985,17 @@ let gs_kiri_fdm = exports;
moveTo({x:x, y:y, e:emitMM}, speedMMM);
emitted += emitMM;
} else {
moveTo({x:x, y:y}, seekMMM);
// TODO disabling out of plane z moves until a better mechanism
// can be built that doesn't rely on computed zpos from layer heights...
// when making z moves (like polishing) allow slowdown vs fast seek
let moveSpeed = (lastp && lastp.z !== z) ? speedMMM : seekMMM;
moveTo({x:x, y:y, z:z}, moveSpeed);
// let moveSpeed = (lastp && lastp.z !== z) ? speedMMM : seekMMM;
// moveTo({x:x, y:y, z:z}, moveSpeed);
}
// retract filament
// retract filament if point retract flag set
if (!retracted && out.retract) {
retract();
retract(zhop);
}
// update time and distance (should calc in moveTo() instead)

View file

@ -1413,8 +1413,8 @@ var gs_kiri_init = exports;
zHopDistance: UC.newInput(LANG.ad_zhop_s, {title:LANG.ad_zhop_l, bound:UC.bound(0,3.0), convert:UC.toFloat, modes:FDM, expert:true}),
antiBacklash: UC.newInput(LANG.ad_abkl_s, {title:LANG.ad_abkl_l, bound:UC.bound(0,3), convert:UC.toInt, modes:FDM, expert:true}),
// detectThinWalls: UC.newBoolean("thin wall fill", onBooleanClick, {title: "detect and fill thin openings\nbetween shells walls", modes:FDM, expert:true})
polishLayers: LOCAL ? UC.newInput(LANG.ad_play_s, {title:LANG.ad_play_l, bound:UC.bound(0,10), convert:UC.toFloat, modes:FDM, expert:true}) : null,
polishSpeed: LOCAL ? UC.newInput(LANG.ad_pspd_s, {title:LANG.ad_pspd_l, bound:UC.bound(10,2000), convert:UC.toInt, modes:FDM, expert:true}) : null,
// polishLayers: LOCAL ? UC.newInput(LANG.ad_play_s, {title:LANG.ad_play_l, bound:UC.bound(0,10), convert:UC.toFloat, modes:FDM, expert:true}) : null,
// polishSpeed: LOCAL ? UC.newInput(LANG.ad_pspd_s, {title:LANG.ad_pspd_l, bound:UC.bound(10,2000), convert:UC.toInt, modes:FDM, expert:true}) : null,
gcodePauseLayers: UC.newInput(LANG.ag_paws_s, {title:LANG.ag_paws_l, modes:FDM, expert:true}),
outputLayerRetract: UC.newBoolean(LANG.ad_lret_s, onBooleanClick, {title:LANG.ad_lret_l, modes:FDM, expert:true})
});