diff --git a/notes.md b/notes.md index 6b1ce320..12113044 100644 --- a/notes.md +++ b/notes.md @@ -51,7 +51,6 @@ # FDM - BELT * `B` fix supports for belt printing -* `F` hide layer lines under print # CAM diff --git a/src/kiri/init.js b/src/kiri/init.js index d0089f6f..5e382e9d 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1603,13 +1603,13 @@ firstLayerNozzleTemp:UC.newInput(LANG.fl_nozl_s, {title:LANG.fl_nozl_l, convert:UC.toInt, modes:FDM, show:isNotBelt}), firstLayerBedTemp: UC.newInput(LANG.fl_bedd_s, {title:LANG.fl_bedd_l, convert:UC.toInt, modes:FDM, show:isNotBelt}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isNotBelt}), + firstLayerYOffset: UC.newInput(LANG.fl_zoff_s, {title:LANG.fl_zoff_l, convert:UC.toFloat, modes:FDM, show:isBelt}), firstLayerRate: UC.newInput(LANG.fl_rate_s, {title:LANG.fl_rate_l, convert:UC.toFloat, modes:FDM}), firstLayerFillRate: UC.newInput(LANG.fl_frat_s, {title:LANG.fl_frat_l, convert:UC.toFloat, modes:FDM, show:isNotBelt}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isNotBelt}), - firstLayerLineMult: UC.newInput(LANG.fl_sfac_s, {title:LANG.fl_sfac_l, convert:UC.toFloat, bound:UC.bound(0.5,2), modes:FDM, show:isNotBelt}), + firstLayerLineMult: UC.newInput(LANG.fl_sfac_s, {title:LANG.fl_sfac_l, convert:UC.toFloat, bound:UC.bound(0.5,2), modes:FDM, show:isNotBelt}), firstLayerPrintMult: UC.newInput(LANG.fl_mult_s, {title:LANG.fl_mult_l, convert:UC.toFloat, modes:FDM}), - firstLayerBrim: UC.newInput(LANG.fl_sfac_s, {title:LANG.fl_brim_l, convert:UC.toFloat, modes:FDM, show:isBelt}), - firstLayerYOffset: UC.newInput(LANG.fl_zoff_s, {title:LANG.fl_zoff_l, convert:UC.toFloat, modes:FDM, show:isBelt}), + firstLayerBrim: UC.newInput(LANG.fl_brim_s, {title:LANG.fl_brim_l, convert:UC.toFloat, modes:FDM, show:isBelt}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isNotBelt}), outputBrimCount: UC.newInput(LANG.fl_skrt_s, {title:LANG.fl_skrt_l, convert:UC.toInt, modes:FDM, show:isNotBelt}), outputBrimOffset: UC.newInput(LANG.fl_skro_s, {title:LANG.fl_skro_l, convert:UC.toFloat, modes:FDM, show:isNotBelt}), diff --git a/src/kiri/print.js b/src/kiri/print.js index e32e924b..2145cd8c 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -749,9 +749,11 @@ break; } - // optimize start point on belt for all tops - if (isBelt) { + // optimize start point on belt for tops touching belt + // and enforce optimal shell order (outer first) + if (isBelt && opt.onBelt) { startPoint = startClone; + shellOrder = 1; } // top object diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index f87c8cc0..a97fcdfc 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -292,8 +292,25 @@ if (isBelt) { offset.x = rotinfo.xpos; offset.y = -belt.midy; - offset.y += rotinfo.ypos * beltfact;// - 0.5; + offset.y += rotinfo.ypos * beltfact; offset.z = rotinfo.ypos * beltfact; + // locate the lowest point in slices and widget overall + let minby = Infinity; + for (let slice of widget.slices) { + slice.minby = Infinity; + for (let top of slice.tops) { + let poly = top.poly; + for (let point of poly.points) { + let ypos = -point.y + point.z * bfactor; + slice.minby = Math.min(slice.minby, ypos); + minby = Math.min(minby, ypos); + } + } + } + // flag slices as being on or off the bed / belt + for (let slice of widget.slices) { + slice.onbelt = Math.abs(minby - slice.minby) < 0.01; + } } else { // when rafts used this is non-zero offset.z = zoff; @@ -382,7 +399,8 @@ tmpout, //layerout, { first: slice.index === 0, - support: slice.widget.support + support: slice.widget.support, + onBelt: slice.onbelt } ); layerout.appendAll(tmpout); @@ -431,8 +449,7 @@ } } // correct y offset to desired layer offset - let miny = process.firstLayerYOffset; - // console.log({minby, miny, firstLayerHeight}); + let miny = process.firstLayerYOffset || 0; for (let layer of output) { for (let rec of layer) { let point = rec.point; diff --git a/src/moto/space.js b/src/moto/space.js index 4880c376..b1b1111c 100644 --- a/src/moto/space.js +++ b/src/moto/space.js @@ -645,6 +645,10 @@ Space.view.front(); cycleInd = 0; break; + case cca('b'): + Space.view.back(); + cycleInd = 2; + break; case cca('>'): cycleInd = (++cycleInd % cycle.length); cycle[cycleInd]();