diff --git a/js/kiri-driver-fdm.js b/js/kiri-driver-fdm.js index 58fddb53..db7ca49e 100644 --- a/js/kiri-driver-fdm.js +++ b/js/kiri-driver-fdm.js @@ -206,7 +206,7 @@ var gs_kiri_fdm = exports; tops.push(top.poly.clone()); }); POLY.nest(tops).forEach(function(poly) { - poly.offset(-process.outputBrimOffset).forEach(function(brim) { + poly.offset(-process.outputBrimOffset+device.nozzleSize/2).forEach(function(brim) { brim.move(widget.mesh.position); brims.push(brim); }); @@ -270,7 +270,9 @@ var gs_kiri_fdm = exports; progress = 0, distance = 0, emitted = 0, + retracted = 0, pos = {x:0, y:0, z:0, f:0}, + last = null, zinc = process.sliceHeight, zpos = zinc * process.firstLayerHeight, offset = process.outputOriginCenter ? null : { @@ -289,7 +291,7 @@ var gs_kiri_fdm = exports; bottom: offset ? 0 : -device.bedDepth/2, z_max: device.maxHeight }, - fillBridgeDist = device.nozzleSize * 2, + glideBridgeDist = device.nozzleSize * 2, shortDist = process.outputShortDistance, shortFact = process.outputShortFactor, maxPrintMMM = process.outputFeedrate * 60, @@ -382,7 +384,13 @@ var gs_kiri_fdm = exports; if (comment) { o.append(" ; ").append(comment); } - append(o.join('')); + var line = o.join(''); + if (last == line) { + // console.log({dup:line}); + return; + } + last = line; + append(line); } // calc total distance traveled by head as proxy for progress @@ -427,6 +435,10 @@ var gs_kiri_fdm = exports; dist = lastp ? lastp.distTo2D(out.point) : 0; distance += dist; progress = Math.round((distance / totaldistance) * 100); + if (out.emit && retracted) { + moveTo({e:retracted}, retSpeed, "engage (ooze control)"); + retracted = 0; + } if (lastp && out.emit) { var outMMM = printMMM, emitMM = emitPerMM * out.emit * dist; @@ -452,14 +464,13 @@ var gs_kiri_fdm = exports; if (out.speed) { moveMMM = out.speed * 60; } - if (laste && retOver > 0.0 && dist > retOver) { - // - moveTo({e:-retDist}, retSpeed, "ooze retract"); + if (out.retract || (laste && retOver > 0.0 && dist > retOver)) { + retracted = retDist; + moveTo({e:-retracted}, retSpeed, "retract (ooze control)"); moveTo({x:x, y:y}, moveMMM); - moveTo({e:retDist}, retSpeed, "re-engage"); - } else if (lastp && dist <= fillBridgeDist) { - var e = (layer === 0 ? emitPerMMLayer1 : emitPerMM) * dist; - moveTo({x:x, y:y, e:e}, outMMM); + // } else if (lastp && dist <= glideBridgeDist) { + // var e = (layer === 0 ? emitPerMMLayer1 : emitPerMM) * dist; + // moveTo({x:x, y:y, e:e}, outMMM); } else { moveTo({x:x, y:y}, moveMMM); } diff --git a/js/kiri-print.js b/js/kiri-print.js index 2e56748b..2b1146f1 100644 --- a/js/kiri-print.js +++ b/js/kiri-print.js @@ -217,7 +217,16 @@ var gs_kiri_print = exports; newlayer = []; newout.push(newlayer); layerout.forEach(function(out) { - if (out.point) newlayer.push({emit:out.emit, speed:out.speed, point:{x:out.point.x, y:out.point.y, z:out.point.z}}); + if (out.point) { + // used for presentation only. can drop non-essential + // data to speed up worker -> browser transfer + newlayer.push({ + emit: out.emit, + // speed: out.speed, + // retract: out.retract, + point: {x: out.point.x, y: out.point.y, z: out.point.z} + }); + } }); }); return newout; @@ -308,6 +317,9 @@ var gs_kiri_print = exports; if (lastPoint && point.x == lastPoint.x && point.y == lastPoint.y && point.z == lastPoint.z && lastEmit == emit) { return; } + if (lastPoint && UTIL.round(point.x,4) == UTIL.round(lastPoint.x,4) && UTIL.round(point.y,4) == UTIL.round(lastPoint.y,4)) { + console.log(({dup:point, last:lastPoint})); + } lastPoint = point; lastEmit = emit; array.push(new Output(point, emit, speed, tool)); @@ -376,7 +388,8 @@ var gs_kiri_print = exports; var closest = poly.findClosestPointTo(startPoint), distance = wipeDistance, - last = startPoint; + last = startPoint, + steps = 0; if (!distance) return; @@ -391,6 +404,7 @@ var gs_kiri_print = exports; distance -= last.distTo2D(point); } last = point; + if (steps++ === 0) preout.last().retract = true; } }, true, closest.index); @@ -419,7 +433,8 @@ var gs_kiri_print = exports; if (!paths || paths.length !== 2) return; var path = paths[0].perimeter() < paths[1].perimeter() ? paths[0] : paths[1]; if (p1.distTo2D(path.first() > p1.distTo2D(path.last()))) path.reverse(); - routes.push(path); + // cull phantom and short paths + if (path.perimeter() > 0.1) routes.push(path); }); // sort bisecting paths by those closest to start point (p1) routes.sort((function(o1, o2) { @@ -536,6 +551,8 @@ var gs_kiri_print = exports; } var all = [].appendAll(slice.supports || []).appendAll(slice.tops || []); + var wipe = null; + var lastTop = null; outputOrderClosest(all || [], function(next) { if (next instanceof Polygon) { // support polygon @@ -545,13 +562,27 @@ var gs_kiri_print = exports; next.fills.forEach(function(p) { p.z = z }); outputFills(next.fills, next.inner); } + // lastTop = null; } else { + if (lastTop && lastTop !== next && wipe) { + outputWipe(wipe); + wipe = null; + } // top object var bounds = POLY.flatten(next.gatherOuter([])); outputTraces([].appendAll(next.traces).appendAll(next.innerTraces() || []), bounds); outputFills(next.fill_lines, bounds); outputSparse(next.fill_sparse, bounds); - outputWipe(next.traces.last()); + if (next.inner) { + wipe = next.inner.last(); + // best to use inner offset for wipe + // outputWipe(next.inner.last()); + } else { + wipe = next.traces.last(); + // otherwise fall back to innermost trace + // outputWipe(next.traces.last()); + } + lastTop = next; } }, function(obj) { return obj instanceof Polygon ? obj : obj.poly; diff --git a/js/kiri.js b/js/kiri.js index 04d76c91..0792db07 100644 --- a/js/kiri.js +++ b/js/kiri.js @@ -452,6 +452,7 @@ self.kiri.license = exports.LICENSE; sliced_opacity = 0.0, sliced_opacity_cam = 0.25, // --------------- + printSeq = parseInt(SDB['print-seq'] || "0") + 1, catalogSize = 0, showLayerRange = 0, showLayerValue = 0, @@ -935,7 +936,9 @@ self.kiri.license = exports.LICENSE; KIRI.serial.setGCode(gcode, currentPrint.bounds); } - var pre = MODE === MODES.CAM ? "cnc" : "print", + SDB['print-seq'] = printSeq++; + + var pre = (MODE === MODES.CAM ? "cnc-" : "print-") + (printSeq.toString().padStart(3,"0")), filename = pre,// + (new Date().getTime().toString(36)), fileext = settings.device.gcodeFExt || "gcode", octo_host, @@ -1060,7 +1063,7 @@ self.kiri.license = exports.LICENSE; function download() { filename = $('print-filename').value; - saveAs(getBlob(), filename+"."+fileext); + saveAs(getBlob(), filename + "." + fileext); } function pad(v) { diff --git a/notes.md b/notes.md index 15168c25..41c27fa0 100644 --- a/notes.md +++ b/notes.md @@ -59,6 +59,7 @@ # FDM todo * add lay-flat auto-rotation +* add dashed poly output on first connected brim (when offset === 0) * implement gyroid infill * https://en.wikipedia.org/wiki/Gyroid * fan / layer control * update forum * infill rendering as moves instead of extrusions (firefox?)