diff --git a/notes.md b/notes.md index 6602e0ea..a638d816 100644 --- a/notes.md +++ b/notes.md @@ -75,6 +75,7 @@ * `B` need to force cut line at synthetic z bottom (midlines, etc) * `B` contour does not honor clip to stock +* `F` import and follow 2D paths (conformed like pocket contours) * `F` add user-defined origin (issue #28) * `F` add custom gcode operation for things like injecting pauses * `F` all ops should allow limit and milling direction / ease down overrides diff --git a/src/kiri-mode/cam/animate2.js b/src/kiri-mode/cam/animate2.js index 734c7f67..300ce1f2 100644 --- a/src/kiri-mode/cam/animate2.js +++ b/src/kiri-mode/cam/animate2.js @@ -104,8 +104,8 @@ kiri.load(() => { geo.setIndex(new THREE.BufferAttribute(ia, 1)); const mat = new THREE.MeshMatcapMaterial({ flatShading: true, - transparent: true, - opacity: 0.1, + transparent: false, + opacity: 1, color: 0x888888, side: THREE.DoubleSide }); @@ -366,6 +366,7 @@ kiri.load(() => { const { process } = settings; const print = worker.print; const density = parseInt(settings.controller.animesh) * 1000; + const isIndexed = process.camStockOn && process.camStockIndexed; pathIndex = 0; path = print.output.flat(); @@ -381,11 +382,11 @@ kiri.load(() => { indexCount = 0; startTime = 0; updates = 0; - stockZ = stock.z; + stockZ = isIndexed ? 0 : stock.z; stockSlices = []; const { x, y, z } = stock; - const sliceCount = 1; + const sliceCount = 10; const sliceWidth = stock.x / sliceCount; for (let i=0; i { return; } pathIndex++; + // console.log(next.point.z); if (next.tool >= 0 && (!tool || tool.getNumber() !== next.tool)) { // on real tool change, go to safe Z first diff --git a/src/kiri-mode/cam/client.js b/src/kiri-mode/cam/client.js index a38381af..877ce4ee 100644 --- a/src/kiri-mode/cam/client.js +++ b/src/kiri-mode/cam/client.js @@ -14,6 +14,7 @@ const { CAM } = driver; let isAnimate, isArrange, + isPreview, isCamMode, isIndexed, isParsed, @@ -153,10 +154,17 @@ CAM.init = function(kiri, api) { api.event.on("view.set", (mode) => { isArrange = (mode === VIEWS.ARRANGE); + isPreview = (mode === VIEWS.PREVIEW); isAnimate = false; animFn().animate_clear(api); func.clearPops(); $('camops').style.display = isCamMode && isArrange ? 'flex' : ''; + if (isCamMode && isPreview) { + for (let widget of API.widgets.all()) { + widget.setAxisIndex(0); + } + updateStock(); + } }); api.event.on("settings.saved", (settings) => { @@ -596,11 +604,10 @@ CAM.init = function(kiri, api) { } } // update widget rotations from timeline marker - if (isIndexed) for (let widget of API.widgets.all()) { - widget.setAxisIndex(-index); + widget.setAxisIndex(isPreview || !isIndexed ? 0 : -index); } - currentIndex = isIndexed ? index * (Math.PI / 180) : 0; + currentIndex = isIndexed && !isPreview ? index * (Math.PI / 180) : 0; updateStock(); }); diff --git a/src/kiri-mode/cam/ops.js b/src/kiri-mode/cam/ops.js index 42513d2d..0b4f8c0d 100644 --- a/src/kiri-mode/cam/ops.js +++ b/src/kiri-mode/cam/ops.js @@ -481,7 +481,6 @@ class OpOutline extends CamOp { max: op.top ? zMax + ztOff : undefined }; let indices = slicer.interval(op.down, intopt); -console.log({slicer, indices, zBottom}); let trueShadow = process.camTrueShadow === true; // shift out first (top-most) slice indices.shift(); diff --git a/src/kiri-mode/cam/prepare.js b/src/kiri-mode/cam/prepare.js index c1b2e749..04332153 100644 --- a/src/kiri-mode/cam/prepare.js +++ b/src/kiri-mode/cam/prepare.js @@ -69,6 +69,7 @@ function prepEach(widget, settings, print, firstPoint, update) { outerz = outer.max.z, slices = widget.slices, hasStock = stock.x && stock.y && stock.z && process.camStockOn, + isIndexed = hasStock && process.camStockIndexed, startCenter = process.outputOriginCenter, alignTop = settings.controller.alignTop, zclear = (process.camZClearance || 1), @@ -78,7 +79,7 @@ function prepEach(widget, settings, print, firstPoint, update) { ztOff = hasStock ? stock.z - wztop : 0, bounds = widget.getBoundingBox(), boundsz = bounds.max.z + ztOff, - zadd = hasStock ? stock.z - boundsz : alignTop ? outerz - boundsz : 0, + zadd = hasStock && !isIndexed ? stock.z - boundsz : alignTop ? outerz - boundsz : 0, zmax = outerz + zclear, wmpos = widget.track.pos, wmx = wmpos.x, @@ -296,6 +297,7 @@ function prepEach(widget, settings, print, firstPoint, update) { point.y += wmy; point.z += zadd; + // console.log(point.z); if (nextIsMove) { cut = 0; nextIsMove = false; diff --git a/src/kiri-mode/cam/slice.js b/src/kiri-mode/cam/slice.js index 373fe5f6..9a4674fb 100644 --- a/src/kiri-mode/cam/slice.js +++ b/src/kiri-mode/cam/slice.js @@ -157,7 +157,7 @@ CAM.slice = function(settings, widget, onupdate, ondone) { slices = [ slices ]; } sliceAll.appendAll(slices); - if (axisIndex !== undefined) { + if (isIndexed && axisIndex !== undefined) { // update slice cam lines to add axis indexing for (let slice of slices.filter(s => s.camLines)) { for (let poly of slice.camLines) { diff --git a/src/kiri/render.js b/src/kiri/render.js index 777e9bfb..935c5eba 100644 --- a/src/kiri/render.js +++ b/src/kiri/render.js @@ -15,6 +15,8 @@ gapp.register("kiri.render", [], (root, exports) => { const { base, kiri } = root; const { config, util, newPolygon } = base; const hsV = 0.9; +const XAXIS = new THREE.Vector3(1,0,0); +const DEG2RAD = Math.PI / 180; exports({ path, @@ -126,6 +128,7 @@ async function path(levels, update, opts = {}) { const retracts = []; const engages = []; const lasers = []; + const sparks = []; const output = new kiri.Layers(); layers.push(output); @@ -165,6 +168,19 @@ async function path(levels, update, opts = {}) { return; } + // rotate 4th axis indexed points + // todo -- add spark lines + if (out.point.a) { + let { point } = out; + let p2 = new THREE.Vector3(point.x, point.y, point.z) + .applyAxisAngle(XAXIS, point.a * DEG2RAD); + out.point.x = p2.x; + out.point.y = p2.y; + out.point.z = p2.z; + // let sp = base.newPoint(out.point.x * 1.1, out.point.y * 1.1, out.point.z * 1.1); + // sparks.push(out.point, sp); + } + if (lastOut) { if (arrowAll || lastOut.emit !== out.emit) { heads.push({p1: lastOut.point, p2: out.point}); @@ -261,6 +277,13 @@ async function path(levels, update, opts = {}) { }), { outline: true }); } + if (thin && sparks.length) { + let line = dark ? 0xffffff : 0x112233; + output + .setLayer('sparks', { face: headColor, line, opacity: 0.75 }, true) + .addLines(sparks, { thin: true }); + } + if (thin && heads.length) { let line = dark ? 0xffffff : 0x112233; output