diff --git a/notes.md b/notes.md index b7e7a9a1..7cf2186c 100644 --- a/notes.md +++ b/notes.md @@ -33,8 +33,6 @@ * `F` new parameter to cap output flow rate (on printer device) * `F` new parameters for bridging speed / bridge fan control -* `F` new base paremeter for hole and perimeter compensation -* `F` new parameters for inner / outer perimeter compensation * `F` convert ranges to z offsets while continuing to show layer # * `F` support pillar top/bottom should conform to part * `F` more explicit line width control with ranges and min/max adaptive diff --git a/src/kiri/core/api.js b/src/kiri/core/api.js index c66292a3..42ec035c 100644 --- a/src/kiri/core/api.js +++ b/src/kiri/core/api.js @@ -96,6 +96,7 @@ let UC = UI.prefix('kiri').inputAction(settings.conf.update), put: (key, val) => localSet(key, val), set: (key, val) => localSet(key, val), setItem: (key, val) => localSet(key, val), + removeItem: (key) => localRemove(key) }, tweak = { line_precision(v) { api.work.config({ base: { clipperClean: v } }) }, @@ -119,6 +120,11 @@ function localSet(key, val) { return val; } +function localRemove(key) { + let sloc = api.conf.get().local; + return delete sloc[key]; +} + export const api = { ajax, beta, diff --git a/src/kiri/core/conf.js b/src/kiri/core/conf.js index 4daf5556..71908b54 100644 --- a/src/kiri/core/conf.js +++ b/src/kiri/core/conf.js @@ -267,6 +267,8 @@ export const conf = { sliceLayerStartX: 0, sliceLayerStartY: 0, sliceLineWidth: 0, + sliceCompInner: 0, + sliceCompOuter: 0, sliceFillGrow: 0, sliceFillAngle: 45, sliceFillWidth: 1, diff --git a/src/kiri/core/widget.js b/src/kiri/core/widget.js index 783598ca..47222eb7 100644 --- a/src/kiri/core/widget.js +++ b/src/kiri/core/widget.js @@ -782,9 +782,11 @@ class Widget { } if (set) { let dark = this.api.space.is_dark(); + let cam = this.api.mode.is_cam(); + let color = dark && !cam ? 0xffffff : 0; let angle = this.api.conf.get().controller.edgeangle || 20; let edges = new THREE.EdgesGeometry(mesh.geometry, angle); - let material = new THREE.LineBasicMaterial({ color: 0 }); + let material = new THREE.LineBasicMaterial({ color }); this.outline = new THREE.LineSegments(edges, material); this.outline.renderOrder = -20; mesh.add(this.outline); diff --git a/src/kiri/mode/fdm/init-menu.js b/src/kiri/mode/fdm/init-menu.js index fc0506c1..07571f0b 100644 --- a/src/kiri/mode/fdm/init-menu.js +++ b/src/kiri/mode/fdm/init-menu.js @@ -181,6 +181,8 @@ export function menu() { outputScarfLength: newInput(LANG.ad_scar_s, {title:LANG.ad_scar_l, convert:toFloat, bound:bound(0,1000)}), outputShortPoly: newInput(LANG.ad_spol_s, {title:LANG.ad_spol_l, convert:toFloat, bound:bound(0,10000)}), outputCoastDist: newInput(LANG.ad_scst_s, {title:LANG.ad_scst_l, convert:toFloat, bound:bound(0.0,10)}), + sliceCompInner: newInput(LANG.sl_ofin_s, {title:LANG.sl_ofin_l, convert:toFloat, bound:bound(-10.0,10.0)}), + sliceCompOuter: newInput(LANG.sl_ofot_s, {title:LANG.sl_ofot_l, convert:toFloat, bound:bound(-10.0,10.0)}), zHopDistance: newInput(LANG.ad_zhop_s, {title:LANG.ad_zhop_l, convert:toFloat, bound:bound(0,3.0)}), outputLoops: newInput(LANG.ag_loop_s, {title:LANG.ag_loop_l, convert:toInt, bound:bound(-1,1000), show:isBelt}), diff --git a/src/kiri/mode/fdm/post.js b/src/kiri/mode/fdm/post.js index 25cd368e..b910958a 100644 --- a/src/kiri/mode/fdm/post.js +++ b/src/kiri/mode/fdm/post.js @@ -17,12 +17,13 @@ slicer.slicePost.FDM = slicePost; * data object. return is ignored. */ export function slicePost(data, options) { - const { z, lines, groups } = data; - const { useAssembly, post_args, zIndexes } = options; - const { process, isSynth, vaseMode } = post_args; - const { shellOffset, fillOffset, clipOffset } = post_args; + const { groups, z } = data; + const { post_args, useAssembly, zIndexes } = options; + const { isSynth, process, vaseMode } = post_args; + const { compInner, compOuter, pump } = post_args; + const { clipOffset, fillOffset, shellOffset } = post_args; - if (options.pump) { + if (pump) { let nugroups = []; let pump = shellOffset / 10; for (let p of groups) { @@ -41,6 +42,19 @@ export function slicePost(data, options) { data.tops = POLY.nest(groups); } + // perimeter and inner hole compensation offsets + if (compInner || compOuter) { + let inner = POLY.inner(data.tops).flat(); + let outer = POLY.outer(data.tops); + if (compInner) { + inner = POLY.flatten(POLY.offset(inner, compInner/2)); + } + if (compOuter) { + outer = POLY.flatten(POLY.offset(outer, -compOuter/2)); + } + data.tops = POLY.nest([...inner, ...outer]); + } + if (isSynth) { const process = post_args.process; if (process.sliceSupportGrow > 0) { @@ -54,6 +68,7 @@ export function slicePost(data, options) { delete data.groups; return; } + const index = zIndexes.indexOf(z); const range = getRangeParameters(process, index); // calculate fractional shells @@ -129,7 +144,7 @@ function offset_default(params) { } const deltaBig = 160; - const deltSmall = 20; + const deltaSmall = 20; // look for close points on adjacent segmented polys and merge let test_polys = first !== last ? [ ...first, ...last ] : last; @@ -139,6 +154,8 @@ function offset_default(params) { for (let poly of test_flats) poly.forEachSegment((p0, p1) => { p0.angle = new Slope(p0, p1); + // todo calc vertex angle + // exclude segment vertex from merge when angle < deltaSmall }); // segment each poly to be tested diff --git a/src/kiri/mode/fdm/slice.js b/src/kiri/mode/fdm/slice.js index bc91bb0e..9bda3df8 100644 --- a/src/kiri/mode/fdm/slice.js +++ b/src/kiri/mode/fdm/slice.js @@ -140,7 +140,8 @@ export function fdm_slice(settings, widget, onupdate, ondone) { fillOffset = lineWidth * fillOffsetMult, clipOffset = process.sliceSupportOffset, sliceFillAngle = process.sliceFillAngle, - supportDensity = process.sliceSupportDensity; + supportDensity = process.sliceSupportDensity, + { sliceCompInner, sliceCompOuter } = process; // override globals used by vopt() isFlat = controller.lineType === "flat"; @@ -230,6 +231,8 @@ export function fdm_slice(settings, widget, onupdate, ondone) { useAssembly, post: 'FDM', post_args: { + compInner: sliceCompInner, + compOuter: sliceCompOuter, shellOffset, fillOffset, clipOffset, diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 451bcadb..39eb200d 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -362,6 +362,10 @@ self.lang['en-us'] = { sl_ordr_l: ["output shell order","inside to outside","or outside to inside","affects surface quality"], sl_strt_s: "start point", sl_strt_l: ["layer starting point","last = where last layer ended","center = part center","origin = device origin","random = yolo"], + sl_ofin_s: "shell inner offset", + sl_ofin_l: ["inner hole perimeter offset","in millimeters"], + sl_ofot_s: "shell outer offset", + sl_ofot_l: ["outer wall perimeter offset","in millimeters"], // FDM SOLID fs_menu: "solid fill",