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 (poly.isClockwise() !== CW) poly.reverse();
if (recurse && poly.inner) setWinding(poly.inner, !CW, false); if (recurse && poly.inner) setWinding(poly.inner, !CW, false);
} }
return array;
} }
/** /**

View file

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

View file

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

View file

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

View file

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