add .photon export

This commit is contained in:
Stewart Allen 2020-04-14 22:15:10 -04:00
commit db1590c57f
6 changed files with 168 additions and 18 deletions

View file

@ -88,6 +88,7 @@ let gs_kiri_conf = exports;
// currently causes unecessary fills and culls because
// it's not mode and device type sensitive
let device = {
noclone: valueOf(code.no_clone, false),
mode: mode || code.mode || '',
internal: 0,
bedHeight: 2.5,
@ -286,6 +287,7 @@ let gs_kiri_conf = exports;
sla:{
// device defaults SLA:Device
d:{
noclone: false,
mode: "",
internal: 0,
bedWidth: 150,

View file

@ -210,7 +210,7 @@ let gs_kiri_sla = exports;
$('print-layers').value = lines.length;
$('print-close').onclick = API.modal.hide;
$('print-photons').onclick = () => { download_photons(print) };
// $('print-photon').onclick = () => { download_photon(print) };
$('print-photon').onclick = () => { download_photon(print) };
// $('print-pws').onclick = () => { download_pws(print) };
let canvas = $('print-canvas');
@ -235,6 +235,122 @@ let gs_kiri_sla = exports;
});
}
function download_photon(print) {
let printset = print.settings,
process = printset.process,
device = printset.device,
width = print.sla.done.width,
height = print.sla.done.height,
layerCount = print.sla.lines.length,
layerBytes = width * height;
let converted = print.sla.lines.map((line, index) => {
let count = line.length / 4;
let bits = new Uint8Array(line.length / 4);
let bitsDV = new DataView(bits.buffer);
let lineDV = new DataView(line.buffer);
// reduce RGB to R
for (let i = 0; i < count; i++) {
// defeat anti-aliasing for the moment
bitsDV.setUint8(i, lineDV.getUint8(i * 4) > 0 ? 1 : 0);
}
return {
subs: [{
exposureTime: process.slaLayerOn,
data: bits
}]
};
});
let coded = encodeLayers(converted, "photon");
let filebuf = new ArrayBuffer(984 + coded.length + layerCount * 28);
let filedat = new DataWriter(new DataView(filebuf));
filedat.skip(4); // header
filedat.writeU32(2); //version
filedat.writeF32(68.04, true); // bed x
filedat.writeF32(120.96, true); // bed y
filedat.writeF32(150.0, true); // bed z
filedat.skip(12); // padding
filedat.writeF32(process.slaSlice, true); // layer height
filedat.writeF32(process.slaLayerOn, true); // default lamp on
filedat.writeF32(process.slaBaseOn, true); // base lamp on
filedat.writeF32(process.slaLayerOff, true); // lamp off
filedat.writeU32(process.slaBaseLayers, true); // base layers
filedat.writeU32(1440, true); // device x
filedat.writeU32(2560, true); // device y
let hirez = filedat.skip(4); // hirez preview address filled pater
let layerpos = filedat.skip(4); // layer data address filled later
filedat.writeU32(layerCount, true);
let lorez = filedat.skip(4); // hirez preview address filled later
filedat.writeU32(0, true); // print time (TODO)
filedat.writeU32(0, true); // projection type (TODO)
let proppos = filedat.skip(4); // print properties address filled later
let proplen = filedat.skip(4); // print properties length filled later
filedat.writeU32(1, true); // AA level (sub layers)
filedat.writeU16(0, true); // light pwm (TODO);
filedat.writeU16(0, true); // light pwm bottom (TODO);
filedat.view.setUint32(hirez, filedat.pos, true);
// write hirez preview header
filedat.writeU32(0, true); // res x
filedat.writeU32(0, true); // res y
filedat.writeU32(filedat.pos, true); // data pos
filedat.writeU32(0, true); // data len
// write hirez preview data
filedat.view.setUint32(lorez, filedat.pos, true);
// write lorez preview header
filedat.writeU32(0, true); // res x
filedat.writeU32(0, true); // res y
filedat.writeU32(filedat.pos, true); // data pos
filedat.writeU32(0, true); // data len
// write lorez preview data
filedat.view.setUint32(proppos, filedat.pos, true);
// write print properties
filedat.writeF32(process.slaPeelDist, true);
filedat.writeF32(process.slaPeelLift, true); // speed
filedat.writeF32(process.slaPeelDrop, true); // speed
filedat.writeF32(0, true); // volume of used
filedat.writeF32(0, true); // weight of used
filedat.writeF32(0, true); // cost of used
filedat.writeF32(0, true); // bottom off delay time
filedat.writeF32(0, true); // light off delay time
filedat.writeF32(process.slaBaseLayers, true);
filedat.writeF32(0, true); // p1 ?
filedat.writeF32(0, true); // p2 ?
filedat.writeF32(0, true); // p3 ?
filedat.writeF32(0, true); // p4 ?
filedat.view.setUint32(layerpos, filedat.pos, true);
// write layer headers
let layers = coded.layers;
let layerat = [];
for (let l=0; l<layers.length; l++) {
filedat.writeF32(process.slaSlice, true);
filedat.writeF32(l < process.slaBaseLayers ? process.slaBasOn : process.slaLayerOn, true);
filedat.writeF32(process.slaLayerOff, true);
layerat.push(filedat.skip(4)); // rewrite later
filedat.writeU32(layers[l].length, true);
filedat.skip(16); // padding
}
// write layer data
for (let l=0; l<layers.length; l++) {
filedat.view.setUint32(layerat[l], filedat.pos, true);
let layer = layers[l].sublayers[0];
for (let j=0; j<layer.length; j++) {
filedat.writeU8(layer[j], true);
}
}
saveAs(
new Blob([filebuf], { type: "application/octet-stream" }),
$('print-filename').value + ".photon");
print.sla.API.modal.hide();
}
function download_photons(print) {
let printset = print.settings,
process = printset.process,
@ -262,8 +378,8 @@ let gs_kiri_sla = exports;
};
});
let layers = encodeLayers(converted, "photons");
let filebuf = new ArrayBuffer(75366 + layers.length + 28 * layerCount);
let coded = encodeLayers(converted, "photons");
let filebuf = new ArrayBuffer(75366 + coded.length + 28 * layerCount);
let filedat = new DataView(filebuf);
let filePos = 0;
@ -288,7 +404,7 @@ let gs_kiri_sla = exports;
filePos = 75366;
for (let i = 0; i < layerCount; i++) {
let layer = layers.layers[i],
let layer = coded.layers[i],
sublayer = layer.sublayers[0],
numbytes = sublayer.length;
@ -312,9 +428,6 @@ let gs_kiri_sla = exports;
print.sla.API.modal.hide();
}
function download_photon() {
}
function download_pws() {
}
@ -407,3 +520,41 @@ let gs_kiri_sla = exports;
return bytes;
}
})();
class DataWriter {
constructor(view) {
this.view = view;
this.pos = 0;
}
skip(v) {
let p = this.pos;
this.pos += v;
return p;
}
writeU8(v) {
this.view.setUint8(this.pos, v);
return this.skip(1);
}
writeU16(v,le) {
this.view.setUint16(this.pos, v, le);
return this.skip(2);
}
writeU32(v,le) {
this.view.setUint32(this.pos, v, le);
return this.skip(4);
}
writeF32(v,le) {
this.view.setFloat32(this.pos, v, le);
return this.skip(4);
}
writeF64(v,le) {
this.view.setFloat64(this.pos, v, le);
return this.skip(8);
}
}

View file

@ -626,6 +626,7 @@ var gs_kiri_init = exports;
UI.deviceSave.disabled = !local;
UI.deviceDelete.disabled = !local;
UI.deviceAdd.disabled = dev.noclone;
API.view.update_fields();
platform.update_size();
@ -1142,9 +1143,9 @@ var gs_kiri_init = exports;
deviceName: UC.newInput(LANG.dv_name_s, {title:LANG.dv_name_l, size:"60%", text:true}),
bedWidth: UC.newInput(LANG.dv_bedw_s, {title:LANG.dv_bedw_l, convert:UC.toInt}),
bedDepth: UC.newInput(LANG.dv_bedd_s, {title:LANG.dv_bedd_l, convert:UC.toInt}),
maxHeight: UC.newInput(LANG.dv_bedh_s, {title:LANG.dv_bedh_l, convert:UC.toInt, modes:FDM}),
maxHeight: UC.newInput(LANG.dv_bedh_s, {title:LANG.dv_bedh_l, convert:UC.toInt, modes:FDM_SLA}),
deviceMaxSpindle: UC.newInput(LANG.dv_spmx_s, {title:LANG.dv_spmx_l, convert:UC.toInt, modes:CAM}),
deviceOrigin: UC.newBoolean(LANG.dv_orgc_s, onBooleanClick, {title:LANG.dv_orgc_l}),
deviceOrigin: UC.newBoolean(LANG.dv_orgc_s, onBooleanClick, {title:LANG.dv_orgc_l, modes:GCODE}),
deviceOriginTop: UC.newBoolean(LANG.dv_orgt_s, onBooleanClick, {title:LANG.dv_orgt_l, modes:CAM}),
deviceRound: UC.newBoolean(LANG.dv_bedc_s, onBooleanClick, {title:LANG.dv_bedc_l, modes:FDM}),

View file

@ -1,11 +1,9 @@
{
"pre":[],
"post":[],
"no_clone": true,
"cmd":{},
"settings":{
"bed_width": 115,
"bed_depth": 65,
"max_height": 155,
"origin_center": true
"max_height": 155
}
}

View file

@ -1,11 +1,9 @@
{
"pre":[],
"post":[],
"no_clone": true,
"cmd":{},
"settings":{
"bed_width": 115,
"bed_depth": 65,
"max_height": 165,
"origin_center": true
"max_height": 165
}
}

View file

@ -12,8 +12,8 @@
<div class="print-sel">
<table>
<tr><th><button id="print-photons">download as .photons</button></th></tr>
<!--
<tr><th><button id="print-photon">download as .photon</button></th></tr>
<!--
<tr><th><button id="print-pws">download as .pws</button></th></tr>
-->
</table>