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

View file

@ -210,7 +210,7 @@ let gs_kiri_sla = exports;
$('print-layers').value = lines.length; $('print-layers').value = lines.length;
$('print-close').onclick = API.modal.hide; $('print-close').onclick = API.modal.hide;
$('print-photons').onclick = () => { download_photons(print) }; $('print-photons').onclick = () => { download_photons(print) };
// $('print-photon').onclick = () => { download_photon(print) }; $('print-photon').onclick = () => { download_photon(print) };
// $('print-pws').onclick = () => { download_pws(print) }; // $('print-pws').onclick = () => { download_pws(print) };
let canvas = $('print-canvas'); 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) { function download_photons(print) {
let printset = print.settings, let printset = print.settings,
process = printset.process, process = printset.process,
@ -262,8 +378,8 @@ let gs_kiri_sla = exports;
}; };
}); });
let layers = encodeLayers(converted, "photons"); let coded = encodeLayers(converted, "photons");
let filebuf = new ArrayBuffer(75366 + layers.length + 28 * layerCount); let filebuf = new ArrayBuffer(75366 + coded.length + 28 * layerCount);
let filedat = new DataView(filebuf); let filedat = new DataView(filebuf);
let filePos = 0; let filePos = 0;
@ -288,7 +404,7 @@ let gs_kiri_sla = exports;
filePos = 75366; filePos = 75366;
for (let i = 0; i < layerCount; i++) { for (let i = 0; i < layerCount; i++) {
let layer = layers.layers[i], let layer = coded.layers[i],
sublayer = layer.sublayers[0], sublayer = layer.sublayers[0],
numbytes = sublayer.length; numbytes = sublayer.length;
@ -312,9 +428,6 @@ let gs_kiri_sla = exports;
print.sla.API.modal.hide(); print.sla.API.modal.hide();
} }
function download_photon() {
}
function download_pws() { function download_pws() {
} }
@ -407,3 +520,41 @@ let gs_kiri_sla = exports;
return bytes; 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.deviceSave.disabled = !local;
UI.deviceDelete.disabled = !local; UI.deviceDelete.disabled = !local;
UI.deviceAdd.disabled = dev.noclone;
API.view.update_fields(); API.view.update_fields();
platform.update_size(); 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}), 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}), 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}), 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}), 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}), 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}), deviceRound: UC.newBoolean(LANG.dv_bedc_s, onBooleanClick, {title:LANG.dv_bedc_l, modes:FDM}),

View file

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

View file

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

View file

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