fix shadow for manual supports
This commit is contained in:
parent
3ba5601cfd
commit
56c8f8e588
1 changed files with 57 additions and 38 deletions
|
|
@ -146,6 +146,36 @@
|
||||||
onSliceDoneAsync(slices).then(ondone);
|
onSliceDoneAsync(slices).then(ondone);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function doShadow(slices) {
|
||||||
|
if (widget.shadow) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// create shadow for clipping supports
|
||||||
|
let shadow = null;
|
||||||
|
let allslices = widget.group.map(w => w.slices).flat();
|
||||||
|
let alltops = allslices.map(slice => slice.topPolys()).flat();
|
||||||
|
let alllen = alltops.map(p => p.deepLength).reduce((a,v)=>a+v);
|
||||||
|
// de-rez for really large #s
|
||||||
|
if (alllen > 100000) {
|
||||||
|
// console.log({alllen});
|
||||||
|
alltops = alltops.map(p => p.clean(true, undefined, 5000));
|
||||||
|
// console.log({reduced: alltops.map(p => p.deepLength).reduce((a,v)=>a+v)});
|
||||||
|
}
|
||||||
|
let mark = Date.now();
|
||||||
|
// shadow = POLY.union(alltops, 0.1, true);
|
||||||
|
shadow = doConcurrent ?
|
||||||
|
await KIRI.minions.union(alltops, 0.1) :
|
||||||
|
POLY.union(alltops, 0.1, true);
|
||||||
|
// console.log({unioned_in: Date.now() - mark});
|
||||||
|
if (spro.sliceSupportExtra) {
|
||||||
|
shadow = POLY.offset(shadow, spro.sliceSupportExtra);
|
||||||
|
}
|
||||||
|
widget.shadow = shadow;
|
||||||
|
// slices[0].output()
|
||||||
|
// .setLayer('shadow', { line: 0xff0000, check: 0xff0000 })
|
||||||
|
// .addPolys(shadow);
|
||||||
|
}
|
||||||
|
|
||||||
async function onSliceDoneAsync(slices) {
|
async function onSliceDoneAsync(slices) {
|
||||||
// remove all empty slices above part but leave below
|
// remove all empty slices above part but leave below
|
||||||
// for multi-part (multi-extruder) setups where the void is ok
|
// for multi-part (multi-extruder) setups where the void is ok
|
||||||
|
|
@ -165,6 +195,11 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// create shadow for non-belt supports
|
||||||
|
if (!isBelt && (isSynth || (!isSynth && supportDensity && spro.sliceSupportEnable))) {
|
||||||
|
await doShadow(slices);
|
||||||
|
}
|
||||||
|
|
||||||
// for synth support widgets, merge tops
|
// for synth support widgets, merge tops
|
||||||
if (isSynth) {
|
if (isSynth) {
|
||||||
for (let slice of slices) {
|
for (let slice of slices) {
|
||||||
|
|
@ -200,17 +235,17 @@
|
||||||
}
|
}
|
||||||
// trim to group's shadow if not in belt mode
|
// trim to group's shadow if not in belt mode
|
||||||
if (!isBelt) {
|
if (!isBelt) {
|
||||||
let group = widget.group[0];
|
// let group = widget.group[0];
|
||||||
if (!group.shadow) {
|
// if (!group.shadow) {
|
||||||
let gs = [];
|
// let gs = [];
|
||||||
for (let w of group) {
|
// for (let w of group) {
|
||||||
if (w.shadow) {
|
// if (w.shadow) {
|
||||||
gs = POLY.union([w.shadow,...gs],null,0.1);
|
// gs = POLY.union([w.shadow,...gs],null,0.1);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
group.shadow = gs;
|
// group.shadow = gs;
|
||||||
}
|
// }
|
||||||
tops = POLY.setZ(POLY.trimTo(tops, group.shadow), slice.z);
|
tops = POLY.setZ(POLY.trimTo(tops, widget.shadow), slice.z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
slice.tops = [];
|
slice.tops = [];
|
||||||
|
|
@ -464,54 +499,38 @@
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else if (isSynth) {
|
} else if (isSynth) {
|
||||||
forSlices(0.5, 0.7, slice => {
|
let promises = doConcurrent ? [] : undefined;
|
||||||
|
forSlices(0.5, promises ? 0.6 : 0.7, slice => {
|
||||||
let params = slice.params || spro;
|
let params = slice.params || spro;
|
||||||
let density = params.sliceSupportDensity;
|
let density = params.sliceSupportDensity;
|
||||||
if (density)
|
if (density)
|
||||||
for (let top of slice.tops) {
|
for (let top of slice.tops) {
|
||||||
let offset = [];
|
let offset = [];
|
||||||
POLY.expand(top.shells, -nozzleSize/4, slice.z, offset);
|
POLY.expand(top.shells, -nozzleSize/4, slice.z, offset);
|
||||||
fillSupportPolys(offset, lineWidth, density, slice.z);
|
fillSupportPolys(promises, offset, lineWidth, density, slice.z);
|
||||||
top.fill_lines = offset.map(o => o.fill).flat().filter(v => v);
|
top.fill_lines = offset.map(o => o.fill).flat().filter(v => v);
|
||||||
}
|
}
|
||||||
}, "infill");
|
}, "infill");
|
||||||
|
if (promises) {
|
||||||
|
await tracker(promises, (i, t) => {
|
||||||
|
trackupdate(i / t, 0.6, 0.7);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// auto support generation
|
// auto support generation
|
||||||
if (!isBelt && !isSynth && supportDensity && spro.sliceSupportEnable) {
|
if (!isBelt && !isSynth && supportDensity && spro.sliceSupportEnable) {
|
||||||
// create shadow for clipping supports
|
doShadow(slices);
|
||||||
let shadow = null;
|
|
||||||
let alltops = slices.map(slice => slice.topPolys()).flat();
|
|
||||||
let alllen = alltops.map(p => p.deepLength).reduce((a,v)=>a+v);
|
|
||||||
if (alllen > 100000) {
|
|
||||||
// console.log({alllen});
|
|
||||||
alltops = alltops.map(p => p.clean(true, undefined, 5000));
|
|
||||||
// console.log({reduced: alltops.map(p => p.deepLength).reduce((a,v)=>a+v)});
|
|
||||||
}
|
|
||||||
let mark = Date.now();
|
|
||||||
// shadow = POLY.union(alltops, 0.1, true);
|
|
||||||
shadow = doConcurrent ?
|
|
||||||
await KIRI.minions.union(alltops, 0.1) :
|
|
||||||
POLY.union(alltops, 0.1, true);
|
|
||||||
// console.log({unioned_in: Date.now() - mark});
|
|
||||||
if (spro.sliceSupportExtra) {
|
|
||||||
shadow = POLY.offset(shadow, spro.sliceSupportExtra);
|
|
||||||
}
|
|
||||||
widget.shadow = shadow;
|
|
||||||
// slices[0].output()
|
|
||||||
// .setLayer('shadow', { line: 0xff0000, check: 0xff0000 })
|
|
||||||
// .addPolys(shadow);
|
|
||||||
// console.log('start'); await BASE.util.ptimer(1000);
|
// console.log('start'); await BASE.util.ptimer(1000);
|
||||||
forSlices(0.7, 0.8, slice => {
|
forSlices(0.7, 0.8, slice => {
|
||||||
doSupport(slice, spro, shadow);
|
doSupport(slice, spro, widget.shadow);
|
||||||
}, "support");
|
}, "support");
|
||||||
// console.log('stop'); await BASE.util.ptimer(1000);
|
// console.log('stop'); await BASE.util.ptimer(1000);
|
||||||
let promises = doConcurrent ? [] : undefined;
|
let promises = doConcurrent ? [] : undefined;
|
||||||
forSlices(0.8, promises ? 0.88 : 0.9, slice => {
|
forSlices(0.8, promises ? 0.88 : 0.9, slice => {
|
||||||
doSupportFill(promises, slice, lineWidth, supportDensity, spro.sliceSupportArea);
|
doSupportFill(promises, slice, lineWidth, supportDensity, spro.sliceSupportArea);
|
||||||
}, "support.fill");
|
}, "support");
|
||||||
if (promises) {
|
if (promises) {
|
||||||
console.log({promises});
|
|
||||||
await tracker(promises, (i, t) => {
|
await tracker(promises, (i, t) => {
|
||||||
trackupdate(i / t, 0.88, 0.9);
|
trackupdate(i / t, 0.88, 0.9);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue