1
0
Fork 0
freesewing/plugins/plugin-mirror/src/index.js

99 lines
2.9 KiB
JavaScript
Raw Normal View History

import pkg from '../package.json'
2020-05-10 11:58:02 -05:00
const lineValues = (start, end) => {
const { x: x1, y: y1 } = start
const { x: x2, y: y2 } = end
const [A, B] = [-(y2 - y1), x2 - x1]
const C = -(A * x1 + B * y1)
return [A, B, C]
2020-05-10 11:58:02 -05:00
}
const mirrorGen = (start, end) => {
2020-05-10 11:58:02 -05:00
const [A, B, C] = lineValues(start, end)
return (point) => {
const { x, y } = point
const uNom = (B ** 2 - A ** 2) * x - 2 * A * B * y - 2 * A * C
const vNom = (A ** 2 - B ** 2) * y - 2 * A * B * x - 2 * B * C
const denom = A ** 2 + B ** 2
return [uNom / denom, vNom / denom]
}
}
const capFirst = (string) => string.charAt(0).toUpperCase() + string.slice(1)
2020-05-10 11:58:02 -05:00
export default {
name: pkg.name,
version: pkg.version,
2020-05-10 11:58:02 -05:00
hooks: {
preRender: (svg) => svg.attributes.setIfUnset('freesewing:plugin-mirror', pkg.version),
2020-05-10 11:58:02 -05:00
},
macros: {
mirror: function ({
mirror,
clone = true,
points = null,
paths = null,
prefix = 'mirrored',
2021-04-24 10:16:31 +02:00
nameFormat = undefined,
}) {
const [start, end] = mirror
const mirrorPoint = mirrorGen(start, end)
const ops = ['from', 'to', 'cp1', 'cp2']
2020-05-10 11:58:02 -05:00
if (paths !== null) {
paths.forEach((path, i) => {
// Try to find point name from path by looking in list of all points
let foundId = null
for (let id of Object.keys(this.paths)) {
if (this.paths[id] === path) {
foundId = id
break
2020-05-10 11:58:02 -05:00
}
}
path = clone ? path.clone() : path
if (clone) {
if (foundId === null && typeof nameFormat == 'function') {
this.paths[nameFormat(path)] = path
} else {
this.paths[`${prefix}${capFirst(foundId)}`] = path
2020-05-10 11:58:02 -05:00
}
}
for (let op in path.ops) {
for (let type of ops) {
// Iterate over all possible path op points and clone/move point
const pathOp = path.ops[op][type]
if (typeof pathOp !== 'undefined') {
;[pathOp.x, pathOp.y] = mirrorPoint(pathOp)
pathOp.attributes.set('mirrored', true)
2020-05-10 11:58:02 -05:00
}
}
}
})
}
if (points !== null) {
points.forEach((point) => {
let foundId = null
for (let id of Object.keys(this.points)) {
if (this.points[id] === point) {
foundId = id
break
}
}
if (clone) {
point = point.clone()
2020-05-17 01:13:43 -05:00
if (foundId === null && typeof nameFormat == 'function') {
this.points[nameFormat(point)] = point
} else {
this.points[`${prefix}${capFirst(foundId)}`] = point
2020-05-10 11:58:02 -05:00
}
}
;[point.x, point.y] = mirrorPoint(point)
point.attributes.set('mirrored', true)
})
2020-05-10 11:58:02 -05:00
}
2021-04-24 10:16:31 +02:00
},
},
2022-01-19 16:23:40 +01:00
methods: { lineValues, mirrorGen },
2020-05-10 11:58:02 -05:00
}