checkpoint prototype
This commit is contained in:
parent
2f755459ff
commit
849a55439b
12 changed files with 169 additions and 50 deletions
|
|
@ -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 }));
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 });
|
||||
});
|
||||
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue