mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-06 16:33:15 +01:00
add the DXF import button
This commit is contained in:
parent
2fa2866296
commit
f62fb8aa86
4 changed files with 82 additions and 32 deletions
21
modules/ui/fileUploader.ts
Normal file
21
modules/ui/fileUploader.ts
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
|
||||
export function uploadFile(cb: ((fileName: string, text: string) => void)) {
|
||||
const uploader = document.createElement('input');
|
||||
uploader.setAttribute('type', 'file');
|
||||
uploader.style.display = 'none';
|
||||
|
||||
document.body.appendChild(uploader);
|
||||
uploader.click();
|
||||
function read() {
|
||||
const reader = new FileReader();
|
||||
reader.onload = () => {
|
||||
try {
|
||||
cb(uploader.value, reader.result as string);
|
||||
} finally {
|
||||
document.body.removeChild(uploader);
|
||||
}
|
||||
};
|
||||
reader.readAsText(uploader.files[0]);
|
||||
}
|
||||
uploader.addEventListener('change', read, false);
|
||||
}
|
||||
28
package-lock.json
generated
28
package-lock.json
generated
|
|
@ -9,7 +9,8 @@
|
|||
"version": "0.1.0",
|
||||
"license": "SEE LICENSE IN LICENSE",
|
||||
"dependencies": {
|
||||
"@tarikjabiri/dxf": "^2.3.2",
|
||||
"@dxfjs/parser": "^0.0.2",
|
||||
"@tarikjabiri/dxf": "^2.6.1",
|
||||
"@types/three": "^0.143.0",
|
||||
"browser-xml2js": "^0.4.19",
|
||||
"classnames": "2.2.5",
|
||||
|
|
@ -2487,6 +2488,14 @@
|
|||
"node": ">=10.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@dxfjs/parser": {
|
||||
"version": "0.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@dxfjs/parser/-/parser-0.0.2.tgz",
|
||||
"integrity": "sha512-CpWIzTV+t89MCtsLVeqRL4dNhioWjRFxVyPX0sgPKuIGr9VbXUZ89772WgdrFiSZqPXWGaZ4DaKyt78StgTunQ==",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/dxfjs"
|
||||
}
|
||||
},
|
||||
"node_modules/@electron/get": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz",
|
||||
|
|
@ -3044,9 +3053,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@tarikjabiri/dxf": {
|
||||
"version": "2.3.4",
|
||||
"resolved": "https://registry.npmjs.org/@tarikjabiri/dxf/-/dxf-2.3.4.tgz",
|
||||
"integrity": "sha512-ChgsslM6XI3EAYxSwt2BBsqoIZ1RRO/DEuiAVHyaRohXZoeE36iyGnrwPa63ILw7OJLirwO1nimBtCfAimBOhw==",
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/@tarikjabiri/dxf/-/dxf-2.6.1.tgz",
|
||||
"integrity": "sha512-/1APUzakzUQp7uJdg3qJwz0Pffx1fQq1plLyuqMFGO643iWqoqba8d5Y+B5jpEqwNiuX+/BQUZFwMHDbH3LRhQ==",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/dxfjs"
|
||||
}
|
||||
|
|
@ -17650,6 +17659,11 @@
|
|||
"integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
|
||||
"dev": true
|
||||
},
|
||||
"@dxfjs/parser": {
|
||||
"version": "0.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@dxfjs/parser/-/parser-0.0.2.tgz",
|
||||
"integrity": "sha512-CpWIzTV+t89MCtsLVeqRL4dNhioWjRFxVyPX0sgPKuIGr9VbXUZ89772WgdrFiSZqPXWGaZ4DaKyt78StgTunQ=="
|
||||
},
|
||||
"@electron/get": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz",
|
||||
|
|
@ -18084,9 +18098,9 @@
|
|||
}
|
||||
},
|
||||
"@tarikjabiri/dxf": {
|
||||
"version": "2.3.4",
|
||||
"resolved": "https://registry.npmjs.org/@tarikjabiri/dxf/-/dxf-2.3.4.tgz",
|
||||
"integrity": "sha512-ChgsslM6XI3EAYxSwt2BBsqoIZ1RRO/DEuiAVHyaRohXZoeE36iyGnrwPa63ILw7OJLirwO1nimBtCfAimBOhw=="
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/@tarikjabiri/dxf/-/dxf-2.6.1.tgz",
|
||||
"integrity": "sha512-/1APUzakzUQp7uJdg3qJwz0Pffx1fQq1plLyuqMFGO643iWqoqba8d5Y+B5jpEqwNiuX+/BQUZFwMHDbH3LRhQ=="
|
||||
},
|
||||
"@tootallnate/once": {
|
||||
"version": "2.0.0",
|
||||
|
|
|
|||
|
|
@ -5,35 +5,21 @@ import {SketchFormat_V3} from "sketcher/io";
|
|||
import {ApplicationContext} from "cad/context";
|
||||
import {OperationRequest} from "../craft/craftBundle";
|
||||
import {AssemblyConstraintDefinition} from "cad/assembly/assemblyConstraint";
|
||||
import {uploadFile} from "ui/fileUploader";
|
||||
|
||||
export function activate(ctx: ApplicationContext) {
|
||||
|
||||
function importProjectImpl(getId, onDone) {
|
||||
const uploader = document.createElement('input');
|
||||
uploader.setAttribute('type', 'file');
|
||||
uploader.style.display = 'none';
|
||||
|
||||
document.body.appendChild(uploader);
|
||||
uploader.click();
|
||||
function read() {
|
||||
const reader = new FileReader();
|
||||
reader.onload = () => {
|
||||
try {
|
||||
uploadFile((fileName, content) => {
|
||||
const bundle = JSON.parse(content as string);
|
||||
const projectId = getId(fileName, bundle);
|
||||
|
||||
const bundle = JSON.parse(reader.result as string);
|
||||
const projectId = getId(uploader.value, bundle);
|
||||
|
||||
if (projectId) {
|
||||
importBundle(projectId, bundle);
|
||||
onDone(projectId);
|
||||
}
|
||||
} finally {
|
||||
document.body.removeChild(uploader);
|
||||
}
|
||||
};
|
||||
reader.readAsText(uploader.files[0]);
|
||||
}
|
||||
uploader.addEventListener('change', read, false);
|
||||
if (projectId) {
|
||||
importBundle(projectId, bundle);
|
||||
onDone(projectId);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function importBundle(projectId: string, bundle: ModelBundle) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,16 @@
|
|||
import {MdZoomOutMap} from "react-icons/md";
|
||||
import {AiOutlineCopy, AiOutlineExport, AiOutlineFile, AiOutlineFolderOpen, AiOutlineSave} from "react-icons/ai";
|
||||
import {
|
||||
AiOutlineCopy,
|
||||
AiOutlineExport,
|
||||
AiOutlineFile,
|
||||
AiOutlineFolderOpen,
|
||||
AiOutlineImport,
|
||||
AiOutlineSave
|
||||
} from "react-icons/ai";
|
||||
import {NoIcon} from "../icons/NoIcon";
|
||||
import {uploadFile} from "ui/fileUploader";
|
||||
import {DxfParserAdapter} from "sketcher/dxf";
|
||||
import {SketchFormat_V3} from "sketcher/io";
|
||||
|
||||
export default [
|
||||
|
||||
|
|
@ -43,6 +53,25 @@ export default [
|
|||
}
|
||||
},
|
||||
|
||||
{
|
||||
id: 'Import',
|
||||
shortName: 'Import',
|
||||
kind: 'Common',
|
||||
description: 'Import from other formats',
|
||||
icon: AiOutlineImport,
|
||||
|
||||
invoke: async (ctx, e) => {
|
||||
uploadFile((fileName, content) => {
|
||||
|
||||
|
||||
const dxfParserAdapter = new DxfParserAdapter();
|
||||
dxfParserAdapter.parse(content).then(sketch => {
|
||||
ctx.viewer.io._loadSketch(sketch);
|
||||
}).catch(console.error);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
id: 'Save',
|
||||
shortName: 'Save',
|
||||
|
|
|
|||
Loading…
Reference in a new issue