add laser on/off gcode. cleanup help, export dialogs

This commit is contained in:
Stewart Allen 2020-03-13 12:31:10 -04:00
commit eb381f3417
13 changed files with 149 additions and 93 deletions

View file

@ -387,7 +387,14 @@ var gs_base = exports;
offsetPrecision : offsetPrecision,
intersectRayLine : intersectRayLine,
intersect : intersect,
determinant : determinant
determinant : determinant,
comma: (v) => {
let [lt,rt] = v.toString().split('.');
lt = lt.toString().split('').reverse().map((v,i,a) => {
return (i < a.length - 1 && i % 3 === 2) ? `,${v}` : v
}).reverse().join('');
return rt ? `${lt}.${rt}` : lt;
}
};
})();

View file

@ -193,6 +193,12 @@ var gs_kiri_conf = exports;
d:{
bedWidth: 1,
bedDepth: 1,
gcodePre: 1,
gcodePost: 1,
gcodeFExt: 1,
gcodeSpace: 1,
gcodeLaserOn: 1,
gcodeLaserOff: 1
},
// fields permitted in Laser:Process
p:{
@ -289,12 +295,14 @@ var gs_kiri_conf = exports;
gcodeFan: "", // FDM fan command
gcodeTrack: "", // FDM progress command
gcodeLayer: "", // FDM layer output
gcodeFExt: "", // CAM file extension
gcodeSpace: "", // CAM token spacing
gcodeStrip: true, // CAM strip comments
gcodeDwell: ["G4 P{time}"], // CAM dwell script
gcodeChange: ["M6 T{tool}"], // CAM tool change script
gcodeSpindle: ["M3 S{speed}"], // CAM spindle speed
gcodeFExt: "", // CAM file extension
gcodeSpace: "", // CAM token spacing
gcodeStrip: true // CAM strip comments
gcodeLaserOn: ["M106 S{power}"],// LASER turn on
gcodeLaserOff: ["M107"] // LASER turn off
},
// FDM/CAM/Laser
process:{

View file

@ -290,37 +290,52 @@ let gs_kiri_laser = exports;
*
*/
function exportGCode(print) {
let lines = [], dx = 0, dy = 0, feedrate, laser_on;
let lines = [], dx = 0, dy = 0, feedrate;
let dev = print.settings.device;
let space = dev.gcodeSpace;
let power = 255;
let laser_on = dev.gcodeLaserOn || [];
let laser_off = dev.gcodeLaserOff || [];
exportElements(
print,
function(min, max, power, speed) {
let width = (max.x - min.x),
height = (max.y - min.y);
dx = min.x;
dy = min.y;
feedrate = " F" + speed,
laser_on = "M106 S" + UTIL.round(256 * (power / 100), 3);
// pre
feedrate = `${space}F${speed}`;
power = (256 * (power / 100)).toFixed(3);
(dev.gcodePre || []).forEach(line => {
lines.push(line);
});
},
function(poly, color) {
poly.forEach(function(point, index) {
if (index === 0) {
lines.push("G0 " + point);
lines.push(`G0${space}${point}`);
} else if (index === 1) {
lines.push(laser_on);
lines.push("G1 " + point + feedrate);
laser_on.forEach(line => {
lines.push(line.replace('{power}', power));
});
lines.push(`G1${space}${point}${feedrate}`);
} else {
lines.push("G1 " + point);
lines.push(`G1${space}${point}`);
}
});
lines.push("M107");
laser_off.forEach(line => {
lines.push(line);
});
},
function() {
// post
(dev.gcodePost || []).forEach(line => {
lines.push(line);
});
},
function(point) {
return "X" + UTIL.round(point.x - dx, 3) + " Y" + UTIL.round(point.y - dy, 3);
return `X${(point.x - dx, 3).toFixed(3)}${space}Y${(point.y - dy, 3).toFixed(3)}`;
}
);
@ -333,6 +348,7 @@ let gs_kiri_laser = exports;
function exportSVG(print, cut_color) {
let lines = [], dx = 0, dy = 0, my;
let colors = [
"black",
"purple",
"blue",
"red",
@ -340,8 +356,7 @@ let gs_kiri_laser = exports;
"yellow",
"green",
"brown",
"gray",
"black"
"gray"
];
exportElements(

View file

@ -10,6 +10,8 @@ let gs_kiri_export = exports;
if (self.kiri.export) return;
let KIRI = self.kiri,
BASE = self.base,
UTIL = BASE.util,
API = KIRI.api,
SDB = API.sdb,
UI = API.ui,
@ -76,7 +78,7 @@ let gs_kiri_export = exports;
currentPrint.output.forEach(layer => { segments += layer.length });
UI.print.innerHTML = html;
$('print-filename').value = filename;
$('print-lines').value = segments;
$('print-lines').value = UTIL.comma(segments);
$('print-close').onclick = API.modal.hide;
$('print-svg').onclick = download_svg;
$('print-dxf').onclick = download_dxf;
@ -353,9 +355,18 @@ let gs_kiri_export = exports;
function calcWeight() {
try {
let density = $('print-density');
$('print-weight').value = (
UTIL.round((Math.PI * UTIL.sqr(currentPrint.settings.device.filamentSize/2)) * currentPrint.distance * 1.25 / 1000, 2)
);
(Math.PI * UTIL.sqr(
currentPrint.settings.device.filamentSize / 2
)) *
currentPrint.distance *
(parseFloat(density.value) || 1.25) /
1000
).toFixed(2);
density.onkeyup = (ev) => {
if (ev.key === 'Enter') calcWeight();
};
} catch (e) { }
}
@ -381,7 +392,7 @@ let gs_kiri_export = exports;
$('print-filament-row').style.display = MODE === MODES.FDM ? '' : 'none';
$('mill-info').style.display = MODE === MODES.CAM ? '' : 'none';
$('print-filename').value = filename;
$('print-filesize').value = currentPrint.bytes;
$('print-filesize').value = UTIL.comma(currentPrint.bytes);
$('print-filament').value = Math.round(currentPrint.distance);
$('grid-host').onkeyup = gridhost_probe;
$('grid-apik').onkeyup = gridhost_probe;

View file

@ -118,14 +118,16 @@ var gs_kiri_init = exports;
setDeviceTrack: UC.newInput(LANG.dev_prog, {title:LANG.dev_prog_desc, modes:FDM, size:17}),
setDeviceLayer: UC.newText(LANG.dev_layer, {title:LANG.dev_layer_desc, modes:FDM, size:14, height: 2}),
setDeviceToken: UC.newBoolean(LANG.dev_token, null, {title:LANG.dev_token_desc, modes:CAM_LASER}),
setDeviceStrip: UC.newBoolean(LANG.dev_strip, null, {title:LANG.dev_strip_desc, modes:CAM_LASER}),
setDeviceStrip: UC.newBoolean(LANG.dev_strip, null, {title:LANG.dev_strip_desc, modes:CAM}),
setDeviceFExt: UC.newInput(LANG.dev_fext, {title:LANG.dev_fext_desc, modes:CAM_LASER, size:7}),
setDeviceDwell: UC.newText(LANG.dev_dwell, {title:LANG.dev_dwell_desc, modes:CAM, size:14, height:2}),
setDeviceChange: UC.newText(LANG.dev_tool, {title:LANG.dev_tool_desc, modes:CAM, size:14, height:2}),
setDeviceSpindle: UC.newText(LANG.dev_speed, {title:LANG.dev_speed_desc, modes:CAM, size:14, height:2}),
setDevicePause: UC.newText(LANG.dev_pause, {title:LANG.dev_pause_desc, modes:FDM, size:14, height:3}),
setDevicePre: UC.newText(LANG.dev_head, {title:LANG.dev_head_desc, xmodes:FDM_CAM, size:14, height:3}),
setDevicePost: UC.newText(LANG.dev_foot, {title:LANG.dev_foot_desc, xmodes:FDM_CAM, size:14, height:3}),
setDeviceLaserOn: UC.newText(LANG.dev_lzon, {title:LANG.dev_lzon_desc, modes:LASER, size:14, height:3}),
setDeviceLaserOff: UC.newText(LANG.dev_lzof, {title:LANG.dev_lzof_desc, modes:LASER, size:14, height:3}),
setDevicePre: UC.newText(LANG.dev_head, {title:LANG.dev_head_desc, modes:ALL, size:14, height:3}),
setDevicePost: UC.newText(LANG.dev_foot, {title:LANG.dev_foot_desc, modes:ALL, size:14, height:3}),
tools: $('tools'),
toolsSave: $('tools-save'),
@ -879,6 +881,8 @@ var gs_kiri_init = exports;
post: UI.setDevicePost.value.split('\n'),
pause: UI.setDevicePause.value.split('\n'),
dwell: UI.setDeviceDwell.value.split('\n'),
'laser-on': UI.setDeviceLaserOn.value.split('\n'),
'laser-off': UI.setDeviceLaserOff.value.split('\n'),
'tool-change': UI.setDeviceChange.value.split('\n'),
'file-ext': UI.setDeviceFExt.value,
'token-space': UI.setDeviceToken.checked ? ' ' : '',
@ -927,7 +931,9 @@ var gs_kiri_init = exports;
gcodeChange: valueOf(code['tool-change'], []),
gcodeFExt: valueOf(code['file-ext'], 'gcode'),
gcodeSpace: valueOf(code['token-space'], ''),
gcodeStrip: valueOf(code['strip-comments'], false)
gcodeStrip: valueOf(code['strip-comments'], false),
gcodeLaserOn: valueOf(code['laser-on'], []),
gcodeLaserOff: valueOf(code['laser-off'], [])
};
let dev = current.device,
@ -961,6 +967,9 @@ var gs_kiri_init = exports;
UI.setDeviceFExt.value = dev.gcodeFExt;
UI.setDeviceToken.checked = dev.gcodeSpace ? true : false;
UI.setDeviceStrip.checked = dev.gcodeStrip;
// LASER
UI.setDeviceLaserOn.value = dev.gcodeLaserOn.join('\n');
UI.setDeviceLaserOff.value = dev.gcodeLaserOff.join('\n');
// disable editing for non-local devices
[
@ -986,7 +995,9 @@ var gs_kiri_init = exports;
UI.setDeviceChange,
UI.setDeviceFExt,
UI.setDeviceToken,
UI.setDeviceStrip
UI.setDeviceStrip,
UI.setDeviceLaserOn,
UI.setDeviceLaserOff
].forEach(function(e) {
e.disabled = !local;
});
@ -1002,7 +1013,7 @@ var gs_kiri_init = exports;
e.parentNode.style.display = dev.spindleMax >= 0 ? 'none' : 'block';
});
UI.deviceSave.disabled =
UI.deviceSave.disabled = !local;
UI.deviceDelete.disabled = !local;
API.view.update_fields();
@ -1076,18 +1087,26 @@ var gs_kiri_init = exports;
UI.deviceSelect.innerHTML = '';
let incr = 0;
let faves = API.show.favorites();
let found = false;
let first = devices[0];
// run through the list up to twice forcing faves off
// the second time if incr === 0 (no devices shown)
// if incr > 0, second loop is avoided
for (let rep=0; rep<2; rep++)
if (incr === 0)
devices.forEach(function(device, index) {
let opt = DOC.createElement('option'),
fav = isFavoriteDevice(device),
// force faves off for second try
if (rep === 1) faves = false;
let fav = isFavoriteDevice(device),
loc = isLocalDevice(device);
if (API.show.favorites() && !(fav || loc)) {
if (faves && !(fav || loc)) {
return;
}
if (incr === 0) {
first = device;
}
let opt = DOC.createElement('option');
opt.appendChild(DOC.createTextNode(device));
opt.onclick = function() {
selectDevice(device);
@ -1328,7 +1347,7 @@ var gs_kiri_init = exports;
function showDevices() {
if (deviceLock) return;
API.modal.hide();
API.ajax("/api/filters-"+API.mode.get_lower(), function(flvalue) {
if (!flvalue) return;
renderDevices(js2o(flvalue));
@ -1647,6 +1666,8 @@ var gs_kiri_init = exports;
API.space.restore(ondone) || checkSeed(ondone) || ondone();
// extend API
API.show.devices = showDevices;
};
})();

View file

@ -90,7 +90,11 @@ var gs_kiri_lang = exports;
dev_head: "header",
dev_head_desc: "gcode header script",
dev_foot: "footer",
dev_foot_desc: "gcode footer script"
dev_foot_desc: "gcode footer script",
dev_lzon: "laser on",
dev_lzon_desc: "gcode laser on script",
dev_lzof: "laser off",
dev_lzof_desc: "gcode laser off script"
};

View file

@ -1,20 +1,24 @@
# Kiri:Moto todo
* hide the bed with a checkbox? indication of part outside printable area?
* set page background color? or dark mode?
* better small screen support (on screen button for hiding side panels, compact selectors)
* widget general add-ons (fdm supports, cam tabs)
* extend mesh object to store raw + annotations (rot,scale,pos)
## `C` cosmetic, `F` functional, `P` performance
* `C` hide the bed with a checkbox? indication of part outside printable area?
* `C` set page background color? or dark mode?
* `C` better small screen support (on screen button for hiding side panels, compact selectors)
* `F` widget general add-ons (fdm supports, cam tabs)
* `F` extend mesh object to store raw + annotations (rot,scale,pos)
* share raw data w/ dups, encode/decode
* bail on decimation if it's proving ineffective
* improve decimation speed by avoiding in/out of Point
* server-side processing (determine protocol and storage)
* refactor / simplify POLY.expand (put onus on collector)
* cloned objects should share same slice data unless rotated
* remember object's original position/orientation for reset/multi-object import alignment
* `F` remember object's original position/orientation for reset/multi-object import alignment
* `P` bail on decimation if it's proving ineffective
* `P` improve decimation speed by avoiding in/out of Point
* `P` server-side processing (determine protocol and storage)
* `P` refactor / simplify POLY.expand (put onus on collector)
* `P` cloned objects should share same slice data unless rotated
# FDM todo
# FDM
* polishing and other non-planar work
* manual support addition / control
* gradient infill https://www.youtube.com/watch?v=hq53gsYREHU&feature=emb_logo
* disable infill fingerprinting for gyroids
* first layer segment large flat areas for better fill reliability
@ -29,12 +33,11 @@
* fix wrong first point in general (all modes)
* trim support offset from layer below
* feather sharp tips by reducing extrusion in area of overlap
* dual extruder support
* add manual supports
* dual extruder and swapping extruder support
* option to support interior bridges when 0% infill
* fix multiple part layout export offset (resend position @ print time)
# CAM todo
# CAM
* refactor slicing around flats w/ interpolation instead of culling
* optimize away topo generation (for z hop/move) when part is flat
@ -57,31 +60,12 @@
* linear x/y not obeying inset from pocket only
* check normals for downward facing facets. mark top for slice skirt/pancake
# Laser todo
# Laser
* add proper devices
* color coding according to # of identical polys that show up in stacked layers
* overcuts, radii for drag knives
* sla :: svg modified from http://garyhodgson.github.io/slic3rsvgviewer/?file=examples/belt_pulley3.svg
# References
* other
-----
* http://lcamtuf.coredump.cx/gcnc/full/
* http://wiki.imal.org/howto/cnc-milling-introduction-cutting-tools
* http://www.twak.co.uk/2011/01/degeneracy-in-weighted-straight.html
# Sample FDM Pause/Unpause ```
G91 ; Relative Positioning
G0 Z20 ; Move Bed down 20mm
G90 ; Absolute positioning
G0 X10 Y10 ; Move to 10,10
M2000 ; Raise3D N2 Pause command
G91 ; Relative Positioning
G0 Z-20 ; Move Bed up 20mm
G90 ; Absolute positioning
```

View file

@ -1,13 +1,18 @@
{
"file-ext": "gcode",
"token-space": " ",
"strip-comments": false,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M30 ; program end"
],
"laser-on":[
"M106 S{power}"
],
"laser-off":[
"M107"
],
"settings": {
"bed_width": 300,

View file

@ -1,14 +1,10 @@
{
"file-ext": "gcode",
"token-space": " ",
"strip-comments": false,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M30 ; program end"
],
"pre":[],
"post":[],
"laser-on":[],
"laser-off":[],
"settings": {
"bed_width": 500,
"bed_depth": 300

View file

@ -23,19 +23,22 @@
<b>File Load & Import</b>
<li>Drag and drop an <a href="https://en.wikipedia.org/wiki/STL_(file_format)" target="_stl">STL</a> onto the grid
<li>Or load with Function [Import]
<li>Or load with Function <button onclick="kiri.api.event.import()">Import</button>
<p>
<b>Start Working</b>
<li>Select device mode: FDM, CAM, Laser
<li>Select device profile under Devices
<li>Set slicing parameters in right menu
<li>Test slicing settings with Function [Slice]
<li>Preview slicing output with Function [Preview]
<li>Export gcode with Function [Export]
<li>Set mode
<button onclick="kiri.api.mode.set('FDM')">FDM</button>
<button onclick="kiri.api.mode.set('CAM')">CAM</button>
<button onclick="kiri.api.mode.set('LASER')">LASER</button>
<li>Select <button onclick="kiri.api.show.devices()">Device</button>
<li>Set slicing parameters in right panel
<li><button onclick = "kiri.api.function.slice()">Slice</button>
using settings from the right panel
<li><button onclick = "kiri.api.function.print()">Preview</button> GCode output
<li><button onclick = "kiri.api.function.export()">Export</button> GCode
<p>
<b>Other ways to use Kiri</b>
<b>Other ways to use Kiri:Moto</b>
<li><label><a target="_onshape" href="https://appstore.onshape.com/apps/CAM/EAAEWYIOMQKBENEMYW2N7MF253CT4WYL6SUJGEY=/description">Onshape</a></label> -- Inside Onshape
<li><label><a target="_thingiverse" href="http://www.thingiverse.com/apps/kirimoto/">Thingiverse</a></label> -- Inside Thingiverse

View file

@ -5,17 +5,17 @@
<div>
<table id="print-info">
<tr><th>file name</th><td><input id="print-filename" size="30" spellcheck="false" /></td></tr>
<tr><th>file size (bytes)</th><td><input id="print-filesize" size="10" disabled="true" /></td></tr>
<tr id="mill-info"><th>estimate (h:m:s)</th><td><input id="mill-time" size="10" disabled="true" /></td></tr>
<tr><th>file size (bytes)</th><td><input id="print-filesize" size="12" disabled="true" /></td></tr>
<tr id="mill-info"><th>time estimate (h:m:s)</th><td><input id="mill-time" size="12" disabled="true" /></td></tr>
</table>
</div>
<div id="print-filament-row">
<table>
<tr><th>filament used (mm)</th><td><input id="print-filament" size="10" disabled="true" /></td></tr>
<tr><th>filament density (g/cm^3)</th><td><input id="print-density" size="10" value="1.25" /></td></tr>
<tr><th>printed weight (g)</th><td><input id="print-weight" size="10" disabled="true" /></td></tr>
<tr><th>estimate (h:m:s)</th><td><input id="print-time" size="10" disabled="true" /></td></tr>
<tr><th>filament used (mm)</th><td><input id="print-filament" size="12" disabled="true" /></td></tr>
<tr><th>filament density (g/cm^3)</th><td><input id="print-density" size="12" value="1.25" /></td></tr>
<tr><th>printed weight (g)</th><td><input id="print-weight" size="12" disabled="true" /></td></tr>
<tr><th>time estimate (h:m:s)</th><td><input id="print-time" size="12" disabled="true" /></td></tr>
</table>
</div>

View file

@ -5,7 +5,7 @@
<div>
<table id="print-info">
<tr><th>file name</th><td><input id="print-filename" size="30" spellcheck="false" /></td></tr>
<tr><th>segments</th><td><input id="print-lines" size="10" disabled="true" /></td></tr>
<tr><th>segments</th><td><input id="print-lines" size="12" disabled="true" /></td></tr>
</table>
</div>

View file

@ -532,6 +532,8 @@ button.selected {
}
#device label {
white-space: nowrap;
}
#device > div > label {
padding: 2px;
}
#device input {
@ -664,7 +666,6 @@ button[import="1"] {
z-Index: 10000;
}
.poptext label {
width: 100% !important;
text-align: center !important;
border-top: 1px solid #888;
border-left: 1px solid #888;
@ -676,6 +677,7 @@ button[import="1"] {
}
.poptext textarea {
flex-grow: 1;
margin: 0;
opacity: 0.95;
outline: none;
overflow-y: scroll !important;