diff --git a/src/geo/polygon.js b/src/geo/polygon.js index 979a7396..c8414b63 100644 --- a/src/geo/polygon.js +++ b/src/geo/polygon.js @@ -693,16 +693,24 @@ * scale polygon around origin */ PRO.scale = function(scale, round) { + let x,y,z; + if (typeof(scale) === 'number') { + x = y = z = scale; + } else { + x = scale.x; + y = scale.y; + z = scale.z; + } this._bounds = undefined; - this.points = this.points.map(point => { + this.points.forEach(point => { if (round) { - point.x = (point.x * scale).round(round); - point.y = (point.y * scale).round(round); - point.z = (point.z * scale).round(round); + point.x = (point.x * x).round(round); + point.y = (point.y * y).round(round); + point.z = (point.z * z).round(round); } else { - point.x = point.x * scale; - point.y = point.y * scale; - point.z = point.z * scale; + point.x = point.x * x; + point.y = point.y * y; + point.z = point.z * z; } }); if (this.inner) { diff --git a/src/kiri/main.js b/src/kiri/main.js index 19ea8011..3c019d86 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1094,6 +1094,7 @@ if (MODE === MODES.SLA && !callback) { callback = preparePreview; } + // force layout in belt mode when widget exceeds bed length if (WIDGETS.length && settings.device.bedBelt) { let doLayout = false; @@ -1109,6 +1110,15 @@ } } + let process = settings.process, + device = settings.device, + isBelt = device.bedBelt, + mode = settings.mode, + now = Date.now(), + totvert = 0, + track = {}, + totalProgress; + // clear completion marks complete = {}; @@ -1119,42 +1129,49 @@ API.conf.save(); API.event.emit('slice.begin', getMode()); - let slicing = WIDGETS.slice().filter(w => !w.track.ignore), - totalProgress, - track = {}, - mode = settings.mode, - now = Date.now(), - totvert = 0, - defvert; + let slicing = WIDGETS.slice().filter(w => !w.track.ignore); // determing this widgets % of processing time estimated by vertex count for (let widget of slicing) { totvert += widget.getVertices().count; } - defvert = totvert / slicing.length; + let defvert = totvert / slicing.length; setOpacity(color.slicing_opacity); - STACKS.clear(); - if (settings.device.bedBelt) { - KIRI.client.clear(); - } - KIRI.client.sync(); - KIRI.client.rotate(settings); - let segtimes = {}, segNumber = 0, errored = false, startTime = Date.now(), toSlice = slicing.slice(), camOrLaser = mode === 'CAM' || mode === 'LASER', + extruders = {}, lastMsg; for (let widget of toSlice) { widget.stats.progress = 0; widget.setColor(color.slicing); + extruders[widget.anno.extruder] = widget.anno.extruder; } + // in multi-material belt mode, the anchor needs to be extended + // to allow room for the purge tower to be built. calculate here + extruders = Object.values(extruders); + if (isBelt && extruders.length > 1 && process.outputPurgeTower) { + process.beltAnchor = Math.max( + process.firstLayerBeltLead, + Math.sqrt(process.outputPurgeTower) * extruders.length * (1/Math.sqrt(2))); + } else { + process.beltAnchor = process.firstLayerBeltLead; + } + + STACKS.clear(); + if (isBelt) { + KIRI.client.clear(); + } + KIRI.client.sync(); + KIRI.client.rotate(settings); + sliceNext(); function sliceNext() { diff --git a/src/kiri/worker.js b/src/kiri/worker.js index 0c42e225..8d66fcaa 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -313,7 +313,7 @@ KIRI.worker = { let ypos = settings.device.bedDepth / 2 + track.pos.y + miny; let rotation = (Math.PI / 180) * 45; // move to accomodate anchor - ypos += (settings.process.firstLayerBeltLead || 0); + ypos += (settings.process.beltAnchor || 0); for (let w of group) { w.moveMesh(0, miny, 0); } @@ -340,7 +340,7 @@ KIRI.worker = { let { xpos, ypos } = widget.belt; let { dy, dz } = widget.belt; // move to accomodate anchor - dy -= (settings.process.firstLayerBeltLead || 0) ; + dy -= (settings.process.beltAnchor || 0) ; widget.rotinfo = { angle: 45, dy, dz, xpos, ypos }; for (let others of group.slice(1)) { others.rotinfo = widget.rotinfo; diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index df76f7b9..acca1c2c 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -111,7 +111,7 @@ printPoint = null; let raft = function(height, angle, spacing, speed, extrude) { - let slice = kiri.newSlice(zoff + height / 2); + let slice = KIRI.newSlice(zoff + height / 2); brims.forEach(function(brim) { // use first point of first brim as start point if (printPoint === null) printPoint = brim.first(); @@ -329,13 +329,23 @@ let box = rec.rect.clone().setZ(z); let fill = (purgeOn ? rec.full : rec.sparse).clone().setZ(z); if (isBelt) { + let scale = z >= 0 ? 0 : 1 + ((z / blokw)); + if (scale) { + box.scale({x:1, y:scale, z:1}); + let inset = box.offset(rec.diameter/2); + if (inset) { + fill = linesToPoly(POLY.fillArea(inset, 90, rec.diameter * 5)); + } else { + fill = undefined; + } + } // offset by nozzle diameter + half step (shell) then angled - let exo = rec.diameter * (1/Math.sqrt(2)) * 1.5; + let exo = rec.diameter * beltfact * 1.5; box.move({x:0, y:z - exo, z:0}); - fill.move({x:0, y:z - exo, z:0}); + if (fill) fill.move({x:0, y:z - exo, z:0}); if (offset) { box.move(offset); - fill.move(offset); + if (fill) fill.move(offset); } } start = print.polyPrintPath(box, start, layer, { @@ -344,7 +354,7 @@ simple: true, open: false, }); - start = print.polyPrintPath(fill, start, layer, { + if (fill) start = print.polyPrintPath(fill, start, layer, { tool, rate, simple: true, @@ -451,6 +461,7 @@ layerout.anchor = slice.belt && slice.belt.anchor; // detect extruder change and print purge block if (!lastOut || lastOut.extruder !== slice.extruder) { + if (slice.extruder >= 0) printPoint = purge(slice.extruder, track, layerout, printPoint, slice.z, undefined, offset); } let wtb = slice.widget.track.box; diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 79edd7ff..567c9d0c 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -385,8 +385,7 @@ } // array of added top.fill_sparse arrays let adds = []; - // add enough lead in layers to fill anchor area - let anchorlen = process.firstLayerBeltLead * beltfact; + let anchorlen = process.beltAnchor * beltfact; while (anchorlen && start && anchorlen >= sliceHeight) { let addto = start.down; if (!addto) {