fix tab reference for mirror op

add box area constraint for contour ops
This commit is contained in:
Stewart Allen 2025-10-12 16:01:38 -04:00
commit 46c135ba23
8 changed files with 87 additions and 43 deletions

View file

@ -193,7 +193,6 @@ SP.init = function(options = {}) {
}; };
request.onsuccess = function(event) { request.onsuccess = function(event) {
console.log('IDB open succeeded');
storage.current = storage.stores[0]; storage.current = storage.stores[0];
storage.db = request.result; storage.db = request.result;
storage.runQueue(); storage.runQueue();

View file

@ -10,7 +10,7 @@ import { Layers } from '../../core/layers.js';
import { Stack } from '../../core/stack.js'; import { Stack } from '../../core/stack.js';
import { updateStock } from './cl-stock.js'; import { updateStock } from './cl-stock.js';
import { createPopOps } from './cl-ops.js'; import { createPopOps } from './cl-ops.js';
import { tabAdd, tabDone, tabClear, restoreTabs, rotateTabs, updateTabs, clearTabs } from './cl-tab.js'; import { tabAdd, tabDone, tabClear, restoreTabs, rotateTabs, updateTabs, clearTabs, mirrorTabs } from './cl-tab.js';
import { traceOn, traceDone, unselectTraces } from './cl-trace.js'; import { traceOn, traceDone, unselectTraces } from './cl-trace.js';
import { holeSelOn, selectHolesDone, clearHolesRec } from './cl-hole.js'; import { holeSelOn, selectHolesDone, clearHolesRec } from './cl-hole.js';
import { surfaceOn, surfaceDone } from './cl-surface.js'; import { surfaceOn, surfaceDone } from './cl-surface.js';

View file

@ -4,26 +4,70 @@ import { CamOp } from './op.js';
import { Tool } from './tool.js'; import { Tool } from './tool.js';
import { generate as Topo } from './topo3.js'; import { generate as Topo } from './topo3.js';
import { newPoint } from '../../../geo/point.js'; import { newPoint } from '../../../geo/point.js';
import { newPolygon } from '../../../geo/polygon.js';
import { tip2tipEmit } from '../../../geo/paths.js'; import { tip2tipEmit } from '../../../geo/paths.js';
function createFilter(op) { function createFilter(op, origin, axis) {
console.log({ origin, axis });
let ok = () => true;
let filter = slices => slices; let filter = slices => slices;
let filterString = op.filter?.map(l => l.trim()).join('\n'); let filterString = op.filter?.map(l => l.trim()).join('\n');
if (filterString) { if (filterString) {
try { try {
const obj = eval(`( ${filterString} )`); const obj = eval(`( ${filterString} )`);
let idx = 0; let box = obj?.box;
if (obj && obj.slices) { let slice_fn = obj?.slices;
const nadd = []; let index = 0;
filter = function (slices) { const accept = [];
for (let slice of slices) { filter = function (slices) {
if (obj.slices(slice, idx++)) { for (let slice of slices) {
nadd.push(slice); if (slice_fn && slice_fn(slice, index++)) {
accept.push(slice);
} else if (box) {
// slice.z = x when axis = y
// slice.z = y when axis = x
let { x, y, z } = box;
x = x ?? [ -Infinity, Infinity ];
y = y ?? [ -Infinity, Infinity ];
z = z ?? [ -Infinity, Infinity ];
let ok = false;
if (axis === 'x') {
let sy = slice.z + origin.y;
if (sy >= y[0] && sy <= y[1]) {
ok = true;
for (let p of slice.camLines) {
p.points = p.points.filter(p =>
p.x - origin.x >= x[0] && p.x - origin.x <= x[1] &&
p.z - origin.z >= z[0] && p.z - origin.z <= z[1]
);
}
}
} else {
let sx = slice.z - origin.x;
if (sx >= x[0] && sx <= x[1]) {
ok = true;
for (let p of slice.camLines) {
p.points = p.points.filter(p =>
p.y + origin.y >= y[0] && p.y + origin.y <= y[1] &&
p.z - origin.z >= z[0] && p.z - origin.z <= z[1]
);
}
}
}
if (ok) {
slice.camLines = slice.camLines.map(p => {
if (p.points.length > 1) {
return newPolygon(p.points).setOpen(true);
} else {
return undefined;
}
}).filter(p => p);
accept.push(slice);
} }
} }
return nadd; }
}; return accept;
} };
} catch (e) { } catch (e) {
console.log('filter parse error', e, op.filter); console.log('filter parse error', e, op.filter);
} }
@ -38,8 +82,8 @@ class OpContour extends CamOp {
async slice(progress) { async slice(progress) {
let { op, state } = this; let { op, state } = this;
let { addSlices, settings, updateToolDiams } = state; let { color, addSlices, settings, updateToolDiams } = state;
let filter = createFilter(op); let filter = createFilter(op, settings.origin, op.axis.toLowerCase());
let toolDiam = this.toolDiam = new Tool(settings, op.tool).fluteDiameter(); let toolDiam = this.toolDiam = new Tool(settings, op.tool).fluteDiameter();
updateToolDiams(toolDiam); updateToolDiams(toolDiam);
// we need topo for safe travel moves when roughing and outlining // we need topo for safe travel moves when roughing and outlining
@ -54,6 +98,11 @@ class OpContour extends CamOp {
slices = filter(slices); slices = filter(slices);
this.sliceOut = slices; this.sliceOut = slices;
addSlices(slices); addSlices(slices);
for (let slice of slices) {
slice.output()
.setLayer(`contour ${op.axis}`, { face: color, line: color })
.addPolys(slice.camLines);
}
}, },
contour: op, contour: op,
state: state state: state

View file

@ -6,22 +6,23 @@ import { generate as topo4_generate } from './topo4.js';
import { newPoint } from '../../../geo/point.js'; import { newPoint } from '../../../geo/point.js';
function createFilter(op) { function createFilter(op) {
let ok = () => true;
let filter = slices => slices; let filter = slices => slices;
if (op.filter) { let filterString = op.filter?.map(l => l.trim()).join('\n');
if (filterString) {
try { try {
const obj = eval(`( ${op.filter.join('\n')} )`); const obj = eval(`( ${filterString} )`);
let idx = 0; const accept = [];
if (obj && obj.slices) { let index = 0;
const nadd = []; let sl_fn = obj?.slices ?? ok;
filter = function (slices) { filter = function (slices) {
for (let slice of slices) { for (let slice of slices) {
if (obj.slices(slice, idx++)) { if (sl_fn(slice, index++)) {
nadd.push(slice); accept.push(slice);
}
} }
return nadd; }
}; return accept;
} };
} catch (e) { } catch (e) {
console.log('filter parse error', e, op.filter); console.log('filter parse error', e, op.filter);
} }
@ -38,7 +39,6 @@ class OpLathe extends CamOp {
let { op, state } = this; let { op, state } = this;
let { addSlices } = state; let { addSlices } = state;
let filter = createFilter(op); let filter = createFilter(op);
this.topo = await topo4_generate({ this.topo = await topo4_generate({
op, op,
state, state,

View file

@ -973,8 +973,8 @@ export function prepEach(widget, settings, print, firstPoint, update) {
let arcPoints = arcToPath(from, to, arcPreviewRes, { clockwise, center }) let arcPoints = arcToPath(from, to, arcPreviewRes, { clockwise, center })
.map(applyWidgetMovement); .map(applyWidgetMovement);
// console.log({arcPoints}) // console.log({arcPoints})
camOut(from, 1); camOut(from, 1);

View file

@ -16,7 +16,7 @@ export class Topo {
async generate(opt = {}) { async generate(opt = {}) {
let { state, contour, onupdate, ondone } = opt; let { state, contour, onupdate, ondone } = opt;
let { widget, settings, tshadow, center, tabs, color } = opt.state; let { widget, settings, tshadow, tabs } = opt.state;
let { controller, process } = settings, let { controller, process } = settings,
animesh = parseInt(controller.animesh || 100) * 2500, animesh = parseInt(controller.animesh || 100) * 2500,
@ -177,8 +177,7 @@ export class Topo {
clipTabZ: clipTab ? clipTab.map(t => t.z) : undefined, clipTabZ: clipTab ? clipTab.map(t => t.z) : undefined,
tabHeight, tabHeight,
newslices, newslices,
leave, leave
color
}, (i, l, p) => { }, (i, l, p) => {
onupdate(l / 2 + i / 2, l, p); onupdate(l / 2 + i / 2, l, p);
}); });
@ -304,7 +303,7 @@ export class Topo {
const { minX, maxX, minY, maxY, boundsX, boundsY, stepsX, stepsY } = params; const { minX, maxX, minY, maxY, boundsX, boundsY, stepsX, stepsY } = params;
const { gridDelta, resolution, density, partOff, toolStep, contourX, contourY } = params; const { gridDelta, resolution, density, partOff, toolStep, contourX, contourY } = params;
const { clipTo, clipTab, clipTabZ, tabHeight, newslices, color, leave } = params; const { clipTo, clipTab, clipTabZ, tabHeight, newslices, leave } = params;
let stepsTaken = 0, let stepsTaken = 0,
stepsTotal = 0; stepsTotal = 0;
@ -370,11 +369,8 @@ export class Topo {
gridy gridy
}, segments => { }, segments => {
if (segments.length > 0) { if (segments.length > 0) {
let slice = newSlice(gridx); let slice = newSlice(x);
slice.camLines = segments; slice.camLines = segments;
slice.output()
.setLayer("contour y", { face: color, line: color })
.addPolys(segments);
slicesY.push(slice); slicesY.push(slice);
} }
onupdate(++stepsTaken, stepsTotal, "contour y"); onupdate(++stepsTaken, stepsTotal, "contour y");
@ -399,11 +395,8 @@ export class Topo {
gridy gridy
}, segments => { }, segments => {
if (segments.length > 0) { if (segments.length > 0) {
let slice = newSlice(gridy); let slice = newSlice(y);
slice.camLines = segments; slice.camLines = segments;
slice.output()
.setLayer("contour x", { face: color, line: color })
.addPolys(segments);
slicesX.push(slice); slicesX.push(slice);
} }
onupdate(++stepsTaken, stepsTotal, "contour x"); onupdate(++stepsTaken, stepsTotal, "contour x");

View file

@ -20,6 +20,7 @@ function safeExec(fn) {
function checkReady() { function checkReady() {
if (document.readyState === 'complete') { if (document.readyState === 'complete') {
console.log(`kiri | boot ctrl | ` + (navigator.serviceWorker.controller ? true : false));
kiri.api = run(); kiri.api = run();
self.$ = kiri.api.web.$; self.$ = kiri.api.web.$;
for (let fn of load) { for (let fn of load) {

View file

@ -1376,6 +1376,8 @@ details[open] summary::after {
#camops { #camops {
display: flex; display: flex;
padding: 5px 0 0 0; padding: 5px 0 0 0;
max-height: 70vh;
/* overflow-y: auto; */
} }
.cam-pop-op { .cam-pop-op {
top: 50%; top: 50%;