diff --git a/src/load/file.js b/src/load/file.js index 02689d05..f92aa5ad 100644 --- a/src/load/file.js +++ b/src/load/file.js @@ -40,7 +40,7 @@ const types = { svg(data, file, resolve, reject, opt = {}) { let out = load.SVG.parse(data, opt); - resolve(opt.flat ? out : out.map(m => { return {mesh: m.toFloat32(), file} })); + resolve(opt.flat ? out : out.map(m => { return { mesh: m.toFloat32(), file } })); }, png(data, file, resolve, reject, opt = {}) { @@ -53,7 +53,11 @@ const types = { }, gbr(data, file, resolve, reject, opt = {}) { - resolve([{ mesh: load.GBR.toMesh(data).toFloat32(), file }]) + if (opt.flat) { + resolve([ load.GBR.parse(data) ]) + } else { + resolve([{ mesh: load.GBR.toMesh(data).toFloat32(), file }]) + } } }; diff --git a/src/load/svg.js b/src/load/svg.js index 0aff5b06..28ebc607 100644 --- a/src/load/svg.js +++ b/src/load/svg.js @@ -35,7 +35,7 @@ function parse(text, opt = { soup: true }) { for (let node of shapes) { let { shape, holes } = node.extractPoints(); for (let path of [ shape, ...holes ]) { - let poly = base.newPolygon().addPoints(path.map(p => base.newPoint(p.x, p.y, 0))); + let poly = base.newPolygon().addPoints(path.map(p => base.newPoint(p.x, -p.y, 0))); if (poly.appearsClosed()) poly.points.pop(); polys.push(poly); } diff --git a/src/main/mesh.js b/src/main/mesh.js index c7e25ae7..1d6d7459 100644 --- a/src/main/mesh.js +++ b/src/main/mesh.js @@ -466,18 +466,34 @@ function load_files(files) { let api = mesh.api; let has_image = false; let has_svg = false; + let has_gbr = false; + let sketch = api.sketch.selection.one; for (let file of files) { has_image = has_image || file.type === 'image/png'; has_svg = has_svg || file.name.toLowerCase().indexOf(".svg") > 0; + has_gbr = has_gbr || file.name.toLowerCase().indexOf(".gbr") > 0; } + if (sketch && has_gbr) { + load.File.load([...files], { flat: true }).then(layers => { + for (let layer of layers.flat()) { + let { circs, closed, open, rects } = layer; + let group = Date.now().toString(36); + for (let poly of [ ...closed, ...circs, ...rects ]) { + sketch.add_polygon({ poly, group }); + } + } + }); + } else + if (sketch && has_svg) { + load.File.load([...files], { flat: true }) + .then(polys => polys.forEach(set => { + let group = Date.now().toString(36); + set.forEach(poly => sketch.add_polygon({ poly, group })) + })) + .catch(error => dbug.error(error)) + .finally(() => mesh.api.log.hide()); + } else if (has_svg) { - let sketch = api.sketch.selection.one; - if (sketch) { - return load.File.load([...files], { flat: true }) - .then(polys => polys.flat().forEach(poly => sketch.add_polygon({ poly }))) - .catch(error => dbug.error(error)) - .finally(() => mesh.api.log.hide()); - } api.modal.dialog({ title: `svg import`, body: [ h.div({ class: "image-import" }, [ @@ -501,7 +517,8 @@ function load_files(files) { ]) ]) ] }); - } else if (has_image) { + } else + if (has_image) { api.modal.dialog({ title: `image import`, body: [ h.div({ class: "image-import" }, [