init
This commit is contained in:
commit
b0cb3e60d6
14
file.js
Normal file
14
file.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
export default {
|
||||||
|
download(filename, text) {
|
||||||
|
var element = document.createElement("a");
|
||||||
|
element.setAttribute("href", "data:text/plain;charset=utf-8," + encodeURIComponent(text));
|
||||||
|
element.setAttribute("download", filename);
|
||||||
|
|
||||||
|
element.style.display = "none";
|
||||||
|
document.body.appendChild(element);
|
||||||
|
|
||||||
|
element.click();
|
||||||
|
|
||||||
|
document.body.removeChild(element);
|
||||||
|
},
|
||||||
|
};
|
||||||
503
index.html
Normal file
503
index.html
Normal file
@ -0,0 +1,503 @@
|
|||||||
|
<script src="https://unpkg.com/axios@0.2.1/dist/axios.min.js"></script>
|
||||||
|
<!-- <script src="index.js" type="module"></script> -->
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.panel div {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div class="panel">
|
||||||
|
<div>
|
||||||
|
<button onclick="save()">Download</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="width: 100px;"> </div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<button onclick="build_map_wopt()">WOPT map</button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button onclick="build_map_wwpt()">WWPT map</button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button onclick="build_map_wgpt()">WGPT map</button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button onclick="build_map_wwit()">WWIT map</button>
|
||||||
|
</div>
|
||||||
|
<div style="width: 100px;"> </div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<button onclick="build_map_wopt()">WOPR map</button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button onclick="build_map_wwpt()">WWPR map</button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button onclick="build_map_wgpr()">WGPR map</button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button onclick="build_map_wwit()">WWIR map</button>
|
||||||
|
</div>
|
||||||
|
<div style="width: 100px;"> </div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<button onclick="scale()">Scale</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="map" style="border: 1px #000 solid;"></div>
|
||||||
|
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div>menu</div>
|
||||||
|
<div>map</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function download(filename, text) {
|
||||||
|
var element = document.createElement('a');
|
||||||
|
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
|
||||||
|
element.setAttribute('download', filename);
|
||||||
|
element.setAttribute('target', '_blank');
|
||||||
|
|
||||||
|
element.style.display = 'none';
|
||||||
|
document.body.appendChild(element);
|
||||||
|
|
||||||
|
element.click();
|
||||||
|
|
||||||
|
document.body.removeChild(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
let wells = [
|
||||||
|
{ id: 1, name: 'well1', whx: 100, why: 100 },
|
||||||
|
{ id: 2, name: 'well2', whx: 200, why: 300 },
|
||||||
|
{ id: 3, name: 'well3', whx: 300, why: 500 },
|
||||||
|
{ id: 4, name: 'well4', whx: 100, why: 500 }
|
||||||
|
]
|
||||||
|
|
||||||
|
let map = {
|
||||||
|
layers: [
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
function render_map(map) {
|
||||||
|
// let header = `<svg viewBox="-200 -200 2000 2000" version="1.1" xmlns="http://www.w3.org/2000/svg">`
|
||||||
|
let header = `<svg viewBox="-200 -200 2000 2000" version="1.1" xmlns="http://www.w3.org/2000/svg" id="svg">`
|
||||||
|
// let header = `<svg viewBox="-200 -200 2000 2000" version="1.1" xmlns="http://www.w3.org/2000/svg" id="svg" preserveAspectRatio="xMinYMax meet">`
|
||||||
|
let footer = `</svg>`
|
||||||
|
let body = map.layers.join('')
|
||||||
|
|
||||||
|
return header + body + footer
|
||||||
|
}
|
||||||
|
// let layer = '<g>' + wells.map(x => `<circle cx="${x.whx}" cy="${x.whx}" r="50" />`).join('') + '</g>'
|
||||||
|
|
||||||
|
class SvgNode {
|
||||||
|
constructor(tag, attrs) {
|
||||||
|
this.tag = tag
|
||||||
|
this.attrs = attrs || {}
|
||||||
|
}
|
||||||
|
|
||||||
|
set_attr(attr, value) {
|
||||||
|
if (typeof attr === 'string')
|
||||||
|
this.attrs[attr] = value
|
||||||
|
else
|
||||||
|
this.attrs = { ...this.attrs, ...attr }
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
set_style(style) {
|
||||||
|
this.style = { ...this.style || {}, ...style }
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_style(style) {
|
||||||
|
this.style = null
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
move(x, y) {
|
||||||
|
this.transform = { x, y }
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
get(attr) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
_render_node(node) {
|
||||||
|
// console.log(typeof node)
|
||||||
|
// if (typeof node == 'undefined') return ''
|
||||||
|
if (typeof node == 'string') return node
|
||||||
|
else if (typeof node == 'SvgNode') return node.render()
|
||||||
|
else return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
let attrs = Object.keys(this.attrs).map(x => `${x}="${this.attrs[x]}"`).join(' ')
|
||||||
|
// console.log(this.style ? Object.keys(this.style).map(x => `${x}:${this.style[x]}`) : '')
|
||||||
|
let style = this.style ? 'style="' + Object.keys(this.style).map(x => `${x}:${this.style[x]}`).join('; ') + '"' : ''
|
||||||
|
let transfrom = this.transform ? `transform="translate(${this.transform.x},${this.transform.y})"` : ''
|
||||||
|
let children = this.items ? this.items.map(x => this._render_node(x)).join('') : ''
|
||||||
|
return `<${this.tag} ${attrs} ${style} ${transfrom}>${children}</${this.tag}>`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
svg_node = {}
|
||||||
|
|
||||||
|
|
||||||
|
svg_path = {
|
||||||
|
move(x, y) {
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
line(x, y) {
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
arc(x, y, r, a) {
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
attrs: {
|
||||||
|
'stroke-width': 3
|
||||||
|
},
|
||||||
|
|
||||||
|
layers: [],
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return `<path d="M0 0 L${c0} ${s0} A ${r} ${r} 0 ${aa} 0 ${c1} ${s1} z" stroke-width="3" stroke="#f00" fill="#0f0"/>`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function arc(r, ang) {
|
||||||
|
var sa = -Math.sin(ang * Math.PI / 180) * r;
|
||||||
|
var ca = Math.cos(ang * Math.PI / 180) * r;
|
||||||
|
var aa = (ang > 180) ? 1 : 0;
|
||||||
|
// var p = new TimalSvg.Data.SvgPath(string.Format("M0 0 L{0} 0 A {0} {0} 0 {3} 0 {1} {2} z", FN(r), ca, sa, aa));
|
||||||
|
// p.Transform = string.Format("rotate({0})", FN(ang / 2));
|
||||||
|
|
||||||
|
return `<path d="M${r} 0 A ${r} ${r} 0 ${aa} 0 ${ca} ${sa}" stroke-width="30" stroke="#f00" fill="none"/>`
|
||||||
|
}
|
||||||
|
|
||||||
|
function sector(r, a0, a1) {
|
||||||
|
const k = Math.PI / 180
|
||||||
|
let s0 = -Math.sin(a0 * k) * r;
|
||||||
|
let c0 = Math.cos(a0 * k) * r;
|
||||||
|
let s1 = -Math.sin(a1 * k) * r;
|
||||||
|
let c1 = Math.cos(a1 * k) * r;
|
||||||
|
|
||||||
|
var aa = (a1 - a0 > 180) ? 1 : 0
|
||||||
|
// var p = new TimalSvg.Data.SvgPath(string.Format("M0 0 L{0} 0 A {0} {0} 0 {3} 0 {1} {2} z", FN(r), ca, sa, aa));
|
||||||
|
// p.Transform = string.Format("rotate({0})", FN(ang / 2));
|
||||||
|
|
||||||
|
return `<path d="M0 0 L${c0} ${s0} A ${r} ${r} 0 ${aa} 0 ${c1} ${s1} z" stroke-width="3" stroke="#f00" fill="#0f0"/>`
|
||||||
|
}
|
||||||
|
|
||||||
|
function svg_sector(r, a0, a1) {
|
||||||
|
const k = Math.PI / 180
|
||||||
|
let s0 = -Math.sin(a0 * k) * r;
|
||||||
|
let c0 = Math.cos(a0 * k) * r;
|
||||||
|
let s1 = -Math.sin(a1 * k) * r;
|
||||||
|
let c1 = Math.cos(a1 * k) * r;
|
||||||
|
|
||||||
|
var aa = (a1 - a0 > 180) ? 1 : 0
|
||||||
|
// var p = new TimalSvg.Data.SvgPath(string.Format("M0 0 L{0} 0 A {0} {0} 0 {3} 0 {1} {2} z", FN(r), ca, sa, aa));
|
||||||
|
// p.Transform = string.Format("rotate({0})", FN(ang / 2));
|
||||||
|
|
||||||
|
return new SvgNode('path', { d: `M0 0 L${c0} ${s0} A ${r} ${r} 0 ${aa} 0 ${c1} ${s1} z` })
|
||||||
|
}
|
||||||
|
|
||||||
|
let style = {
|
||||||
|
'stroke-width': 3,
|
||||||
|
'stroke': '#f00',
|
||||||
|
'fill': '#0f0'
|
||||||
|
}
|
||||||
|
|
||||||
|
function circle(r) {
|
||||||
|
return new SvgNode('circle').set_attr('r', r)
|
||||||
|
}
|
||||||
|
|
||||||
|
function svg_ring_sector(r0, r1, a0, a1) {
|
||||||
|
const k = Math.PI / 180
|
||||||
|
let s0 = -Math.sin(a0 * k);
|
||||||
|
let c0 = Math.cos(a0 * k);
|
||||||
|
let s1 = -Math.sin(a1 * k);
|
||||||
|
let c1 = Math.cos(a1 * k);
|
||||||
|
|
||||||
|
var aa = (a1 - a0 > 180) ? 1 : 0
|
||||||
|
|
||||||
|
return new SvgNode('path', {
|
||||||
|
'd': `M${c0 * r0} ${s0 * r0}
|
||||||
|
A ${r0} ${r0} 0 ${aa} 0 ${c1 * r0} ${s1 * r0}
|
||||||
|
L${c1 * r1} ${s1 * r1}
|
||||||
|
A ${r1} ${r1} 0 ${aa} 1 ${c0 * r1} ${s0 * r1} z`
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let style2 = {
|
||||||
|
'stroke-width': 3,
|
||||||
|
'stroke': '#00f',
|
||||||
|
'fill': '#0ff'
|
||||||
|
}
|
||||||
|
|
||||||
|
let style3 = {
|
||||||
|
'stroke-width': 1,
|
||||||
|
'stroke': '#000',
|
||||||
|
'fill': '#fff'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let style_fault = {
|
||||||
|
'stroke-width': 3,
|
||||||
|
'stroke-dasharray': "10 10",
|
||||||
|
'stroke': '#000',
|
||||||
|
'fill': 'none'
|
||||||
|
}
|
||||||
|
|
||||||
|
let style_vnk = {
|
||||||
|
'stroke-width': 2,
|
||||||
|
'stroke-dasharray': "2 2",
|
||||||
|
'stroke': '#00f',
|
||||||
|
'fill': 'none'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let style_wellhead = {
|
||||||
|
'stroke-width': 2,
|
||||||
|
'stroke': '#f00',
|
||||||
|
'fill': '#eee',
|
||||||
|
'font-family': 'Courier new',
|
||||||
|
'font-weight': 'bold',
|
||||||
|
'font-size': '26px'
|
||||||
|
}
|
||||||
|
|
||||||
|
let style_wellhead_text = {
|
||||||
|
'stroke-width': 1,
|
||||||
|
'stroke': '#fff',
|
||||||
|
'fill': '#000',
|
||||||
|
'font-family': 'Courier new',
|
||||||
|
'font-weight': 'bold',
|
||||||
|
'font-size': '26px'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let style_wir = {
|
||||||
|
'stroke-width': 3,
|
||||||
|
'stroke': '#00f',
|
||||||
|
'fill': '#0af'
|
||||||
|
}
|
||||||
|
|
||||||
|
let style_opr = {
|
||||||
|
'stroke-width': 1,
|
||||||
|
'stroke': '#00f',
|
||||||
|
'fill': '#293324'
|
||||||
|
}
|
||||||
|
|
||||||
|
let style_gpr = {
|
||||||
|
'stroke-width': 1,
|
||||||
|
'stroke': '#00f',
|
||||||
|
'fill': '#ff0'
|
||||||
|
}
|
||||||
|
|
||||||
|
let fault = {
|
||||||
|
name: 'Fault 1', lines: [
|
||||||
|
[
|
||||||
|
{ x: 10, y: 20 },
|
||||||
|
{ x: 300, y: 50 },
|
||||||
|
{ x: 170, y: 10 },
|
||||||
|
{ x: 120, y: -150 }
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
function render_fault(fault) {
|
||||||
|
let path0 = fault.lines[0]
|
||||||
|
path0 = path0.slice(0, 1).map(x => `M${x.x} ${x.y}`).join(' ') + ' ' + path0.slice(1).map(x => `L${x.x} ${x.y}`).join(' ')
|
||||||
|
|
||||||
|
return new SvgNode('path').set_attr('d', path0)
|
||||||
|
}
|
||||||
|
|
||||||
|
let vnk1 = [
|
||||||
|
{ x: -10, y: -20 },
|
||||||
|
{ x: 300, y: 0 },
|
||||||
|
{ x: 470, y: 300 },
|
||||||
|
{ x: -120, y: 290 }
|
||||||
|
]
|
||||||
|
|
||||||
|
function render_contour(curve) {
|
||||||
|
let path0 = curve.slice(0, 1).map(x => `M${x.x} ${x.y}`).join(' ') + ' ' + curve.slice(1).map(x => `L${x.x} ${x.y}`).join(' ') + ' z'
|
||||||
|
|
||||||
|
return new SvgNode('path').set_attr('d', path0)
|
||||||
|
}
|
||||||
|
|
||||||
|
function render_well(well) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function svg_text(text) {
|
||||||
|
let node = new SvgNode('text')
|
||||||
|
node.items = [text]
|
||||||
|
node.set_attr('x', 0).set_attr('y', 0)
|
||||||
|
// node.set_attr('style', style)
|
||||||
|
// node.set_attr('stroke', "#fff")
|
||||||
|
// node.set_attr('stroke-width', "1")
|
||||||
|
return node
|
||||||
|
}
|
||||||
|
|
||||||
|
const text_style = 'font-family: Courier new; font-weight:bold; font-size:26px; fill:#000; stroke:#0f0; stroke-width:1'
|
||||||
|
|
||||||
|
map = {
|
||||||
|
layers: [
|
||||||
|
'<circle cx="0" cy="0" r="5" stroke-width="1" stroke="#f00" fill="#f00" />',
|
||||||
|
// '<g>' + wells.map(x => `<circle cx="${x.whx}" cy="${x.why}" r="5" strokeWidth="1" stroke="#f00" fill="none" />`).join('') + '</g>',
|
||||||
|
// '<path d="M0 0 L{0} 0 A {0} {0} 0 {3} 0 {1} {2} z"/>',
|
||||||
|
// '<circle cx="200" cy="200" r="50" stroke-width="25" stroke-dasharray="180" stroke-dashoffset="180" stroke="#f00" fill="none" />'
|
||||||
|
// sector(100, 0, 290),
|
||||||
|
// sector(50, 90, 360),
|
||||||
|
// svg_ring_sector(50, 100, 0, 290).set_attr(style).render(),
|
||||||
|
// svg_ring_sector(50, 100, 290, 360).set_attr(style2).render(),
|
||||||
|
// circle(15).set_attr(style3).render(),
|
||||||
|
// '<text x="10" y="-10" style="font-family: Courier new; font-weight:bold; font-size:26px; fill:#000" stroke="#fff" stroke-width="1">G-504</text>',
|
||||||
|
// render_fault(fault).set_attr(style_fault).render(),
|
||||||
|
// render_contour(vnk1).set_attr(style_vnk).render(),
|
||||||
|
// svg_text('Hallo world', text_style).render()
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
let cur_map = ''
|
||||||
|
|
||||||
|
|
||||||
|
function save() {
|
||||||
|
download('file.svg', cur_map)
|
||||||
|
}
|
||||||
|
|
||||||
|
// document.getElementById('map').innerHTML = render_map(map)
|
||||||
|
|
||||||
|
const query = 'SELECT * FROM wells WHERE whx < 2000 AND why < 2000'
|
||||||
|
axios.post('http://localhost:4000/proxy/sqlite', { query }).then(x => x.data)
|
||||||
|
.then(wells => {
|
||||||
|
|
||||||
|
let layer_wells = wells.map(w => circle(15).set_style(style_wellhead).move(w.whx, w.why).render())
|
||||||
|
let layer_wells_wpr = wells.map(w => svg_sector(70, 0, 70).set_style(style_wir).move(w.whx, w.why).render())
|
||||||
|
|
||||||
|
let layer_wells_gpr = wells.map(w => svg_sector(70, 70, 130).set_style(style_gpr).move(w.whx, w.why).render())
|
||||||
|
let layer_wells_opr = wells.map(w => svg_sector(70, 130, 360).set_style(style_opr).move(w.whx, w.why).render())
|
||||||
|
|
||||||
|
let layer_well_names = wells.map(w => svg_text(w.well).set_style(style_wellhead_text).move(w.whx + 10, w.why - 10).render())
|
||||||
|
// let layers = [...layer_wells, ...layer_wells_wpr, ...layer_well_names]
|
||||||
|
// let layers = layer_wells_wpr
|
||||||
|
let layers = [...layer_wells_wpr, ...layer_wells_gpr, ...layer_wells_opr, ...layer_wells, ...layer_well_names,
|
||||||
|
render_fault(fault).set_attr(style_fault).render(),
|
||||||
|
render_contour(vnk1).set_attr(style_vnk).render()
|
||||||
|
]
|
||||||
|
|
||||||
|
cur_map = render_map({ layers })
|
||||||
|
document.getElementById('map').innerHTML = cur_map
|
||||||
|
|
||||||
|
new SvgMap(document.getElementById('svg'))
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
class SvgMap {
|
||||||
|
constructor(el) {
|
||||||
|
this.el = el
|
||||||
|
this.scale = 1
|
||||||
|
this.pos = { x: 0, y: 0 }
|
||||||
|
console.log(el)
|
||||||
|
this.el.onwheel = this.handle_wheel.bind(this)
|
||||||
|
this.el.onmousedown = this.handle_mousedown.bind(this)
|
||||||
|
this.el.onmousemove = this.handle_mousemove.bind(this)
|
||||||
|
this.el.onmouseup = this.handle_mouseup.bind(this)
|
||||||
|
|
||||||
|
this.is_down = false
|
||||||
|
|
||||||
|
this.set_scale(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
handle_mousedown(event) {
|
||||||
|
this.is_down = true
|
||||||
|
this.downin = { x: event.clientX, y: event.clientY }
|
||||||
|
console.log(event)
|
||||||
|
// clientX: 451, clientY: 297
|
||||||
|
// layerX: 451, layerY: 297
|
||||||
|
}
|
||||||
|
|
||||||
|
handle_mousemove(event) {
|
||||||
|
if (this.is_down) {
|
||||||
|
event.preventDefault()
|
||||||
|
let dx = event.clientX - this.downin.x
|
||||||
|
let dy = event.clientY - this.downin.y
|
||||||
|
|
||||||
|
this.pos.x -= dx * this.scale
|
||||||
|
this.pos.y -= dy * this.scale
|
||||||
|
this.set_scale(this.scale)
|
||||||
|
this.downin = { x: event.clientX, y: event.clientY }
|
||||||
|
// this.downin = {x: event.clientX, y: event.clientY}
|
||||||
|
}
|
||||||
|
// console.log(event.target.tagName)
|
||||||
|
}
|
||||||
|
|
||||||
|
handle_mouseup(event) {
|
||||||
|
this.is_down = false
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
handle_wheel(event) {
|
||||||
|
event.preventDefault()
|
||||||
|
|
||||||
|
if (event.ctrlKey) {
|
||||||
|
if (event.deltaY > 0) {
|
||||||
|
this.scale_up()
|
||||||
|
}
|
||||||
|
else
|
||||||
|
this.scale_down()
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (event.shiftKey) {
|
||||||
|
console.log('shifted')
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
set_scale(scale) {
|
||||||
|
this.scale = scale
|
||||||
|
this.el.setAttribute("viewBox", `${this.pos.x} ${this.pos.y} ${2000 * this.scale} ${2000 * this.scale}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
scale_up() {
|
||||||
|
this.set_scale(this.scale * 1.1)
|
||||||
|
}
|
||||||
|
|
||||||
|
scale_down() {
|
||||||
|
this.set_scale(this.scale * 0.9)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function handle_wheel(event) {
|
||||||
|
event.preventDefault()
|
||||||
|
console.log(event.deltaY)
|
||||||
|
console.log(event)
|
||||||
|
|
||||||
|
document.getElementById('svg').setAttribute("viewBox", "0 0 3000 3000")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function scale() {
|
||||||
|
document.getElementById('svg').setAttribute("viewBox", "0 0 3000 3000")
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
Loading…
Reference in New Issue
Block a user