diff --git a/src/data/index.js b/src/data/index.js index f92b7089..ee631f26 100644 --- a/src/data/index.js +++ b/src/data/index.js @@ -193,7 +193,6 @@ SP.init = function(options = {}) { }; request.onsuccess = function(event) { - console.log('IDB open succeeded'); storage.current = storage.stores[0]; storage.db = request.result; storage.runQueue(); diff --git a/src/kiri/mode/cam/client.js b/src/kiri/mode/cam/client.js index bd509dbf..aa847a64 100644 --- a/src/kiri/mode/cam/client.js +++ b/src/kiri/mode/cam/client.js @@ -10,7 +10,7 @@ import { Layers } from '../../core/layers.js'; import { Stack } from '../../core/stack.js'; import { updateStock } from './cl-stock.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 { holeSelOn, selectHolesDone, clearHolesRec } from './cl-hole.js'; import { surfaceOn, surfaceDone } from './cl-surface.js'; diff --git a/src/kiri/mode/cam/op-contour.js b/src/kiri/mode/cam/op-contour.js index ae7e089a..1d14b313 100644 --- a/src/kiri/mode/cam/op-contour.js +++ b/src/kiri/mode/cam/op-contour.js @@ -4,26 +4,70 @@ import { CamOp } from './op.js'; import { Tool } from './tool.js'; import { generate as Topo } from './topo3.js'; import { newPoint } from '../../../geo/point.js'; +import { newPolygon } from '../../../geo/polygon.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 filterString = op.filter?.map(l => l.trim()).join('\n'); if (filterString) { try { const obj = eval(`( ${filterString} )`); - let idx = 0; - if (obj && obj.slices) { - const nadd = []; - filter = function (slices) { - for (let slice of slices) { - if (obj.slices(slice, idx++)) { - nadd.push(slice); + let box = obj?.box; + let slice_fn = obj?.slices; + let index = 0; + const accept = []; + filter = function (slices) { + for (let slice of slices) { + 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) { console.log('filter parse error', e, op.filter); } @@ -38,8 +82,8 @@ class OpContour extends CamOp { async slice(progress) { let { op, state } = this; - let { addSlices, settings, updateToolDiams } = state; - let filter = createFilter(op); + let { color, addSlices, settings, updateToolDiams } = state; + let filter = createFilter(op, settings.origin, op.axis.toLowerCase()); let toolDiam = this.toolDiam = new Tool(settings, op.tool).fluteDiameter(); updateToolDiams(toolDiam); // we need topo for safe travel moves when roughing and outlining @@ -54,6 +98,11 @@ class OpContour extends CamOp { slices = filter(slices); this.sliceOut = slices; addSlices(slices); + for (let slice of slices) { + slice.output() + .setLayer(`contour ${op.axis}`, { face: color, line: color }) + .addPolys(slice.camLines); + } }, contour: op, state: state diff --git a/src/kiri/mode/cam/op-lathe.js b/src/kiri/mode/cam/op-lathe.js index 915ae7e1..d1cde28b 100644 --- a/src/kiri/mode/cam/op-lathe.js +++ b/src/kiri/mode/cam/op-lathe.js @@ -6,22 +6,23 @@ import { generate as topo4_generate } from './topo4.js'; import { newPoint } from '../../../geo/point.js'; function createFilter(op) { + let ok = () => true; let filter = slices => slices; - if (op.filter) { + let filterString = op.filter?.map(l => l.trim()).join('\n'); + if (filterString) { try { - const obj = eval(`( ${op.filter.join('\n')} )`); - let idx = 0; - if (obj && obj.slices) { - const nadd = []; - filter = function (slices) { - for (let slice of slices) { - if (obj.slices(slice, idx++)) { - nadd.push(slice); - } + const obj = eval(`( ${filterString} )`); + const accept = []; + let index = 0; + let sl_fn = obj?.slices ?? ok; + filter = function (slices) { + for (let slice of slices) { + if (sl_fn(slice, index++)) { + accept.push(slice); } - return nadd; - }; - } + } + return accept; + }; } catch (e) { console.log('filter parse error', e, op.filter); } @@ -38,7 +39,6 @@ class OpLathe extends CamOp { let { op, state } = this; let { addSlices } = state; let filter = createFilter(op); - this.topo = await topo4_generate({ op, state, diff --git a/src/kiri/mode/cam/prepare.js b/src/kiri/mode/cam/prepare.js index fac80971..cbeefb87 100644 --- a/src/kiri/mode/cam/prepare.js +++ b/src/kiri/mode/cam/prepare.js @@ -973,8 +973,8 @@ export function prepEach(widget, settings, print, firstPoint, update) { let arcPoints = arcToPath(from, to, arcPreviewRes, { clockwise, center }) - .map(applyWidgetMovement); - + .map(applyWidgetMovement); + // console.log({arcPoints}) camOut(from, 1); diff --git a/src/kiri/mode/cam/topo3.js b/src/kiri/mode/cam/topo3.js index 84a54fce..678cf831 100644 --- a/src/kiri/mode/cam/topo3.js +++ b/src/kiri/mode/cam/topo3.js @@ -16,7 +16,7 @@ export class Topo { async generate(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, animesh = parseInt(controller.animesh || 100) * 2500, @@ -177,8 +177,7 @@ export class Topo { clipTabZ: clipTab ? clipTab.map(t => t.z) : undefined, tabHeight, newslices, - leave, - color + leave }, (i, 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 { 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, stepsTotal = 0; @@ -370,11 +369,8 @@ export class Topo { gridy }, segments => { if (segments.length > 0) { - let slice = newSlice(gridx); + let slice = newSlice(x); slice.camLines = segments; - slice.output() - .setLayer("contour y", { face: color, line: color }) - .addPolys(segments); slicesY.push(slice); } onupdate(++stepsTaken, stepsTotal, "contour y"); @@ -399,11 +395,8 @@ export class Topo { gridy }, segments => { if (segments.length > 0) { - let slice = newSlice(gridy); + let slice = newSlice(y); slice.camLines = segments; - slice.output() - .setLayer("contour x", { face: color, line: color }) - .addPolys(segments); slicesX.push(slice); } onupdate(++stepsTaken, stepsTotal, "contour x"); diff --git a/src/main/kiri.js b/src/main/kiri.js index e21a7734..14ec062c 100644 --- a/src/main/kiri.js +++ b/src/main/kiri.js @@ -20,6 +20,7 @@ function safeExec(fn) { function checkReady() { if (document.readyState === 'complete') { + console.log(`kiri | boot ctrl | ` + (navigator.serviceWorker.controller ? true : false)); kiri.api = run(); self.$ = kiri.api.web.$; for (let fn of load) { diff --git a/web/kiri/index.css b/web/kiri/index.css index 5b39165b..aa19ea56 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -1376,6 +1376,8 @@ details[open] summary::after { #camops { display: flex; padding: 5px 0 0 0; + max-height: 70vh; + /* overflow-y: auto; */ } .cam-pop-op { top: 50%;