diff --git a/release.md b/release.md index 89bffd35..4673070a 100644 --- a/release.md +++ b/release.md @@ -9,15 +9,19 @@ Full docs @ https://docs.grid.space/projects/kiri-moto * add new fdm parameters, range overrides * various fixes and improvements to CAM indexing * various fixes and improvements to gcode variables -* move to save Z between CAM ops, refresh spindle speed +* CAM move to save Z between ops, refresh spindle speed * improve gcode arc import decoding * improve trace line selection with zoom adaptive thresholds -* add CAM origin offset optional parameters +* CAM add origin offset optional parameters * remove auto-decimation on object import -* fix FDM raft line fill strategy +* FDM fix raft line fill strategy * slicing memory reduction from team lychee -* option to control first CAM output point order +* option to control first output point order +* CAM add control to omit initial tool change +* CAM fix vertical face selection and step over defaults + - refactor object/group storage model in Mesh:Tool +- add omit pocket to rough and outline # Release 3.7 (2022-11-12) diff --git a/src/kiri-mode/cam/driver.js b/src/kiri-mode/cam/driver.js index 96550378..f22d4cd2 100644 --- a/src/kiri-mode/cam/driver.js +++ b/src/kiri-mode/cam/driver.js @@ -88,7 +88,7 @@ kiri.load(api => { CAM.surface_find = function(widget, faces) { CAM.surface_prep(widget); - return widget.tool.findConnectedSurface(faces, 0.1, 0.1); + return widget.tool.findConnectedSurface(faces, 0.1, 0.0); }; kiri.worker.cam_surfaces = function(data, send) { diff --git a/src/kiri-mode/cam/export.js b/src/kiri-mode/cam/export.js index 10962578..33120fc4 100644 --- a/src/kiri-mode/cam/export.js +++ b/src/kiri-mode/cam/export.js @@ -34,6 +34,7 @@ CAM.export = function(print, online) { output = [], spindle = 0, newSpindle = 0, + toolChanges = 0, spindleMax = device.spindleMax, origin = settings.origin || { x: 0, y: 0, z: 0 }, space = device.gcodeSpace ? ' ' : '', @@ -188,9 +189,10 @@ CAM.export = function(print, online) { pos.t = out.tool; consts.tool = pos.t; consts.tool_name = toolNameByNumber(out.tool); - if (!laserOp) { + if (!laserOp && (spro.camToolInit || toolChanges > 0)) { filterEmit(cmdToolChange, { ...consts, spindle: newSpindle } ); } + toolChanges++; } // on spindle change (deferred from layer transition so it's post-toolchange) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index ef84e43a..be753879 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -508,7 +508,7 @@ const conf = exports({ camTraceBottom: false, camPocketSpindle: 1000, camPocketTool: 1000, - camPocketOver: 0.5, + camPocketOver: 0.25, camPocketDown: 1, camPocketSpeed: 250, camPocketPlunge: 200, @@ -582,6 +582,7 @@ const conf = exports({ camTrueShadow: false, camForceZMax: false, camFirstZMax: false, + camToolInit: true, ops: [], // current ops op2: [] // flip ops } diff --git a/src/kiri/init.js b/src/kiri/init.js index d6f3478f..8e178355 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1974,6 +1974,7 @@ gapp.register("kiri.init", [], (root, exports) => { camConventional: uc.newBoolean(LANG.ou_conv_s, onBooleanClick, {title:LANG.ou_conv_l, modes:CAM}), camEaseDown: uc.newBoolean(LANG.cr_ease_s, onBooleanClick, {title:LANG.cr_ease_l, modes:CAM}), camDepthFirst: uc.newBoolean(LANG.ou_depf_s, onBooleanClick, {title:LANG.ou_depf_l, modes:CAM}), + camToolInit: uc.newBoolean(LANG.ou_toin_s, onBooleanClick, {title:LANG.ou_toin_l, modes:CAM}), fdmSep: uc.newBlank({class:"pop-sep", modes:FDM_CAM}), camFirstZMax: uc.newBoolean(LANG.ou_z1st_s, onBooleanClick, {title:LANG.ou_z1st_l, modes:CAM}), camForceZMax: uc.newBoolean(LANG.ou_forz_s, onBooleanClick, {title:LANG.ou_forz_l, modes:CAM}), diff --git a/src/mesh/tool.js b/src/mesh/tool.js index e0c354db..611a9bdc 100644 --- a/src/mesh/tool.js +++ b/src/mesh/tool.js @@ -226,7 +226,7 @@ mesh.tool = class MeshTool { // depends on index() being run first findConnectedSurface(faces, radians, filterZ, found = {}) { const norms = this.getIndex().faces; - if (filterZ) { + if (filterZ !== undefined) { // optional filter to z normal >= value faces = faces.filter(f => norms[f * 6 + 2] >= filterZ); } diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 027f6608..b890ca69 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -443,7 +443,7 @@ self.kiri.lang['en-us'] = { cc_spnd_s: "spindle rpm", cc_spnd_l: ["spindle speed in","revolutions / minute"], cc_sovr_s: "step over", - cc_sovr_l: ["a fraction of tool diameter between 0 and 1. values greater than 0.5 may result in uncut areas from acute angle offsets."], + cc_sovr_l: ["a fraction of tool diameter between 0 and 1. values greater than 0.49 may result in uncut areas from acute angle offsets or undesirable artifacts when contour is enabled."], cc_sdwn_s: "step down", cc_sdwn_l: ["step down depth","for each pass","in workspace units","0 to disable"], cc_thru_s: "cut thru", @@ -676,6 +676,8 @@ self.kiri.lang['en-us'] = { ou_conv_l: ["milling direction","uncheck for 'climb'"], ou_depf_s: "depth first", ou_depf_l: ["optimize pocket cuts","with depth priority"], + ou_toin_s: "tool init", + ou_toin_l: "emit tool change with first operation", ou_forz_s: "force z max", ou_forz_l: "all moves between pockets will go to z max (above stock). this is usually required if you are not performing a roughing operation before pocketing operations.", ou_z1st_s: "first z max",