clean up platform file load
This commit is contained in:
parent
7f4a6723ff
commit
903a0007d6
4 changed files with 57 additions and 79 deletions
|
|
@ -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('');
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue