import { parse } from "svg-parser"; import SvgNode from './svg-node.js' import SvgNodes from './svg-nodes.js' export default class { async parse(xml) { let result1 = parse(xml); this.svg = result1.children.filter((x) => x.tagName == "svg")[0]; } /** * Получить слои документа. Имя слоя можно получить через поле id. * @returns */ get_layers() { return this.svg.children.filter((x) => x.tagName == "g"); } /** * Получить данные масштаба карты. * @returns {w, h, k, u} Ширина в мм, высота в мм, k * v[px] = v[мм], юниты (mm, cm, inch) */ 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 }; } /** * Достать из слоя опордные скважины * @param {*} layer Слой в котором 2 последние группы содержат опорные скважины. * @returns { w1, w2 } Опрорные скважины */ 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]); } /** * Получить из группы данные скважины (имя, координаты) * @param {*} pivot_group Svg группа * @returns { {x, y, name} } */ extract_well(pivot_group) { let flat = this._flat(pivot_group); let ellipse = flat.filter((x) => x.tagName == "circle" || x.tagName == "ellipse")[0]; let tr = ellipse.properties.transform .replace("matrix(", "") .replace(")", "") .split(" ") .map((x) => parseFloat(x)); let text = flat.filter((x) => x.type == "text")[0]; let name = text.value; return { x: tr[4], y: tr[5], name }; } build_tp_layer(wells, settings){ const sc = this.get_map_scale() function t2r(tons){ // tonns/mm2 = tonns/cm2 / 100. S(mm)=Pi*r*r=tons/tons_in_cm2*100. r = sqrt(tons/tons_in_cm2*100 / PI) return Math.sqrt(tons / settings.tons_in_cm2 * 100 / Math.PI) } let {styles} = settings let defs = new SvgNode("defs") defs.append(SvgNodes.defs.simple.radialGradient("rg_opt", "#fff", "#B86B41")) defs.append(SvgNodes.defs.simple.radialGradient("rg_wpt", "#fff", "#67c2e5")) let svg = SvgNodes.group(['']).set_attr("id", "WWPT") // Круги svg.append(wells.map((x) => SvgNodes.ring_sectors(1.5 * sc.k, t2r(x.wlpt) * sc.k, [{v: x.wopt, style: styles.opt}, {v: x.wwpt, style: styles.wpt}]).move(x.lx, x.ly))); // Знак скважины svg.append(wells.map((x) => SvgNodes.circle(1.5 * sc.k).move(x.lx, x.ly).add_style(styles.wellhead))); // Имя скважины svg.append(wells.map((x) => SvgNodes.text(x.well).move(x.lx + styles.wellhead.dx * sc.k, x.ly + styles.wellhead.dy * sc.k).add_style(styles.wellhead))); // Обводненность svg.append(wells.map((x) => SvgNodes.text(`${Math.round(x.wlf * 1000)/10 || ''}%`).move(x.lx + styles.wlf.dx * sc.k, x.ly + styles.wlf.dy * sc.k).add_style(styles.wlf))); return {defs, svg} } build_ti_layer(wells, settings){ const sc = this.get_map_scale() function t2r(tons){ // tonns/mm2 = tonns/cm2 / 100. S(mm)=Pi*r*r=tons/tons_in_cm2*100. r = sqrt(tons/tons_in_cm2*100 / PI) return Math.sqrt(tons / settings.tons_in_cm2 * 100 / Math.PI) } let {styles} = settings let defs = SvgNodes.container() defs.append(SvgNodes.defs.simple.radialGradient("rg1", "#fff", "#c1ff5e")) let svg = SvgNodes.group(['']).set_attr("id", "WWIT") // Круги // let g_rings = SvgNodes.group(['']).set_attr("id", "Круги") // svg.append(g_rings) svg.append(wells.map((x) => SvgNodes.circle(t2r(x.wwit) * sc.k).add_style(styles.wit).move(x.lx, x.ly))); // Знак скважины svg.append(wells.map((x) => SvgNodes.circle(1.5 * sc.k).move(x.lx, x.ly).add_style(styles.wellhead))); // Имя скважины svg.append(wells.map((x) => SvgNodes.text(x.well).move(x.lx + styles.wellhead.dx * sc.k, x.ly + styles.wellhead.dy * sc.k).add_style(styles.wellhead))); // Обводненность svg.append(wells.map((x) => SvgNodes.text(`${Math.round(x.wlf * 1000)/10 || ''}%`).move(x.lx + styles.wlf.dx * sc.k, x.ly + styles.wlf.dy * sc.k).add_style(styles.wlf))); return {defs, svg} } }