From 05cdb29d1101041c787785b22c42cd5c884dbfcc Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 28 Oct 2022 17:18:01 -0400 Subject: [PATCH] add cam index operation. not wired into slice/preview yet --- src/kiri-mode/cam/animate2.js | 4 +-- src/kiri-mode/cam/client.js | 19 ++++++++++- src/kiri-mode/cam/ops.js | 59 +++++++++++++++++++++-------------- src/kiri-mode/cam/slice.js | 20 ++++++++++-- src/kiri/conf.js | 1 + src/kiri/platform.js | 5 +-- src/kiri/widget.js | 7 +++++ web/kiri/index.css | 3 ++ web/kiri/index.html | 1 + web/kiri/lang/en.js | 4 +++ 10 files changed, 92 insertions(+), 31 deletions(-) diff --git a/src/kiri-mode/cam/animate2.js b/src/kiri-mode/cam/animate2.js index 358d72dc..513b7cb3 100644 --- a/src/kiri-mode/cam/animate2.js +++ b/src/kiri-mode/cam/animate2.js @@ -35,7 +35,7 @@ kiri.load(() => { const { api } = kiri; function animate_clear2(api) { - moto.space.platform.showGridBelow(true); + // moto.space.platform.showGridBelow(true); kiri.client.animate_cleanup2(); $('layer-animate').innerHTML = ''; $('layer-toolpos').innerHTML = ''; @@ -71,7 +71,7 @@ kiri.load(() => { pauseButton.style.display = 'none'; api.event.emit('animate', 'CAM'); api.alerts.hide(alert); - moto.space.platform.showGridBelow(false); + // moto.space.platform.showGridBelow(false); $('render-hide').onclick(); }); } diff --git a/src/kiri-mode/cam/client.js b/src/kiri-mode/cam/client.js index eb965171..172c58b2 100644 --- a/src/kiri-mode/cam/client.js +++ b/src/kiri-mode/cam/client.js @@ -68,6 +68,12 @@ CAM.init = function(kiri, api) { isIndexed = settings.process.camStockIndexed; animVer = isIndexed ? 1 : 0; updateStock(); + SPACE.platform.setVisible(!isIndexed); + for (let widget of api.widgets.all()) { + widget.setIndexed(camStock && isIndexed ? camStock.scale.z : 0); + } + api.platform.update_top_z(); + $('cam-index').style.display = isIndexed ? '' : 'none'; } // wire up animate button in ui @@ -95,7 +101,7 @@ CAM.init = function(kiri, api) { api.event.on("mode.set", (mode) => { isCamMode = mode === 'CAM'; $('set-tools').style.display = isCamMode ? '' : 'none'; - kiri.space.platform.setColor(isCamMode ? 0xeeeeee : 0xcccccc); + SPACE.platform.setColor(isCamMode ? 0xeeeeee : 0xcccccc); updateStock(undefined, 'internal'); UI.func.animate.style.display = isCamMode ? '' : 'none'; if (!isCamMode) { @@ -211,6 +217,7 @@ CAM.init = function(kiri, api) { let settings = API.conf.get(); let { process, device } = settings; switch (ev.target.innerText) { + case "index": return func.opAddIndex(); case "laser on": return func.opAddLaserOn(); case "laser off": return func.opAddLaserOff(); case "gcode": return func.opAddGCode(); @@ -252,6 +259,10 @@ CAM.init = function(kiri, api) { func.opAdd(popOp.gcode.new()); }; + func.opAddIndex = () => { + func.opAdd(popOp.index.new()); + }; + func.opAddLevel = () => { func.opAdd(popOp.level.new()); }; @@ -1302,6 +1313,12 @@ CAM.init = function(kiri, api) { action: UC.newRow([ UC.newButton(LANG.edit, gcodeEditor()) ], {class:"ext-buttons f-row"}) }; + createPopOp('index', { + degrees: 'camIndexAxis', + }).inputs = { + degrees: UC.newInput(LANG.ci_degr_s, {title:LANG.ci_degr_l, convert:UC.toFloat, bound:UC.bound(-360,360.0) }) + }; + const editEnable = gcodeEditor('Laser Enable Script', 'enable'); const editOn = gcodeEditor('Laser On Script', 'on'); const editOff = gcodeEditor('Laser Off Script', 'off'); diff --git a/src/kiri-mode/cam/ops.js b/src/kiri-mode/cam/ops.js index afbeeb1e..2a0b190a 100644 --- a/src/kiri-mode/cam/ops.js +++ b/src/kiri-mode/cam/ops.js @@ -38,6 +38,16 @@ class CamOp { prepare() { } } +class OpIndex extends CamOp { + constructor(state, op) { + super(state, op); + state.setAxisIndex(op.degrees); + } + + prepare(ops, progress) { + } +} + class OpGCode extends CamOp { constructor(state, op) { super(state, op); @@ -83,7 +93,7 @@ class OpLevel extends CamOp { slice(progress) { let { op, state } = this; - let { settings, widget, sliceAll } = state; + let { settings, widget, addSlices } = state; let { updateToolDiams, thruHoles, tabs, cutTabs } = state; let { bounds, zMax, ztOff, color, tshadow } = state; let { stock } = settings; @@ -107,7 +117,7 @@ class OpLevel extends CamOp { slice.output() .setLayer("level", {face: color, line: color}) .addPolys(this.lines); - sliceAll.push(slice); + addSlices(slice); } } @@ -140,7 +150,7 @@ class OpRough extends CamOp { slice(progress) { let { op, state } = this; - let { settings, widget, slicer, sliceAll, unsafe, color } = state; + let { settings, widget, slicer, addSlices, unsafe, color } = state; let { updateToolDiams, thruHoles, tabs, cutTabs, cutPolys } = state; let { tshadow, shadowTop, ztOff, zBottom, zMax, shadowAt } = state; let { process, stock } = settings; @@ -178,7 +188,7 @@ class OpRough extends CamOp { slice.output() .setLayer("face", {face: color, line: color}) .addPolys(slice.camLines); - sliceAll.push(slice); + addSlices(slice); camFaces.push(slice); z -= zstep; } @@ -351,7 +361,7 @@ class OpRough extends CamOp { }); this.sliceOut = slices.filter(slice => slice.camLines); - sliceAll.appendAll(this.sliceOut); + addSlices(this.sliceOut); } prepare(ops, progress) { @@ -449,7 +459,7 @@ class OpOutline extends CamOp { slice(progress) { let { op, state } = this; - let { settings, widget, slicer, sliceAll, tshadow, thruHoles, unsafe, color } = state; + let { settings, widget, slicer, addSlices, tshadow, thruHoles, unsafe, color } = state; let { updateToolDiams, zThru, zBottom, shadowTop, tabs, cutTabs, cutPolys } = state; let { zMax, ztOff } = state; let { process, stock } = settings; @@ -618,7 +628,7 @@ class OpOutline extends CamOp { .addPolys(slice.camLines); } - sliceAll.appendAll(slices); + addSlices(slices); this.sliceOut = slices; } @@ -698,7 +708,7 @@ class OpContour extends CamOp { slice(progress) { let { op, state } = this; - let { sliceAll } = state; + let { addSlices } = state; // we need topo for safe travel moves when roughing and outlining // not generated when drilling-only. then all z moves use bounds max. // also generates x and y contouring when selected @@ -709,7 +719,7 @@ class OpContour extends CamOp { }, ondone: (slices) => { this.sliceOut = slices; - sliceAll.appendAll(slices); + addSlices(slices); }, contour: op, state: state @@ -788,7 +798,7 @@ class OpTrace extends CamOp { slice(progress) { let { op, state } = this; let { tool, rate, down, plunge, offset } = op; - let { settings, widget, sliceAll, zMax, zTop, zThru, tabs } = state; + let { settings, widget, addSlices, zMax, zTop, zThru, tabs } = state; let { updateToolDiams, cutTabs, cutPolys, healPolys, color } = state; let { process, stock } = settings; let { camStockClipTo, camZBottom } = process; @@ -814,7 +824,7 @@ class OpTrace extends CamOp { } function newSliceOut(z) { let slice = newSlice(z); - sliceAll.push(slice); + addSlices(slice); sliceOut.push(slice); return slice; } @@ -987,7 +997,7 @@ class OpPocket extends CamOp { const debug = false; let { op, state } = this; let { tool, rate, down, plunge, expand, contour, smooth, tolerance } = op; - let { settings, widget, sliceAll, zMax, zTop, zThru, tabs, color } = state; + let { settings, widget, addSlices, zMax, zTop, zThru, tabs, color } = state; let { updateToolDiams, cutTabs, cutPolys, healPolys, shadowAt } = state; let { process, stock } = settings; // generate tracing offsets from chosen features @@ -1022,7 +1032,7 @@ class OpPocket extends CamOp { } function newSliceOut(z) { let slice = newSlice(z); - sliceAll.push(slice); + addSlices(slice); sliceOut.push(slice); return slice; } @@ -1206,7 +1216,7 @@ class OpDrill extends CamOp { slice(progress) { let { op, state } = this; - let { settings, sliceAll, tslices, updateToolDiams } = state; + let { settings, addSlices, tslices, updateToolDiams } = state; let { zBottom, zThru, thruHoles, color } = state; let drills = [], @@ -1272,14 +1282,14 @@ class OpDrill extends CamOp { slice.output() .setLayer("drill", {face: color, line: color}) .addPolys(drill); - sliceAll.push(slice); + addSlices(slice); sliceOut.push(slice); }); } prepare(ops, progress) { let { op, state } = this; - let { settings, widget, sliceAll, updateToolDiams } = state; + let { settings, widget, addSlices, updateToolDiams } = state; let { setTool, setSpindle, setDrill, emitDrills } = ops; setTool(op.tool, undefined, op.rate); @@ -1296,7 +1306,7 @@ class OpRegister extends CamOp { slice(progress) { let { op, state } = this; - let { settings, widget, bounds, sliceAll, zMax, zThru, color } = state; + let { settings, widget, bounds, addSlices, zMax, zThru, color } = state; let { updateToolDiams } = state; let tool = new CAM.Tool(settings, op.tool); @@ -1376,7 +1386,7 @@ class OpRegister extends CamOp { } for (let z of base.util.lerp(z1, z2, op.down)) { let slice = newSlice(z); - sliceAll.push(slice); + addSlices(slice); sliceOut.push(slice); start(z); rept(4, o2, oy => { @@ -1416,14 +1426,14 @@ class OpRegister extends CamOp { slice.output() .setLayer("register", {face: color, line: color}) .addPolys(polys); - sliceAll.push(slice); + addSlices(slice); sliceOut.push(slice); } } prepare(ops, progress) { let { op, state } = this; - let { settings, widget, sliceAll, updateToolDiams } = state; + let { settings, widget, addSlices, updateToolDiams } = state; let { setTool, setSpindle, setDrill, emitDrills } = ops; if (op.axis === '-') { @@ -1447,7 +1457,7 @@ class OpXRay extends CamOp { } slice(progress) { - let { widget, sliceAll } = this.state; + let { widget, addSlices } = this.state; let slicer = new kiri.cam_slicer(widget.getPoints(), { zlist: true, zline: true @@ -1461,7 +1471,7 @@ class OpXRay extends CamOp { // data.tops.forEach(top => slice.addTop(top)); slice.lines = data.lines; slice.xray(); - sliceAll.push(slice); + addSlices(slice); }, over: false, flatoff: 0, edges: true, openok: true }; slicer.slice(xrayind, xrayopt); // xrayopt.over = true; @@ -1476,7 +1486,7 @@ class OpShadow extends CamOp { slice(progress) { let state = this.state; - let { ops, slicer, widget, unsafe, sliceAll, shadowAt } = state; + let { ops, slicer, widget, unsafe, addSlices, shadowAt } = state; let real = ops.map(rec => rec.op).filter(op => op); let drill = real.filter(op => op.type === 'drill').length > 0; @@ -1509,7 +1519,7 @@ class OpShadow extends CamOp { data.slice.shadow = tshadow; if (false) { const slice = data.slice; - sliceAll.push(slice); + addSlices(slice); slice.output() .setLayer("shadow", {line: 0x888800, thin: true }) .addPolys(POLY.setZ(tshadow.clone(true), data.z), { thin: true }); @@ -1651,6 +1661,7 @@ CAM.OPS = CamOp.MAP = { "laser on": OpLaserOn, "laser off": OpLaserOff, "gcode": OpGCode, + "index": OpIndex, "flip": CamOp }; diff --git a/src/kiri-mode/cam/slice.js b/src/kiri-mode/cam/slice.js index 5d8ddfb1..4309ff21 100644 --- a/src/kiri-mode/cam/slice.js +++ b/src/kiri-mode/cam/slice.js @@ -49,7 +49,8 @@ CAM.slice = function(settings, widget, onupdate, ondone) { color = dark ? 0xbbbbbb : 0, tabs = widget.anno.tab, unsafe = proc.camExpertFast, - units = settings.controller.units === 'in' ? 25.4 : 1; + units = settings.controller.units === 'in' ? 25.4 : 1, + axisIndex = undefined; if (tabs) { // make tab polygons @@ -136,6 +137,20 @@ CAM.slice = function(settings, widget, onupdate, ondone) { return shadows[z] = POLY.setZ(shadow, z); } + function setAxisIndex(degrees) { + axisIndex = degrees; + } + + function addSlices(slices) { + if (!Array.isArray(slices)) { + slices = [ slices ]; + } + sliceAll.appendAll(slices); + if (axisIndex !== undefined) { + console.log({post_axis_index: slices}); + } + } + let state = { settings, widget, @@ -146,7 +161,8 @@ CAM.slice = function(settings, widget, onupdate, ondone) { healPolys, shadowAt, slicer, - sliceAll, + addSlices, + setAxisIndex, updateToolDiams, zBottom, zThru, diff --git a/src/kiri/conf.js b/src/kiri/conf.js index d3380c03..03a6b2a7 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -565,6 +565,7 @@ const conf = exports({ camStockOffset: true, camStockClipTo: false, camStockIndexed: false, + camIndexAxis: 0, camStockOn: true, camConventional: false, // outputClockwise outputOriginCenter: false, diff --git a/src/kiri/platform.js b/src/kiri/platform.js index 0fecce4d..182da138 100644 --- a/src/kiri/platform.js +++ b/src/kiri/platform.js @@ -77,10 +77,11 @@ function platformUpdateOrigin() { space.platform.setRulers(ruler, ruler, 1 / api.view.unit_scale(), 'X', isBelt ? 'Z' : 'Y'); let { x, y, z } = origin; + let oz = process.camStockIndexed ? z / 2 : z; if (controller.showOrigin && MODE !== MODES.SLA) { - space.platform.setOrigin(x, y, z, true); + space.platform.setOrigin(x, y, oz, true); } else { - space.platform.setOrigin(x, y, z,false); + space.platform.setOrigin(x, y, oz, false); } } diff --git a/src/kiri/widget.js b/src/kiri/widget.js index adf35f0b..dd044228 100644 --- a/src/kiri/widget.js +++ b/src/kiri/widget.js @@ -457,6 +457,10 @@ class Widget { this.setModified(); } + setIndexed(z) { + this.track.indexed = z; + } + /** * moves top of widget to given Z * @@ -476,6 +480,9 @@ class Widget { mesh.position.z = -this.track.zcut || 0; this.track.top = mbz; } + if (this.track.indexed) { + mesh.position.z -= this.track.indexed / 2; + } let ntz = { pz: pos.z, mpz: mesh.position.z diff --git a/web/kiri/index.css b/web/kiri/index.css index 900d5003..d47cbaa7 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -938,6 +938,9 @@ th, tr, td, label { align-items: center; gap: 5px; } +#cam-index { + grid-column-start: span 2; +} #op-add-list { padding: 4px; display: flex; diff --git a/web/kiri/index.html b/web/kiri/index.html index 07028ae8..8f9d0f66 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -483,6 +483,7 @@
+
index
laser on
laser off
flip
diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index b5f3558c..dea2660d 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -556,6 +556,10 @@ self.kiri.lang['en-us'] = { cf_nvrt_s: "z bottom", cf_nvrt_l: "invert z bottom setting to follow stock", + // CNC INDEX AXIS + ci_degr_s: "degrees", + ci_degr_l: "degrees to rotate the A (indexed) axis", + // CNC LASER cl_powr_s: "power", cl_powr_l: "laser power from 0 to 1.0",