diff --git a/notes.md b/notes.md index 0a92e655..491659d3 100644 --- a/notes.md +++ b/notes.md @@ -7,7 +7,6 @@ # - redo path planning # - double-sided assistance # `fdm` -# - layer start point control # - bind process to z ranges or boxed regions ## `C` cosmetic, `F` functional, `P` performance, `B` bug fix diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 9bdbb58d..421b3b7f 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -283,6 +283,7 @@ sliceHeight: 0.25, sliceShells: 3, sliceShellOrder: "in-out", + sliceLayerStart: "last", sliceFillAngle: 45, sliceFillOverlap: 0.3, sliceFillSparse: 0.5, diff --git a/src/kiri/init.js b/src/kiri/init.js index 8c705dc2..3f748b24 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1693,6 +1693,7 @@ fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), outputFanLayer: UC.newInput(LANG.ou_fanl_s, {title:LANG.ou_fanl_l, convert:UC.toInt, bound:UC.bound(0,100), modes:FDM}), sliceShellOrder: UC.newSelect(LANG.sl_ordr_s, {title:LANG.sl_ordr_l, modes:FDM}, "shell"), + sliceLayerStart: UC.newSelect(LANG.sl_strt_s, {title:LANG.sl_strt_l, modes:FDM}, "start"), camConventional: UC.newBoolean(LANG.ou_conv_s, onBooleanClick, {title:LANG.ou_conv_l, modes:CAM}), camEaseDown: UC.newBoolean(LANG.cr_ease_s, onBooleanClick, {title:LANG.cr_ease_l, modes:CAM}), camDepthFirst: UC.newBoolean(LANG.ou_depf_s, onBooleanClick, {title:LANG.ou_depf_l, modes:CAM}), diff --git a/src/kiri/main.js b/src/kiri/main.js index 2b511212..08e62446 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -138,6 +138,11 @@ { name: "in-out" }, { name: "out-in" }, ], + start: [ + { name: "last" }, + { name: "center" }, + { name: "origin" }, + ], infill: [ { name: "vase" }, { name: "hex" }, diff --git a/src/kiri/print.js b/src/kiri/print.js index 4f1f2fff..49813e7c 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -706,6 +706,16 @@ outputFills(next.fill, {fast: true}); } } else { + // control of layer start point + switch (process.sliceLayerStart) { + case "center": + startPoint = newPoint(0,0,startPoint.z); + break; + case "origin": + startPoint = origin.clone(); + break; + } + // top object let bounds = POLY.flatten(next.shellsAtDepth(0).clone(true)); diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 3fc82611..e863f721 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -186,6 +186,8 @@ kiri.lang['en-us'] = { sl_shel_l: "number of perimeter\nwalls to generate", sl_ordr_s: "shell order", sl_ordr_l: "output shell order\ninside to outside\nor outside to inside\naffects surface quality", + sl_strt_s: "layer start", + sl_strt_l: "layer starting point\nlast = last layer end\ncenter = part center\norigin = device origin", ad_thin_s: "thin walls", ad_thin_l: "detect and fill gaps\nbetween shell walls",