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.ltview, { group: ltpops, target: $('pop-view') });
UC.hoverPop(UI.ltact, { group: ltpops, target: $('pop-slice') });
UC.hoverPop(UI.render, { group: ltpops, target: $('pop-render') });
UC.hoverPop(UI.rotate, { group: ltpops, target: $('pop-rotate') });
UC.hoverPop(UI.scale, { group: ltpops, target: $('pop-scale') });
UC.hoverPop(UI.nozzle, { group: ltpops, target: $('pop-nozzle') });
UC.hoverPop(UI.render, { group: ltpops, target: $('pop-render'), sticky: true });
UC.hoverPop(UI.rotate, { group: ltpops, target: $('pop-rotate'), sticky: true });
UC.hoverPop(UI.scale, { group: ltpops, target: $('pop-scale'), sticky: true });
UC.hoverPop(UI.nozzle, { group: ltpops, target: $('pop-nozzle'), sticky: true });
UC.onBlur([
UI.toolName,

View file

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

View file

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

View file

@ -81,7 +81,9 @@
fillOffset = lineWidth * fillOffsetMult,
sliceFillAngle = spro.sliceFillAngle,
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";
isThin = !isFlat && settings.controller.lineType === "line";
@ -285,7 +287,6 @@
doShells(slice, count, offset, fillOff, {
vase: vaseMode,
thin: spro.detectThinWalls && !isSynth,
belt0: isBelt && first,
widget: widget
});
if (solid) {
@ -295,6 +296,50 @@
sliceFillAngle += 90.0;
}, "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
if (doSolidLayers) {
forSlices(0.2, 0.34, slice => {
@ -380,13 +425,11 @@
const height = slice.height / 2;
slice.tops.forEach(top => {
if (isThin) {
output
if (isThin) output
.setLayer('slice', { line: 0x000066, check: 0x000066 })
.addPolys(top.poly);
}
output
if (top.shells) output
.setLayer("shells", isSynth ? COLOR.support : COLOR.shell)
.addPolys(top.shells, vopt({ offset, height }));
@ -572,23 +615,6 @@
top.last = last;
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
tops.forEach(function(top) {
top.fill_sparse = [];
top.fill_sparse = top.fill_sparse || [];
polys.appendAll(top.fill_off);
polys.appendAll(top.solids);
});
@ -844,8 +870,13 @@
let minarea = minArea || 1,
tops = slice.tops,
solids = slice.solids,
unioned = POLY.union(solids, undefined, true).flat(), // TODO verify
solids = slice.solids;
if (!(tops && solids)) {
return;
}
let unioned = POLY.union(solids, undefined, true).flat(), // TODO verify
isSLA = (spacing === undefined && angle === undefined);
if (solids.length === 0) return false;