clean up platform file load

This commit is contained in:
Stewart Allen 2024-06-30 23:15:03 -04:00
commit 903a0007d6
4 changed files with 57 additions and 79 deletions

View file

@ -235,6 +235,10 @@ Float32Array.prototype.toShared = function() {
Float32Array.prototype.toFloat32 = function() { return this }; Float32Array.prototype.toFloat32 = function() { return this };
ArrayBuffer.prototype.textDecode = function(encoding = 'utf-8') {
return new TextDecoder(encoding).decode(this);
};
String.prototype.reverse = function() { String.prototype.reverse = function() {
return this.split('').reverse().join(''); return this.split('').reverse().join('');
}; };

View file

@ -747,113 +747,92 @@ function platformLayout() {
api.event.emit('platform.layout'); api.event.emit('platform.layout');
} }
function platformLoadWidget(group, vertices, filename) {
const widget = newWidget(undefined, group).loadVertices(vertices.toFloat32(), true);
if (filename) widget.saveToCatalog(filename);
platformAdd(widget);
return widget;
}
function platformLoadFiles(files, group) { function platformLoadFiles(files, group) {
let loaded = files.length;
platform.group(); platform.group();
for (let i = 0; i < files.length; i++) { let loading = files.length;
const file = files[i], for (let file of files) {
const name = file.name,
reader = new FileReader(), reader = new FileReader(),
lower = files[i].name.toLowerCase(), lower = name.toLowerCase(),
israw = lower.endsWith(".raw") || lower.indexOf('.') < 0,
isstl = lower.endsWith(".stl"), isstl = lower.endsWith(".stl"),
isobj = lower.endsWith(".obj"), isobj = lower.endsWith(".obj"),
is3mf = lower.endsWith(".3mf"), is3mf = lower.endsWith(".3mf"),
issvg = lower.endsWith(".svg"), issvg = lower.endsWith(".svg"),
ispng = lower.endsWith(".png"), ispng = lower.endsWith(".png"),
isjpg = lower.endsWith(".jpg"), isjpg = lower.endsWith(".jpg"),
isgcode = lower.endsWith(".gcode") || lower.endsWith(".nc"),
isset = lower.endsWith(".b64") || lower.endsWith(".km"),
iskmz = lower.endsWith(".kmz"), iskmz = lower.endsWith(".kmz"),
isini = lower.endsWith(".ini"), isini = lower.endsWith(".ini"),
isgbr = lower.endsWith(".gbr"); isgbr = lower.endsWith(".gbr"),
reader.file = files[i]; israw = lower.endsWith(".raw") || lower.indexOf('.') < 0,
isset = lower.endsWith(".b64") || lower.endsWith(".km"),
isgcode = lower.endsWith(".gcode") || lower.endsWith(".nc");
reader.file = file;
reader.onloadend = function(e) { reader.onloadend = function(e) {
const data = e.target.result;
function load_dec() { function load_dec() {
if (--loaded === 0) { if (--loading === 0) {
platform.group_done(isgcode); platform.group_done(isgcode);
} }
} }
if (israw) { if (israw) {
platform.add( platformLoadWidget(group, JSON.parse(data));
newWidget(undefined, group)
.loadVertices(JSON.parse(e.target.result).toFloat32())
);
load_dec(); load_dec();
} else if (api.feature.on_load && (isstl || isobj || is3mf)) { } else if (api.feature.on_load && (isstl || isobj || is3mf)) {
api.feature.on_load(e.target.result, file); api.feature.on_load(data, file);
load_dec();
} else if (api.feature.on_add_stl && isstl) {
api.feature.on_add_stl(data, file);
load_dec(); load_dec();
} else if (isstl) { } else if (isstl) {
if (api.feature.on_add_stl) { const stl = new load.STL().parse(data, api.view.unit_scale());
api.feature.on_add_stl(e.target.result, file); platformLoadWidget(group, stl, name);
} else {
platform.add(
newWidget(undefined, group)
.loadVertices(new load.STL().parse(e.target.result, api.view.unit_scale()))
.saveToCatalog(e.target.file.name)
);
}
load_dec(); load_dec();
} else if (isobj) { } else if (isobj) {
let objs = load.OBJ.parse(e.target.result); const objs = load.OBJ.parse(data.textDecode('utf-8'));
let odon = function() { const ondn = function() {
for (let obj of objs) { for (let obj of objs) {
let name = e.target.file.name; platformLoadWidget(group, obj, obj.name ? `${obj.name}-${name}` : name);
if (obj.name) {
name = obj.name + ' - ' + name;
}
platform.add(
newWidget(undefined, group)
.loadVertices(obj.toFloat32(), true)
.saveToCatalog(name)
);
} }
load_dec(); load_dec();
}; };
if (objs.length > 1 && !group) { if (objs.length > 1 && !group) {
api.uc.confirm('group objects?').then(ok => { api.uc.confirm('group objects?').then(ok => {
if (ok) { group = ok ? [] : group;
group = []; ondn();
}
odon();
}); });
} else { } else {
odon(); ondn();
} }
} else if (isgbr) { } else if (isgbr) {
let text = data.textDecode('utf-8');
if (api.conf.get().controller.devel) { if (api.conf.get().controller.devel) {
api.event.emit('cam.parse.gerber', { data: e.target.result }); api.event.emit('cam.parse.gerber', { data: text });
} else { } else {
let mesh = load.GBR.toMesh(e.target.result); let mesh = load.GBR.toMesh(text);
let wid; let wid = platformLoadWidget(group, mesh, name);
platform.add(wid =
newWidget(undefined, group)
.loadVertices(mesh, true)
.saveToCatalog(e.target.file.name)
);
if (api.mode.is_cam()) { if (api.mode.is_cam()) {
// attach raw illustration // attach raw illustration
api.event.emit('cam.parse.gerber', { data: e.target.result, mesh: wid.mesh }); api.event.emit('cam.parse.gerber', { data: text, mesh: wid.mesh });
} }
} }
} else if (is3mf) { } else if (is3mf) {
let odon = function(models) { let odon = function(models) {
let msg = api.show.alert('Adding Objects'); let msg = api.show.alert('Adding Objects');
for (let model of models) { for (let model of models) {
let name = e.target.file.name; platformLoadWidget(group, model.faces, model.name ? `${model.name}-${name}` : name);
if (model.name) {
name = model.name + ' - ' + name;
}
platform.add(
newWidget(undefined, group)
.loadVertices(model.faces.toFloat32())
.saveToCatalog(name)
);
} }
load_dec(); load_dec();
api.hide.alert(msg); api.hide.alert(msg);
} }
let msg = api.show.alert('Decoding 3MF'); let msg = api.show.alert('Decoding 3MF');
load.TMF.parseAsync(e.target.result).then(models => { load.TMF.parseAsync(data).then(models => {
api.hide.alert(msg); api.hide.alert(msg);
if (models.length > 1 && !group) { if (models.length > 1 && !group) {
UC.confirm(`group ${models.length} objects?`).then(ok => { UC.confirm(`group ${models.length} objects?`).then(ok => {
@ -867,34 +846,25 @@ function platformLoadFiles(files, group) {
} }
}); });
} else if (isgcode) { } else if (isgcode) {
api.function.parse(e.target.result, 'gcode'); api.function.parse(data.textDecode('utf-8'), 'gcode');
load_dec(); load_dec();
} else if (issvg) { } else if (issvg) {
group = group || []; group = group || [];
let name = e.target.file.name; let svg = load.SVG.parse(data.textDecode('utf-8'));
let svg = load.SVG.parse(e.target.result);
let ind = 0; let ind = 0;
for (let v of svg) { for (let v of svg) {
let num = ind++; platformLoadWidget(group, svg[ind], ind ? `${name}-${ind++}` : name);
platform.add(
newWidget(undefined, group)
.loadVertices(svg[num].toFloat32())
.saveToCatalog(num ? `${name}-${num}` : name)
);
} }
load_dec(); load_dec();
} else if (iskmz) api.settings.import_zip(e.target.result, true); }
else if (isset) api.settings.import(e.target.result, true); else if (iskmz) api.settings.import_zip(data, true);
else if (ispng) api.image.dialog(e.target.result, e.target.file.name); else if (isset) api.settings.import(data, true);
else if (isjpg) api.image.convert(e.target.result, e.target.file.name); else if (ispng) api.image.dialog(data, name);
else if (isini) api.settings.import_prusa(e.target.result); else if (isjpg) api.image.convert(data, name);
else if (isini) api.settings.import_prusa(data.textDecode('utf-8'));
else api.show.alert(`Unsupported file: ${reader.file.name}`); else api.show.alert(`Unsupported file: ${reader.file.name}`);
}; };
if (isstl || ispng || isjpg || iskmz) { reader.readAsArrayBuffer(reader.file);
reader.readAsArrayBuffer(reader.file);
} else {
reader.readAsBinaryString(reader.file);
}
} }
} }

View file

@ -34,7 +34,7 @@ function index() { return catalog().index }
class Widget { class Widget {
constructor(id, group) { constructor(id, group) {
this.id = id || new Date().getTime().toString(36)+(nextId++); this.id = id || Date.now().toString(36)+(nextId++);
this.grouped = group ? true : false; this.grouped = group ? true : false;
this.group = group || []; this.group = group || [];
this.group.push(this); this.group.push(this);

View file

@ -158,6 +158,7 @@ function parse(text) {
last = { x, y, tool }; last = { x, y, tool };
return r; return r;
}); });
// center board on origin
const { minx, maxx, miny, maxy } = bounds; const { minx, maxx, miny, maxy } = bounds;
for (let poly of [...polys, ...circs, ...rects]) { for (let poly of [...polys, ...circs, ...rects]) {
poly.move({ poly.move({
@ -166,10 +167,13 @@ function parse(text) {
z: 0 z: 0
}); });
} }
// separate open and closed polys (traces vs areas)
const open = []; const open = [];
const closed = []; const closed = [];
for (let poly of polys) { for (let poly of polys) {
if (poly.appearsClosed()) { if (poly.appearsClosed()) {
// clean up gnarly overlapping lines
// make contiguous, simpler enclosed areas
closed.push(...poly.simplify()); closed.push(...poly.simplify());
} else { } else {
open.push(poly); open.push(poly);