add .photon export
This commit is contained in:
parent
f9d650284c
commit
db1590c57f
6 changed files with 168 additions and 18 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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}),
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue