From 764c77692ab8398ae5cc988b361790ae618b7ddb Mon Sep 17 00:00:00 2001 From: djerom Date: Tue, 22 Mar 2022 10:17:22 +0500 Subject: [PATCH] sync --- .gitignore | 1 + package-lock.json | 77 +++++++++++++++++++++++++++++++++++++- package.json | 6 ++- src/libs/file.js | 39 ++++++++++++++++++- src/moc/styles.json | 21 ++++++----- src/svgmap/SvgMapParser.js | 74 ++++++++++++++++++++++++++++++++++++ 6 files changed, 205 insertions(+), 13 deletions(-) create mode 100644 src/svgmap/SvgMapParser.js diff --git a/.gitignore b/.gitignore index da93220..eaf74b8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /node_modules/ /public/build/ +/tmp .DS_Store diff --git a/package-lock.json b/package-lock.json index 4d63bec..524b8fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,11 @@ "dependencies": { "@rollup/plugin-json": "^4.1.0", "axios": "^0.26.1", + "fast-xml-parser": "^4.0.7", "sirv-cli": "^2.0.0", - "svelte-toasts": "^1.1.2" + "svelte-toasts": "^1.1.2", + "svg-parser": "^2.0.4", + "xml-js": "^1.6.11" }, "devDependencies": { "@rollup/plugin-commonjs": "^17.0.0", @@ -363,6 +366,21 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "node_modules/fast-xml-parser": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.7.tgz", + "integrity": "sha512-dMtibyus3kC7nbxj1CpVtysLzO13UOAZEFAb5vpQg3T4O6qvetmSePpXKFx5KPNCHKoGwjtgjfF5DOyn7s1ylQ==", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -915,6 +933,11 @@ } ] }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "node_modules/semiver": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", @@ -1000,6 +1023,11 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1038,6 +1066,11 @@ "resolved": "https://registry.npmjs.org/svelte-toasts/-/svelte-toasts-1.1.2.tgz", "integrity": "sha512-m+yL4eEKXyJoyjTYaH1j1GFwF0Pi8YDqnVfwWPDmwi4712iZesv+TNCmToSNlav3R5Vkmc8ZBRkT8DOcu3sywQ==" }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, "node_modules/terser": { "version": "5.12.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", @@ -1110,6 +1143,17 @@ "optional": true } } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } } }, "dependencies": { @@ -1377,6 +1421,14 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "fast-xml-parser": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.7.tgz", + "integrity": "sha512-dMtibyus3kC7nbxj1CpVtysLzO13UOAZEFAb5vpQg3T4O6qvetmSePpXKFx5KPNCHKoGwjtgjfF5DOyn7s1ylQ==", + "requires": { + "strnum": "^1.0.5" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1782,6 +1834,11 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "semiver": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", @@ -1851,6 +1908,11 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1877,6 +1939,11 @@ "resolved": "https://registry.npmjs.org/svelte-toasts/-/svelte-toasts-1.1.2.tgz", "integrity": "sha512-m+yL4eEKXyJoyjTYaH1j1GFwF0Pi8YDqnVfwWPDmwi4712iZesv+TNCmToSNlav3R5Vkmc8ZBRkT8DOcu3sywQ==" }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, "terser": { "version": "5.12.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", @@ -1920,6 +1987,14 @@ "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", "dev": true, "requires": {} + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "requires": { + "sax": "^1.2.4" + } } } } diff --git a/package.json b/package.json index 6ef9ab2..1f051c1 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "svelte-app", "version": "1.0.0", "private": true, + "type": "module", "scripts": { "build": "rollup -c", "dev": "rollup -c -w", @@ -20,7 +21,10 @@ "dependencies": { "@rollup/plugin-json": "^4.1.0", "axios": "^0.26.1", + "fast-xml-parser": "^4.0.7", "sirv-cli": "^2.0.0", - "svelte-toasts": "^1.1.2" + "svelte-toasts": "^1.1.2", + "svg-parser": "^2.0.4", + "xml-js": "^1.6.11" } } diff --git a/src/libs/file.js b/src/libs/file.js index 86ca466..edb392d 100644 --- a/src/libs/file.js +++ b/src/libs/file.js @@ -22,7 +22,6 @@ export default { * @param {*} input */ async toBase64(input) { - console.log(input) return new Promise((resolve) => { if (input.files.length == 0){ resolve(null) @@ -52,5 +51,41 @@ export default { reject(error) }; }); - } + }, + + /** + * Read data of file/files selected in input as string + * @param {*} input + */ + async read(input) { + return new Promise((resolve) => { + if (input.files.length == 0){ + resolve(null) + } + else if (input.files.length == 1){ + this.readFile(input.files[0]).then(resolve) + } + else + Promise.all(Array(...input.files).map(this.readFile)).then(resolve) + } + ); + }, + + /** + * Read data of file/files selected in input as string + * @param {*} input + */ + async readFile(file) { + return new Promise((resolve, reject) => { + var reader = new FileReader(); + reader.readAsText(file); + + reader.onload = function () { + resolve(reader.result) + }; + reader.onerror = function (error) { + reject(error) + }; + }); + }, }; diff --git a/src/moc/styles.json b/src/moc/styles.json index c2878ce..d1d4be9 100644 --- a/src/moc/styles.json +++ b/src/moc/styles.json @@ -1,22 +1,25 @@ { "wellhead": { - "stroke-width": 1, - "stroke": "#000", - "fill": "#fff" + "font-family": "Times New Roman", + "font-weight": "bold", + "stroke-width": "0.5mm", + "font-size":"10pt", + "stroke": "#fff", + "fill": "#000" }, "gpt": { - "stroke-width": 0, - "stroke": "#ff0", + "stroke-width": 1, + "stroke": "#000", "fill": "#ff0" }, "opt": { "stroke-width": 1, - "stroke": "#f00", - "fill": "#00f" + "stroke": "#000", + "fill": "#B86B41" }, "wpt": { "stroke-width": 1, - "stroke": "#f00", - "fill": "#00f" + "stroke": "#000", + "fill": "#67c2e5" } } \ No newline at end of file diff --git a/src/svgmap/SvgMapParser.js b/src/svgmap/SvgMapParser.js new file mode 100644 index 0000000..006fe31 --- /dev/null +++ b/src/svgmap/SvgMapParser.js @@ -0,0 +1,74 @@ +// import convert from 'xml-js/index.js' +// import { XMLParser, XMLBuilder, XMLValidator} from 'fast-xml-parser' +import { parse } from 'svg-parser' + +// var convert = require('xml-js'); + +export default class { + async parse(xml){ + let result1 = parse(xml); + + this.svg = result1.children.filter(x => x.tagName =='svg')[0] + } + + get_layers(){ + return this.svg.children.filter(x => x.tagName == 'g') + } + + get_map_scale(){ + // console.log(this.svg) + let vb = this.svg.properties.viewBox.split(' ').map(x => parseFloat(x)) + let w = this.svg.properties.width + let h = this.svg.properties.height + + let units = { + 'in': 25.4, + 'mm': 1, + 'cm': 10, + 'px': 0.0846646, + // '%': 1 + } + + const u = Object.keys(units).filter(x => w.endsWith(x))[0] + if (!u) throw "Unsupported units" + + w = Math.round(parseFloat(w.substring(0, w.length - u.length)) * units[u] * 100) / 100 + h = Math.round(parseFloat(h.substring(0, h.length - u.length)) * units[u] * 100) / 100 + let k = vb[2] / w + + return {w, h, k, u} + } + + extract_anchor(layer){ + let w1 = this.extract_well(layer.children[layer.children.length - 1]) + let w2 = this.extract_well(layer.children[layer.children.length - 2]) + + return{w1, w2} + } + + _flat(node){ + if (!node.children) return [node]; + return node.children.reduce((s, c) => s.concat(this._flat(c)), [node]) + } + + extract_well(pivot_group){ + let scale = this.get_map_scale() + + let flat = this._flat(pivot_group) + ///// console.log('pivot_group', pivot_group.children) + // console.log('FLAT---', flat) + let ellipse = flat.filter(x => x.tagName =='circle' || x.tagName =='ellipse')[0] + // console.log('ellipse', ellipse) + let tr = ellipse.properties.transform.replace('matrix(', '').replace(')', '').split(' ').map(x => parseFloat(x)) + // console.log('tr', tr) + // let x = ellipse.properties.transform + // let y = ellipse.cy.baseVal.value + + let text = flat.filter(x => x.type =='text')[0] + // console.log('text', text) + let name = text.value + return {x: tr[4], y: tr[5], name} + } + + +} \ No newline at end of file