diff --git a/notes.md b/notes.md index 1a012b26..6b1ce320 100644 --- a/notes.md +++ b/notes.md @@ -12,6 +12,8 @@ * `P` client/worker interface normalization * `P` explore widget vertex reloading / replacing +* `F` SVG import to 3D part like images + # FDM * `B` fix adaptive slicing with multi-extruder @@ -19,6 +21,7 @@ * `B` multi-extruder rendering of raft fails to offset the rest of the print * `B` multi-extruder purge blocks fail to generate properly for rafts +* `F` optional seed profile for a first-time-used device * `F` slicing controls per user-defined z-region * `F` control for size of purge block (with 0=disabled) * `F` add separate fill speed control @@ -34,6 +37,7 @@ * `F` apply finish speed to exposed top and underside flat areas * `F` expand internal supporting flats / solids before projection +* `P` revisit path routing / optimization * `P` implement infill clipping in wasm * `P` solid fill the tops of supports for down facing flats * `P` sparse infill should follow polys between intersect points diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 830c9b67..d257dc9b 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -305,6 +305,7 @@ firstLayerFillRate: 35, firstLayerPrintMult: 1.0, firstLayerLineMult: 1.0, + firstLayerYOffset: 0, firstLayerNozzleTemp: 0, firstLayerBedTemp: 0, firstLayerBrim: 0, diff --git a/src/kiri/init.js b/src/kiri/init.js index c87db812..d0089f6f 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1325,6 +1325,14 @@ } } + function isBelt() { + return UI.deviceBelt.checked; + } + + function isNotBelt() { + return !isBelt(); + } + // MAIN INITIALIZATION FUNCTION function init_one() { @@ -1505,7 +1513,7 @@ maxHeight: UC.newInput(LANG.dv_bedh_s, {title:LANG.dv_bedh_l, convert:UC.toFloat, size:6, modes:FDM_SLA}), spindleMax: UC.newInput(LANG.dv_spmx_s, {title:LANG.dv_spmx_l, convert:UC.toInt, size: 6, modes:CAM}), deviceOrigin: UC.newBoolean(LANG.dv_orgc_s, onBooleanClick, {title:LANG.dv_orgc_l, modes:FDM_LASER_SLA}), - deviceRound: UC.newBoolean(LANG.dv_bedc_s, onBooleanClick, {title:LANG.dv_bedc_l, modes:FDM, trigger:true, show:() => !UI.deviceBelt.checked}), + deviceRound: UC.newBoolean(LANG.dv_bedc_s, onBooleanClick, {title:LANG.dv_bedc_l, modes:FDM, trigger:true, show:isNotBelt}), deviceBelt: UC.newBoolean(LANG.dv_belt_s, onBooleanClick, {title:LANG.dv_belt_l, modes:FDM, trigger:true, show:() => !UI.deviceRound.checked}), extruder: UC.newGroup(LANG.dv_gr_ext, $('device2'), {group:"dext", inline:true, modes:FDM}), @@ -1590,23 +1598,24 @@ laserSliceSingle: UC.newBoolean(LANG.ls_sngl_s, onBooleanClick, {title:LANG.ls_sngl_l, modes:LASER}), firstLayer: UC.newGroup(LANG.fl_menu, null, {modes:FDM}), - firstSliceHeight: UC.newInput(LANG.fl_lahi_s, {title:LANG.fl_lahi_l, convert:UC.toFloat, modes:FDM, show:() => !UI.deviceBelt.checked}), - fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:() => !UI.deviceBelt.checked}), - firstLayerNozzleTemp:UC.newInput(LANG.fl_nozl_s, {title:LANG.fl_nozl_l, convert:UC.toInt, modes:FDM, show:() => !UI.deviceBelt.checked}), - firstLayerBedTemp: UC.newInput(LANG.fl_bedd_s, {title:LANG.fl_bedd_l, convert:UC.toInt, modes:FDM, show:() => !UI.deviceBelt.checked}), - fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:() => !UI.deviceBelt.checked}), + firstSliceHeight: UC.newInput(LANG.fl_lahi_s, {title:LANG.fl_lahi_l, convert:UC.toFloat, modes:FDM, show:isNotBelt}), + fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isNotBelt}), + 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}), 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:() => !UI.deviceBelt.checked}), - fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:() => !UI.deviceBelt.checked}), - firstLayerLineMult: UC.newInput(LANG.fl_sfac_s, {title:LANG.fl_sfac_l, convert:UC.toFloat, bound:UC.bound(0.5,2), modes:FDM, show:() => !UI.deviceBelt.checked}), + 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}), 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:() => UI.deviceBelt.checked}), - fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:() => !UI.deviceBelt.checked}), - outputBrimCount: UC.newInput(LANG.fl_skrt_s, {title:LANG.fl_skrt_l, convert:UC.toInt, modes:FDM, show:() => !UI.deviceBelt.checked}), - outputBrimOffset: UC.newInput(LANG.fl_skro_s, {title:LANG.fl_skro_l, convert:UC.toFloat, modes:FDM, show:() => !UI.deviceBelt.checked}), - fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:() => !UI.deviceBelt.checked}), - outputRaftSpacing: UC.newInput(LANG.fr_spac_s, {title:LANG.fr_spac_l, convert:UC.toFloat, bound:UC.bound(0.0,3.0), modes:FDM, show: () => UI.outputRaft.checked && !UI.deviceBelt.checked }), - outputRaft: UC.newBoolean(LANG.fr_nabl_s, onBooleanClick, {title:LANG.fr_nabl_l, modes:FDM, trigger: true, show: () => !UI.deviceBelt.checked }), + 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}), + 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}), + fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isNotBelt}), + outputRaftSpacing: UC.newInput(LANG.fr_spac_s, {title:LANG.fr_spac_l, convert:UC.toFloat, bound:UC.bound(0.0,3.0), modes:FDM, show: () => UI.outputRaft.checked && isNotBelt() }), + outputRaft: UC.newBoolean(LANG.fr_nabl_s, onBooleanClick, {title:LANG.fr_nabl_l, modes:FDM, trigger: true, show:isNotBelt}), fdmInfill: UC.newGroup(LANG.fi_menu, $('settings'), {modes:FDM}), sliceFillType: UC.newSelect(LANG.fi_type, {modes:FDM}, "infill"), diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 15a3f7c5..f87c8cc0 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -431,7 +431,7 @@ } } // correct y offset to desired layer offset - let miny = firstLayerHeight / 2; + let miny = process.firstLayerYOffset; // console.log({minby, miny, firstLayerHeight}); for (let layer of output) { for (let rec of layer) { diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 1fac1c51..59c1e326 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -213,6 +213,8 @@ kiri.lang['en-us'] = { fl_mult_l: "extrusion multiplier\n0.0 - 2.0", fl_sfac_s: "width factor", fl_sfac_l: "multiplier on nozzle size\nchanges line spacing", + fl_zoff_s: "layer offset", + fl_zoff_l: "height offset from belt\nof lowest extrusion\nin millimeters", fl_brim_s: "brim size", fl_brim_l: "add brim to part bottom\nsize is width in millimeters\n0 to disable", fl_skrt_s: "skirt count",