1
0
Fork 0

Fix macro nesting and introduce nameFormat function

This commit is contained in:
Patrick Forringer 2020-05-17 01:10:47 -05:00
parent 8e768cf640
commit b6d7c78bab
2 changed files with 91 additions and 44 deletions

View file

@ -18,6 +18,10 @@ export const mirrorGen = (start, end) => {
} }
} }
function capFirst(string) {
return string.charAt(0).toUpperCase() + string.slice(1)
}
export default { export default {
name: name, name: name,
version: version, version: version,
@ -28,55 +32,71 @@ export default {
} }
}, },
macros: { macros: {
macros: { mirror: function ({
mirror: function ({ mirror,
mirror, clone = true,
clone = true, points = null,
points = null, paths = null,
paths = null, prefix = 'mirrored',
prefix = 'mirrored', nameFormat = undefined
nameFormat // unimplemented }) {
}) { const [start, end] = mirror
const [start, end] = mirror const mirrorPoint = mirrorGen(start, end)
const mirrorPoint = mirrorGen(start, end) const ops = ['from', 'to', 'cp1', 'cp2']
const ops = ['from', 'to', 'cp1', 'cp2']
if (paths !== null) { if (paths !== null) {
paths.forEach((path) => { paths.forEach((path, i) => {
// find existing path id // Try to find point name from path by looking in list of all points
// Find point name from path by looking in the list of all points? let foundId = null
let foundId = null for (let id of Object.keys(this.paths)) {
for (let id of Object.keys(this.paths)) { if (this.paths[id] === path) {
if (this.paths[id] === path) { foundId = id
foundId = id break
break }
}
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
}
}
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)
} }
} }
path = clone ? path.clone() : path }
if (clone && foundId !== null) { })
this.paths[`${prefix}${foundId}`] = path }
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
} }
for (let op in path.ops) { }
for (let type of ops) { if (clone) {
// Iterate over all possible path op points and clone/move point point = point.clone()
const pathOp = path.ops[op][type]
if (typeof pathOp !== 'undefined') {
;[pathOp.x, pathOp.y] = mirrorPoint(pathOp)
pathOp.attributes.set('mirrored', true)
}
}
}
})
}
if (points !== null) {
points.forEach((point) => {
if (clone) { if (clone) {
point = point.clone() if (foundId === null && typeof nameFormat == 'function') {
this.points[nameFormat(point)] = point
} else {
this.points[`${prefix}${capFirst(foundId)}`] = point
}
} }
;[point.x, point.y] = mirrorPoint(point) }
point.attributes.set('mirrored', true) ;[point.x, point.y] = mirrorPoint(point)
}) point.attributes.set('mirrored', true)
} })
} }
} }
} }

View file

@ -1,12 +1,39 @@
// These tests haven't been run, stub to fix when plugin testing is added
import freesewing from 'freesewing' import freesewing from 'freesewing'
import { version } from '../package.json' import { version } from '../package.json'
import reflect, { lineValues, mirrorGen } from '../src/reflect'
let chai = require('chai') let chai = require('chai')
let expect = chai.expect let expect = chai.expect
chai.use(require('chai-string')) chai.use(require('chai-string'))
let plugin = require('../dist/index.js') let plugin,
{ lineValues, mirrorGen } = require('../dist/index.js')
it('Should set the plugin name:version attribute', () => { it('Should set the plugin name:version attribute', () => {
let pattern = new freesewing.Pattern().with(plugin) let pattern = new freesewing.Pattern().with(plugin)
pattern.render() pattern.render()
expect(pattern.svg.attributes.get('freesewing:plugin-mirror')).to.equal(version) expect(pattern.svg.attributes.get('freesewing:plugin-mirror')).to.equal(version)
}) })
describe('mirrorGen(start, end)', () => {
it('Should reflect points', () => {
const reflectedPoint1 = new Point(2, 2)
reflectedPoint1.attributes.set('reflected', true)
const reflectedPoint2 = new Point(-32, 20)
reflectedPoint2.attributes.set('reflected', true)
// Should reflect point along 45deg line
const gen = mirrorGen(new Point(-1, 1))
expect([gen(new Point(-2, -2)), gen(new Point(32, -20))]).to.equal([
reflectedPoint1,
reflectedPoint2
])
})
it('lineValues should find the correct values for the line equation', () => {
expect(lineValues(new Point(-1, 1), new Point(1, -1))).to.equal([-2, -2, 0])
expect(lineValues(new Point(-2, 1), new Point(2, -1))).to.equal([-4, -2, 0])
expect(lineValues(new Point(-1, 4), new Point(4, -1))).to.equal([-5, -5, 15])
expect(lineValues(new Point(-12, -13), new Point(-1, 3))).to.equal([-11, 16, 49])
})
})