From 9fce8272fa2e7d6e031ed19f2279c70c144eea4f Mon Sep 17 00:00:00 2001 From: bakedpotatolord Date: Thu, 12 Jun 2025 09:41:39 -0600 Subject: [PATCH 1/4] add drill from stock top option --- src/kiri-mode/cam/client.js | 7 ++++--- src/kiri-mode/cam/slice.js | 5 +++++ web/kiri/lang/en.js | 2 ++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/kiri-mode/cam/client.js b/src/kiri-mode/cam/client.js index 94b44438..0ea743dc 100644 --- a/src/kiri-mode/cam/client.js +++ b/src/kiri-mode/cam/client.js @@ -1791,7 +1791,7 @@ CAM.init = function(kiri, api) { menu: UC.newRow([ UC.newButton("select", func.surfaceAdd) ], {class:"ext-buttons f-row"}), }; - const drillOp =createPopOp('drill', { + createPopOp('drill', { tool: 'camDrillTool', spindle: 'camDrillSpindle', down: 'camDrillDown', @@ -1801,7 +1801,7 @@ CAM.init = function(kiri, api) { mark: 'camDrillMark', precision:'camDrillPrecision', thru: 'camDrillThru', - + fromTop: 'camDrillFromStockTop', }).inputs = { tool: UC.newSelect(LANG.cc_tool, {}, "tools"), sep: UC.newBlank({class:"pop-sep"}), @@ -1810,7 +1810,8 @@ CAM.init = function(kiri, api) { down: UC.newInput(LANG.cc_sdwn_s, {title:LANG.cc_sdwn_l, convert:UC.toFloat, units:true}), dwell: UC.newInput(LANG.cd_dwll_s, {title:LANG.cd_dwll_l, convert:UC.toFloat}), lift: UC.newInput(LANG.cd_lift_s, {title:LANG.cd_lift_l, convert:UC.toFloat, units:true, show:() => !poppedRec.mark}), - mark: UC.newBoolean(LANG.cd_mark_s, undefined, {title:LANG.cd_mark_l}), + mark: UC.newBoolean(LANG.cd_mark_s,undefined, {title:LANG.cd_mark_l, show:() => !poppedRec.fromTop}), + fromTop: UC.newBoolean(LANG.cd_ftop_s,undefined, {title:LANG.cd_ftop_l, show:() => !poppedRec.mark}), sep: UC.newBlank({class:"pop-sep"}), thru: UC.newInput(LANG.cd_dtru_s, {title:LANG.cd_dtru_l, convert:UC.toFloat, units:true,show:() => !poppedRec.mark}), precision:UC.newInput(LANG.cd_prcn_s, {title:LANG.cd_prcn_l, convert:UC.toFloat, units:true,show:() => !poppedRec.mark}), diff --git a/src/kiri-mode/cam/slice.js b/src/kiri-mode/cam/slice.js index 9f0db31a..b995d74b 100644 --- a/src/kiri-mode/cam/slice.js +++ b/src/kiri-mode/cam/slice.js @@ -564,6 +564,11 @@ CAM.holes = async function(settings, widget, individual, rec,onProgress) { onProgress(0.75+(i/circles.length*0.25),"assemble holes") } drills.forEach( h=>{ + if(rec.fromTop){ + // set z top if selected + h.depth += wztop - h.z + h.z = wztop + } delete h.overlapping //for encoding h.diam = toolDiam // for mesh generation h.selected = (!individual && Math.abs(h.area - area) <= area * 0.05 ); //for same size selection diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 72a84134..d9c32b46 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -599,6 +599,8 @@ self.kiri.lang['en-us'] = { cd_dtru_l: ["additional drill depth below part bottom","overrides global z thru","0 to disable"], cd_mark_s: "marking", cd_mark_l: ["only mark holes, do not drill out","the step down setting is used","to determine how deep to mark"], + cd_ftop_s: "from stock top", + cd_ftop_l: ["drill from stock top","instead of part surface"], cd_prcn_s: "precision", cd_prcn_l: ["distance between slices","to search for holes","in workspace units","lower is slower and","uses more memory","0 = only flats"], From b45a3eb0386ec8f37ccbf5bf1ad473df5824a47d Mon Sep 17 00:00:00 2001 From: bakedpotatolord Date: Thu, 12 Jun 2025 09:50:59 -0600 Subject: [PATCH 2/4] add default --- src/kiri/conf.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 1830281f..8b351c97 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -520,6 +520,7 @@ const conf = exports({ camDrillDwell: 250, camDrillLift: 2, camDrillMark: false, + camDrillFromStockTop: false, camDrillThru: 5, camDrillPrecision: 1, camDrillingOn: false, From f4f1d881e7be06f6f74dd9325fb8bae3aa2610bd Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 12 Jun 2025 23:11:34 -0400 Subject: [PATCH 3/4] fix z top in indexed mode --- src/kiri-mode/cam/ops.js | 3 --- src/kiri-mode/cam/slice.js | 10 +++++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/kiri-mode/cam/ops.js b/src/kiri-mode/cam/ops.js index 408ded97..555e469f 100644 --- a/src/kiri-mode/cam/ops.js +++ b/src/kiri-mode/cam/ops.js @@ -200,9 +200,6 @@ class OpRough extends CamOp { POLY.offset([ newPolygon().centerRectangle(stock.center, stock.x, stock.y) ], step) : POLY.offset(shadow, roughIn ? step : step + roughLeave + toolDiam / 2); let facing = POLY.offset(inset, -step, { count: 999, flat: true }); - if (isIndexed) { - ztOff = (stock.z / 2) - zMax; - } let zdiv = ztOff / roughDown; let zstep = (zdiv % 1 > 0) ? ztOff / (Math.floor(zdiv) + 1) : roughDown; if (ztOff === 0) { diff --git a/src/kiri-mode/cam/slice.js b/src/kiri-mode/cam/slice.js index 9f0db31a..b2bb1f56 100644 --- a/src/kiri-mode/cam/slice.js +++ b/src/kiri-mode/cam/slice.js @@ -52,8 +52,8 @@ CAM.slice = async function(settings, widget, onupdate, ondone) { track = widget.track; ({ camZTop, camZBottom, camZThru } = proc); wztop = track.top; - ztOff = isIndexed ? 0 : (stock.z - wztop); - zbOff = isIndexed ? 0 : (wztop - track.box.d); + ztOff = isIndexed ? (stock.z - bounds.dim.z) / 2 : (stock.z - wztop); + zbOff = isIndexed ? (stock.z - bounds.dim.z) / 2 : (wztop - track.box.d); zBottom = isIndexed ? camZBottom : camZBottom - zbOff; zMin = isIndexed ? bounds.min.z : Math.max(bounds.min.z, zBottom); zMax = bounds.max.z; @@ -125,7 +125,7 @@ CAM.slice = async function(settings, widget, onupdate, ondone) { return error('no processes specified'); } - if (stock.x && stock.y && stock.z) { + if (stock.x && stock.y && stock.z && !isIndexed) { if (stock.x + 0.00001 < bounds.max.x - bounds.min.x) { return error('stock X too small for part. resize stock or use offset stock'); } @@ -291,7 +291,7 @@ CAM.slice = async function(settings, widget, onupdate, ondone) { if (op.op.type === "index") { widget.topo = undefined; // let points = base.verticesToPoints(); - state.slicer = new kiri.cam_slicer(widget); + slicer = state.slicer = new kiri.cam_slicer(widget); shadows = {}; await new CAM.OPS.shadow(state, { type: "shadow", silent: true }).slice(progress => { // console.log('reshadow', progress.round(3)); @@ -471,7 +471,7 @@ CAM.holes = async function(settings, widget, individual, rec,onProgress) { let slicerOpts = {flatoff: 0.001} let slicer = new kiri.cam_slicer(widget,slicerOpts); let zFlats = Object.keys(slicer.zFlat).map(Number).map(z=>[z,z-0.002]).flat() - + precision = Math.max( 0, precision ) let intervals = (precision == 0) ? [] : slicer.interval( precision, From 01fba558004e49a6c6232a423b9f1a344e32e018 Mon Sep 17 00:00:00 2001 From: bakedpotatolord Date: Mon, 16 Jun 2025 11:36:10 -0600 Subject: [PATCH 4/4] fix multi-part drilling bug --- src/kiri-mode/cam/client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kiri-mode/cam/client.js b/src/kiri-mode/cam/client.js index 0ea743dc..53993015 100644 --- a/src/kiri-mode/cam/client.js +++ b/src/kiri-mode/cam/client.js @@ -1266,7 +1266,7 @@ CAM.init = function(kiri, api) { centers = centers ?? [] // list of all hole centers and if they are selected kiri.api.widgets.for(widget => { - const {holes} = centers.find(center=>center.id = widget.id) + const {holes} = centers.find(center=>center.id == widget.id) // console.log(holes) if (!holes.length) unselectHoles(holes); holes.forEach(hole => {