checkpoint trace work

This commit is contained in:
Stewart Allen 2020-12-01 14:22:19 -05:00
commit ea4f5de034
4 changed files with 59 additions and 7 deletions

View file

@ -1389,7 +1389,7 @@
* @param {Polygon} poly clipping mask
* @returns {?Polygon[]}
*/
PRO.mask = function(poly) {
PRO.mask = function(poly, nullOnEquiv) {
let fillang = this.fillang && this.area() > poly.area() ? this.fillang : poly.fillang,
clib = self.ClipperLib,
ctyp = clib.ClipType,
@ -1408,6 +1408,9 @@
poly.forEach(function(p) {
p.fillang = fillang;
})
if (nullOnEquiv && poly.length === 1 && poly[0].isEquivalent(this)) {
return null;
}
return poly;
} else {
return null;
@ -1454,7 +1457,7 @@
});
return cuts;
} else {
return this;
return null;
}
};

View file

@ -240,6 +240,12 @@
layers.setLayer("trace", {line: 0x88aa55}, false).addPoly(poly);
stack.addLayers(layers);
});
// for (let [key, val] of Object.entries(widget.sindex)) {
// console.log('sindex', {key, val});
// let layers = new KIRI.Layers();
// layers.setLayer("sindex", {line: 0x55aa88}, false).addPolys(val);
// stack.addLayers(layers);
// }
widget.adds.appendAll(stack.meshes);
});
});

View file

@ -32,6 +32,7 @@
send("traces", { settings }, output => {
KIRI.codec.decode(output).forEach(rec => {
widgets[rec.id].traces = rec.traces;
widgets[rec.id].sindex = rec.sindex;
});
ondone(true);
});
@ -44,7 +45,8 @@
widgets.forEach(widget => CAM.traces(settings, widget));
send.done(KIRI.codec.encode(widgets.map(widget => {return {
id: widget.id,
traces: widget.traces
traces: widget.traces,
sindex: widget.sindex
}})));
};

View file

@ -147,7 +147,7 @@
tzindex = [ tzindex.pop() ];
}
let terrain = slicer.slice(tzindex, { each: (data, index, total) => {
tshadow = POLY.union(tshadow.appendAll(data.tops), 0.01, true);
tshadow = POLY.union(tshadow.slice().appendAll(data.tops), 0.01, true);
tslices.push(data.slice);
if (false) {
const slice = data.slice;
@ -242,7 +242,7 @@
// console.log('indices', ...indices, {zBottom});
slicer.slice(indices, { each: (data, index, total) => {
shadow = POLY.union(shadow.appendAll(data.tops), 0.01, true);
shadow = POLY.union(shadow.slice().appendAll(data.tops), 0.01, true);
if (flats.indexOf(data.z) >= 0) {
// exclude flats injected to complete shadow
return;
@ -373,7 +373,7 @@
indices = indices.appendAll(flats).sort((a,b) => b-a);
// console.log('indices', ...indices, {zBottom, slicer});
slicer.slice(indices, { each: (data, index, total) => {
shadow = POLY.union(shadow.appendAll(data.tops), 0.01, true);
shadow = POLY.union(shadow.slice().appendAll(data.tops), 0.01, true);
if (flats.indexOf(data.z) >= 0) {
// exclude flats injected to complete shadow
return;
@ -535,9 +535,19 @@
})
.filter(v => v !== null)))]
.sort((a,b) => b - a);
// create shadow
let sindex = {};
let shadow = [];
let sindices = indices.map((v,i) => v > 0 ? v : v + 0.005 );
slicer.slice(sindices, { each: (data, index, total) => {
shadow = POLY.union(shadow.slice().appendAll(data.tops), 0, true);
POLY.setZ(shadow, data.z);
sindex[index] = shadow;
}, flatoff: 0 });
let traces = [];
// find and trim polys (including open) to shadow
let oneach = (data, index, total) => {
// create separate slice for each poly (and inner)
BASE.polygons.flatten(data.tops,null,true).forEach(poly => {
for (let i=0, il=traces.length; i<il; i++) {
// do not add duplicates
@ -546,6 +556,36 @@
}
}
traces.push(poly);
return;
// do trimming
let trimto = sindex[index];
if (!trimto) {
traces.push(poly);
return;
}
trimto = trimto.clone(true);
if (poly.open) {
let cuts = poly.cut(trimto);
if (cuts.length) {
traces.appendAll(cuts);
} else {
traces.push(poly);
}
} else {
let limit = 1000;
while (trimto.length && limit-- > 0) {
let trim = trimto.shift();
let mask = poly.mask(trim, true);
if (mask) {
trimto.appendAll(mask);
} else {
traces.push(poly);
}
}
if (limit === 1000) {
traces.push(poly);
}
}
});
};
let opts = { each: oneach, over: false, flatoff: 0, edges: true, openok: true };
@ -553,6 +593,7 @@
opts.over = true;
slicer.slice(indices, opts);
widget.traces = traces;
widget.sindex = sindex;
};
// drilling op