diff --git a/app.js b/app.js index 01b55b6d..2285ec80 100644 --- a/app.js +++ b/app.js @@ -309,7 +309,7 @@ const script = { "mode/sla/driver", "mode/sla/slice", "mode/sla/export", - "mode/sla/x_halot", + "mode/sla/x_cxdlp", "mode/sla/x_photon", "mode/cam/driver", "mode/cam/ops", diff --git a/src/kiri/export.js b/src/kiri/export.js index d8c0884c..563fe8e1 100644 --- a/src/kiri/export.js +++ b/src/kiri/export.js @@ -60,27 +60,19 @@ console.log/** Copyright Stewart Allen -- All Rights Reserved */ } function callExportSLA(options) { - const preview = []; KIRI.client.export(API.conf.get(), (line) => { API.show.progress(line.progress, "exporting"); - if (line.data) { - preview.push(line.data); - } }, (output, error) => { API.show.progress(0); if (error) { API.show.alert(error, 5); } else { - KIRI.driver.SLA.printDownload(preview, output, API); + KIRI.driver.SLA.printDownload(output, API); } }); } function exportLaserDialog(data) { - // if (!isPrepared()) { - // return API.function.prepare(exportLaser); - // } - const filename = "laser-"+(new Date().getTime().toString(36)); const settings = API.conf.get(); const driver = KIRI.driver.LASER; diff --git a/src/mode/sla/client.js b/src/mode/sla/client.js index d58a7213..38169f04 100644 --- a/src/mode/sla/client.js +++ b/src/mode/sla/client.js @@ -19,9 +19,8 @@ }); }; - SLA.printDownload = function(preview, output, API) { - const lines = preview; - const { file, width, height } = output; + SLA.printDownload = function(output, API) { + const { file, width, height, layers } = output; const filename = `print-${new Date().getTime().toString(36)}`; API.ajax("/kiri/output-sla.html", html => { @@ -31,10 +30,10 @@ process = settings.process, device = settings.device, print_sec = (process.slaBaseLayers * process.slaBaseOn) + - (lines.length - process.slaBaseLayers) * process.slaLayerOn; + (layers - process.slaBaseLayers) * process.slaLayerOn; // add peel lift/drop times to total print time - for (let i=0; i { online({progress: progress * part2 + part1, message}); }); - ondone({ - width: width, - height: height, - file: file - },[file]); + ondone({ width, height, file, layers: images.length }, [file]); } else { - let part1 = 0.25; + let part1 = 0.95; let part2 = 1 - part1; - let images = []; let slices = []; for (let index=0; index < layermax; index++) { let param = { index, width, height, widgets, scaleX, scaleY }; - let {image, lines} = CXDLP.render(param); - images.push(image); + let {lines} = CXDLP.render(param); slices.push(lines); - // transfer image memory to browser main - // it *should* be sampled to save memory - image = image ? image.buffer : undefined; online({ progress: (index / layermax) * part1, - message: "image_gen", - data: image - }, [image]); + message: "image_gen" + }); // bail on an empty layer if (lines.length === 0) { break; } } - let file = CXDLP.export({settings, width, height, slices}); + // generate thumb, preview1, preview2 + + let file = CXDLP.export({ + settings, + width, + height, + slices + }); ondone({ width: width, height: height, - file: file + file: file, + layers: slices.length }, [file]); } diff --git a/src/mode/sla/x_halot.js b/src/mode/sla/x_halot.js deleted file mode 100644 index 85da6ac7..00000000 --- a/src/mode/sla/x_halot.js +++ /dev/null @@ -1,386 +0,0 @@ -(function() { - - const default_values = { - magic1: 'CXSW3DV2', - magic2: 'CXSW3DV2', - model: 'CL-89', - version: 1, - layer_count: 0, - res_x: 3840, - res_y: 2400, - height: 0, - thumb: undefined, - preview1: undefined, - preview2: undefined, - dim_x: '192.000000', - dim_y: '120.000000', - layer: '0.050000', - light_on: 6, - light_off: 2, - light_pwm: 255, - lift_dist: 6, - lift_speed: 60, - down_speed: 150, - base_layers: 8, - base_light_on: 60, - base_light_pwm: 255, - base_lift_dist: 5, - base_lift_speed: 60 - }; - const data_term = 0x0d0a; - - class CXDLP { - constructor() { - Object.assign(this, default_values); - } - - // takes a DataView Object - read(view) { - let read = new DataReader(view, 0); - - function read_string(dbl) { - let len = read.readU32(); - let str = ''; - while (--len > 0) { - if (dbl) { - read.readU8(); - len--; - } - str += String.fromCharCode(read.readU8()); - } - if (!dbl) { - read.skip(1); // null term on byte strings - } - return str; - } - - let meta = { - view, - magic1: read_string(), - version: read.readU16(), - model: read_string(), - layer_count: read.readU16(), - res_x: read.readU16(), - res_y: read.readU16(), - height: read.readU32(), - skip: read.skip(60), - thumb: read.skip(26914), - preview1: read.skip(168202), - preview2: read.skip(168202), - dim_x: read_string(true), - dim_y: read_string(true), - layer: read_string(true), - light_on: read.readU16(), - light_off: read.readU16(), - base_light_on: read.readU16(), - base_layers: read.readU16(), - base_lift_dist: read.readU16(), - base_lift_speed: read.readU16(), - lift_dist: read.readU16(), - lift_speed: read.readU16(), - down_speed: read.readU16(), - base_light_pwm: read.readU16(), - light_pwm: read.readU16() - }; - - // read layer record lengths - let layers = this.layers = []; - for (let i=0; i this.layers.length) { - throw `layer out of range 0-${this.layers.length}`; - } - let out = []; - let rec = this.layers[layer]; - let { lines, pos } = rec; - for (let j=0; j> 3; - let y_end = ((d1 & 0b111) << 10) | (d2 >> 6); - let x_end = ((d2 & 0b111111) << 8) | (d3 >> 8); - let color = d3 & 0xff; - out.push({y_start, y_end, x_end, color}); - } - return out; - } else { - throw "missing data view"; - } - } - - write() { - let output = new ArrayWriter(); - - output.write_string = function write_string(str, dbl = false) { - let len = str.length; - output.writeU32(dbl ? len * 2 : len + 1); - let pos = 0; - while (pos < len) { - if (dbl) { - output.writeU8(0); - } - output.writeU8(str.charCodeAt(pos++)); - } - if (!dbl) { - output.writeU8(0); - } - } - - let layers = this.layers; - this.layer_count = layers.length; - output.write_string(this.magic1); - output.writeU16(this.version); - output.write_string(this.model); - output.writeU16(this.layer_count); - output.writeU16(this.res_x); - output.writeU16(this.res_y); - output.writeU32(this.height); - output.skip(60); - output.skip(26912); // thumb - output.writeU16(data_term); - output.skip(168200); // preview1 - output.writeU16(data_term); - output.skip(168200); // preview1 - output.writeU16(data_term); - output.write_string(this.dim_x, true); - output.write_string(this.dim_y, true); - output.write_string(this.layer, true); - output.writeU16(this.light_on); - output.writeU16(this.light_off); - output.writeU16(this.base_light_on); - output.writeU16(this.base_layers); - output.writeU16(this.base_lift_dist); - output.writeU16(this.base_lift_speed); - output.writeU16(this.lift_dist); - output.writeU16(this.lift_speed); - output.writeU16(this.down_speed); - output.writeU16(this.base_light_pwm); - output.writeU16(this.light_pwm); - - // write placeholder layer length to capture position - for (let layer of layers) { - layer.l1 = output.pos; - output.writeU32(0); - } - output.writeU16(data_term); - - // write out encoded layers - for (let layer of layers) { - layer.l2 = output.pos; - // placeholder to be written post - output.writeU32(0); - output.writeU32(layer.lines.length); - let start = output.pos; - for (let line of layer.lines) { - let b1 = (line.y_start >> 5); - let b2 = ((line.y_start << 3) | (line.y_end >> 10)) & 0xff; - let b3 = (line.y_end >> 2) & 0xff; - let b4 = ((line.y_end << 6) | (line.x_end >> 8)) & 0xff; - let b5 = (line.x_end) & 0xff; - output.writeU8(b1); - output.writeU8(b2); - output.writeU8(b3); - output.writeU8(b4); - output.writeU8(b5); - output.writeU8(line.color); - } - layer.length = output.pos - start; - output.writeU16(data_term); - } - - output.write_string(this.magic2); - let ckpos = output.pos; - - // retrace and write layer lengths - for (let layer of layers) { - output.seek(layer.l1); - output.writeU32(layer.length); - output.seek(layer.l2); - output.writeU32(layer.length); - } - - output.seek(ckpos); - // compute xor checksum - let cksum = 0; - let array = output.array; - for (let i=0; i {return { lines: a }}); - - return cxdlp.write(); - }; - - CXDLP.render = function(params) { - let { width, height, index, widgets, scaleX, scaleY } = params; - let width2 = width / 2, height2 = height / 2; - let array = []; - let count = 0; - - function scaleMovePoly(poly) { - let points = poly.points; - poly._bounds = undefined; - for (let i=0, il=points.length; i { - let slice = widget.slices[index]; - if (slice) { - if (slice.synth) count++; - let polys = slice.unioned; - if (!polys) polys = slice.tops.map(t => t.poly); - if (slice.supports) polys.appendAll(slice.supports); - array.appendAll(polys.map(poly => { - return poly.clone(true).move(widget.track.pos); - })); - count += polys.length; - } - }); - - let wasm = kiri.driver.SLA.wasm; - let imagelen = width * height; - let writer = new self.DataWriter(new DataView(wasm.memory.buffer), imagelen); - writer.writeU16(width, true); - writer.writeU16(height, true); - writer.writeU16(array.length, true); - - // scale and move all polys to fit in rendered platform coordinates - for (let i=0, il=array.length; i - +