add sticky option to popHover. checkpoint belt anchors

This commit is contained in:
Stewart Allen 2021-01-28 21:46:41 -05:00
commit d48e001e1e
4 changed files with 87 additions and 40 deletions

View file

@ -2099,10 +2099,10 @@
UC.hoverPop(UI.ltfile, { group: ltpops, target: $('file-pop') }); UC.hoverPop(UI.ltfile, { group: ltpops, target: $('file-pop') });
UC.hoverPop(UI.ltview, { group: ltpops, target: $('pop-view') }); UC.hoverPop(UI.ltview, { group: ltpops, target: $('pop-view') });
UC.hoverPop(UI.ltact, { group: ltpops, target: $('pop-slice') }); UC.hoverPop(UI.ltact, { group: ltpops, target: $('pop-slice') });
UC.hoverPop(UI.render, { group: ltpops, target: $('pop-render') }); UC.hoverPop(UI.render, { group: ltpops, target: $('pop-render'), sticky: true });
UC.hoverPop(UI.rotate, { group: ltpops, target: $('pop-rotate') }); UC.hoverPop(UI.rotate, { group: ltpops, target: $('pop-rotate'), sticky: true });
UC.hoverPop(UI.scale, { group: ltpops, target: $('pop-scale') }); UC.hoverPop(UI.scale, { group: ltpops, target: $('pop-scale'), sticky: true });
UC.hoverPop(UI.nozzle, { group: ltpops, target: $('pop-nozzle') }); UC.hoverPop(UI.nozzle, { group: ltpops, target: $('pop-nozzle'), sticky: true });
UC.onBlur([ UC.onBlur([
UI.toolName, UI.toolName,

View file

@ -891,26 +891,42 @@
let group = opt.group || []; let group = opt.group || [];
let closes = opt.closes || group; let closes = opt.closes || group;
let target = opt.target || el; let target = opt.target || el;
let popped = false;
group.push(target); group.push(target);
if (closes !== group) { if (closes !== group) {
closes.push(target); closes.push(target);
} }
el.addEventListener("mouseenter", (ev) => { let openit = () => {
clearTimeout(closes.timer); clearTimeout(closes.timer);
for (let close of closes) { for (let close of closes) {
close.classList.remove("hoverpop"); close.classList.remove("hoverpop");
} }
target.classList.add("hoverpop"); target.classList.add("hoverpop");
}); popped = true;
};
let closeit = () => {
target.classList.remove("hoverpop");
clearTimeout(closes.timer);
popped = false;
};
el.addEventListener("mouseenter", openit);
el.addEventListener("mouseleave", (ev) => { el.addEventListener("mouseleave", (ev) => {
closes.timer = setTimeout(() => { closes.timer = setTimeout(() => {
target.classList.remove("hoverpop"); target.classList.remove("hoverpop");
}, 750); }, 750);
}); });
if (!opt.sticky) {
el.addEventListener("mouseup", (ev) => {
if (popped) {
closeit();
} else {
openit();
}
});
}
document.addEventListener("keydown", (ev) => { document.addEventListener("keydown", (ev) => {
if (ev.keyCode === 27 || ev.code === 'Escape') { if (ev.keyCode === 27 || ev.code === 'Escape') {
target.classList.remove("hoverpop"); closeit();
clearTimeout(closes.timer);
} }
}); });
} }

View file

@ -459,10 +459,10 @@
} }
// add lead in, when specified // add lead in, when specified
if (process.firstLayerBeltLead) { // if (process.firstLayerBeltLead) {
// add belt lead in // // add belt lead in
console.log({process, output}); // console.log({process, output});
} // }
let thresh = firstLayerHeight * 1.05; let thresh = firstLayerHeight * 1.05;
// iterate over layers, find extrusion on belt and // iterate over layers, find extrusion on belt and

View file

@ -81,7 +81,9 @@
fillOffset = lineWidth * fillOffsetMult, fillOffset = lineWidth * fillOffsetMult,
sliceFillAngle = spro.sliceFillAngle, sliceFillAngle = spro.sliceFillAngle,
supportDensity = spro.sliceSupportDensity, supportDensity = spro.sliceSupportDensity,
view = widget.mesh && widget.mesh.newGroup ? widget.mesh.newGroup() : null; view = widget.mesh && widget.mesh.newGroup ? widget.mesh.newGroup() : null,
beltfact = Math.cos(Math.PI/4),
invbfact = 1 / beltfact;
isFlat = settings.controller.lineType === "flat"; isFlat = settings.controller.lineType === "flat";
isThin = !isFlat && settings.controller.lineType === "line"; isThin = !isFlat && settings.controller.lineType === "line";
@ -285,7 +287,6 @@
doShells(slice, count, offset, fillOff, { doShells(slice, count, offset, fillOff, {
vase: vaseMode, vase: vaseMode,
thin: spro.detectThinWalls && !isSynth, thin: spro.detectThinWalls && !isSynth,
belt0: isBelt && first,
widget: widget widget: widget
}); });
if (solid) { if (solid) {
@ -295,6 +296,50 @@
sliceFillAngle += 90.0; sliceFillAngle += 90.0;
}, "offsets"); }, "offsets");
// add lead in when specified in belt mode
if (!isSynth && isBelt && spro.firstLayerBeltLead) {
let wb = widget.bounds;
// find adjusted zero point from slices
let smin = Infinity;
for (let slice of slices) {
let miny = Infinity;
for (let poly of slice.topPolys()) {
let y = poly.bounds.maxy;
let z = slice.z;
let by = -y + z;
if (by < miny) miny = by;
if (by < smin) smin = by;
}
slice.belt = { miny, touch: false };
}
// mark slices with tops touching belt
let start;
for (let slice of slices) {
if (Math.abs(slice.belt.miny - smin) < 0.001) {
slice.belt.touch = true;
if (!start) start = slice;
}
}
// console.log({smin: smin.round(4)});
let offset = spro.firstLayerBeltLead * beltfact;
while (start && offset >= sliceHeight) {
let addto = start.down;
if (!addto) {
addto = newSlice(start.z - sliceHeight);
addto.height = start.height;
addto.up = start;
start.down = addto;
slices.splice(0,0,addto);
}
let z = addto.z;
let y = z - smin - sliceHeight * beltfact;
let splat = BASE.newPolygon().add(wb.min.x, y, z).add(wb.max.x, y, z).setOpen();
addto.addTop(splat).fill_sparse = [ splat ];
start = addto;
offset -= sliceHeight;
}
}
// calculations only relevant when solid layers are used // calculations only relevant when solid layers are used
if (doSolidLayers) { if (doSolidLayers) {
forSlices(0.2, 0.34, slice => { forSlices(0.2, 0.34, slice => {
@ -380,13 +425,11 @@
const height = slice.height / 2; const height = slice.height / 2;
slice.tops.forEach(top => { slice.tops.forEach(top => {
if (isThin) { if (isThin) output
output .setLayer('slice', { line: 0x000066, check: 0x000066 })
.setLayer('slice', { line: 0x000066, check: 0x000066 }) .addPolys(top.poly);
.addPolys(top.poly);
}
output if (top.shells) output
.setLayer("shells", isSynth ? COLOR.support : COLOR.shell) .setLayer("shells", isSynth ? COLOR.support : COLOR.shell)
.addPolys(top.shells, vopt({ offset, height })); .addPolys(top.shells, vopt({ offset, height }));
@ -572,23 +615,6 @@
top.last = last; top.last = last;
shellout += top.shells.length; shellout += top.shells.length;
// add anchor extrusion if missing on the first belt layer
// todo: fix. disabled because throws off layer min y calculations in some cases
if (false && opt.belt0 && top.shells.length === 0 && slice.up && slice.up.tops.length) {
for (let up of slice.up.tops) {
let bounds = up.poly.bounds,
midy = (bounds.miny + bounds.maxy) / 2;
if (top.poly.isInside(up.poly, 1)) {
slice.widget.belt.ymid = midy;
slice.widget.belt.zmid = slice.z;
top.shells.push(BASE.newPolygon()
.setOpen()
.add(bounds.minx,midy,slice.z)
.add(bounds.maxx,midy,slice.z));
}
}
}
}); });
}; };
@ -687,7 +713,7 @@
// prepare top infill structure // prepare top infill structure
tops.forEach(function(top) { tops.forEach(function(top) {
top.fill_sparse = []; top.fill_sparse = top.fill_sparse || [];
polys.appendAll(top.fill_off); polys.appendAll(top.fill_off);
polys.appendAll(top.solids); polys.appendAll(top.solids);
}); });
@ -844,8 +870,13 @@
let minarea = minArea || 1, let minarea = minArea || 1,
tops = slice.tops, tops = slice.tops,
solids = slice.solids, solids = slice.solids;
unioned = POLY.union(solids, undefined, true).flat(), // TODO verify
if (!(tops && solids)) {
return;
}
let unioned = POLY.union(solids, undefined, true).flat(), // TODO verify
isSLA = (spacing === undefined && angle === undefined); isSLA = (spacing === undefined && angle === undefined);
if (solids.length === 0) return false; if (solids.length === 0) return false;