diff --git a/designs/bee/build.mjs b/designs/bee/build.mjs index 9d1da1994da..0f283af1c6d 100644 --- a/designs/bee/build.mjs +++ b/designs/bee/build.mjs @@ -14,7 +14,7 @@ const banner = `/** const options = { banner: { js: banner }, bundle: true, - entryPoints: ['src/index.js'], + entryPoints: ['src/index.mjs'], format: 'esm', outfile: 'dist/index.mjs', external: ["@freesewing"], diff --git a/designs/bee/config/index.js b/designs/bee/config/index.js deleted file mode 100644 index 06e894a2bcc..00000000000 --- a/designs/bee/config/index.js +++ /dev/null @@ -1,154 +0,0 @@ -import pkg from '../package.json' assert { type: 'json' } -import configHelpers from '@freesewing/config-helpers' - -const { pctBasedOn } = configHelpers -const { version } = pkg - -export default { - version, - name: 'bee', - design: 'PrudenceRabbit', - code: 'bobgeorgethe3rd', - department: 'tops', - type: 'pattern', - difficulty: 3, - optionGroups: { - fit: [ - 'chestEase', - 'waistEase', - 'bustSpanEase', - 'topDepth', - 'bottomCupDepth', - 'sideDepth', - 'sideCurve', - 'frontCurve', - 'bellaGuide', - ], - style: [ - 'ties', - 'neckTieWidth', - 'neckTieLength', - 'neckTieEnds', - 'neckTieColours', - 'bandTieWidth', - 'bandTieLength', - 'bandTieEnds', - 'bandTieColours', - 'crossBackTies', - 'bandLength', - ], - advanced: [ - { bellaDarts: ['backDartHeight'] }, - { bellaArmhole: ['armholeDepth', 'frontArmholePitchDepth'] }, - { - bellaAdvanced: [ - 'frontShoulderWidth', - 'fullChestEaseReduction', - 'highBustWidth', - 'shoulderToShoulderEase', - ], - }, - ], - }, - measurements: [ - 'highBust', - 'chest', - 'underbust', - 'waist', - 'waistBack', - 'bustSpan', - 'neck', - 'hpsToBust', - 'hpsToWaistFront', - 'hpsToWaistBack', - 'shoulderToShoulder', - 'shoulderSlope', - 'bustPointToUnderbust', - // FIXME: Measurement from waist up to armhole (for sleeveless) - ], - dependencies: { - frontSideDart: 'back', - bandTie: 'cup', - cup: 'neckTie', - }, - inject: { cup: 'frontSideDart' }, - hide: ['frontSideDart', 'back'], - parts: [ - 'back', - 'frontSideDart', - 'cup', - 'neckTie', - 'bandTie', - // 'frontShoulderDart' - ], - options: { - // Constants - acrossBackFactor: 0.925, - shoulderSlopeBack: 1.23, - neckWidthBack: 0.197, - neckWidthFront: 0.17, - backDartLocation: 0.145, - backCenterWaistReduction: 0.35, - collarFactor: 0.19, - backNeckCutout: 0.06, - backHemSlope: 2.5, - backArmholeSlant: 5, - backArmholeCurvature: 0.63, - frontArmholeCurvature: 0.63, - backArmholePitchDepth: 0.35, - bustDartLength: 1, - waistDartLength: 1, - bustDartCurve: 1, - // Percentages - //Bella Fit - waistEase: { pct: 5, min: 1, max: 20 }, - chestEase: { pct: 11, min: 5, max: 20 }, - bustSpanEase: { pct: 10, min: 0, max: 20 }, - //Bella Advanced - shoulderToShoulderEase: { pct: -0.5, min: -1, max: 5 }, - backDartHeight: { pct: 46, min: 38, max: 54 }, - armholeDepth: { pct: 44, min: 38, max: 46 }, - frontArmholePitchDepth: { pct: 29, max: 31, min: 27 }, - frontShoulderWidth: { pct: 95, max: 98, min: 92 }, - fullChestEaseReduction: { pct: 4, min: 0, max: 8 }, - highBustWidth: { pct: 86, max: 92, min: 80 }, - // Bikini Top - topDepth: { pct: 54, min: 50, max: 80 }, - //neckTieWidth: { mm: 13, min: 6, max: 30}, - neckTieWidth: { - pct: 6, - min: 2, - max: 18, - snap: { - metric: [6, 13, 19, 25, 32, 38], - imperial: [6.35, 12.7, 19.05, 25.4, 31.75, 38.1], - }, - ...pctBasedOn('bustSpan'), - }, - neckTieLength: { pct: 80, min: 70, max: 100 }, - neckTieEnds: { dflt: 'straight', list: ['straight', 'pointed'] }, - neckTieColours: { dflt: 'one', list: ['one', 'two'] }, - //bandTieWidth: { mm: 13, min: 6, max: 30 }, - bandTieWidth: { - pct: 3, - min: 1, - max: 9, - snap: { - metric: [6, 13, 19, 25, 32, 38], - imperial: [6.35, 12.7, 19.05, 25.4, 31.75, 38.1], - }, - toAbs: (pct, { measurements }) => measurements.hpsToWaistFront * pct, - }, - bandTieLength: { pct: 35, min: 30, max: 50 }, - bandTieEnds: { dflt: 'straight', list: ['straight', 'pointed'] }, - bandTieColours: { dflt: 'one', list: ['one', 'two'] }, - bottomCupDepth: { pct: 8, min: 0, max: 20 }, - sideDepth: { pct: 20.6, min: 0, max: 30 }, - sideCurve: { pct: 0, min: -50, max: 50 }, - frontCurve: { pct: 0, min: -50, max: 50 }, - bellaGuide: { bool: false }, - ties: { bool: true }, - crossBackTies: { bool: false }, - bandLength: { pct: 85, min: 75, max: 90 }, - }, -} diff --git a/designs/bee/package.json b/designs/bee/package.json index 30665b3ba99..c647b690bd4 100644 --- a/designs/bee/package.json +++ b/designs/bee/package.json @@ -38,7 +38,7 @@ "vbuild": "VERBOSE=1 node --experimental-json-modules build.mjs", "lab": "cd ../../sites/lab && yarn start", "tips": "node ../../scripts/help.mjs", - "prettier": "npx prettier --write 'src/*.js' 'config/*.js'", + "prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'", "testci": "npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js", "cibuild_step5": "node --experimental-json-modules build.mjs" }, diff --git a/designs/bee/src/band-tie.mjs b/designs/bee/src/band-tie.mjs new file mode 100644 index 00000000000..daae7a11464 --- /dev/null +++ b/designs/bee/src/band-tie.mjs @@ -0,0 +1,206 @@ +import { cup } from './cup.mjs' + +export const bandTie = { + name: 'bee.bandTie', + after: cup, + options: { + bandTieWidth: { + pct: 3, + min: 1, + max: 9, + snap: { + metric: [6, 13, 19, 25, 32, 38], + imperial: [6.35, 12.7, 19.05, 25.4, 31.75, 38.1], + }, + toAbs: (pct, { measurements }) => measurements.hpsToWaistFront * pct, + menu: 'style', + }, + bandTieLength: { pct: 35, min: 30, max: 50, menu: 'style' }, + bandTieEnds: { dflt: 'straight', list: ['straight', 'pointed'], menu: 'style' }, + bandTieColours: { dflt: 'one', list: ['one', 'two'], menu: 'style' }, + }, + draft: part => { + const { + store, + sa, + Point, + points, + Path, + paths, + options, + complete, + paperless, + macro, + measurements, + snippets, + Snippet, + absoluteOptions, + } = part.shorthand() + // band tie + if (!options.ties) { + if (!options.crossBackTies) { + part.render = false + } + } + let bandTieLength + if (options.crossBackTies) + bandTieLength = (measurements.underbust * options.bandLength) / 2 + options.neckTieWidth * 2 + else bandTieLength = (measurements.underbust + measurements.underbust * options.bandTieLength) / 2 + let bandTieWidth + if (options.crossBackTies) bandTieWidth = absoluteOptions.bandTieWidth * 2 + else bandTieWidth = absoluteOptions.bandTieWidth + points.topLeft = new Point(0, 0) + points.topRight = new Point(bandTieWidth * 2, points.topLeft.y) + points.bottomLeft = new Point(points.topLeft.x, bandTieLength) + points.bottomRight = new Point(points.topRight.x, bandTieLength) + if (!options.crossBackTies) { + switch (options.bandTieEnds) { + case 'straight': + points.topMiddle = new Point(bandTieWidth, points.topLeft.y) + break + case 'pointed': + points.topMiddle = new Point(bandTieWidth, points.topLeft.y - bandTieWidth) + } + } else points.topMiddle = new Point(bandTieWidth, points.topLeft.y) + + points.bottomMiddle = new Point(points.topMiddle.x, bandTieLength) + + switch (options.bandTieColours) { + case 'one': + paths.seam = new Path() + .move(points.bottomRight) + .line(points.topRight) + .line(points.topMiddle) + .line(points.topLeft) + .line(points.bottomLeft) + .close() + break + case 'two': + paths.seam = new Path() + .move(points.bottomMiddle) + .line(points.topMiddle) + .line(points.topLeft) + .line(points.bottomLeft) + .close() + } + + if (complete) { + points.cofLeft = points.bottomLeft.shift(0, bandTieWidth * (1 / 8)) + points.grainlineLeft = points.topLeft.translate(bandTieWidth * (1 / 8), bandTieLength * (3 / 4)) + points.title = points.topLeft.translate(bandTieWidth * (1 / 8), bandTieLength * (1 / 4)) + if (!options.crossBackTies) { + macro('title', { + at: points.title, + nr: 3, + title: 'band tie', + scale: 0.2, + }) + } else + macro('title', { + at: points.title, + nr: 3, + title: 'band', + scale: 0.5, + }) + + switch (options.bandTieColours) { + case 'one': + points.cofRight = points.bottomLeft.shift(0, bandTieWidth * (15 / 8)) + points.grainlineRight = points.grainlineLeft.shift(0, bandTieWidth * (14 / 8)) + paths.foldline = new Path() + .move(points.topMiddle) + .line(points.bottomMiddle) + .attr('data-text', 'Fold-line') + .attr('data-text-class', 'center') + .attr('class', 'various') + break + case 'two': + points.cofRight = points.bottomLeft.shift(0, bandTieWidth * (7 / 8)) + points.grainlineRight = points.grainlineLeft.shift(0, bandTieWidth * (7 / 8)) + } + macro('grainline', { + from: points.grainlineLeft, + to: points.grainlineRight, + }) + macro('cutonfold', { + from: points.cofLeft, + to: points.cofRight, + grainline: true, + }) + if (options.crossBackTies) { + let gatherLength = store.get('gatherLength') + snippets.centreNotch = new Snippet('notch', points.bottomRight) + points.sideNotch = points.bottomRight.shift(90, gatherLength) + snippets.sideNotch = new Snippet('notch', points.sideNotch) + paths.casingFold = new Path() + .move(points.topLeft.shift(-90, options.neckTieWidth)) + .line(points.topRight.shift(-90, options.neckTieWidth)) + .attr('class', 'various') + .attr('data-text', 'Fold-line') + .attr('data-text-class', 'center') + } + if (sa) { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } + if (paperless) { + macro('vd', { + from: points.bottomLeft, + to: points.topLeft, + x: points.topLeft.x - sa - 20, + }) + macro('hd', { + from: points.topLeft, + to: points.topMiddle, + y: points.topLeft.x - sa - 20, + }) + switch (options.bandTieColours) { + case 'one': + macro('hd', { + from: points.topLeft, + to: points.topRight, + y: points.topLeft.x - sa - 30, + }) + break + case 'two': + } + if (!options.crossBackTies) { + switch (options.bandTieEnds) { + case 'straight': + macro('hd', { + from: points.topLeft, + to: points.topMiddle, + y: points.topLeft.x - sa - 20, + }) + break + case 'pointed': + macro('vd', { + from: points.topLeft, + to: points.topMiddle, + x: points.topLeft.x - sa - 20, + }) + macro('vd', { + from: points.bottomLeft, + to: points.topMiddle, + x: points.topLeft.x - sa - 30, + }) + } + } else + macro('hd', { + from: points.topLeft, + to: points.topMiddle, + y: points.topLeft.x - sa - 20, + }) + if (options.crossBackTies) { + macro('vd', { + from: points.sideNotch, + to: points.bottomRight, + x: points.topRight.x + sa + 20, + }) + } + } + } + + return part + } +} + diff --git a/designs/bee/src/bandTie.js b/designs/bee/src/bandTie.js deleted file mode 100644 index 0f452638e15..00000000000 --- a/designs/bee/src/bandTie.js +++ /dev/null @@ -1,183 +0,0 @@ -export default function (part) { - let { - store, - sa, - Point, - points, - Path, - paths, - options, - complete, - paperless, - macro, - measurements, - snippets, - Snippet, - absoluteOptions, - } = part.shorthand() - // band tie - if (!options.ties) { - if (!options.crossBackTies) { - part.render = false - } - } - let bandTieLength - if (options.crossBackTies) - bandTieLength = (measurements.underbust * options.bandLength) / 2 + options.neckTieWidth * 2 - else bandTieLength = (measurements.underbust + measurements.underbust * options.bandTieLength) / 2 - let bandTieWidth - if (options.crossBackTies) bandTieWidth = absoluteOptions.bandTieWidth * 2 - else bandTieWidth = absoluteOptions.bandTieWidth - points.topLeft = new Point(0, 0) - points.topRight = new Point(bandTieWidth * 2, points.topLeft.y) - points.bottomLeft = new Point(points.topLeft.x, bandTieLength) - points.bottomRight = new Point(points.topRight.x, bandTieLength) - if (!options.crossBackTies) { - switch (options.bandTieEnds) { - case 'straight': - points.topMiddle = new Point(bandTieWidth, points.topLeft.y) - break - case 'pointed': - points.topMiddle = new Point(bandTieWidth, points.topLeft.y - bandTieWidth) - } - } else points.topMiddle = new Point(bandTieWidth, points.topLeft.y) - - points.bottomMiddle = new Point(points.topMiddle.x, bandTieLength) - - switch (options.bandTieColours) { - case 'one': - paths.seam = new Path() - .move(points.bottomRight) - .line(points.topRight) - .line(points.topMiddle) - .line(points.topLeft) - .line(points.bottomLeft) - .close() - break - case 'two': - paths.seam = new Path() - .move(points.bottomMiddle) - .line(points.topMiddle) - .line(points.topLeft) - .line(points.bottomLeft) - .close() - } - - if (complete) { - points.cofLeft = points.bottomLeft.shift(0, bandTieWidth * (1 / 8)) - points.grainlineLeft = points.topLeft.translate(bandTieWidth * (1 / 8), bandTieLength * (3 / 4)) - points.title = points.topLeft.translate(bandTieWidth * (1 / 8), bandTieLength * (1 / 4)) - if (!options.crossBackTies) { - macro('title', { - at: points.title, - nr: 3, - title: 'band tie', - scale: 0.2, - }) - } else - macro('title', { - at: points.title, - nr: 3, - title: 'band', - scale: 0.5, - }) - - switch (options.bandTieColours) { - case 'one': - points.cofRight = points.bottomLeft.shift(0, bandTieWidth * (15 / 8)) - points.grainlineRight = points.grainlineLeft.shift(0, bandTieWidth * (14 / 8)) - paths.foldline = new Path() - .move(points.topMiddle) - .line(points.bottomMiddle) - .attr('data-text', 'Fold-line') - .attr('data-text-class', 'center') - .attr('class', 'various') - break - case 'two': - points.cofRight = points.bottomLeft.shift(0, bandTieWidth * (7 / 8)) - points.grainlineRight = points.grainlineLeft.shift(0, bandTieWidth * (7 / 8)) - } - macro('grainline', { - from: points.grainlineLeft, - to: points.grainlineRight, - }) - macro('cutonfold', { - from: points.cofLeft, - to: points.cofRight, - grainline: true, - }) - if (options.crossBackTies) { - let gatherLength = store.get('gatherLength') - snippets.centreNotch = new Snippet('notch', points.bottomRight) - points.sideNotch = points.bottomRight.shift(90, gatherLength) - snippets.sideNotch = new Snippet('notch', points.sideNotch) - paths.casingFold = new Path() - .move(points.topLeft.shift(-90, options.neckTieWidth)) - .line(points.topRight.shift(-90, options.neckTieWidth)) - .attr('class', 'various') - .attr('data-text', 'Fold-line') - .attr('data-text-class', 'center') - } - if (sa) { - paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') - } - if (paperless) { - macro('vd', { - from: points.bottomLeft, - to: points.topLeft, - x: points.topLeft.x - sa - 20, - }) - macro('hd', { - from: points.topLeft, - to: points.topMiddle, - y: points.topLeft.x - sa - 20, - }) - switch (options.bandTieColours) { - case 'one': - macro('hd', { - from: points.topLeft, - to: points.topRight, - y: points.topLeft.x - sa - 30, - }) - break - case 'two': - } - if (!options.crossBackTies) { - switch (options.bandTieEnds) { - case 'straight': - macro('hd', { - from: points.topLeft, - to: points.topMiddle, - y: points.topLeft.x - sa - 20, - }) - break - case 'pointed': - macro('vd', { - from: points.topLeft, - to: points.topMiddle, - x: points.topLeft.x - sa - 20, - }) - macro('vd', { - from: points.bottomLeft, - to: points.topMiddle, - x: points.topLeft.x - sa - 30, - }) - } - } else - macro('hd', { - from: points.topLeft, - to: points.topMiddle, - y: points.topLeft.x - sa - 20, - }) - if (options.crossBackTies) { - macro('vd', { - from: points.sideNotch, - to: points.bottomRight, - x: points.topRight.x + sa + 20, - }) - } - } - } - - return part -} diff --git a/designs/bee/src/cup.js b/designs/bee/src/cup.js deleted file mode 100644 index 0d12f0749d2..00000000000 --- a/designs/bee/src/cup.js +++ /dev/null @@ -1,379 +0,0 @@ -export default function (part) { - let { - store, - sa, - Point, - points, - Path, - paths, - options, - complete, - paperless, - macro, - utils, - measurements, - snippets, - Snippet, - absoluteOptions, - } = part.shorthand() - //inherited from Bella - let angle = store.get('bustDartAngleSide') - //removing paths and snippets not required from Bella - for (let i in paths) delete paths[i] - for (let i in snippets) delete snippets[i] - //removing macros not required from Bella - macro('title', false) - macro('scalebox', false) - //bella alterations - points.sideHemNew = points.armhole.shiftOutwards( - points.bustDartTop, - points.bustDartBottom.dist(points.sideHemInitial) - ) - points.waistDartRightRotated = points.waistDartRight.rotate(angle, points.bust) - if (options.bellaGuide) { - paths.bellaGuide = new Path() - .move(points.sideHemNew) - .line(points.bustDartTop) - .line(points.armhole) - .curve(points.armholeCp2, points.armholePitchCp1, points.armholePitch) - .curve_(points.armholePitchCp2, points.shoulder) - .line(points.hps) - .curve(points.hpsCp2, points.cfNeckCp1, points.cfNeck) - .line(points.cfHem) - .line(points.waistDartLeft) - .line(points.bustA) - .line(points.waistDartRightRotated) - .line(points.sideHemNew) - .attr('class', 'various lashed') - .close() - } - - //bikini top - let underbust = - measurements.bustPointToUnderbust + measurements.bustPointToUnderbust * options.bottomCupDepth - points.top = points.bustA.shiftTowards(points.hps, measurements.hpsToBust * options.topDepth) - points.topLeft = points.top.shift( - points.top.angle(points.hps) + 90, - absoluteOptions.neckTieWidth / 2 - ) - points.topRight = points.top.shift( - points.top.angle(points.hps) - 90, - absoluteOptions.neckTieWidth / 2 - ) - points.leftDart = points.bustA.shiftTowards(points.waistDartLeft, underbust) - points.rightDart = points.bustA.shiftTowards(points.waistDartRightRotated, underbust) - points.lefti = utils.beamsIntersect( - points.leftDart, - points.leftDart.shift(points.leftDart.angle(points.bustA) + 90, 10), - points.cfNeck, - points.cfHem - ) - points.righti = utils.beamsIntersect( - points.rightDart, - points.rightDart.shift(points.rightDart.angle(points.bustA) - 90, 10), - points.armhole, - points.sideHemNew - ) - points.rightiOffset = points.righti.shiftFractionTowards(points.rightDart, options.sideDepth) - points.sideEdge = points.rightiOffset.shift( - points.armhole.angle(points.righti), - absoluteOptions.bandTieWidth - ) - points.frontEdge = points.lefti.shift( - points.cfNeck.angle(points.cfHem), - absoluteOptions.bandTieWidth - ) - points.middleDart = points.bustA.shift( - points.bustA.angle(points.leftDart) + - (points.bustA.angle(points.rightDart) - points.bustA.angle(points.leftDart)) / 2, - points.bustA.dist(points.leftDart) - ) - points.casingDart = points.bustA.shiftOutwards(points.middleDart, absoluteOptions.bandTieWidth) - points.leftControli = utils.beamsIntersect( - points.casingDart, - points.casingDart.shift(points.bustA.angle(points.middleDart) - 90, 10), - points.cfNeck, - points.cfHem - ) - points.rightControli = utils.beamsIntersect( - points.casingDart, - points.casingDart.shift(points.bustA.angle(points.middleDart) + 90, 10), - points.armhole, - points.sideHemNew - ) - points.leftControl = points.casingDart.shiftFractionTowards(points.leftControli, 0.5) - points.rightControl = points.casingDart.shiftFractionTowards(points.rightControli, 0.5) - points.middleSideFront = points.rightiOffset.shiftFractionTowards(points.topRight, 0.5) - points.sideCurveControl = points.middleSideFront.shiftFractionTowards( - points.bustA, - options.sideCurve - ) - points.middleFront = points.topLeft.shiftFractionTowards(points.lefti, 0.5) - points.frontCurveControl = points.middleFront.shiftFractionTowards( - points.bustA, - options.frontCurve - ) - points.leftControlOffset = points.leftControl.shiftTowards( - points.top, - absoluteOptions.bandTieWidth - ) - points.rightControlOffset = points.rightControl.shiftTowards( - points.top, - absoluteOptions.bandTieWidth - ) - if (!options.crossBackTies) { - paths.seam = new Path() - .move(points.sideEdge) - .line(points.rightiOffset) - .curve_(points.sideCurveControl, points.topRight) - .line(points.topLeft) - .curve_(points.frontCurveControl, points.lefti) - .line(points.frontEdge) - .curve_(points.leftControl, points.casingDart) - .curve_(points.rightControl, points.sideEdge) - .close() - } - if (options.crossBackTies) { - paths.seam = new Path() - .move(points.rightiOffset) - .curve_(points.sideCurveControl, points.topRight) - .line(points.topLeft) - .curve_(points.frontCurveControl, points.lefti) - .curve_(points.leftControlOffset, points.middleDart) - .curve_(points.rightControlOffset, points.rightiOffset) - .close() - } - if (complete) { - points.grainlineTop = points.top.shiftFractionTowards(points.bustA, 0.05) - points.grainlineBottom = points.bustA.shiftFractionTowards(points.top, 0.05) - macro('grainline', { - from: points.grainlineTop, - to: points.grainlineBottom, - }) - paths.frontCurve = new Path() - .move(points.topLeft) - .curve_(points.frontCurveControl, points.lefti) - .setRender(false) - points.frontNotch = paths.frontCurve.shiftFractionAlong(0.5) - snippets.frontNotch = new Snippet('notch', points.frontNotch) - snippets.lefti = new Snippet('notch', points.lefti) - snippets.righti = new Snippet('notch', points.rightiOffset) - if (!options.crossBackTies) { - snippets.frontEdge = new Snippet('notch', points.frontEdge) - snippets.sideEdge = new Snippet('notch', points.sideEdge) - } - points.title = points.grainlineBottom.shift( - points.bustA.angle(points.top) - 90, - points.grainlineTo.dist(points.grainlineBottom) - ) - macro('title', { - at: points.title, - nr: 1, - title: 'cup', - scale: 0.7, - rotation: 90 - points.bustA.angle(points.top) - 270, - }) - points.scalebox = new Point(points.lefti.x + 12.7, points.topLeft.y + 12.7) - macro('miniscale', { at: points.scalebox }) - if (!options.crossBackTies) { - paths.casingline = new Path() - .move(points.lefti) - .curve_(points.leftControlOffset, points.middleDart) - .curve_(points.rightControlOffset, points.rightiOffset) - .attr('class', 'fabric lashed') - .attr('data-text', 'Casing Stitching Line') - .attr('data-text-class', 'center') - } - points.logo = points.grainlineTop.shiftOutwards( - points.grainlineBottom, - points.grainlineTo.dist(points.grainlineBottom) * 9 - ) - snippets.logo = new Snippet('logo', points.logo) - .attr('data-rotate', 90 - points.bustA.angle(points.top) - 270) - .attr('data-scale', 0.7) - if (!options.ties) { - let neckTieLength = utils.units(store.get('neckTieLength')) - points.neckTieLength = points.__miniscaleImperialBottomLeft - .shiftFractionTowards(points.lefti, 1 / 10) - .attr('data-text', 'Neck Tie Length: ') - .attr('data-text', neckTieLength) - if (!options.crossBackTies) { - let bandTieLength = utils.units( - measurements.underbust + measurements.underbust * options.bandTieLength - ) - points.backTieLength = points.__miniscaleImperialBottomLeft - .shiftFractionTowards(points.lefti, 2 / 10) - .attr('data-text', 'Band Tie Length: ') - .attr('data-text', bandTieLength) - } - } - if (sa) { - paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') - } - if (paperless) { - if (!options.crossBackTies) { - macro('vd', { - from: points.frontEdge, - to: points.lefti, - x: points.frontEdge.x - sa - 20, - }) - } - macro('vd', { - from: points.lefti, - to: points.topLeft, - x: points.frontEdge.x - sa - 20, - }) - macro('vd', { - from: points.topLeft, - to: points.topRight, - x: points.frontEdge.x - sa - 20, - }) - if (!options.crossBackTies) { - macro('vd', { - from: points.frontEdge, - to: points.topRight, - x: points.frontEdge.x - sa - 30, - }) - } - macro('hd', { - from: points.topLeft, - to: points.topRight, - y: points.topRight.y - sa - 20, - }) - macro('hd', { - from: points.lefti, - to: points.topLeft, - y: points.topRight.y - sa - 20, - }) - macro('hd', { - from: points.topRight, - to: points.rightiOffset, - y: points.topRight.y - sa - 20, - }) - if (!options.crossBackTies) { - macro('hd', { - from: points.rightiOffset, - to: points.sideEdge, - y: points.topRight.y - sa - 20, - }) - } - macro('hd', { - from: points.frontEdge, - to: points.rightiOffset, - y: points.topRight.y - sa - 30, - }) - if (!options.crossBackTies) { - macro('hd', { - from: points.frontEdge, - to: points.sideEdge, - y: points.topRight.y - sa - 40, - }) - } - macro('vd', { - from: points.topRight, - to: points.rightiOffset, - x: points.sideEdge.x + sa + 20, - }) - if (!options.crossBackTies) { - macro('vd', { - from: points.rightiOffset, - to: points.sideEdge, - x: points.sideEdge.x + sa + 20, - }) - macro('vd', { - from: points.topRight, - to: points.sideEdge, - x: points.sideEdge.x + sa + 30, - }) - macro('vd', { - from: points.sideEdge, - to: points.casingDart, - x: points.sideEdge.x + sa + 10, - }) - macro('hd', { - from: points.sideEdge, - to: points.casingDart, - y: points.casingDart.y + sa + 20, - }) - macro('hd', { - from: points.casingDart, - to: points.frontEdge, - y: points.casingDart.y + sa + 20, - }) - macro('vd', { - from: points.casingDart, - to: points.frontEdge, - x: points.frontEdge.x - sa - 10, - }) - macro('vd', { - from: points.casingDart, - to: points.topRight, - x: points.frontEdge.x - sa - 40, - }) - } - if (options.crossBackTies) { - macro('vd', { - from: points.rightiOffset, - to: points.middleDart, - x: points.sideEdge.x + sa + 10, - }) - macro('hd', { - from: points.rightiOffset, - to: points.middleDart, - y: points.casingDart.y + sa + 20, - }) - macro('hd', { - from: points.middleDart, - to: points.lefti, - y: points.casingDart.y + sa + 20, - }) - macro('vd', { - from: points.middleDart, - to: points.lefti, - x: points.frontEdge.x - sa - 10, - }) - macro('vd', { - from: points.middleDart, - to: points.topRight, - x: points.frontEdge.x - sa - 30, - }) - } - macro('ld', { - from: points.rightiOffset, - to: points.righti, - }) - } - if (options.crossBackTies) { - paths.curve = new Path() - .move(points.lefti) - .curve_(points.leftControlOffset, points.middleDart) - .curve_(points.rightControlOffset, points.rightiOffset) - .setRender(false) - paths.dart = new Path() - .move( - points.bustA.shiftOutwards(points.leftDart, points.topRight.dist(points.rightiOffset)) - ) - .line(points.bustA) - .line( - points.bustA.shiftOutwards(points.rightDart, points.topRight.dist(points.rightiOffset)) - ) - .setRender(false) - for (let p of paths.curve.intersects(paths.dart)) { - points.rightDarti = points.bustA.shiftFractionTowards(p, 1) - } - for (let p of paths.curve.reverse().intersects(paths.dart)) { - points.leftDarti = points.bustA.shiftFractionTowards(p, 1) - } - let leftCurve = paths.curve.reverse().split(points.leftDarti) - for (let i in leftCurve) { - paths.leftCurve = leftCurve[i].setRender(false) - } - let rightCurve = paths.curve.split(points.rightDarti) - for (let i in rightCurve) { - paths.rightCurve = rightCurve[i].setRender(false) - } - store.set('gatherLength', paths.leftCurve.length() + paths.rightCurve.length()) - } - } - return part -} diff --git a/designs/bee/src/cup.mjs b/designs/bee/src/cup.mjs new file mode 100644 index 00000000000..a22449d5457 --- /dev/null +++ b/designs/bee/src/cup.mjs @@ -0,0 +1,396 @@ +import { frontSideDart } from '@freesewing/bella' +import { neckTie } from './neck-tie.mjs' + +export const cup = { + name: 'bee.cup', + from: { ...frontSideDart, hidden: true }, + after: neckTie, + options: { + topDepth: { pct: 54, min: 50, max: 80, menu: 'fit' }, + bottomCupDepth: { pct: 8, min: 0, max: 20, menu: 'fit' }, + sideDepth: { pct: 20.6, min: 0, max: 30, menu: 'fit' }, + sideCurve: { pct: 0, min: -50, max: 50, menu: 'fit' }, + frontCurve: { pct: 0, min: -50, max: 50, menu: 'fit' }, + bellaGuide: { bool: false, menu: 'fit' }, + }, + draft: part => { + const { + store, + sa, + Point, + points, + Path, + paths, + options, + complete, + paperless, + macro, + utils, + measurements, + snippets, + Snippet, + absoluteOptions, + } = part.shorthand() + //inherited from Bella + let angle = store.get('bustDartAngleSide') + //removing paths and snippets not required from Bella + for (let i in paths) delete paths[i] + for (let i in snippets) delete snippets[i] + //removing macros not required from Bella + macro('title', false) + macro('scalebox', false) + //bella alterations + points.sideHemNew = points.armhole.shiftOutwards( + points.bustDartTop, + points.bustDartBottom.dist(points.sideHemInitial) + ) + points.waistDartRightRotated = points.waistDartRight.rotate(angle, points.bust) + if (options.bellaGuide) { + paths.bellaGuide = new Path() + .move(points.sideHemNew) + .line(points.bustDartTop) + .line(points.armhole) + .curve(points.armholeCp2, points.armholePitchCp1, points.armholePitch) + .curve_(points.armholePitchCp2, points.shoulder) + .line(points.hps) + .curve(points.hpsCp2, points.cfNeckCp1, points.cfNeck) + .line(points.cfHem) + .line(points.waistDartLeft) + .line(points.bustA) + .line(points.waistDartRightRotated) + .line(points.sideHemNew) + .attr('class', 'various lashed') + .close() + } + + //bikini top + let underbust = + measurements.bustPointToUnderbust + measurements.bustPointToUnderbust * options.bottomCupDepth + points.top = points.bustA.shiftTowards(points.hps, measurements.hpsToBust * options.topDepth) + points.topLeft = points.top.shift( + points.top.angle(points.hps) + 90, + absoluteOptions.neckTieWidth / 2 + ) + points.topRight = points.top.shift( + points.top.angle(points.hps) - 90, + absoluteOptions.neckTieWidth / 2 + ) + points.leftDart = points.bustA.shiftTowards(points.waistDartLeft, underbust) + points.rightDart = points.bustA.shiftTowards(points.waistDartRightRotated, underbust) + points.lefti = utils.beamsIntersect( + points.leftDart, + points.leftDart.shift(points.leftDart.angle(points.bustA) + 90, 10), + points.cfNeck, + points.cfHem + ) + points.righti = utils.beamsIntersect( + points.rightDart, + points.rightDart.shift(points.rightDart.angle(points.bustA) - 90, 10), + points.armhole, + points.sideHemNew + ) + points.rightiOffset = points.righti.shiftFractionTowards(points.rightDart, options.sideDepth) + points.sideEdge = points.rightiOffset.shift( + points.armhole.angle(points.righti), + absoluteOptions.bandTieWidth + ) + points.frontEdge = points.lefti.shift( + points.cfNeck.angle(points.cfHem), + absoluteOptions.bandTieWidth + ) + points.middleDart = points.bustA.shift( + points.bustA.angle(points.leftDart) + + (points.bustA.angle(points.rightDart) - points.bustA.angle(points.leftDart)) / 2, + points.bustA.dist(points.leftDart) + ) + points.casingDart = points.bustA.shiftOutwards(points.middleDart, absoluteOptions.bandTieWidth) + points.leftControli = utils.beamsIntersect( + points.casingDart, + points.casingDart.shift(points.bustA.angle(points.middleDart) - 90, 10), + points.cfNeck, + points.cfHem + ) + points.rightControli = utils.beamsIntersect( + points.casingDart, + points.casingDart.shift(points.bustA.angle(points.middleDart) + 90, 10), + points.armhole, + points.sideHemNew + ) + points.leftControl = points.casingDart.shiftFractionTowards(points.leftControli, 0.5) + points.rightControl = points.casingDart.shiftFractionTowards(points.rightControli, 0.5) + points.middleSideFront = points.rightiOffset.shiftFractionTowards(points.topRight, 0.5) + points.sideCurveControl = points.middleSideFront.shiftFractionTowards( + points.bustA, + options.sideCurve + ) + points.middleFront = points.topLeft.shiftFractionTowards(points.lefti, 0.5) + points.frontCurveControl = points.middleFront.shiftFractionTowards( + points.bustA, + options.frontCurve + ) + points.leftControlOffset = points.leftControl.shiftTowards( + points.top, + absoluteOptions.bandTieWidth + ) + points.rightControlOffset = points.rightControl.shiftTowards( + points.top, + absoluteOptions.bandTieWidth + ) + if (!options.crossBackTies) { + paths.seam = new Path() + .move(points.sideEdge) + .line(points.rightiOffset) + .curve_(points.sideCurveControl, points.topRight) + .line(points.topLeft) + .curve_(points.frontCurveControl, points.lefti) + .line(points.frontEdge) + .curve_(points.leftControl, points.casingDart) + .curve_(points.rightControl, points.sideEdge) + .close() + } + if (options.crossBackTies) { + paths.seam = new Path() + .move(points.rightiOffset) + .curve_(points.sideCurveControl, points.topRight) + .line(points.topLeft) + .curve_(points.frontCurveControl, points.lefti) + .curve_(points.leftControlOffset, points.middleDart) + .curve_(points.rightControlOffset, points.rightiOffset) + .close() + } + if (complete) { + points.grainlineTop = points.top.shiftFractionTowards(points.bustA, 0.05) + points.grainlineBottom = points.bustA.shiftFractionTowards(points.top, 0.05) + macro('grainline', { + from: points.grainlineTop, + to: points.grainlineBottom, + }) + paths.frontCurve = new Path() + .move(points.topLeft) + .curve_(points.frontCurveControl, points.lefti) + .setRender(false) + points.frontNotch = paths.frontCurve.shiftFractionAlong(0.5) + snippets.frontNotch = new Snippet('notch', points.frontNotch) + snippets.lefti = new Snippet('notch', points.lefti) + snippets.righti = new Snippet('notch', points.rightiOffset) + if (!options.crossBackTies) { + snippets.frontEdge = new Snippet('notch', points.frontEdge) + snippets.sideEdge = new Snippet('notch', points.sideEdge) + } + points.title = points.grainlineBottom.shift( + points.bustA.angle(points.top) - 90, + points.grainlineTo.dist(points.grainlineBottom) + ) + macro('title', { + at: points.title, + nr: 1, + title: 'cup', + scale: 0.7, + rotation: 90 - points.bustA.angle(points.top) - 270, + }) + points.scalebox = new Point(points.lefti.x + 12.7, points.topLeft.y + 12.7) + macro('miniscale', { at: points.scalebox }) + if (!options.crossBackTies) { + paths.casingline = new Path() + .move(points.lefti) + .curve_(points.leftControlOffset, points.middleDart) + .curve_(points.rightControlOffset, points.rightiOffset) + .attr('class', 'fabric lashed') + .attr('data-text', 'Casing Stitching Line') + .attr('data-text-class', 'center') + } + points.logo = points.grainlineTop.shiftOutwards( + points.grainlineBottom, + points.grainlineTo.dist(points.grainlineBottom) * 9 + ) + snippets.logo = new Snippet('logo', points.logo) + .attr('data-rotate', 90 - points.bustA.angle(points.top) - 270) + .attr('data-scale', 0.7) + if (!options.ties) { + let neckTieLength = utils.units(store.get('neckTieLength')) + points.neckTieLength = points.__miniscaleImperialBottomLeft + .shiftFractionTowards(points.lefti, 1 / 10) + .attr('data-text', 'Neck Tie Length: ') + .attr('data-text', neckTieLength) + if (!options.crossBackTies) { + let bandTieLength = utils.units( + measurements.underbust + measurements.underbust * options.bandTieLength + ) + points.backTieLength = points.__miniscaleImperialBottomLeft + .shiftFractionTowards(points.lefti, 2 / 10) + .attr('data-text', 'Band Tie Length: ') + .attr('data-text', bandTieLength) + } + } + if (sa) { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } + if (paperless) { + if (!options.crossBackTies) { + macro('vd', { + from: points.frontEdge, + to: points.lefti, + x: points.frontEdge.x - sa - 20, + }) + } + macro('vd', { + from: points.lefti, + to: points.topLeft, + x: points.frontEdge.x - sa - 20, + }) + macro('vd', { + from: points.topLeft, + to: points.topRight, + x: points.frontEdge.x - sa - 20, + }) + if (!options.crossBackTies) { + macro('vd', { + from: points.frontEdge, + to: points.topRight, + x: points.frontEdge.x - sa - 30, + }) + } + macro('hd', { + from: points.topLeft, + to: points.topRight, + y: points.topRight.y - sa - 20, + }) + macro('hd', { + from: points.lefti, + to: points.topLeft, + y: points.topRight.y - sa - 20, + }) + macro('hd', { + from: points.topRight, + to: points.rightiOffset, + y: points.topRight.y - sa - 20, + }) + if (!options.crossBackTies) { + macro('hd', { + from: points.rightiOffset, + to: points.sideEdge, + y: points.topRight.y - sa - 20, + }) + } + macro('hd', { + from: points.frontEdge, + to: points.rightiOffset, + y: points.topRight.y - sa - 30, + }) + if (!options.crossBackTies) { + macro('hd', { + from: points.frontEdge, + to: points.sideEdge, + y: points.topRight.y - sa - 40, + }) + } + macro('vd', { + from: points.topRight, + to: points.rightiOffset, + x: points.sideEdge.x + sa + 20, + }) + if (!options.crossBackTies) { + macro('vd', { + from: points.rightiOffset, + to: points.sideEdge, + x: points.sideEdge.x + sa + 20, + }) + macro('vd', { + from: points.topRight, + to: points.sideEdge, + x: points.sideEdge.x + sa + 30, + }) + macro('vd', { + from: points.sideEdge, + to: points.casingDart, + x: points.sideEdge.x + sa + 10, + }) + macro('hd', { + from: points.sideEdge, + to: points.casingDart, + y: points.casingDart.y + sa + 20, + }) + macro('hd', { + from: points.casingDart, + to: points.frontEdge, + y: points.casingDart.y + sa + 20, + }) + macro('vd', { + from: points.casingDart, + to: points.frontEdge, + x: points.frontEdge.x - sa - 10, + }) + macro('vd', { + from: points.casingDart, + to: points.topRight, + x: points.frontEdge.x - sa - 40, + }) + } + if (options.crossBackTies) { + macro('vd', { + from: points.rightiOffset, + to: points.middleDart, + x: points.sideEdge.x + sa + 10, + }) + macro('hd', { + from: points.rightiOffset, + to: points.middleDart, + y: points.casingDart.y + sa + 20, + }) + macro('hd', { + from: points.middleDart, + to: points.lefti, + y: points.casingDart.y + sa + 20, + }) + macro('vd', { + from: points.middleDart, + to: points.lefti, + x: points.frontEdge.x - sa - 10, + }) + macro('vd', { + from: points.middleDart, + to: points.topRight, + x: points.frontEdge.x - sa - 30, + }) + } + macro('ld', { + from: points.rightiOffset, + to: points.righti, + }) + } + if (options.crossBackTies) { + paths.curve = new Path() + .move(points.lefti) + .curve_(points.leftControlOffset, points.middleDart) + .curve_(points.rightControlOffset, points.rightiOffset) + .setRender(false) + paths.dart = new Path() + .move( + points.bustA.shiftOutwards(points.leftDart, points.topRight.dist(points.rightiOffset)) + ) + .line(points.bustA) + .line( + points.bustA.shiftOutwards(points.rightDart, points.topRight.dist(points.rightiOffset)) + ) + .setRender(false) + for (let p of paths.curve.intersects(paths.dart)) { + points.rightDarti = points.bustA.shiftFractionTowards(p, 1) + } + for (let p of paths.curve.reverse().intersects(paths.dart)) { + points.leftDarti = points.bustA.shiftFractionTowards(p, 1) + } + let leftCurve = paths.curve.reverse().split(points.leftDarti) + for (let i in leftCurve) { + paths.leftCurve = leftCurve[i].setRender(false) + } + let rightCurve = paths.curve.split(points.rightDarti) + for (let i in rightCurve) { + paths.rightCurve = rightCurve[i].setRender(false) + } + store.set('gatherLength', paths.leftCurve.length() + paths.rightCurve.length()) + } + } + return part + } +} + diff --git a/designs/bee/src/index.js b/designs/bee/src/index.js deleted file mode 100644 index ed65bd175a9..00000000000 --- a/designs/bee/src/index.js +++ /dev/null @@ -1,29 +0,0 @@ -import freesewing from '@freesewing/core' -import Bella from '@freesewing/bella' -import bundle from '@freesewing/plugin-bundle' -import config from '../config' -// Parts -import draftCup from './cup' -import draftNeckTie from './neckTie' -import draftBandTie from './bandTie' -//import draftFrontShoulderDart from './front-shoulder-dart' - -// Create design -const Bee = new freesewing.Design(config, bundle) - -// Attach draft methods to prototype -for (let m of ['draftBack', 'draftFrontSideDart']) { - Bee.prototype[m] = function (part) { - return new Bella(this.settings)[m](part) - } -} -Bee.prototype.draftCup = draftCup -Bee.prototype.draftNeckTie = draftNeckTie -Bee.prototype.draftBandTie = draftBandTie -//Bee.prototype.draftFrontShoulderDart = (part) => draftFrontShoulderDart(part) - -// Named exports -export { config, Bee } - -// Default export -export default Bee diff --git a/designs/bee/src/index.mjs b/designs/bee/src/index.mjs new file mode 100644 index 00000000000..c367c6a755c --- /dev/null +++ b/designs/bee/src/index.mjs @@ -0,0 +1,16 @@ +import { Design } from '@freesewing/core' +import { name, version } from '../package.json' +import { pluginBundle } from '@freesewing/plugin-bundle' +import { cup } from './cup.mjs' +import { neckTie } from './neck-tie.mjs' +import { bandTie } from './band-tie.mjs' + +const Bee = new Design({ + name, + version, + parts: [ cup, neckTie, bandTie ], + plugins: pluginBundle, +}) + +export { cup, neckTie, bandTie, Bee } + diff --git a/designs/bee/src/neck-tie.mjs b/designs/bee/src/neck-tie.mjs new file mode 100644 index 00000000000..f4238710c11 --- /dev/null +++ b/designs/bee/src/neck-tie.mjs @@ -0,0 +1,190 @@ +import { pctBasedOn } from '@freesewing/core' + +export const neckTie = { + name: 'bee.neckTie', + measurements: [ 'underbust', 'hpsToBust', 'hpsToWaistFront' ], + options: { + ties: { bool: true, menu: 'style' }, + crossBackTies: { bool: false, menu: 'style' }, + bandLength: { pct: 85, min: 75, max: 90, menu: 'style' }, + neckTieLength: { pct: 80, min: 70, max: 100, menu: 'style' }, + neckTieWidth: { + pct: 6, + min: 2, + max: 18, + snap: { + metric: [6, 13, 19, 25, 32, 38], + imperial: [6.35, 12.7, 19.05, 25.4, 31.75, 38.1], + }, + menu: 'style', + ...pctBasedOn('bustSpan'), + }, + neckTieEnds: { dflt: 'straight', list: ['straight', 'pointed'], menu: 'style' }, + neckTieColours: { dflt: 'one', list: ['one', 'two'], menu: 'style' }, + }, + draft: part => { + const { + store, + sa, + Point, + points, + Path, + paths, + options, + complete, + paperless, + macro, + measurements, + absoluteOptions, + } = part.shorthand() + // neck tie + if (!options.ties) { + part.render = false + } + let neckTieLength + if (options.crossBackTies) + neckTieLength = + (Math.sqrt( + Math.pow(measurements.hpsToWaistFront, 2) + + Math.pow(measurements.underbust - measurements.underbust * options.neckTieLength, 2) + ) + + measurements.underbust - + measurements.underbust * options.bandLength + + measurements.underbust - + measurements.underbust * options.bandLength * options.neckTieLength) / + 2 + else neckTieLength = (measurements.hpsToBust + measurements.hpsToBust * options.neckTieLength) / 2 + store.set('neckTieLength', neckTieLength * 2) + points.topLeft = new Point(0, 0) + points.topRight = new Point(absoluteOptions.neckTieWidth * 2, points.topLeft.y) + points.bottomLeft = new Point(points.topLeft.x, neckTieLength) + points.bottomRight = new Point(points.topRight.x, neckTieLength) + switch (options.neckTieEnds) { + case 'straight': + points.topMiddle = new Point(absoluteOptions.neckTieWidth, points.topLeft.y) + break + case 'pointed': + points.topMiddle = new Point( + absoluteOptions.neckTieWidth, + points.topLeft.y - absoluteOptions.neckTieWidth + ) + } + + points.bottomMiddle = new Point(points.topMiddle.x, neckTieLength) + + switch (options.neckTieColours) { + case 'one': + paths.seam = new Path() + .move(points.bottomRight) + .line(points.topRight) + .line(points.topMiddle) + .line(points.topLeft) + .line(points.bottomLeft) + .close() + break + case 'two': + paths.seam = new Path() + .move(points.bottomMiddle) + .line(points.topMiddle) + .line(points.topLeft) + .line(points.bottomLeft) + .close() + } + + if (complete) { + points.cofLeft = points.bottomLeft.shift(0, absoluteOptions.neckTieWidth * (1 / 8)) + points.grainlineLeft = points.topLeft.translate( + absoluteOptions.neckTieWidth * (1 / 8), + neckTieLength * (3 / 4) + ) + points.title = points.topLeft.translate( + absoluteOptions.neckTieWidth * (1 / 8), + neckTieLength * (1 / 4) + ) + macro('title', { + at: points.title, + nr: 2, + title: 'neck tie', + scale: 0.2, + }) + switch (options.neckTieColours) { + case 'one': + points.cofRight = points.bottomLeft.shift(0, absoluteOptions.neckTieWidth * (15 / 8)) + points.grainlineRight = points.grainlineLeft.shift( + 0, + absoluteOptions.neckTieWidth * (14 / 8) + ) + paths.foldline = new Path() + .move(points.topMiddle) + .line(points.bottomMiddle) + .attr('data-text', 'Fold-line') + .attr('data-text-class', 'center') + .attr('class', 'various') + break + case 'two': + points.cofRight = points.bottomLeft.shift(0, absoluteOptions.neckTieWidth * (7 / 8)) + points.grainlineRight = points.grainlineLeft.shift( + 0, + absoluteOptions.neckTieWidth * (7 / 8) + ) + } + macro('grainline', { + from: points.grainlineLeft, + to: points.grainlineRight, + }) + macro('cutonfold', { + from: points.cofLeft, + to: points.cofRight, + grainline: true, + }) + if (sa) { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } + if (paperless) { + macro('vd', { + from: points.bottomLeft, + to: points.topLeft, + x: points.topLeft.x - sa - 20, + }) + macro('hd', { + from: points.topLeft, + to: points.topMiddle, + y: points.topLeft.x - sa - 20, + }) + switch (options.neckTieColours) { + case 'one': + macro('hd', { + from: points.topLeft, + to: points.topRight, + y: points.topLeft.x - sa - 30, + }) + break + case 'two': + } + switch (options.neckTieEnds) { + case 'straight': + macro('hd', { + from: points.topLeft, + to: points.topMiddle, + y: points.topLeft.x - sa - 20, + }) + break + case 'pointed': + macro('vd', { + from: points.topLeft, + to: points.topMiddle, + x: points.topLeft.x - sa - 20, + }) + macro('vd', { + from: points.bottomLeft, + to: points.topMiddle, + x: points.topLeft.x - sa - 30, + }) + } + } + } + + return part + } +} + diff --git a/designs/bee/src/neckTie.js b/designs/bee/src/neckTie.js deleted file mode 100644 index 5c36073c21e..00000000000 --- a/designs/bee/src/neckTie.js +++ /dev/null @@ -1,164 +0,0 @@ -export default function (part) { - let { - store, - sa, - Point, - points, - Path, - paths, - options, - complete, - paperless, - macro, - measurements, - absoluteOptions, - } = part.shorthand() - // neck tie - if (!options.ties) { - part.render = false - } - let neckTieLength - if (options.crossBackTies) - neckTieLength = - (Math.sqrt( - Math.pow(measurements.hpsToWaistFront, 2) + - Math.pow(measurements.underbust - measurements.underbust * options.neckTieLength, 2) - ) + - measurements.underbust - - measurements.underbust * options.bandLength + - measurements.underbust - - measurements.underbust * options.bandLength * options.neckTieLength) / - 2 - else neckTieLength = (measurements.hpsToBust + measurements.hpsToBust * options.neckTieLength) / 2 - store.set('neckTieLength', neckTieLength * 2) - points.topLeft = new Point(0, 0) - points.topRight = new Point(absoluteOptions.neckTieWidth * 2, points.topLeft.y) - points.bottomLeft = new Point(points.topLeft.x, neckTieLength) - points.bottomRight = new Point(points.topRight.x, neckTieLength) - switch (options.neckTieEnds) { - case 'straight': - points.topMiddle = new Point(absoluteOptions.neckTieWidth, points.topLeft.y) - break - case 'pointed': - points.topMiddle = new Point( - absoluteOptions.neckTieWidth, - points.topLeft.y - absoluteOptions.neckTieWidth - ) - } - - points.bottomMiddle = new Point(points.topMiddle.x, neckTieLength) - - switch (options.neckTieColours) { - case 'one': - paths.seam = new Path() - .move(points.bottomRight) - .line(points.topRight) - .line(points.topMiddle) - .line(points.topLeft) - .line(points.bottomLeft) - .close() - break - case 'two': - paths.seam = new Path() - .move(points.bottomMiddle) - .line(points.topMiddle) - .line(points.topLeft) - .line(points.bottomLeft) - .close() - } - - if (complete) { - points.cofLeft = points.bottomLeft.shift(0, absoluteOptions.neckTieWidth * (1 / 8)) - points.grainlineLeft = points.topLeft.translate( - absoluteOptions.neckTieWidth * (1 / 8), - neckTieLength * (3 / 4) - ) - points.title = points.topLeft.translate( - absoluteOptions.neckTieWidth * (1 / 8), - neckTieLength * (1 / 4) - ) - macro('title', { - at: points.title, - nr: 2, - title: 'neck tie', - scale: 0.2, - }) - switch (options.neckTieColours) { - case 'one': - points.cofRight = points.bottomLeft.shift(0, absoluteOptions.neckTieWidth * (15 / 8)) - points.grainlineRight = points.grainlineLeft.shift( - 0, - absoluteOptions.neckTieWidth * (14 / 8) - ) - paths.foldline = new Path() - .move(points.topMiddle) - .line(points.bottomMiddle) - .attr('data-text', 'Fold-line') - .attr('data-text-class', 'center') - .attr('class', 'various') - break - case 'two': - points.cofRight = points.bottomLeft.shift(0, absoluteOptions.neckTieWidth * (7 / 8)) - points.grainlineRight = points.grainlineLeft.shift( - 0, - absoluteOptions.neckTieWidth * (7 / 8) - ) - } - macro('grainline', { - from: points.grainlineLeft, - to: points.grainlineRight, - }) - macro('cutonfold', { - from: points.cofLeft, - to: points.cofRight, - grainline: true, - }) - if (sa) { - paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') - } - if (paperless) { - macro('vd', { - from: points.bottomLeft, - to: points.topLeft, - x: points.topLeft.x - sa - 20, - }) - macro('hd', { - from: points.topLeft, - to: points.topMiddle, - y: points.topLeft.x - sa - 20, - }) - switch (options.neckTieColours) { - case 'one': - macro('hd', { - from: points.topLeft, - to: points.topRight, - y: points.topLeft.x - sa - 30, - }) - break - case 'two': - } - switch (options.neckTieEnds) { - case 'straight': - macro('hd', { - from: points.topLeft, - to: points.topMiddle, - y: points.topLeft.x - sa - 20, - }) - break - case 'pointed': - macro('vd', { - from: points.topLeft, - to: points.topMiddle, - x: points.topLeft.x - sa - 20, - }) - macro('vd', { - from: points.bottomLeft, - to: points.topMiddle, - x: points.topLeft.x - sa - 30, - }) - } - } - } - - return part -} diff --git a/designs/bee/tests/shared.test.mjs b/designs/bee/tests/shared.test.mjs index 1e2811e157e..86f7eeb56fd 100644 --- a/designs/bee/tests/shared.test.mjs +++ b/designs/bee/tests/shared.test.mjs @@ -1,17 +1,16 @@ -// This file is auto-generated. -// Changes you make will be overwritten. -import Pattern from './dist/index.mjs' +// This file is auto-generated | Any changes you make will be overwritten. +import { Bee } from './dist/index.mjs' // Shared tests -import { testPatternConfig } from '../../../tests/patterns/config.mjs' -import { testPatternDrafting } from '../../../tests/patterns/drafting.mjs' -import { testPatternSampling } from '../../../tests/patterns/sampling.mjs' +import { testPatternConfig } from '../../../tests/designs/config.mjs' +import { testPatternDrafting } from '../../../tests/designs/drafting.mjs' +import { testPatternSampling } from '../../../tests/designs/sampling.mjs' // Test config -testPatternConfig("bee", new Pattern()) +testPatternConfig(Bee) -// Test drafting -testPatternDrafting("bee", Pattern) +// Test drafting - Change the second parameter to `true` to log errors +testPatternDrafting(Bee, true) -// Test sampling -testPatternSampling( "bee", Pattern) +// Test sampling - Change the second parameter to `true` to log errors +testPatternSampling(Bee, false)