From 03585272540e01f41f82f3db0f57fd8f3adc703c Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 11 Apr 2020 20:02:39 -0400 Subject: [PATCH] fix brim z, fix zhop for purges. disable polish code --- js/kiri-conf.js | 8 +- js/kiri-driver-fdm.js | 408 ++++++++++++++++++++++-------------------- js/kiri-init.js | 4 +- 3 files changed, 215 insertions(+), 205 deletions(-) diff --git a/js/kiri-conf.js b/js/kiri-conf.js index 5c0d9740..655b26f0 100644 --- a/js/kiri-conf.js +++ b/js/kiri-conf.js @@ -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: "", diff --git a/js/kiri-driver-fdm.js b/js/kiri-driver-fdm.js index 83147f84..001b3658 100644 --- a/js/kiri-driver-fdm.js +++ b/js/kiri-driver-fdm.js @@ -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 { - - 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 { + // + // 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) diff --git a/js/kiri-init.js b/js/kiri-init.js index e7319c0d..4d2029c4 100644 --- a/js/kiri-init.js +++ b/js/kiri-init.js @@ -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}) });