diff --git a/src/kiri/conf.js b/src/kiri/conf.js index d937d885..ef4f52f5 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -577,6 +577,7 @@ outputLaserGroup: true, outputLaserZColor: false, outputLaserLayer: false, + outputLaserStack: false, outputLaserMerged: false, outputOriginCenter: true, outputInvertX: false, diff --git a/src/kiri/init.js b/src/kiri/init.js index 73a15bf8..68e88bd1 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1729,6 +1729,7 @@ laserOffset: UC.newInput(LANG.ls_offs_s, {title:LANG.ls_offs_l, convert:UC.toFloat, modes:LASER}), laserSliceHeight: UC.newInput(LANG.ls_lahi_s, {title:LANG.ls_lahi_l, convert:UC.toFloat, modes:LASER, trigger: true}), laserSliceHeightMin: UC.newInput(LANG.ls_lahm_s, {title:LANG.ls_lahm_l, convert:UC.toFloat, modes:LASER, show:() => { return UI.laserSliceHeight.value == 0 }}), + laserSep: UC.newBlank({class:"pop-sep", modes:LASER}), laserSliceSingle: UC.newBoolean(LANG.ls_sngl_s, onBooleanClick, {title:LANG.ls_sngl_l, modes:LASER}), firstLayer: UC.newGroup(LANG.fl_menu, null, {modes:FDM}), @@ -1845,8 +1846,11 @@ output: UC.newGroup(LANG.ou_menu, null, {modes:GCODE}), outputLaserPower: UC.newInput(LANG.ou_powr_s, {title:LANG.ou_powr_l, convert:UC.toInt, bound:UC.bound(1,100), modes:LASER}), outputLaserSpeed: UC.newInput(LANG.ou_sped_s, {title:LANG.ou_sped_l, convert:UC.toInt, modes:LASER}), + laserSep: UC.newBlank({class:"pop-sep", modes:LASER}), outputLaserZColor: UC.newBoolean(LANG.ou_layo_s, onBooleanClick, {title:LANG.ou_layo_l, modes:LASER, show:() => { return UI.outputLaserMerged.checked === false }}), outputLaserLayer: UC.newBoolean(LANG.ou_layr_s, onBooleanClick, {title:LANG.ou_layr_l, modes:LASER}), + outputLaserStack: UC.newBoolean(LANG.ou_lays_s, onBooleanClick, {title:LANG.ou_lays_l, modes:LASER}), + laserSep: UC.newBlank({class:"pop-sep", modes:LASER}), outputTemp: UC.newInput(LANG.ou_nozl_s, {title:LANG.ou_nozl_l, convert:UC.toInt, modes:FDM}), outputBedTemp: UC.newInput(LANG.ou_bedd_s, {title:LANG.ou_bedd_l, convert:UC.toInt, modes:FDM}), diff --git a/src/mode/laser/driver.js b/src/mode/laser/driver.js index 76ced0d9..4dc8c9a2 100644 --- a/src/mode/laser/driver.js +++ b/src/mode/laser/driver.js @@ -68,28 +68,43 @@ }); }; - function sliceEmitObjects(print, slice, groups, simple) { + function sliceEmitObjects(print, slice, groups, opt = { }) { let start = newPoint(0,0,0); let process = print.settings.process; let grouped = process.outputLaserGroup; + let stacked = process.outputLaserStack; + let simple = opt.simple || false; let group = []; + let emit = { in: [], out: [], mark: [] }; + let lastEmit = opt.lastEmit; let zcolor = print.settings.process.outputLaserZColor; group.thick = slice.thick; - function laserOut(poly, group) { + function laserOut(poly, group, type) { if (!poly) { return; } if (Array.isArray(poly)) { poly.forEach(function(pi) { - laserOut(pi, group); + laserOut(pi, group, type); }); } else { - let pathOpt = zcolor ? {extrude: slice.z, rate: slice.z} : {extrude: 1}; + let pathOpt = zcolor ? {extrude: slice.z, rate: slice.z} : {extrude: 1, rate: 1}; + if (type === "mark") { + pathOpt.rate = 0.001; + } if (simple) pathOpt.simple = true; if (poly.open) pathOpt.open = true; + emit[type].push(poly); print.polyPrintPath(poly, start, group, pathOpt); + if (stacked && type === "out" && lastEmit) { + for (let out of lastEmit.out) { + if (out.isInside(poly)) { + laserOut(out, group, "mark"); + } + } + } } } @@ -97,8 +112,8 @@ let inner = offset.map(poly => poly.inner || []).flat(); // cut inside before outside - laserOut(inner, group); - laserOut(offset, group); + laserOut(inner, group, "in"); + laserOut(offset, group, "out"); if (!grouped) { groups.push(group); @@ -109,6 +124,8 @@ if (grouped) { groups.push(group); } + + return emit; }; /** @@ -246,10 +263,11 @@ }); }); } - widget.slices.forEach(function(slice) { - sliceEmitObjects(print, slice, output, knifeOn); + let lastEmit; + for (let slice of widget.slices.reverse()) { + lastEmit = sliceEmitObjects(print, slice, output, {simple: knifeOn, lastEmit}); update((slices++ / totalSlices) * 0.5, "prepare"); - }); + } } }); diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index ad0ccfc1..6097b76f 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -546,6 +546,8 @@ kiri.lang['en-us'] = { ou_layr_l: ["output layer order","from top right to","bottom left"], ou_layo_s: "layer color", ou_layo_l: ["output layer colors","for each z index","overridden by merged"], + ou_lays_s: "layer stacking", + ou_lays_l: ["mark layers for stacking","with a unique color"], ou_drkn_s: "drag knife", ou_drkn_l: ["enable drag knife","output in gcode","cut radii are added","to corners with","cut down passes"],