Files
pointvec/desktop/sources/scripts/generator.js

118 lines
3.8 KiB
JavaScript
Raw Normal View History

2018-10-04 11:27:40 +12:00
'use strict'
2018-08-28 16:34:17 +12:00
2018-10-04 11:27:40 +12:00
function Generator (layer, style) {
this.layer = layer
this.style = style
2018-05-10 09:56:55 +12:00
2018-10-04 11:27:40 +12:00
function operate (layer, offset, scale, mirror = 0, angle = 0) {
2018-10-02 07:38:14 +12:00
const l = copy(layer)
2018-05-10 09:56:55 +12:00
2018-10-04 11:27:40 +12:00
for (const k1 in l) {
const seg = l[k1]
for (const k2 in seg.vertices) {
2019-04-22 08:49:47 +09:00
if (mirror === 1 || mirror === 3) { seg.vertices[k2].x = (dotgrid.tool.settings.size.width) - seg.vertices[k2].x + 15 }
if (mirror === 2 || mirror === 3) { seg.vertices[k2].y = (dotgrid.tool.settings.size.height) - seg.vertices[k2].y + 15 }
2018-05-28 19:24:19 +12:00
// Offset
2018-05-10 09:56:55 +12:00
seg.vertices[k2].x += offset.x
seg.vertices[k2].y += offset.y
2018-05-28 19:24:19 +12:00
// Rotate
2019-04-22 08:49:47 +09:00
const center = { x: (dotgrid.tool.settings.size.width / 2) + offset.x + (7.5), y: (dotgrid.tool.settings.size.height / 2) + offset.y + 30 }
2019-01-09 16:53:28 +12:00
seg.vertices[k2] = rotatePoint(seg.vertices[k2], center, angle)
2018-05-28 19:24:19 +12:00
// Scale
seg.vertices[k2].x *= scale
2018-05-10 09:56:55 +12:00
seg.vertices[k2].y *= scale
}
}
2018-10-04 11:27:40 +12:00
return l
2018-05-10 09:56:55 +12:00
}
2018-10-04 11:27:40 +12:00
this.render = function (prev, segment, mirror = 0) {
const type = segment.type
const vertices = segment.vertices
let html = ''
let skip = 0
for (const id in vertices) {
if (skip > 0) { skip -= 1; continue }
2018-05-10 09:56:55 +12:00
2019-04-22 08:36:12 +09:00
let vertex = vertices[parseInt(id)]
2018-10-04 11:27:40 +12:00
let next = vertices[parseInt(id) + 1]
2019-01-09 16:53:28 +12:00
let afterNext = vertices[parseInt(id) + 2]
2018-05-10 09:56:55 +12:00
2019-04-22 08:36:12 +09:00
if (parseInt(id) === 0 && !prev || parseInt(id) === 0 && prev && (prev.x !== vertex.x || prev.y !== vertex.y)) {
2018-10-04 11:27:40 +12:00
html += `M${vertex.x},${vertex.y} `
2018-05-10 09:56:55 +12:00
}
2018-10-04 11:27:40 +12:00
2019-04-22 08:36:12 +09:00
if (type === 'line') {
2018-11-23 09:03:33 +12:00
html += this._line(vertex)
2019-04-22 08:36:12 +09:00
} else if (type === 'arc_c') {
2018-12-15 08:06:00 +12:00
let clock = mirror > 0 && mirror < 3 ? '0,0' : '0,1'
2018-11-23 09:03:33 +12:00
html += this._arc(vertex, next, clock)
2019-04-22 08:36:12 +09:00
} else if (type === 'arc_r') {
2018-12-15 08:06:00 +12:00
let clock = mirror > 0 && mirror < 3 ? '0,1' : '0,0'
2018-11-23 09:03:33 +12:00
html += this._arc(vertex, next, clock)
2019-04-22 08:36:12 +09:00
} else if (type === 'arc_c_full') {
2018-11-09 11:41:41 +13:00
let clock = mirror > 0 ? '1,0' : '1,1'
2018-11-23 09:03:33 +12:00
html += this._arc(vertex, next, clock)
2019-04-22 08:36:12 +09:00
} else if (type === 'arc_r_full') {
2018-11-09 11:41:41 +13:00
let clock = mirror > 0 ? '1,1' : '1,0'
2018-11-23 09:03:33 +12:00
html += this._arc(vertex, next, clock)
2019-04-22 08:36:12 +09:00
} else if (type === 'bezier') {
2019-01-09 16:53:28 +12:00
html += this._bezier(next, afterNext)
2018-06-04 09:52:19 +12:00
skip = 1
2018-05-10 09:56:55 +12:00
}
}
2018-05-11 09:13:01 +12:00
2019-04-22 08:36:12 +09:00
if (segment.type === 'close') {
2018-10-04 11:27:40 +12:00
html += 'Z '
2018-05-11 09:13:01 +12:00
}
2018-10-04 11:27:40 +12:00
2018-05-10 09:56:55 +12:00
return html
}
2018-11-23 09:03:33 +12:00
this._line = function (a) {
return `L${a.x},${a.y} `
}
this._arc = function (a, b, c) {
if (!a || !b || !c) { return '' }
const offset = { x: b.x - a.x, y: b.y - a.y }
if (offset.x === 0 || offset.y === 0) { return this._line(b) }
return `A${Math.abs(b.x - a.x)},${Math.abs(b.y - a.y)} 0 ${c} ${b.x},${b.y} `
}
this._bezier = function (a, b) {
if (!a || !b) { return '' }
return `Q${a.x},${a.y} ${b.x},${b.y} `
}
2018-10-04 11:27:40 +12:00
this.convert = function (layer, mirror, angle) {
let s = ''
2018-08-27 07:39:15 +12:00
let prev = null
2018-10-04 11:27:40 +12:00
for (const id in layer) {
2019-04-22 08:36:12 +09:00
const seg = layer[parseInt(id)]
2018-10-04 11:27:40 +12:00
s += `${this.render(prev, seg, mirror)}`
prev = seg.vertices ? seg.vertices[seg.vertices.length - 1] : null
2018-05-10 09:56:55 +12:00
}
2018-10-04 11:27:40 +12:00
return s
2018-05-11 09:37:47 +12:00
}
2018-10-04 11:27:40 +12:00
this.toString = function (offset = { x: 0, y: 0 }, scale = 1, mirror = this.style && this.style.mirror_style ? this.style.mirror_style : 0) {
let s = this.convert(operate(this.layer, offset, scale))
2018-05-11 09:47:09 +12:00
2019-04-22 08:36:12 +09:00
if (mirror === 1 || mirror === 2 || mirror === 3) {
2018-10-04 11:27:40 +12:00
s += this.convert(operate(this.layer, offset, scale, mirror), mirror)
2018-05-11 09:47:09 +12:00
}
2018-05-28 19:24:19 +12:00
2018-05-11 09:37:47 +12:00
return s
2018-05-10 09:56:55 +12:00
}
2018-10-04 11:27:40 +12:00
function copy (data) { return data ? JSON.parse(JSON.stringify(data)) : [] }
2019-01-09 16:53:28 +12:00
function rotatePoint (point, origin, angle) { angle = angle * Math.PI / 180.0; return { x: (Math.cos(angle) * (point.x - origin.x) - Math.sin(angle) * (point.y - origin.y) + origin.x).toFixed(1), y: (Math.sin(angle) * (point.x - origin.x) + Math.cos(angle) * (point.y - origin.y) + origin.y).toFixed(1) } }
2018-10-04 11:27:40 +12:00
}