progress on cam pocketing op

This commit is contained in:
Stewart Allen 2022-04-07 09:28:55 -04:00
commit 5274ed6ae7
5 changed files with 55 additions and 38 deletions

View file

@ -233,6 +233,7 @@ function setWinding(array, CW, recurse) {
if (poly.isClockwise() !== CW) poly.reverse();
if (recurse && poly.inner) setWinding(poly.inner, !CW, false);
}
return array;
}
/**

View file

@ -562,13 +562,10 @@ CAM.init = function(kiri, api) {
// SURFACE FUNCS
let surfaceOn = false, lastWidget;
func.surfaceAdd = (ev) => {
func.unpop();
func.tabDone();
func.traceDone();
func.surfaceDone();
func.clearPops();
alert = api.show.alert("analyzing surfaces...", 1000);
let surfaces = poppedRec.surfaces;
CAM.surfaces(() => {
CAM.surface_prep(() => {
api.hide.alert(alert);
alert = api.show.alert("[esc] cancels surface editing");
for (let [wid, arr] of Object.entries(surfaces)) {
@ -597,10 +594,13 @@ CAM.init = function(kiri, api) {
if (!surfaceOn) {
return;
}
if (lastWidget) {
let surfaces = poppedRec.surfaces;
for (let wid of Object.keys(surfaces)) {
CAM.surface_clear(api.widgets.forid(wid));
let surfaces = poppedRec.surfaces;
for (let wid of Object.keys(surfaces)) {
let widget = api.widgets.forid(wid);
if (widget) {
CAM.surface_clear(widget);
} else {
delete surfaces[wid];
}
}
api.hide.alert(alert);
@ -612,10 +612,7 @@ CAM.init = function(kiri, api) {
// TRACE FUNCS
let traceOn = false, lastTrace;
func.traceAdd = (ev) => {
func.unpop();
func.tabDone();
func.traceDone();
func.surfaceDone();
func.clearPops();
alert = api.show.alert("analyzing parts...", 1000);
traceOn = hoveredOp;
traceOn.classList.add("editing");
@ -693,6 +690,12 @@ CAM.init = function(kiri, api) {
}
});
};
func.clearPops = () => {
if (func.unpop) func.unpop();
func.tabDone();
func.traceDone();
func.surfaceDone();
};
api.event.on("cam.trace.clear", func.traceClear = () => {
func.traceDone();
API.widgets.all().forEach(widget => {
@ -781,22 +784,17 @@ CAM.init = function(kiri, api) {
// COMMON TAB/TRACE EVENT HANDLERS
api.event.on("slice.begin", () => {
if (isCamMode) {
func.tabDone();
func.traceDone();
func.surfaceDone();
func.clearPops();
}
});
api.event.on("key.esc", () => {
if (isCamMode) {
func.tabDone();
func.traceDone();
func.surfaceDone();
func.clearPops();
}
});
api.event.on("selection.scale", () => {
if (isCamMode) {
func.tabClear();
func.traceClear();
func.clearPops();
}
});
api.event.on("widget.duplicate", (widget, oldwidget) => {

View file

@ -25,7 +25,7 @@ CAM.process = {
kiri.load(api => {
if (kiri.client) {
CAM.surfaces = function(ondone) {
CAM.surface_prep = function(ondone) {
kiri.client.sync();
const settings = api.conf.get();
kiri.client.send("cam_surfaces", { settings }, output => {
@ -33,7 +33,7 @@ kiri.load(api => {
});
};
function select_face_groups(widget) {
CAM.surface_show = function(widget) {
widget.selectFaces(Object.values(widget._surfaces).flat());
};
@ -43,14 +43,16 @@ kiri.load(api => {
if (faces.contains(face)) {
// delete this face group
delete surfaces[root];
select_face_groups(widget);
CAM.surface_show(widget);
ondone(Object.keys(surfaces));
return;
}
}
kiri.client.send("cam_surface_find", { id: widget.id, face }, faces => {
surfaces[face] = faces;
select_face_groups(widget);
if (faces.length) {
surfaces[face] = faces;
CAM.surface_show(widget);
}
ondone(Object.keys(surfaces));
});
};
@ -76,14 +78,23 @@ kiri.load(api => {
}
if (kiri.worker) {
CAM.surface_prep = function(widget) {
if (!widget.tool) {
let tool = widget.tool = new mesh.tool();
tool.generateFaceMap(widget.getVertices().array);
}
};
CAM.surface_find = function(widget, faces) {
CAM.surface_prep(widget);
return widget.tool.findConnectedSurface(faces, 0.1, 0.001);
};
kiri.worker.cam_surfaces = function(data, send) {
const { settings } = data;
const widgets = Object.values(kiri.worker.cache);
for (let widget of widgets) {
if (!widget.tool) {
let tool = widget.tool = new mesh.tool();
tool.generateFaceMap(widget.getVertices().array);
}
CAM.surface_prep(widget);
}
send.done({});
};
@ -91,7 +102,7 @@ kiri.load(api => {
kiri.worker.cam_surface_find = function(data, send) {
const { id, face } = data;
const widget = kiri.worker.cache[id];
const faces = widget.tool.findConnectedSurface([face], 0.1, 0.001);
const faces = CAM.surface_find(widget, [face]);
send.done(faces);
}

View file

@ -930,22 +930,29 @@ class OpPocket extends CamOp {
let { process, stock } = settings;
// generate tracing offsets from chosen features
let sliceOut = this.sliceOut = [];
let areas = op.areas[widget.id] || [];
let surface = op.surfaces[widget.id] || [];
let faces = CAM.surface_find(widget, surface);
let toolDiam = new CAM.Tool(settings, tool).fluteDiameter();
let toolOver = toolDiam * op.step;
let cutdir = process.camConventional;
let polys = [];
updateToolDiams(toolDiam);
if (tabs) {
tabs.forEach(tab => {
tab.off = POLY.expand([tab.poly], toolDiam / 2).flat();
});
}
for (let arr of areas) {
let poly = newPolygon().fromArray(arr);
POLY.setWinding([ poly ], cutdir, false);
polys.push(poly);
let vert = widget.getVertices().array;
let polys = [];
for (let face of faces) {
let i = face * 9;
polys.push(newPolygon()
.add(vert[i++], vert[i++], vert[i++])
.add(vert[i++], vert[i++], vert[i++])
.add(vert[i++], vert[i++], vert[i++])
);
}
polys = POLY.union(polys, undefined, true);
polys = POLY.setWinding(polys, cutdir, false);
function newSliceOut(z) {
let slice = newSlice(z);
sliceAll.push(slice);
@ -1423,6 +1430,7 @@ CAM.OPS = CamOp.MAP = {
"rough": OpRough,
"outline": OpOutline,
"contour": OpContour,
"pocket": OpPocket,
"trace": OpTrace,
"drill": OpDrill,
"register": OpRegister,

View file

@ -413,7 +413,6 @@ function platformAdd(widget, shift, nolayout, defer) {
}
function platformAddDeferred() {
console.log('platform_add_deferred');
for (let rec of deferred) {
let { widget, shift, nolayout } = rec;
// platform.select(widget, shift);