diff --git a/src/kiri/platform.js b/src/kiri/platform.js index b7537552..03eb9e3d 100644 --- a/src/kiri/platform.js +++ b/src/kiri/platform.js @@ -857,7 +857,7 @@ function platformLoadFiles(files, group) { let svg = load.SVG.parse(data.textDecode('utf-8')); let ind = 0; for (let v of svg) { - platformLoadWidget(group, svg[ind], ind ? `${name}-${ind++}` : name); + platformLoadWidget(group, svg[ind++], ind ? `${name}-${ind}` : name); } load_dec(); } diff --git a/src/load/file.js b/src/load/file.js index 41dff84b..02689d05 100644 --- a/src/load/file.js +++ b/src/load/file.js @@ -39,7 +39,8 @@ const types = { }, svg(data, file, resolve, reject, opt = {}) { - resolve(load.SVG.parse(data, opt).map(m => { return {mesh: m.toFloat32(), file} })); + let out = load.SVG.parse(data, opt); + resolve(opt.flat ? out : out.map(m => { return {mesh: m.toFloat32(), file} })); }, png(data, file, resolve, reject, opt = {}) { diff --git a/src/load/svg.js b/src/load/svg.js index e3994ed9..0aff5b06 100644 --- a/src/load/svg.js +++ b/src/load/svg.js @@ -17,7 +17,8 @@ function parseAsync(text, opt) { } function parse(text, opt = { soup: true }) { - const fromSoup = opt.soup || false; + const justPoly = opt.flat || false; + const fromSoup = opt.soup || justPoly; const objs = []; const data = new THREE.SVGLoader().parse(text); const paths = data.paths; @@ -34,11 +35,16 @@ function parse(text, opt = { soup: true }) { for (let node of shapes) { let { shape, holes } = node.extractPoints(); for (let path of [ shape, ...holes ]) { - polys.push(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); } } continue; } + if (justPoly) { + continue; + } let geom = new THREE.ExtrudeGeometry(shapes, { steps: 1, depth: parseFloat(depth.value), @@ -46,8 +52,8 @@ function parse(text, opt = { soup: true }) { }); let array = geom.attributes.position.array; // invert y - for (let i=0; i 0; } 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" }, [ @@ -540,15 +547,9 @@ function load_files(files) { function load_files_opt(files, opt) { load.File.load([...files], opt) - .then(data => { - call.space_load(data); - }) - .catch(error => { - dbug.error(error); - }) - .finally(() => { - mesh.api.log.hide(); - }); + .then(data => call.space_load(data)) + .catch(error => dbug.error(error)) + .finally(() => mesh.api.log.hide()); } // add object loader diff --git a/src/mesh/api.js b/src/mesh/api.js index 36e5d82b..d61e3afb 100644 --- a/src/mesh/api.js +++ b/src/mesh/api.js @@ -739,6 +739,8 @@ let file = { import() { // binding created in mesh.build $('import').click(); + // allow importing the same file twice + setTimeout(() => { $('import').value = ''; }, 100); }, export() {