checkpoint prototype

This commit is contained in:
Stewart Allen 2023-01-09 14:55:17 -05:00
commit 849a55439b
12 changed files with 169 additions and 50 deletions

View file

@ -82,7 +82,7 @@ kiri.load(api => {
if (!widget.tool) {
let tool = widget.tool = new mesh.tool();
let translate = index ? true : false;
tool.index(widget.getGeoVertices(true, translate));
tool.index(widget.getGeoVertices({ unroll: true, translate }));
}
};

View file

@ -1136,7 +1136,7 @@ class OpPocket extends CamOp {
}
}
let surfaces = op.surfaces[widget.id] || [];
let vert = widget.getGeoVertices(true,true).map(v => v.round(4));
let vert = widget.getGeoVertices({ unroll: true, translate: true }).map(v => v.round(4));
// let vert = widget.getVertices().array.map(v => v.round(4));
let outline = [];
let faces = CAM.surface_find(widget, surfaces);

View file

@ -245,7 +245,7 @@ CAM.slice = async function(settings, widget, onupdate, ondone) {
tracker.rotation = isIndexed ? axisRotation : 0;
// setup new state when indexing the workspace
if (true && op.op.type === "index") {
let points = base.verticesToPoints(widget.getGeoVertices(true, true));
let points = base.verticesToPoints(widget.getGeoVertices({ unroll: true, translate: true }));
state.slicer = new kiri.cam_slicer(points, {
zlist: true,
zline: true

View file

@ -3,8 +3,10 @@
"use strict";
/**
* Slicing engine used by CAM
* Slicing engine used by CAM Topo
*/
// dep: moto.broker
// dep: kiri.slice
gapp.register("kiri-mode.cam.slicer2", [], (root, exports) => {
@ -13,6 +15,10 @@ const { config, newOrderedLine, newPoint } = base;
class Slicer {
static intersectPoints = intersectPoints;
static checkOverUnderOn = checkOverUnderOn;
static removeDuplicateLines = removeDuplicateLines;
constructor() {
this.min = Infinity;
this.max = -Infinity;
@ -80,13 +86,13 @@ class Slicer {
const zMax = this.max;
const phash = {};
const lines = [];
let { under, over, both } = options;
let p1, p2, p3;
// default to 'over' selection with 2 points on a line
if (!under && !both) over = true;
// iterate over matching buckets for this z offset
for (let i = 0; i < points.length; ) {
p1 = points[i++];
@ -127,11 +133,11 @@ class Slicer {
}
}
}
if (lines.length == 0 && options.noEmpty) {
return;
}
return removeDuplicateLines(lines);
}
@ -311,9 +317,56 @@ function removeDuplicateLines(lines, debug) {
return output;
}
Slicer.checkOverUnderOn = checkOverUnderOn;
Slicer.intersectPoints = intersectPoints;
moto.broker.subscribe("worker.started", msg => {
const { dispatch, minions } = msg;
// console.log({ cam_slicer2_worker: dispatch });
kiri.topo_slice = async (widget, resolution) => {
console.log({ topo_slice: widget, resolution });
const vertices = widget.getGeoVertices().toShared();
const range = { min: Infinity, max: -Infinity };
for (let i=0,l=vertices.length; i<l; i += 3) {
const x = vertices[i];
const z = vertices[i + 2];
vertices[i] = z;
vertices[i + 2] = x;
range.min = Math.min(range.min, x);
range.max = Math.max(range.max, x);
}
// define sharded ranges
if (false && minions.concurrent) {
dispatch.putCache({ key: widget.id, data: vertices }, { done: data => {
console.log({ put_cache_done: data });
}});
kiri.cam_slicer2 = Slicer;
dispatch.clearCache({}, { done: data => {
console.log({ clear_cache_done: data });
}});
return [];
} else {
console.time('nuslice');
// iterate over shards, merge output
const output = new Slicer()
.setFromArray(vertices)
.slice(resolution)
.map(rec => {
const slice = kiri.newSlice(rec.z);
slice.lines = rec.lines;
for (let line of rec.lines) {
const { p1, p2 } = line;
if (!p1.swapped) { p1.swapXZ(); p1.swapped = true }
if (!p2.swapped) { p2.swapXZ(); p2.swapped = true }
}
return slice;
});
console.log({ output });
console.timeEnd('nuslice');
return output;
}
};
});
moto.broker.subscribe("minion.started", funcs => {
// console.log({ cam_slicer2_minion: funcs });
});
});

View file

@ -439,7 +439,16 @@ class Topo {
ondone(newslices);
}
let points = base.verticesToPoints(widget.getGeoVertices(true, true));
console.log('get vertices and points');
let points = base.verticesToPoints(widget.getGeoVertices({ unroll: true, translate: true }));
console.log('topo slice 2');
const slices2 = await kiri.topo_slice(widget, resolution);
console.log({ topo_slice_done: slices2 });
processSlices(slices2);
return this;
console.log('old slice setup')
let slicer = new kiri.cam_slicer(points, {
swapX: true, emptyok: true, notopok: true
});
@ -448,12 +457,15 @@ class Topo {
if (contourX) stepsTotal += Math.round((maxY-minY) / toolStep);
if (contourY) stepsTotal += Math.round((maxX-minX) / toolStep);
console.log('old slice run', stepsTotal)
let slices = topo.slices = topo.slices || slicer.slice(sindex, { each: (data, index, total) => {
onupdate(++stepsTaken, stepsTotal, "topo slice");
}, genso: true });
console.log('process slices', stepsTaken)
processSlices(slices.filter(s => s.lines).map(data => data.slice));
console.log('process done', stepsTaken)
// const t0 = Date.now();
// for (let point of points) point.swapXZ();
// let lines = new kiri.cam_slicer2().setFromPoints(points).slice(resolution);