add pillar merging, culling of stunted pillars
This commit is contained in:
parent
be5b7ff2ee
commit
e83943ed4f
1 changed files with 54 additions and 20 deletions
|
|
@ -94,9 +94,11 @@ let gs_kiri_sla = exports;
|
||||||
grow = height, // union per layer expand
|
grow = height, // union per layer expand
|
||||||
off = 1 - (layers * grow); // starting union offset from part
|
off = 1 - (layers * grow); // starting union offset from part
|
||||||
let outer = slices.forEach(slice => {
|
let outer = slices.forEach(slice => {
|
||||||
polys.appendAll(slice.tops.map(t => t.poly));
|
// poly.clone prevents inner voids from forming
|
||||||
|
polys.appendAll(slice.tops.map(t => t.poly.clone()));
|
||||||
});
|
});
|
||||||
let union = POLY.union(polys);
|
// p.clone prevents inner voids from forming
|
||||||
|
let union = POLY.union(polys).map(p => p.clone());
|
||||||
let expand = POLY.expand(union, off, zoff, [], 1);
|
let expand = POLY.expand(union, off, zoff, [], 1);
|
||||||
let lastraft;
|
let lastraft;
|
||||||
for (let s=0; s<layers + gap; s++) {
|
for (let s=0; s<layers + gap; s++) {
|
||||||
|
|
@ -281,9 +283,6 @@ let gs_kiri_sla = exports;
|
||||||
slices.forEach(slice => {
|
slices.forEach(slice => {
|
||||||
if (slice.can_emit) {
|
if (slice.can_emit) {
|
||||||
if (seq === 0 || slice.index - seqLast > 5) {
|
if (seq === 0 || slice.index - seqLast > 5) {
|
||||||
// slice.supports = slice.bear_up.map(p => {
|
|
||||||
// return p.clone(true).setZ(slice.z);
|
|
||||||
// });
|
|
||||||
slice.bear_up.map(p => {
|
slice.bear_up.map(p => {
|
||||||
return p.clone(true).setZ(slice.z);
|
return p.clone(true).setZ(slice.z);
|
||||||
}).forEach(p => {
|
}).forEach(p => {
|
||||||
|
|
@ -302,7 +301,8 @@ let gs_kiri_sla = exports;
|
||||||
// union support pillars
|
// union support pillars
|
||||||
slices.forEach(slice => {
|
slices.forEach(slice => {
|
||||||
if (slice.supports) {
|
if (slice.supports) {
|
||||||
slice.supports = POLY.union(slice.supports);
|
// todo unioning seems to be failing
|
||||||
|
// slice.supports = POLY.union(slice.supports);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -367,7 +367,18 @@ let gs_kiri_sla = exports;
|
||||||
|
|
||||||
// mark support pillar for each point
|
// mark support pillar for each point
|
||||||
out.filter(p => p !== null)
|
out.filter(p => p !== null)
|
||||||
.forEach(p => projectPillar(process, slice, p, size, []));
|
.forEach(p => {
|
||||||
|
let track = projectPillar(process, slice, p, size, []);
|
||||||
|
// find stunted pillars terminating on a face (not raft or merged)
|
||||||
|
if (track.length && !(track.max || track.synth || track.merged)) {
|
||||||
|
// remove stunted pillar
|
||||||
|
track.forEach(rec => {
|
||||||
|
let sp = rec.slice.supports;
|
||||||
|
let rp = sp.indexOf(rec.pillar);
|
||||||
|
if (rp >= 0) sp.splice(rp,1);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// inset polygon for flat area support
|
// inset polygon for flat area support
|
||||||
if (flat) poly.offset(Math.max(0.2, 1 - process.slaSupportDensity), arr);
|
if (flat) poly.offset(Math.max(0.2, 1 - process.slaSupportDensity), arr);
|
||||||
|
|
@ -389,10 +400,9 @@ let gs_kiri_sla = exports;
|
||||||
safe = [], // non-overlapping points
|
safe = [], // non-overlapping points
|
||||||
low = slice.index < process.slaSupportGap + process.slaSupportLayers;
|
low = slice.index < process.slaSupportGap + process.slaSupportLayers;
|
||||||
|
|
||||||
// slice.supports.push(pillar); return;
|
|
||||||
|
|
||||||
track.min = track.min ? Math.min(track.min, size) : size;
|
track.min = track.min ? Math.min(track.min, size) : size;
|
||||||
track.max = (track.max ? true : false) || size >= max;
|
track.max = (track.max ? true : false) || size >= max;
|
||||||
|
track.synth = track.synth || slice.synth;
|
||||||
|
|
||||||
slice.tops.forEach(t => {
|
slice.tops.forEach(t => {
|
||||||
if (track.length > 3 && point.isInPolygon(t.poly)) {
|
if (track.length > 3 && point.isInPolygon(t.poly)) {
|
||||||
|
|
@ -416,7 +426,7 @@ let gs_kiri_sla = exports;
|
||||||
while (track.length) {
|
while (track.length) {
|
||||||
let prec = track.pop(),
|
let prec = track.pop(),
|
||||||
npil = newPolygon()
|
npil = newPolygon()
|
||||||
.centerCircle(point, nusize/2, points, true)
|
.centerCircle(prec.point, nusize/2, points, true)
|
||||||
.setZ(prec.slice.z),
|
.setZ(prec.slice.z),
|
||||||
spos = prec.slice.supports.indexOf(prec.pillar);
|
spos = prec.slice.supports.indexOf(prec.pillar);
|
||||||
// if we find our old pillar, replace
|
// if we find our old pillar, replace
|
||||||
|
|
@ -429,9 +439,11 @@ let gs_kiri_sla = exports;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return track;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let nextpoint = point;
|
||||||
|
|
||||||
if (over.length) {
|
if (over.length) {
|
||||||
// move toward average of safe (non-overlapping) points
|
// move toward average of safe (non-overlapping) points
|
||||||
if (safe.length) {
|
if (safe.length) {
|
||||||
|
|
@ -440,7 +452,7 @@ let gs_kiri_sla = exports;
|
||||||
x /= safe.length;
|
x /= safe.length;
|
||||||
y /= safe.length;
|
y /= safe.length;
|
||||||
if (x !== point.x || y !== point.y) {
|
if (x !== point.x || y !== point.y) {
|
||||||
point = point.offsetPointTo({x, y, z:slice.z}, inc);
|
nextpoint = point.offsetPointTo({x, y, z:slice.z}, inc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// once max'ed out, can only shrink in size
|
// once max'ed out, can only shrink in size
|
||||||
|
|
@ -453,18 +465,40 @@ let gs_kiri_sla = exports;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size < track.min) {
|
if (size < track.min) {
|
||||||
return;
|
return track;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pillar) {
|
let close = [];
|
||||||
slice.supports.push(pillar);
|
for (let i=0; i<slice.pillars.length; i++) {
|
||||||
slice.pillars.push({point, pillar, size});
|
let p = slice.pillars[i].point;
|
||||||
track.push({slice, point, pillar, size});
|
let d = point.distTo2D(p);
|
||||||
if (slice.down) {
|
// terminate if we're inside another pillar
|
||||||
projectPillar(process, slice.down, point, Math.min(size, max), track);
|
if (d < inc) {
|
||||||
} else {
|
track.merged = true;
|
||||||
|
return track;
|
||||||
|
}
|
||||||
|
if (d <= process.slaSupportSize * 1.5) {
|
||||||
|
close.push(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (close.length) {
|
||||||
|
let newp = point.clone();
|
||||||
|
close.forEach(p => {
|
||||||
|
newp.x += p.x;
|
||||||
|
newp.y += p.y;
|
||||||
|
});
|
||||||
|
newp.x /= (close.length + 1);
|
||||||
|
newp.y /= (close.length + 1);
|
||||||
|
nextpoint = point.offsetPointTo(newp, inc);
|
||||||
|
}
|
||||||
|
|
||||||
|
slice.supports.push(pillar);
|
||||||
|
slice.pillars.push({point, pillar, size});
|
||||||
|
track.push({slice, point, pillar, size});
|
||||||
|
if (slice.down) {
|
||||||
|
projectPillar(process, slice.down, nextpoint, Math.min(size, max), track);
|
||||||
|
}
|
||||||
|
return track;
|
||||||
}
|
}
|
||||||
|
|
||||||
function fillPolys(slice, settings) {
|
function fillPolys(slice, settings) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue