diff --git a/notes.md b/notes.md
index 9f0bad2a..b065103e 100644
--- a/notes.md
+++ b/notes.md
@@ -11,10 +11,12 @@
* `P` client/worker interface normalization
* `P` explore widget vertex reloading / replacing (Onshape primarily)
-* `F` G2/G3 arc output / input
+* `F` add % field type with conversion (like units)
+* `F` complete G2/G3 arc output / input (85% now)
* `F` expose grouping feature
* `F` SVG import to 3D part like images
* `F` bundle current profile into exported device
+* `F` integrate svg nest arrange algorithm
# FDM
@@ -67,6 +69,7 @@
* `B` climb vs conventional not fully consistent after refactor
* `B` outside cutting direction in roughing mode inverted
+* `F` add layout spacing preference
* `F` import SVG into a path that can be overlaid onto a 3D mesh (laser?)
* `F` intelligently turn circle hole pocket clear into spiral down
* `F` trace follow hole that matches endmill should turn into a drill op
@@ -111,6 +114,7 @@
* http://wiki.imal.org/howto/cnc-milling-introduction-cutting-tools
* http://www.twak.co.uk/2011/01/degeneracy-in-weighted-straight.html
* http://photon.chrisgraf.de/
+* https://github.com/Jack000/SVGnest
# More CNC
diff --git a/src/kiri/conf.js b/src/kiri/conf.js
index a9e2e620..b5896367 100644
--- a/src/kiri/conf.js
+++ b/src/kiri/conf.js
@@ -77,6 +77,7 @@
extFilament: device.filamentSize,
extNozzle: device.nozzleSize,
extSelect: ["T0"],
+ extDeselect: [],
extOffsetX: 0,
extOffsetY: 0
}];
@@ -143,6 +144,7 @@
if (rec.offset_x) e.extOffsetX = rec.offset_x;
if (rec.offset_y) e.extOffsetY = rec.offset_y;
if (rec.select) e.extSelect = rec.select;
+ if (rec.deselect) e.extDeselect = rec.deselect;
device.extruders.push(e);
});
} else {
@@ -273,6 +275,7 @@
extFilament: 1.75,
extNozzle: 0.4,
extSelect: ["T0"],
+ extDeselect: [],
extOffsetX: 0,
extOffsetY: 0
}]
diff --git a/src/kiri/init.js b/src/kiri/init.js
index 603c6e2c..538fe453 100644
--- a/src/kiri/init.js
+++ b/src/kiri/init.js
@@ -739,6 +739,12 @@
// add extruder selection buttons
if (dev.extruders) {
+ for (let ext of dev.extruders) {
+ // add missing deselect field from legacy configs
+ if (!ext.extDeselect) {
+ ext.extDeselect = [];
+ }
+ }
let ext = API.lists.extruders = [];
dev.internal = 0;
let selext = $('pop-nozzle');
@@ -768,7 +774,6 @@
UI.bedDepth,
UI.bedWidth,
UI.maxHeight,
- UI.extrudeAbs,
UI.deviceOrigin,
UI.deviceRound,
UI.deviceBelt,
@@ -792,12 +797,12 @@
UI.extDel,
UI.extOffsetX,
UI.extOffsetY,
- UI.extSelect
+ UI.extSelect,
+ UI.extDeselect
].forEach(function(e) {
e.disabled = !local;
});
- UI.extrudeAbs.style.display = mode === 'CAM' ? 'none' : 'flex';
UI.deviceSave.disabled = !local;
UI.deviceDelete.disabled = !local;
UI.deviceExport.disabled = !local;
@@ -1570,7 +1575,7 @@
extOffsetX: UC.newInput(LANG.dv_exox_s, {title:LANG.dv_exox_l, convert:UC.toFloat, modes:FDM}),
extOffsetY: UC.newInput(LANG.dv_exoy_s, {title:LANG.dv_exoy_l, convert:UC.toFloat, modes:FDM}),
extSelect: UC.newText(LANG.dv_exts_s, {title:LANG.dv_exts_l, modes:FDM, size:14, height:3, modes:FDM, area:gcode}),
- extrudeAbs: UC.newBoolean(LANG.dv_xtab_s, onBooleanClick, {title:LANG.dv_xtab_l, modes:FDM}),
+ extDeselect: UC.newText(LANG.dv_dext_s, {title:LANG.dv_dext_l, modes:FDM, size:14, height:3, modes:FDM, area:gcode}),
extActions: UC.newRow([
UI.extPrev = UC.newButton(undefined, undefined, {icon:''}),
UI.extAdd = UC.newButton(undefined, undefined, {icon:''}),
diff --git a/src/kiri/main.js b/src/kiri/main.js
index e34645a3..61afd90d 100644
--- a/src/kiri/main.js
+++ b/src/kiri/main.js
@@ -1974,6 +1974,7 @@
UI.extAdd.onclick = function() {
let copy = clone(device.extruders[device.internal]);
copy.extSelect = [`T${device.extruders.length}`];
+ copy.extDeselect = [];
device.extruders.push(copy);
device.internal = device.extruders.length - 1;
updateExtruderFields(device);
diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js
index 034ab597..44da89a2 100644
--- a/src/mode/fdm/export.js
+++ b/src/mode/fdm/export.js
@@ -28,7 +28,8 @@
extruder = extruders[tool],
offset_x = extruder.extOffsetX,
offset_y = extruder.extOffsetY,
- extrudeAbs = device.extrudeAbs,
+ extrudeAbs = device.extrudeAbs || false,
+ extrudeSet = false,
time = 0,
layer = 0,
pause = [],
@@ -135,7 +136,7 @@
}
function appendAllSub(arr, pad) {
- if (!arr) return;
+ if (!arr || arr.length === 0) return;
if (!Array.isArray(arr)) arr = [ arr ];
arr.forEach(function(line) { appendSub(line, pad) });
}
@@ -156,10 +157,16 @@
let line = device.gcodePre[i];
if (line.indexOf('T0') >= 0) t0 = true; else
if (line.indexOf('T1') >= 0) t1 = true; else
- if (line.indexOf('M82') >= 0) extrudeAbs = true; else
- if (line.indexOf('M83') >= 0) extrudeAbs = false; else
- if (line.indexOf('G90') >= 0) extrudeAbs = true; else
- if (line.indexOf('G91') >= 0) extrudeAbs = false; else
+ if (line.indexOf('M82') >= 0) {
+ extrudeAbs = true;
+ extrudeSet = true;
+ } else
+ if (line.indexOf('M83') >= 0) {
+ extrudeAbs = false;
+ extrudeSet = true;
+ } else
+ if (line.indexOf('G90') >= 0 && !extrudeSet) extrudeAbs = true; else
+ if (line.indexOf('G91') >= 0 && !extrudeSet) extrudeAbs = false; else
if (line.indexOf('G92') === 0) {
line.split(";")[0].split(' ').forEach(function (tok) {
let val = parseFloat(tok.substring(1) || 0) || 0;
@@ -355,8 +362,9 @@
out = path[pidx];
speedMMM = (out.speed || process.outputFeedrate) * 60;
- // look for extruder change and recalc emit factor
+ // look for extruder change, run scripts, recalc emit factor
if (out.tool !== undefined && out.tool !== tool) {
+ appendAllSub(extruder.extDeselect);
tool = out.tool;
subst.nozzle = subst.tool = tool;
extruder = extruders[tool];
diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js
index 7bd8adaf..a00056b0 100644
--- a/web/kiri/lang/en.js
+++ b/web/kiri/lang/en.js
@@ -68,7 +68,9 @@ kiri.lang['en-us'] = {
dv_lzof_s: "laser off",
dv_lzof_l: "gcode laser off script",
dv_exts_s: "select",
- dv_exts_l: "gcode to select this extruder",
+ dv_exts_l: "gcode run to enable this extruder",
+ dv_dext_s: "deselect",
+ dv_dext_l: "gcode run before enabling another extruder",
dv_extd_s: "deselect",
dv_extd_l: "gcode to deselect this extruder",
dv_exox_s: "offset x",