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