checkpoint trace work

This commit is contained in:
Stewart Allen 2020-12-01 12:31:38 -05:00
commit 9945a08dbb
3 changed files with 24 additions and 16 deletions

View file

@ -206,6 +206,7 @@
flatoff = UTIL.numOrDefault(opt.flatoff, 0.01),
onflat = this.zFlat[znorm],
edges = opt.edges || false,
over = opt.over || false,
phash = {},
lines = [],
zScale = this.zScale,
@ -237,7 +238,7 @@
// one side of triangle is on the Z plane and 3rd is below
// drop lines with 3rd above because that leads to ambiguities
// with complex nested polygons on flat surface
if (edges || where.under.length === 1) {
if ((over && where.over.length === 1) || (!over && where.under.length === 1)) {
lines.push(makeZLine(phash, where.on[0], where.on[1], false, true));
}
} else if (where.on.length === 3) {

View file

@ -235,8 +235,10 @@
KIRI.api.widgets.for(widget => {
let stack = new KIRI.Stack(widget.mesh);
widget.trace_stack = stack;
widget.traces.forEach(slice => {
stack.addLayers(slice.layers);
widget.traces.forEach(poly => {
let layers = new KIRI.Layers();
layers.setLayer("trace", {line: 0x88aa55}, false).addPoly(poly);
stack.addLayers(layers);
});
widget.adds.appendAll(stack.meshes);
});

View file

@ -486,6 +486,10 @@
// generate tracing offsets from chosen features
if (procTrace) {
// todo
// let proc = settings.process;
// let traceTool = new CAM.Tool(settings, proc.camTraceTool);
// let traceToolDiam = traceTool.fluteDiameter();
// widget.maxToolDiam = Math.max(maxToolDiam, traceToolDiam);
// slice.camMode = PRO.TRACE;
}
@ -523,30 +527,31 @@
zlist: true,
zline: true
});
let proc = settings.process;
let traceTool = new CAM.Tool(settings, proc.camTraceTool);
let traceToolDiam = traceTool.fluteDiameter();
// widget.maxToolDiam = Math.max(maxToolDiam, traceToolDiam);
// unique merge of z flats and z line indices
let indices = [...new Set(Object.keys(slicer.zFlat)
.map(kv => parseFloat(kv).round(5))
.appendAll(Object.entries(slicer.zLine).map(ze => {
let [ zk, zv ] = ze;
return zv > 0 ? parseFloat(zk).round(5) : null;
return zv > 1 ? parseFloat(zk).round(5) : null;
})
.filter(v => v !== null)))]
.sort((a,b) => b - a);
let traces = [];
slicer.slice(indices, { each: (data, index, total) => {
let oneach = (data, index, total) => {
// create separate slice for each poly (and inner)
BASE.polygons.flatten(data.tops,null,true).forEach(poly => {
let trace = KIRI.newSlice(data.z);
trace.output('trace')
.setLayer("trace", {line: 0x88aa55}, false)
.addPoly(poly);
traces.push(trace);
for (let i=0, il=traces.length; i<il; i++) {
// do not add duplicates
if (traces[i].isEquivalent(poly)) {
return;
}
}
traces.push(poly);
});
}, flatoff: 0, edges: true, openok: true });
};
let opts = { each: oneach, over: false, flatoff: 0, edges: true, openok: true };
slicer.slice(indices, opts);
opts.over = true;
slicer.slice(indices, opts);
widget.traces = traces;
};