diff --git a/js/kiri-driver-fdm.js b/js/kiri-driver-fdm.js index 0b2210bc..b7fecd5f 100644 --- a/js/kiri-driver-fdm.js +++ b/js/kiri-driver-fdm.js @@ -161,7 +161,7 @@ var gs_kiri_fdm = exports; }, "infill"); } - let polish = spro.layerPolishing; + let polish = spro.polishLayers; // experimental polishing if (polish) { let polish_layer = Math.floor(polish); @@ -198,7 +198,13 @@ var gs_kiri_fdm = exports; // console.log({polish_update}); }); // apply polishing finishes to layers - forSlices(1.0, 1.0, slice => { + 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 p2.z) { let t = p2; p2 = p1; p1 = t; + swap = true; } let trimlo = false; let trimhi = false; @@ -250,8 +258,8 @@ var gs_kiri_fdm = exports; p2 = BASE.newPoint(p2.x,p2.z,p2.y); } let slope = BASE.newSlope(p1, p2); - let angle = Math.abs(slope.angle); - if (angle > 40 && angle < 140) { + let angle = slope.angle; + if (angle > 80 && angle < 100) { return; } let len = p1.distTo2D(p2); @@ -281,7 +289,8 @@ var gs_kiri_fdm = exports; if (!lastp) { poly.push(p1); poly.push(p2); - } else if (p1.isEqual(lastp)) { + } else if (p1.isMergable2D(lastp)) { + // } else if (p1.isEqual(lastp)) { poly.push(p2); cont++; } else if (poly.length) { @@ -296,17 +305,17 @@ var gs_kiri_fdm = exports; }); 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() > sdev.nozzleSize), + // .filter(p => p.perimeter() > sdev.nozzleSize) + , y: pout[1] .map(a => BASE.newPolygon(a).setOpen()) - .filter(p => p.perimeter() > sdev.nozzleSize) + // .filter(p => p.perimeter() > sdev.nozzleSize) }; } } @@ -812,7 +821,9 @@ var gs_kiri_fdm = exports; moveTo({x:x, y:y, e:emitMM}, speedMMM); emitted += emitMM; } else { - moveTo({x:x, y:y, z:z}, seekMMM); + // 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); } // retract filament diff --git a/js/kiri-print.js b/js/kiri-print.js index 6cc62ee9..55fbe5ab 100644 --- a/js/kiri-print.js +++ b/js/kiri-print.js @@ -597,7 +597,7 @@ var gs_kiri_print = exports; /** * @param {Polygon[]} polys */ - function outputSparse(polys, extrude) { + function outputSparse(polys, extrude, speed) { if (!polys) return; var proxy = polys.map(function(poly) { return {poly: poly, first: poly.first(), last: poly.last()}; @@ -611,7 +611,7 @@ var gs_kiri_print = exports; if (i === 0 && lp && lp.distTo2D(p) > retractDist && intersectsTop(lp,p)) { retract(); } - addOutput(preout, p, i === 0 ? 0 : extrude, printSpeed); + addOutput(preout, p, i === 0 ? 0 : extrude, speed || printSpeed); lp = p; }); }); @@ -806,10 +806,10 @@ var gs_kiri_print = exports; if (slice.tops.length && slice.tops[0].polish) { let {x,y} = slice.tops[0].polish; if (x) { - outputSparse(x, 0); + outputSparse(x, 0, process.polishSpeed); } if (y) { - outputSparse(y, 0); + outputSparse(y, 0, process.polishSpeed); } } diff --git a/js/kiri.js b/js/kiri.js index ee327ae5..dfe284d9 100644 --- a/js/kiri.js +++ b/js/kiri.js @@ -103,7 +103,8 @@ self.kiri.license = exports.LICENSE; // detectThinWalls: 1, antiBacklash: 1, zHopDistance: 1, - layerPolishing: 1, + polishLayers: 1, + polishSpeed: 1, outputLayerRetract: 1, gcodeNozzle: 1, gcodePauseLayers: 1, @@ -339,7 +340,8 @@ self.kiri.license = exports.LICENSE; detectThinWalls: false, antiBacklash: 1, zHopDistance: 0.2, - layerPolishing: 0, + polishLayers: 0, + polishSpeed: 40, outputLayerRetract: false, gcodeNozzle: 0, gcodePauseLayers: "", @@ -2898,7 +2900,8 @@ self.kiri.license = exports.LICENSE; zHopDistance: UC.newInput("z hop dist", {title: "amount to raise z\non retraction moves\nin millimeters\n0 to disable", bound:UC.bound(0,3.0), convert:UC.toFloat, modes:FDM, expert: true}), antiBacklash: UC.newInput("anti-backlash", {title: "use micro-movements to cancel\nbacklash during fills\nin millimeters", 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}) - layerPolishing: LOCAL ? UC.newInput("layer polish", {title:"polish up to specified\n# of layers at a time", bound:UC.bound(0,10), convert:UC.toFloat, modes:FDM, expert: true}) : null, + polishLayers: LOCAL ? UC.newInput("polish layers", {title:"polish up to specified\n# of layers at a time", bound:UC.bound(0,10), convert:UC.toFloat, modes:FDM, expert: true}) : null, + polishSpeed: LOCAL ? UC.newInput("polish speed", {title:"polishing speed\nin millimeters / minute", bound:UC.bound(10,2000), convert:UC.toInt, modes:FDM, expert: true}) : null, outputLayerRetract: UC.newBoolean("layer retract", onBooleanClick, {title:"force filament retraction\nbetween layers", modes:FDM, expert: true}), gcodeVars: UC.newGroup("gcode", null, {modes:FDM, expert: true}),