From 15aad5a7df644bee1c56a1218133131912a587a5 Mon Sep 17 00:00:00 2001 From: bakedpotatolord Date: Thu, 17 Apr 2025 10:18:13 -0600 Subject: [PATCH 1/5] add drill as tool type --- src/kiri-mode/cam/tool.js | 14 +++++++++++--- src/kiri-mode/cam/tools.js | 24 +++++++++++++++++------- web/kiri/index.html | 1 + 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/kiri-mode/cam/tool.js b/src/kiri-mode/cam/tool.js index d12f3ef8..a3f96dab 100644 --- a/src/kiri-mode/cam/tool.js +++ b/src/kiri-mode/cam/tool.js @@ -67,11 +67,11 @@ class Tool { } traceOffset() { - return (this.isTaperMill() ? this.tipDiameter() : this.fluteDiameter()) / 2; + return (this.hasTaper() ? this.tipDiameter() : this.fluteDiameter()) / 2; } contourOffset(step) { - const diam = Math.min(this.isTaperMill() ? this.tipDiameter() : this.fluteDiameter()); + const diam = Math.min(this.hasTaper() ? this.tipDiameter() : this.fluteDiameter()); return diam ? diam * step : step; } @@ -100,10 +100,18 @@ class Tool { return this.tool.type === "tapermill"; } + isDrill(){ + return this.tool.type === "drill"; + } + + hasTaper() { + return this.isTaperMill() || this.isDrill(); + } + generateProfile(resolution) { // generate tool profile let ball = this.isBallMill(), - taper = this.isTaperMill(), + taper = this.isTaperMill() || this.isDrill(), tip_diameter = this.tipDiameter(), shaft_offset = this.fluteLength(), flute_diameter = this.fluteDiameter(), diff --git a/src/kiri-mode/cam/tools.js b/src/kiri-mode/cam/tools.js index f41fde4b..0696f9c0 100644 --- a/src/kiri-mode/cam/tools.js +++ b/src/kiri-mode/cam/tools.js @@ -15,7 +15,8 @@ gapp.register("kiri-mode.cam.tools", (root, exports) => { DOC = document, selectedTool = null, editTools = null, - maxTool = 0; + maxTool = 0, + toolNames = ['endmill','ballmill','tapermill','drill']; api.show.tools = showTools; @@ -41,6 +42,15 @@ gapp.register("kiri-mode.cam.tools", (root, exports) => { }); } + /** + * Check if a tool is a tapermill or drill (i.e. has a taper angle) + * @param {String} tool - a string representing the tool type + * @return {boolean} true if the tool has a taper angle, false if not + */ + function hasTaper(tool) { + return tool === 'tapermill' || tool === 'drill'; + } + function selectTool(tool) { selectedTool = tool; ui.toolName.value = tool.name; @@ -51,8 +61,8 @@ gapp.register("kiri-mode.cam.tools", (root, exports) => { ui.toolShaftLen.value = tool.shaft_len; ui.toolTaperTip.value = tool.taper_tip || 0; ui.toolMetric.checked = tool.metric; - ui.toolType.selectedIndex = ['endmill','ballmill','tapermill'].indexOf(tool.type); - if (tool.type === 'tapermill') { + ui.toolType.selectedIndex = toolNames.indexOf(tool.type); + if (hasTaper(tool)) { ui.toolTaperAngle.value = kiri.driver.CAM.calcTaperAngle( (tool.flute_diam - tool.taper_tip) / 2, tool.flute_len ).round(1); @@ -83,7 +93,7 @@ gapp.register("kiri-mode.cam.tools", (root, exports) => { function renderTool(tool) { let type = selectedTool.type; - let taper = type === 'tapermill'; + let taper = hasTaper(type) ui.toolTaperAngle.disabled = taper ? undefined : 'true'; ui.toolTaperTip.disabled = taper ? undefined : 'true'; $('tool-view').innerHTML = ''; @@ -123,7 +133,7 @@ gapp.register("kiri-mode.cam.tools", (root, exports) => { stroke } } ]; - if (type === "tapermill") { + if (taper) { let yoff = off.y + shaft_len; // let mid = dim.w / 2; parts.push({path: {stroke_width, stroke, fill:flute_fill, d:[ @@ -183,8 +193,8 @@ gapp.register("kiri-mode.cam.tools", (root, exports) => { selectedTool.shaft_len = parseFloat(ui.toolShaftLen.value); selectedTool.taper_tip = parseFloat(ui.toolTaperTip.value); selectedTool.metric = ui.toolMetric.checked; - selectedTool.type = ['endmill','ballmill','tapermill'][ui.toolType.selectedIndex]; - if (selectedTool.type === 'tapermill') { + selectedTool.type = toolNames[ui.toolType.selectedIndex]; + if (hasTaper(selectedTool.type)) { const CAM = kiri.driver.CAM; const rad = (selectedTool.flute_diam - selectedTool.taper_tip) / 2; if (ev && ev.target === ui.toolTaperAngle) { diff --git a/web/kiri/index.html b/web/kiri/index.html index b38e4073..3eb610ab 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -557,6 +557,7 @@ +
From 7dcfe62dd8c948429941465878edd11e064f6a18 Mon Sep 17 00:00:00 2001 From: bakedpotatolord Date: Thu, 17 Apr 2025 13:18:56 -0600 Subject: [PATCH 2/5] replace redundant code --- src/kiri-mode/cam/tool.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kiri-mode/cam/tool.js b/src/kiri-mode/cam/tool.js index a3f96dab..453e2d63 100644 --- a/src/kiri-mode/cam/tool.js +++ b/src/kiri-mode/cam/tool.js @@ -111,7 +111,7 @@ class Tool { generateProfile(resolution) { // generate tool profile let ball = this.isBallMill(), - taper = this.isTaperMill() || this.isDrill(), + taper = this.hasTaper(), tip_diameter = this.tipDiameter(), shaft_offset = this.fluteLength(), flute_diameter = this.fluteDiameter(), From ae9833b98fe50291b253fe55bcb20bc2edaa0659 Mon Sep 17 00:00:00 2001 From: bakedpotatolord Date: Fri, 18 Apr 2025 12:53:50 -0600 Subject: [PATCH 3/5] add warnings for drill misuse --- src/kiri-mode/cam/client.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/kiri-mode/cam/client.js b/src/kiri-mode/cam/client.js index d764c5c8..c8d449b6 100644 --- a/src/kiri-mode/cam/client.js +++ b/src/kiri-mode/cam/client.js @@ -3,6 +3,8 @@ "use strict"; // dep: kiri-mode.cam.driver +// dep: kiri.api +// dep: kiri.alerts // use: kiri-mode.cam.animate // use: kiri-mode.cam.animate2 // use: kiri-mode.cam.tools @@ -10,7 +12,8 @@ gapp.register("kiri-mode.cam.client", [], (root, exports) => { const { base, kiri } = root; -const { driver } = kiri; +const { driver, api } = kiri; +const {alerts, conf} = api; const { CAM } = driver; const DEG2RAD = Math.PI / 180; const RAD2DEG = 180 / Math.PI; @@ -1728,6 +1731,17 @@ function createPopOp(type, map) { }, bind: (ev) => { API.util.ui2rec(op.rec, op.inputs); + + const settings = conf.get(); + const {tool} = new CAM.Tool(settings,op.rec.tool); //get tool by id + const opType = op.rec.type + if( opType != "drill" && tool.type == "drill"){ + alerts.show(`Warning: Drills should not be used for ${opType} operations.`) + } + if( opType == "drill" && tool.type != "drill"){ + alerts.show(`Warning: Only drills should be used for drilling operations.`) + } + for (let [key, val] of Object.entries(op.rec)) { let saveTo = map[key]; if (saveTo && typeof(key) === 'string' && !key.startsWith("~")) { From 1b06902068dbe6fa52f313f979b01649fd41f19e Mon Sep 17 00:00:00 2001 From: bakedpotatolord Date: Fri, 18 Apr 2025 13:02:58 -0600 Subject: [PATCH 4/5] add drill to language file --- web/kiri/lang/en.js | 1 + 1 file changed, 1 insertion(+) diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index bbcc7203..1aa7288f 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -92,6 +92,7 @@ self.kiri.lang['en-us'] = { td_tyem: "end", // end mill td_tybm: "ball", // ball mill td_tytm: "taper", // taper mill + td_tydr: "drill", // drill td_tonm: "tool #", td_shft: "shaft", // endmill shaft specs td_flut: "flute", // endmill flute specs From e69566623b73a3c330d7fa36da06276731ec50f3 Mon Sep 17 00:00:00 2001 From: bakedpotatolord Date: Sun, 20 Apr 2025 22:37:02 -0600 Subject: [PATCH 5/5] add drill profile svg --- src/kiri-mode/cam/tool.js | 2 +- src/kiri-mode/cam/tools.js | 51 ++++++++++++++++++++++++++++---------- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/kiri-mode/cam/tool.js b/src/kiri-mode/cam/tool.js index 453e2d63..8c049ea0 100644 --- a/src/kiri-mode/cam/tool.js +++ b/src/kiri-mode/cam/tool.js @@ -105,7 +105,7 @@ class Tool { } hasTaper() { - return this.isTaperMill() || this.isDrill(); + return this.isTaperMill(); } generateProfile(resolution) { diff --git a/src/kiri-mode/cam/tools.js b/src/kiri-mode/cam/tools.js index 0696f9c0..7a7ba8c9 100644 --- a/src/kiri-mode/cam/tools.js +++ b/src/kiri-mode/cam/tools.js @@ -42,14 +42,7 @@ gapp.register("kiri-mode.cam.tools", (root, exports) => { }); } - /** - * Check if a tool is a tapermill or drill (i.e. has a taper angle) - * @param {String} tool - a string representing the tool type - * @return {boolean} true if the tool has a taper angle, false if not - */ - function hasTaper(tool) { - return tool === 'tapermill' || tool === 'drill'; - } + function selectTool(tool) { selectedTool = tool; @@ -62,10 +55,13 @@ gapp.register("kiri-mode.cam.tools", (root, exports) => { ui.toolTaperTip.value = tool.taper_tip || 0; ui.toolMetric.checked = tool.metric; ui.toolType.selectedIndex = toolNames.indexOf(tool.type); - if (hasTaper(tool)) { + if (tool === 'tapermill') { ui.toolTaperAngle.value = kiri.driver.CAM.calcTaperAngle( (tool.flute_diam - tool.taper_tip) / 2, tool.flute_len ).round(1); + } else if(tool === 'drill'){ + ui.toolTaperAngle.value = 118; + } else { ui.toolTaperAngle.value = 0; } @@ -93,7 +89,9 @@ gapp.register("kiri-mode.cam.tools", (root, exports) => { function renderTool(tool) { let type = selectedTool.type; - let taper = hasTaper(type) + let taper = type=== 'tapermill' + let drill = type === 'drill' + const drillAngleRad = 140 * Math.PI / 180 ui.toolTaperAngle.disabled = taper ? undefined : 'true'; ui.toolTaperTip.disabled = taper ? undefined : 'true'; $('tool-view').innerHTML = ''; @@ -111,10 +109,12 @@ gapp.register("kiri-mode.cam.tools", (root, exports) => { stroke_thin = stroke_width / 2, shaft = tool.shaft_len || 1, flute = tool.flute_len || 1, - total_len = shaft + flute, + drillTip = drill ? 0.5 * tool.flute_diam * Math.sin(drillAngleRad) : 0, + total_len = shaft + flute+drillTip, units = dim.h / total_len, shaft_len = (shaft / total_len) * max.h, - flute_len = ((flute / total_len) * max.h), + flute_len = (flute / total_len) * max.h, + drill_tip_len = (drillTip / total_len) * max.h, shaft_diam = tool.shaft_diam * units, flute_diam = tool.flute_diam * units, // total_wid = Math.max(flute_diam, shaft_diam), @@ -143,6 +143,31 @@ gapp.register("kiri-mode.cam.tools", (root, exports) => { `L ${dim.w - off.x - flute_off} ${yoff}`, `z` ].join('\n')}}); + } else if(drill){ + + const x1 = off.x + flute_off, + y1 = off.y + shaft_len, + x2 = dim.w - off.x - flute_off, + y2 = y1 + flute_len, + xMid = dim.w / 2 + + parts.push({path: {stroke_width, stroke, fill:flute_fill, d:[ + `M ${x1} ${y1}`, //move to top left + `L ${x1} ${y2}`, //line to bottom left + `L ${xMid} ${y2+drill_tip_len}`, //line to bottom mid point + `L ${x2} ${y2}`, //line to bottom right + `L ${x2} ${y1}`, //line to top right + `z` + ].join('\n')}}); + //add drill flute lines + parts.push({ line: { + x1, y1, x2, y2: (y1 + y2) / 2, + stroke, stroke_width: stroke_thin + } }); + parts.push({ line: { + x1, y1: (y1 + y2) / 2, x2, y2, + stroke, stroke_width: stroke_thin + } }); } else { let fl = isBall ? flute_len - flute_diam/2 : flute_len; let x1 = off.x + flute_off; @@ -194,7 +219,7 @@ gapp.register("kiri-mode.cam.tools", (root, exports) => { selectedTool.taper_tip = parseFloat(ui.toolTaperTip.value); selectedTool.metric = ui.toolMetric.checked; selectedTool.type = toolNames[ui.toolType.selectedIndex]; - if (hasTaper(selectedTool.type)) { + if (selectedTool.type === 'tapermill') { const CAM = kiri.driver.CAM; const rad = (selectedTool.flute_diam - selectedTool.taper_tip) / 2; if (ev && ev.target === ui.toolTaperAngle) {