diff --git a/packages/plugin-mirror/src/index.js b/packages/plugin-mirror/src/index.js index 15463194b17..59232b9ea01 100644 --- a/packages/plugin-mirror/src/index.js +++ b/packages/plugin-mirror/src/index.js @@ -18,6 +18,10 @@ export const mirrorGen = (start, end) => { } } +function capFirst(string) { + return string.charAt(0).toUpperCase() + string.slice(1) +} + export default { name: name, version: version, @@ -28,55 +32,71 @@ export default { } }, macros: { - macros: { - mirror: function ({ - mirror, - clone = true, - points = null, - paths = null, - prefix = 'mirrored', - nameFormat // unimplemented - }) { - const [start, end] = mirror - const mirrorPoint = mirrorGen(start, end) - const ops = ['from', 'to', 'cp1', 'cp2'] + mirror: function ({ + mirror, + clone = true, + points = null, + paths = null, + prefix = 'mirrored', + nameFormat = undefined + }) { + const [start, end] = mirror + const mirrorPoint = mirrorGen(start, end) + const ops = ['from', 'to', 'cp1', 'cp2'] - if (paths !== null) { - paths.forEach((path) => { - // find existing path id - // Find point name from path by looking in the list of all points? - let foundId = null - for (let id of Object.keys(this.paths)) { - if (this.paths[id] === path) { - foundId = id - break + 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 + } + } + 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) { - // 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) - } - } - } - }) - } - if (points !== null) { - points.forEach((point) => { + } + if (clone) { + point = point.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) + }) } } } diff --git a/packages/plugin-mirror/tests/mirror.test.js b/packages/plugin-mirror/tests/mirror.test.js index 383d1589f1d..85017df0141 100644 --- a/packages/plugin-mirror/tests/mirror.test.js +++ b/packages/plugin-mirror/tests/mirror.test.js @@ -1,12 +1,39 @@ +// These tests haven't been run, stub to fix when plugin testing is added import freesewing from 'freesewing' import { version } from '../package.json' +import reflect, { lineValues, mirrorGen } from '../src/reflect' let chai = require('chai') let expect = chai.expect 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', () => { let pattern = new freesewing.Pattern().with(plugin) pattern.render() 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]) + }) +})