From 7380ceee7e531c090f99d108bff526d5fe4c630a Mon Sep 17 00:00:00 2001 From: djerom Date: Tue, 22 Mar 2022 10:17:11 +0500 Subject: [PATCH] sync --- src/App.svelte | 125 ++++++++++++++++++++++++++---- src/back_.js | 138 ++++++++++++++++++++++++++++++++++ src/svgmap/SvgMapBuilder.js | 24 ++++++ src/svgmap/SvgNodes.js | 24 +++++- src/svgmap/drawers/SvgWell.js | 23 ++++++ 5 files changed, 317 insertions(+), 17 deletions(-) create mode 100644 src/back_.js create mode 100644 src/svgmap/SvgMapBuilder.js create mode 100644 src/svgmap/drawers/SvgWell.js diff --git a/src/App.svelte b/src/App.svelte index 69a8e94..d0abac7 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -10,6 +10,7 @@ import Modal from "./components/Modal.svelte"; import MapApp from './services/map' + import SvgMapParser from './svgmap/SvgMapParser' import get_bbox from './libs/bbox' @@ -91,6 +92,114 @@ }); } + async function load_back() { + const form = `Выберите файл подложки
+ `; // multiple + + let res = await ui.modal.show(form, ["ok", "cancel"]); + if (res.code != 'ok') return; + + // console.log(res); + // console.log(res.form['some'].value) + let file = await file_lib.read(res.form["file"]); + + let parser = new SvgMapParser() + parser.parse(file) + + console.log(parser.get_map_scale()) + + + let layers = parser.get_layers() + let options = layers.map(x => ``) + let select_layer_form = `Выберите слой с привязкой ` + let res2 = await ui.modal.show(select_layer_form, ["ok", "cancel"]); + if (res2.code != 'ok') return; + + // console.log(res2) + + let layer2 = layers.filter(x => x.properties.id == res2.form['layer'].value)[0] + console.log('layer2', layer2) + + let anchor = parser.extract_anchor(layer2) + console.log('anchor', anchor) + + + const query = `SELECT well, whx, why FROM wells WHERE well='${anchor.w1.name}' OR well='${anchor.w2.name}'`; + let wells = await axios.post(`${back_url}/proxy/sqlite`, { query }).then((x) => x.data.data); + + let ww1 = wells.filter(x => x.well == anchor.w1.name)[0] + let ww2 = wells.filter(x => x.well == anchor.w2.name)[0] + + console.log(ww1, ww2) + + if (!ww1) return ui.modal.show(`Скважины ${anchor.w1.name} не найдено в базе.`, ["ok"]); + if (!ww2) return ui.modal.show(`Скважины ${anchor.w2.name} не найдено в базе.`, ["ok"]); + + anchor.w1.whx = ww1.whx + anchor.w1.why = ww1.why + anchor.w2.whx = ww2.whx + anchor.w2.why = ww2.why + + + let shift_args = {dx: 0, dy: 0, scale: 1} + + + console.log(anchor) + + + return + + var oParser = new DOMParser(); + var oDOM = oParser.parseFromString(file, "application/xml"); + // temp0.childNodes[2].viewBox.baseVal // rect {x,y,width,height} + // temp0.childNodes[2].width.baseVal.value + // temp0.childNodes[2].height.baseVal.value + + // Find pivots + let svg = oDOM.getElementsByTagName('svg')[0] + let layer = svg.children[svg.children.length - 1] + + function extract_well(pivot_group){ + let ellipse = pivot_group.getElementsByTagName('ellipse')[0] + let x = ellipse.cx.baseVal.value + let y = ellipse.cy.baseVal.value + + let text = pivot_group.getElementsByTagName('text')[0] + let name = text.childNodes[0].nodeValue + return {x, y, name} + } + + // let w1 = extract_well(layer.children[layer.children.length - 1]) + // let w2 = extract_well(layer.children[layer.children.length - 2]) + // console.log(w1, w2) + + // // Map dist + // let map_dx = w2.x - w1.x + // let map_dy = w2.x - w1.x + // let map_d = Math.sqrt(map_dx * map_dx + map_dy * map_dy) + // console.log('map_d', map_d) + + // Определим масштаб карты + + // temp0.viewBox.baseVal.x + + + // console.log(oDOM) + + // console.log(file); + + // let ans = await axios.post(`${back_url}/import/excel`, { name: "wells", file }); + // console.log(ans); + + // toasts.add({ + // description: "File loaded", + // type: 'success', + // }); + + // ui.modal.show(`Hallo ${res.form['some'].value}`, ['ok']) + } + + let ui = { modal: {}, }; @@ -100,21 +209,6 @@ // file_lib.download() - /** - * - * @param r0 - * @param r1 - * @param a0 - * @param a1 - * @param { [{v, style}] } rings - */ - function sectored_ring(r0, r1, rings){ - let sum = rings.reduce((s,c) => s + c.v, 0) - let angs = rings.reduce((s, c, i) => [...s, {...c, a0: i && s[i - 1].a1, a1: c.v + (i && s[i - 1].a1)}], []) - let items = angs.map(x => SvgNodes.ring_sector(r0, r1, x.a0 * 360 / sum, x.a1 * 360 / sum).set_style(x.style)) - - return SvgNodes.group(items) - } @@ -210,6 +304,7 @@ +
diff --git a/src/back_.js b/src/back_.js new file mode 100644 index 0000000..90fb563 --- /dev/null +++ b/src/back_.js @@ -0,0 +1,138 @@ +import fs, { symlinkSync } from "fs"; +import axios from "axios"; + +import SvgMapParser from "./svgmap/SvgMapParser.js"; +import SvgNodes from "./svgmap/SvgNodes.js"; + +const back_url = "http://localhost:4000"; + +const path = "../../data/2022-03-16"; + +// let file = fs.readFileSync('../data/2022-03-16/49_Кар тек и сум отб 7 об_вост.svg') +// let file = fs.readFileSync('../data/2022-03-16/49_Кар тек и сум отб 7 об_вост-sm.svg') +// let file = fs.readFileSync('../data/2022-03-16/49_Кар тек и сум отб 7 об_вост-inch.svg') +// let file = fs.readFileSync(`${path}/49_Кар тек и сум отб 7 об_вост-mm.svg`) +let file = fs.readFileSync(`D:/dev/git/kz/prodmaps/src/49_Кар тек и сум отб 7 об_вост.svg`); + +// let file = fs.readFileSync('../data/2022-03-16/49_Кар тек и сум отб 7 об_вост-px.svg') + +let styles = JSON.parse(fs.readFileSync("./moc/styles.json").toString()); + +let parser = new SvgMapParser(); + +function build_scaler() { + // Получить функцию для перевода координат из геологических в локальные. + // Получить функцию для перевода расстояний кругов (из тонн в см2) +} + +async function start() { + await parser.parse(file.toString()); + + let sc = parser.get_map_scale(); + console.log("scale is", sc); + + let layers = parser.get_layers(); + console.log(layers.map((x) => x.properties.id)); + + let name = "скв"; + let layer = layers.filter((x) => x.properties.id == name)[0]; + // console.log(layer) + + // Получить координаты якоря + let anchor = parser.extract_anchor(layer); + console.log("anchor", anchor); + + const query = `SELECT well, whx, why FROM wells WHERE well='${anchor.w1.name}' OR well='${anchor.w2.name}'`; + let wells = await axios.post(`${back_url}/proxy/sqlite`, { query }).then((x) => x.data.data); + console.log(wells); + + let ww1 = wells.filter((x) => x.well == anchor.w1.name)[0]; + let ww2 = wells.filter((x) => x.well == anchor.w2.name)[0]; + + console.log(ww1, ww2); + + if (!ww1) return ui.modal.show(`Скважины ${anchor.w1.name} не найдено в базе.`, ["ok"]); + if (!ww2) return ui.modal.show(`Скважины ${anchor.w2.name} не найдено в базе.`, ["ok"]); + + anchor.w1.whx = ww1.whx; + anchor.w1.why = ww1.why; + anchor.w2.whx = ww2.whx; + anchor.w2.why = ww2.why; + + function dist(x1, y1, x2, y2) { + let dx = x2 - x1, + dy = y2 - y1; + return Math.sqrt(dx * dx + dy * dy); + } + + function cs(x0, y0, x1, y1) { + return { x0, y0, x1, y1 }; + } + + function build_tr(cs1, cs2) { + let dx1 = cs1.x1 - cs1.x0 + let dy1 = cs1.y1 - cs1.y0 + let dx2 = cs2.x1 - cs2.x0 + let dy2 = cs2.y1 - cs2.y0 + + const kx12 = dx2 / dx1 + const ky12 = dy2 / dy1; + const kx21 = dx1 / dx2 + const ky21 = dy1 / dy2; + + let tr = { + tr12: { + trx(x) { + return (x - cs1.x0) * kx12 + cs2.x0; + }, + try(y) { + return (y - cs1.y0) * ky12 + cs2.y0; + }, + }, + tr21: { + trx(x) { + return (x - cs2.x0) * kx21 + cs1.x0; + }, + try(y) { + return (y - cs2.y0) * ky21 + cs1.y0; + }, + }, + }; + + return tr; + } + + // Функция перевода координат из глобальных в локальные. + const cs1 = cs(anchor.w1.x, anchor.w1.y, anchor.w2.x, anchor.w2.y); + const cs2 = cs(anchor.w1.whx, anchor.w1.why, anchor.w2.whx, anchor.w2.why); + let tr = build_tr(cs1, cs2); + console.log(tr); + + // console.log(wells) + + const query_all = `SELECT well, whx, why FROM wells`// WHERE well='${anchor.w1.name}'`; + // const query_all = `SELECT well, whx, why FROM wells WHERE well='${anchor.w1.name}' OR well='${anchor.w2.name}'`; + let all_wells = await axios.post(`${back_url}/proxy/sqlite`, { query: query_all }).then((x) => x.data.data); + + let mapped_wells = all_wells.map((x) => ({ ...x, lx: tr.tr21.trx(x.whx), ly: tr.tr21.try(x.why) })); + + console.log(mapped_wells.slice(0, 2)); + + let svg = SvgNodes.svg().set_attrs({ + width: sc.w + "mm", + height: sc.h + "mm", + viewBox: `0 0 ${sc.w * sc.k} ${sc.h * sc.k}`, + }); + + svg = SvgNodes.group() + + svg.append(mapped_wells.map((x) => SvgNodes.ring_sector(1.5 * sc.k, 6 * sc.k, 0, 120).move(x.lx, x.ly).set_style(styles.gpt))); + svg.append( mapped_wells.map((x) => SvgNodes.circle(1.5 * sc.k) .move(x.lx, x.ly) .set_style(styles.wellhead) ) ); + svg.append(mapped_wells.map((x) => SvgNodes.text(x.well).move(x.lx, x.ly).set_style(styles.wellhead))); + + let data = file.toString().replace('', svg.render() + '') + + fs.writeFileSync("out.svg", data) //svg.render()); +} + +start(); diff --git a/src/svgmap/SvgMapBuilder.js b/src/svgmap/SvgMapBuilder.js new file mode 100644 index 0000000..9928544 --- /dev/null +++ b/src/svgmap/SvgMapBuilder.js @@ -0,0 +1,24 @@ +export default class SvgMapBulder{ + let WellsRenderer = { + // [{x,y}] + heads(wells, r, style) { + return wells.map((w) => SvgNodes.circle(r).set_style(style).move(w.x, w.y)); + }, + + // [{x,y,name}] + names(wells, style, shift) { + return wells.map((w) => + SvgNodes.text(w.name) + .set_style(style) + .move(w.x + shift.x, w.y + shift.y) + ); + }, + + // {x,y,ring[1,2,3,4,5]} + ring(x, y, r0, r1, a0, a1, style) { + return SvgNodes.ring_sector(r0, r1, a0, a1).move(x, y).set_style(style); + }, + }; + + +} \ No newline at end of file diff --git a/src/svgmap/SvgNodes.js b/src/svgmap/SvgNodes.js index 8496980..d575cfa 100644 --- a/src/svgmap/SvgNodes.js +++ b/src/svgmap/SvgNodes.js @@ -1,4 +1,4 @@ -import SvgNode from "./SvgNode"; +import SvgNode from "./SvgNode.js"; export default { // sector(r, a0, a1) { @@ -18,7 +18,10 @@ export default { svg(){ return new SvgNode('svg', { version: "1.1", - xmlns: "http://www.w3.org/2000/svg" + xmlns: "http://www.w3.org/2000/svg", + "xml:space":"preserve", + "xmlns:xlink": "http://www.w3.org/1999/xlink", + style: "shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" // viewBox: "0 0 2000 2000" }) }, @@ -68,4 +71,21 @@ export default { node.set_attrs({x: 0, y: 0}) return node; }, + + /** + * + * @param r0 + * @param r1 + * @param a0 + * @param a1 + * @param { [{v, style}] } rings + */ + sectored_ring(r0, r1, rings){ + let sum = rings.reduce((s,c) => s + c.v, 0) + let angs = rings.reduce((s, c, i) => [...s, {...c, a0: i && s[i - 1].a1, a1: c.v + (i && s[i - 1].a1)}], []) + let items = angs.map(x => SvgNodes.ring_sector(r0, r1, x.a0 * 360 / sum, x.a1 * 360 / sum).set_style(x.style)) + + return SvgNodes.group(items) + } + }; diff --git a/src/svgmap/drawers/SvgWell.js b/src/svgmap/drawers/SvgWell.js new file mode 100644 index 0000000..9591882 --- /dev/null +++ b/src/svgmap/drawers/SvgWell.js @@ -0,0 +1,23 @@ +export default { + // [{x,y}] + heads(wells, r, style) { + return wells.map((w) => SvgNodes.circle(r).set_style(style).move(w.x, w.y)); + }, + + // [{x,y,name}] + names(wells, style, shift) { + return wells.map((w) => + SvgNodes.text(w.name) + .set_style(style) + .move(w.x + shift.x, w.y + shift.y) + ); + }, + + // {x,y,ring[1,2,3,4,5]} + ring(x, y, r0, r1, a0, a1, style) { + return SvgNodes.ring_sector(r0, r1, a0, a1).move(x, y).set_style(style); + }, +}; + + +} \ No newline at end of file