add hole and perimeter offset compensation as expert settings

This commit is contained in:
Stewart Allen 2025-09-29 19:11:24 -04:00
commit 1cca293495
8 changed files with 44 additions and 10 deletions

View file

@ -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}),

View file

@ -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

View file

@ -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,