1
0
Fork 0

[bee]: Refactor code & fixes (#200)

Closes #105
Closes #76
Closes #148

This is a major clean up and overhaul of Bee's code.

Changes

-     Reinstating the ability to toggle the colours of neck and band tie independently
-     Reinstating the ability to toggle pointed edge of neck and band tie independently
-     Simplify snap options
-     Simplfication of the code
-     Simplify Cutting Instructions
-     Cutlist re-work
-     Hidden tie flag message also now appears when !options.ties
-     Neck tie is no longer hidden when options.pointedNeckTieEnds == true
-     Band tie is no longer hidden when options.crossBackTies == true
-     Band tie is no longer hidden when options.pointedBandTieEnds == true && !options.crossBackTies
-     options.reversible now acts as an override for options.duoNeckTieColours & options.duoBandTieColours
-     options.reversible markdown updated to reflect this
-     Updated neckTieLength when crossBackTies == true this was an error from the original code.
-     Designer note links updated for new options.
-     i18n en.json file updated to reflect change in options

Fixes

-     Neck ties no longer cut on fold (This was an error from when originally coded)
-     Band tie locks in duo colours when options.crossBackTies == true (this is why there were incorrect notch placements)
-     options.bandLength move to neck.mjs
-     Locking Bella options that were added post Bee.

Additions

-     options.duoNeckTieColours
-     options.duoBandTieColours
-     options.pointedNeckTieEnds
-     options.pointedBandTieEnds
-     New option markdown
-     Added snap info to neckTieWidth & bandTieWidth markdown

Removed

-     options.duoTieColors
-     options.pointedTieEnds
-     removed option markdown
-     Hidden tie flag message has had expand flags removed

Things to Note

-     The cut list is not using the mirrored preset to hopefully lessen confusion.

Moving forward, as the original coder of this design, in an effort to maintain the design as intended by the original designer in the future, it would streamline the process and be helpful if any requests for maintenance were sent directly to me.

Reviewed-on: https://codeberg.org/freesewing/freesewing/pulls/200
Reviewed-by: Joost De Cock <joostdecock@noreply.codeberg.org>
Co-authored-by: bobgeorgethe3rd <bobgeorgethe3rd@googlemail.com>
Co-committed-by: bobgeorgethe3rd <bobgeorgethe3rd@googlemail.com>
This commit is contained in:
bobgeorgethe3rd 2025-04-03 16:13:24 +00:00 committed by Joost De Cock
parent 3cba9e4020
commit d973cb4248
15 changed files with 642 additions and 620 deletions

View file

@ -78,29 +78,53 @@
"t": "Band (chest) tie length",
"d": "Controls the length of the ties around your chest"
},
"pointedTieEnds": {
"t": "Pointed tie ends",
"d": "Enable this options if you prefer tie ends to be pointy, rather than straight"
"pointedBandTieEnds": {
"t": "Pointed band tie ends",
"d": "Enable this options if you prefer band tie ends to be pointy, rather than straight"
},
"pointedTieEndsYes": {
"t": "Pointy ends",
"d": "Make the tie ends pointy"
"pointedBandTieEndsYes": {
"t": "Pointy band tie ends",
"d": "Make the band tie ends pointy"
},
"pointedTieEndsNo": {
"t": "Straight ends",
"d": "Make the tie ends straight"
"pointedBandTieEndsNo": {
"t": "Straight band tie ends",
"d": "Make the band tie ends straight"
},
"duoColorTies": {
"t": "Duo-colored ties",
"d": "Enable this option to generate a pattern for bands using two colors instead of one"
"pointedNeckTieEnds": {
"t": "Pointed neck tie ends",
"d": "Enable this options if you prefer neck tie ends to be pointy, rather than straight"
},
"duoColorTiesYes": {
"t": "Two colors",
"d": "Use two colors for the ties"
"pointedNeckTieEndsYes": {
"t": "Pointy neck tie ends",
"d": "Make the neck tie ends pointy"
},
"duoColorTiesNo": {
"t": "Single color",
"d": "Use a single color for the ties"
"pointedNeckTieEndsNo": {
"t": "Straight neck tie ends",
"d": "Make the neck tie ends straight"
},
"duoBandTieColours": {
"t": "Duo-coloured band ties",
"d": "Enable this option to generate a pattern for bands using two band tie colours instead of one"
},
"duoBandTieColoursYes": {
"t": "Two band tie colours",
"d": "Use two band tie colours for the ties"
},
"duoBandTieColoursNo": {
"t": "Single band tie colour",
"d": "Use a single band tie colour for the ties"
},
"duoNeckTieColours": {
"t": "Duo-coloured neck ties",
"d": "Enable this option to generate a pattern for bands using two neck tie colours instead of one"
},
"duoNeckTieColoursYes": {
"t": "Two neck tie colours",
"d": "Use two neck tie colours for the ties"
},
"duoNeckTieColoursNo": {
"t": "Single neck tie colour",
"d": "Use a single neck tie colour for the ties"
},
"neckTieWidth": {
"t": "Neck tie width",
@ -175,4 +199,4 @@
"d": "Create a Bee with where only one side is intended to be worn on the outside"
}
}
}
}

View file

@ -1,21 +1,21 @@
import { pctBasedOn } from '@freesewing/core'
import { cup } from './cup.mjs'
export const bandTie = {
name: 'bee.bandTie',
after: cup,
options: {
//Style
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,
snap: 6.35,
...pctBasedOn('hpsToWaistFront'),
menu: 'style',
},
bandTieLength: { pct: 35, min: 30, max: 50, menu: 'style' },
pointedBandTieEnds: { bool: false, menu: 'style' },
duoBandTieColours: { bool: false, menu: 'style' },
},
draft: ({
store,
@ -25,132 +25,145 @@ export const bandTie = {
Path,
paths,
options,
complete,
macro,
measurements,
snippets,
expand,
Snippet,
paperless,
utils,
absoluteOptions,
part,
}) => {
if (!options.ties && !options.crossBackTies) part.hide()
//lock option
if (options.reversible) options.duoBandTieColours = true
//measures
const bandTieLength = options.crossBackTies
? (measurements.underbust * options.bandLength) / 2 + options.neckTieWidth * 2
: (measurements.underbust + measurements.underbust * options.bandTieLength) / 2
const bandTieWidth = options.crossBackTies
? absoluteOptions.bandTieWidth * 2
: absoluteOptions.bandTieWidth
: (measurements.underbust * (1 + options.bandTieLength)) / 2
const bandTieWidth =
options.crossBackTies || !options.duoBandTieColours
? absoluteOptions.bandTieWidth * 2
: absoluteOptions.bandTieWidth
/*
* Don't bother unless expand is set
*/
if (!expand) {
points.text = new Point(10, 10)
.addText('bee:cutBandTie', 'fill-note')
.addText(':')
.addText(utils.units((bandTieWidth + sa) * 2))
.addText(' x ')
.addText(utils.units(bandTieLength))
paths.diag = new Path().move(new Point(0, 0)).line(new Point(100, 15)).addClass('hidden')
if (((!expand && !options.pointedBandTieEnds) || !options.ties) && !options.crossBackTies) {
const extraSa = sa ? 2 * sa : 0
store.flag.note({
msg: `bee:cutBandTie`,
notes: [sa ? 'flag:saIncluded' : 'flag:saExcluded'],
replace: {
width: utils.units(bandTieWidth + extraSa),
length: utils.units(bandTieLength * 2),
},
})
return part
}
//let's begin
points.topLeft = new Point(0, 0)
points.topRight = new Point(bandTieWidth * 2, points.topLeft.y)
points.topRight = new Point(bandTieWidth, points.topLeft.y)
points.bottomLeft = new Point(points.topLeft.x, bandTieLength)
points.bottomRight = new Point(points.topRight.x, bandTieLength)
points.bottomRight = new Point(points.topRight.x, points.bottomLeft.y)
points.topMid = new Point(points.topRight.x / 2, points.topLeft.y)
points.bottomMid = new Point(points.topMid.x, points.bottomLeft.y)
points.topMiddle = new Point(bandTieWidth, points.topLeft.y)
if (!options.crossBackTies && options.pointedTieEnds) points.topMiddle.y -= bandTieWidth
points.topPeak =
options.crossBackTies || !options.pointedBandTieEnds
? points.topMid
: options.duoBandTieColours
? points.topRight.shift(90, bandTieWidth)
: points.topMid.shift(90, bandTieWidth / 2)
//paths
paths.seam = new Path()
.move(points.bottomRight)
.line(points.topRight)
.line(points.topPeak)
.line(points.topLeft)
.line(points.bottomLeft)
.close()
.addClass('fabric')
points.bottomMiddle = new Point(points.topMiddle.x, bandTieLength)
if (sa) paths.sa = paths.seam.offset(sa).close().addClass('fabric sa')
paths.seam = options.duoColorTies
? new Path().move(points.bottomMiddle)
: new Path().move(points.bottomRight).line(points.topRight)
paths.seam.line(points.topMiddle).line(points.topLeft).line(points.bottomLeft).close()
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
/*
* Annotations
*/
// Cut list
if (options.crossBackTies) store.cutlist.addCut({ cut: 1, from: 'fabric' })
else store.cutlist.addCut({ cut: 2, from: 'fabric' })
points.cofLeft = points.bottomLeft.shift(0, bandTieWidth * (1 / 8))
points.grainlineLeft = points.topLeft.translate(bandTieWidth * (1 / 8), bandTieLength * (3 / 4))
// Title
points.title = points.topLeft.translate(bandTieWidth * (1 / 8), bandTieLength * (1 / 4))
//detail
//grainline
points.cutOnFoldFrom = points.bottomLeft
points.cutOnFoldTo = points.bottomRight
macro('cutonfold', {
from: points.cutOnFoldFrom,
to: points.cutOnFoldTo,
grainline: true,
})
//cutlist
store.cutlist.addCut({ cut: 1, from: 'fabric', onfold: 'true' })
if (options.duoBandTieColours && !options.crossBackTies)
store.cutlist.addCut({ cut: 1, from: 'constrast', onfold: 'true' })
//notches
if (options.crossBackTies) {
points.sideNotchLeft = points.bottomLeft.shift(90, store.get('cupWidth'))
points.sideNotchRight = points.sideNotchLeft.flipX(points.topMid)
macro('sprinkle', {
snippet: 'notch',
on: ['bottomRight', 'sideNotchLeft', 'sideNotchRight'],
})
}
//title
points.title = points.topLeft.translate(bandTieWidth / 8, bandTieLength / 4)
macro('title', {
at: points.title,
nr: 3,
title: options.crossBackTies ? 'band' : 'bandTie',
scale: 0.7,
scale: 0.5,
})
// Foldline
if (options.duoColorTies) {
points.cofRight = points.bottomLeft.shift(0, bandTieWidth * (7 / 8))
points.grainlineRight = points.grainlineLeft.shift(0, bandTieWidth * (7 / 8))
} else {
points.cofRight = points.bottomLeft.shift(0, bandTieWidth * (15 / 8))
points.grainlineRight = points.grainlineLeft.shift(0, bandTieWidth * (14 / 8))
if (complete)
paths.foldline = new Path()
.move(points.bottomMiddle)
.line(points.topMiddle)
.addText('foldLine', 'center fill-note text-sm')
.attr('class', 'note help')
//fold-line
if (options.crossBackTies || !options.duoBandTieColours) {
paths.foldline = new Path()
.move(points.topPeak)
.line(points.bottomMid)
.addText('foldLine', 'center fill-note text-sm')
.addClass('note help')
}
//paperless
if (paperless) {
macro('vd', {
from: points.topLeft,
to: points.bottomLeft,
x: points.topLeft.x - sa - 15,
id: 'vd0',
})
macro('hd', {
from: points.bottomLeft,
to: points.bottomRight,
y: points.bottomLeft.y + sa + 15,
id: 'hd0',
})
// Grainline
macro('grainline', {
from: points.grainlineLeft,
to: points.grainlineRight,
classes: {
text: 'text-sm fill-note',
line: 'stroke-sm',
},
})
// Cut on fold
macro('cutonfold', {
from: points.cofLeft,
to: points.cofRight,
offset: 10,
classes: {
text: 'text-sm center fill-note',
line: 'stroke-sm note',
},
})
if (complete && 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)
if (options.pointedBandTieEnds && !options.crossBackTies) {
macro('vd', {
from: points.topPeak,
to: points.topLeft,
x: points.topLeft.x - sa - 15,
id: 'vdP0',
})
macro('vd', {
from: points.topPeak,
to: points.bottomLeft,
x: points.topLeft.x - sa - 30,
id: 'vdP1',
})
if (!options.duoBandTieColours) {
macro('hd', {
from: points.topLeft,
to: points.topPeak,
y: points.topPeak.y - sa - 15,
id: 'hdP0',
})
}
}
}
macro('vd', {
id: 'hLeft',
from: points.bottomLeft,
to: points.topLeft,
x: points.topLeft.x - sa - 20,
})
macro('hd', {
id: 'wTop',
from: points.topLeft,
to: options.duoColorties ? points.middleRight : points.topRight,
y: points.topLeft.x - sa - 20,
})
return part
},
}
}

View file

@ -11,163 +11,79 @@ export const cup = {
after: neckTie,
measurements: ['bustPointToUnderbust'],
options: {
//Bee's
//Constant
backArmholeCurvature: 0.63, //Altered from Bella
backArmholePitchDepth: 0.35, //Altered from Bella
backArmholeSlant: 5, //Altered from Bella
frontArmholeCurvature: 0.63, //Altered from Bella
bustDartCurve: 1, //Altered from Bella
bustDartLength: 1, //Altered from Bella
waistDartLength: 1, //Altered from Bella
backHemSlope: 2.5, //Altered from Bella
backNeckCutout: 0.06, //Altered from Bella
bustDartAngle: 0, //Altered from Bella
waistDartCurve: 1, //Altered from Bella
bustDartMinimumFabric: 0.05, //Altered from Bella
//Fit
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' },
pointedTieEnds: { bool: false, menu: 'style' },
duoColorTies: { bool: false, menu: 'style' },
//changed from Bella
backArmholeCurvature: 0.63,
backArmholePitchDepth: 0.35,
backArmholeSlant: 5,
frontArmholeCurvature: 0.63,
bustDartCurve: 1,
bustDartLength: 1,
waistDartLength: 1,
waistDartCurve: 1,
backHemSlope: 2.5,
backNeckCutout: 0.06,
bustDartAngle: 0,
bustDartMinimumFabric: 0,
//catergory changed from Bella
armholeDepth: { pct: 44, min: 38, max: 46, menu: 'advanced' },
frontArmholePitchDepth: { pct: 29, max: 31, min: 27, menu: 'advanced' },
backDartHeight: { pct: 46, min: 38, max: 54, menu: 'advanced' },
frontShoulderWidth: { pct: 95, max: 98, min: 92, menu: 'advanced' },
highBustWidth: { pct: 86, max: 92, min: 80, menu: 'advanced' },
//Style
bandTieLength: { pct: 35, min: 30, max: 50, menu: 'style' },
//Advanced
armholeDepth: { pct: 44, min: 38, max: 46, menu: 'advanced' }, //moved from Bella
frontArmholePitchDepth: { pct: 29, max: 31, min: 27, menu: 'advanced' }, //moved from Bella
backDartHeight: { pct: 46, min: 38, max: 54, menu: 'advanced' }, //moved from Bella
frontShoulderWidth: { pct: 95, max: 98, min: 92, menu: 'advanced' }, //moved from Bella
highBustWidth: { pct: 86, max: 92, min: 80, menu: 'advanced' }, //moved from Bella
},
draft: ({
store,
sa,
points,
Point,
Path,
paths,
options,
complete,
macro,
utils,
measurements,
snippets,
Snippet,
absoluteOptions,
paperless,
expand,
part,
}) => {
/*
* Cleaning up paths and snippets from Bella
*/
for (let i in paths) delete paths[i]
for (let i in snippets) delete snippets[i]
/*
* Removing macros from Bella
*/
//removing paths and snippets not required from Bella
for (const i in paths) delete paths[i]
for (const i in snippets) delete snippets[i]
//removing macros not required from Bella
macro('rmtitle')
macro('rmscalebox')
macro('rmcutonfold')
//measurements
const cupWidth = measurements.bustPointToUnderbust * (1 + options.bottomCupDepth)
const bandTieWidth = options.crossBackTies ? 0 : absoluteOptions.bandTieWidth
//rotate to close bust dart
points.bustDartClosed = points.bustDartTop
/*
* Bella alterations
*/
points.sideHemNew = points.armhole.shiftOutwards(
points.bustDartTop,
points.bustDartBottom.dist(points.sideHemInitial)
)
points.waistDartRightRotated = points.waistDartRight.rotate(
store.get('bustDartAngleSide'),
points.bust
)
// Bikini top
const 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),
const rot = ['waistDartRightCp', 'waistDartRight', 'sideHemInitial']
for (const p of rot) points[p] = points[p].rotate(store.get('bustDartAngleSide'), points.bust)
points.sideHem = utils.beamsIntersect(
points.waistDartRight,
points.sideHemInitial,
points.armhole,
points.sideHemNew
points.bustDartClosed
)
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
)
points.bottomEdge = options.crossBackTies
? new Path()
.move(points.lefti)
.curve_(points.leftControlOffset, points.middleDart)
.curve_(points.rightControlOffset, points.rightiOffset)
.edge('bottom')
: new Path()
.move(points.frontEdge)
.curve_(points.leftControl, points.casingDart)
.curve_(points.rightControl, points.sideEdge)
.edge('bottom')
//guide
if (options.bellaGuide) {
paths.bellaGuide = new Path()
.move(points.sideHemNew)
.move(points.sideHem)
.line(points.bustDartTop)
.line(points.armhole)
.curve(points.armholeCp2, points.armholePitchCp1, points.armholePitch)
@ -176,253 +92,311 @@ export const cup = {
.curve(points.hpsCp2, points.cfNeckCp1, points.cfNeck)
.line(points.cfHem)
.line(points.waistDartLeft)
.line(points.bustA)
.line(points.waistDartRightRotated)
.line(points.sideHemNew)
.addClass('note help')
.line(points.bust)
.line(points.waistDartRight)
.line(points.sideHem)
.addClass('various lashed')
.close()
}
//let's begin
points.topMid = points.bust.shiftTowards(points.hps, measurements.hpsToBust * options.topDepth)
points.topLeft = points.topMid.shift(
points.topMid.angle(points.hps) + 90,
absoluteOptions.neckTieWidth / 2
)
points.topRight = points.topMid.shift(
points.topMid.angle(points.hps) - 90,
absoluteOptions.neckTieWidth / 2
)
points.leftDart = points.bust.shiftTowards(points.waistDartLeft, cupWidth)
points.rightDart = points.bust.shiftTowards(points.waistDartRight, cupWidth)
points.bottomLeft = utils.beamsIntersect(
points.leftDart,
points.bust.rotate(90, points.leftDart),
points.cfNeck,
points.cfHem
)
points.bottomRightAnchor = utils.beamsIntersect(
points.rightDart,
points.bust.rotate(-90, points.rightDart),
points.armhole,
points.sideHem
)
points.bottomRight = points.bottomRightAnchor.shiftFractionTowards(
points.rightDart,
options.sideDepth
)
points.sideEdge = points.bottomRight.shift(points.armhole.angle(points.sideHem), bandTieWidth)
points.frontEdge = points.bottomLeft.shift(points.cfNeck.angle(points.cfHem), bandTieWidth)
points.bottomDart = points.bust.shift(
points.bust.angle(points.leftDart) +
(points.bust.angle(points.rightDart) - points.bust.angle(points.leftDart)) / 2,
points.bust.dist(points.leftDart)
)
points.dartEdge = points.bust.shiftOutwards(points.bottomDart, bandTieWidth)
points.frontEdgeCp2 = utils.beamsIntersect(
points.dartEdge,
points.dartEdge.shift(points.bust.angle(points.bottomDart) - 90, 10),
points.cfNeck,
points.cfHem
)
points.sideEdgeCp2Target = utils.beamsIntersect(
points.dartEdge,
points.dartEdge.shift(points.bust.angle(points.bottomDart) + 90, 10),
points.armhole,
points.sideHem
)
points.frontEdgeCp2 = points.dartEdge.shiftFractionTowards(points.frontEdgeCp2, 0.5)
points.sideEdgeCp1 = points.dartEdge.shiftFractionTowards(points.sideEdgeCp2Target, 0.5)
points.middleSideFront = points.bottomRight.shiftFractionTowards(points.topRight, 0.5)
points.bottomRightCp2 = points.middleSideFront.shiftFractionTowards(
points.bust,
options.sideCurve
)
points.middleFront = points.topLeft.shiftFractionTowards(points.bottomLeft, 0.5)
points.bottomLeftCp1 = points.middleFront.shiftFractionTowards(points.bust, options.frontCurve)
points.bottomLeftCp2 = points.frontEdgeCp2.shiftTowards(points.topMid, bandTieWidth)
points.bottomRightCp1 = points.sideEdgeCp1.shiftTowards(points.topMid, bandTieWidth)
//paths
paths.seam = new Path()
.move(points.sideEdge)
.line(points.bottomRight)
.curve_(points.bottomRightCp2, points.topRight)
.line(points.topLeft)
.curve_(points.bottomLeftCp1, points.bottomLeft)
.line(points.frontEdge)
.curve_(points.frontEdgeCp2, points.dartEdge)
.curve_(points.sideEdgeCp1, points.sideEdge)
.close()
.addClass('fabric')
paths.seam = options.crossBackTies
? 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()
: 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 (sa) paths.sa = paths.seam.offset(sa).close().addClass('fabric sa')
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
//stores
if (options.crossBackTies) {
points.leftSplit = utils.lineIntersectsCurve(
points.bust,
points.waistDartLeft,
points.frontEdge,
points.frontEdgeCp2,
points.dartEdge,
points.dartEdge
)
points.rightSplit = utils.lineIntersectsCurve(
points.bust,
points.waistDartRight,
points.dartEdge,
points.sideEdgeCp1,
points.sideEdge,
points.sideEdge
)
paths.bottomCurve = new Path()
.move(points.bottomLeft)
.line(points.frontEdge)
.curve_(points.frontEdgeCp2, points.dartEdge)
.curve_(points.sideEdgeCp1, points.sideEdge)
.hide()
store.set(
'cupWidth',
paths.bottomCurve.split(points.leftSplit)[0].length() +
paths.bottomCurve.split(points.rightSplit)[1].length()
)
}
/*
* Annotations
*/
// Cut list
// Removing the cutonfold indicator should do the trick, but it does not
// So I am setting ignoreOnFold below until I fix this
macro('rmcutonfold')
store.cutlist.addCut({ cut: 2, material: 'fabric', ignoreOnFold: true })
points.gridAnchor = points.lefti
if (options.reversible)
store.cutlist.addCut({ cut: 2, material: 'altFabric1', ignoreOnFold: true })
// Grainline
points.grainlineTop = points.top.shiftFractionTowards(points.bustA, 0.05)
points.grainlineBottom = points.bustA.shiftFractionTowards(points.top, 0.05)
//details
//grainline
points.grainlineFrom = points.topMid.shiftFractionTowards(points.bust, 0.05)
points.grainlineTo = points.bust.shiftFractionTowards(points.topMid, 0.05)
macro('grainline', {
from: points.grainlineTop,
to: points.grainlineBottom,
from: points.grainlineFrom,
to: points.grainlineTo,
})
// Notches
points.frontNotch = new Path()
//cutlist
if (options.reversible) {
store.cutlist.setCut({ cut: 2, from: 'fabric', identical: 'true' })
store.cutlist.addCut({ cut: 2, from: 'constrast', identical: 'true' })
} else {
store.cutlist.setCut({ cut: 4, from: 'fabric', identical: 'true' })
}
//notches
paths.frontCurve = new Path()
.move(points.topLeft)
.curve_(points.frontCurveControl, points.lefti)
.shiftFractionAlong(0.5)
snippets.frontNotch = new Snippet('notch', points.frontNotch)
snippets.lefti = new Snippet('notch', points.lefti)
snippets.righti = new Snippet('notch', points.rightiOffset)
// Title
.curve_(points.bottomLeftCp1, points.bottomLeft)
.hide()
points.frontNotch = paths.frontCurve.shiftFractionAlong(0.5)
macro('sprinkle', {
snippet: 'notch',
on: ['frontNotch', 'bottomLeft', 'bottomRight'],
})
if (!options.crossBackTies) {
macro('sprinkle', {
snippet: 'notch',
on: ['frontEdge', 'sideEdge'],
})
//casingLine
paths.casingline = new Path()
.move(points.bottomLeft)
.curve_(points.bottomLeftCp2, points.bottomDart)
.curve_(points.bottomRightCp1, points.bottomRight)
.addClass('fabric lashed')
.addText('bee:casingStitchingLine', 'center')
}
//title
points.title = points.bottomLeftCp1.shiftFractionTowards(points.bottomRight, 0.5)
macro('title', {
at: points.grainlineBottom,
at: points.title,
nr: 1,
title: 'cup',
scale: 0.7,
})
if (!options.crossBackTies) {
snippets.frontEdge = new Snippet('notch', points.frontEdge)
snippets.sideEdge = new Snippet('notch', points.sideEdge)
}
// Scalebox
points.scalebox = points.grainlineBottom.shift(180, 30)
//scalebox
points.scalebox = new Point(points.bottomLeft.x + 12.7, points.topLeft.y + 12.7)
macro('miniscale', { at: points.scalebox })
// Logo
points.logo = points.grainlineTop.shiftFractionTowards(points.grainlineBottom, 0.3)
snippets.logo = new Snippet('logo', points.logo).scale(0.7)
// Conditional annotations
if (complete && !options.crossBackTies) {
paths.casingline = new Path()
.move(points.lefti)
.curve_(points.leftControlOffset, points.middleDart)
.curve_(points.rightControlOffset, points.rightiOffset)
.attr('class', 'fabric lashed')
.addText('bee:casingStitchingLine', 'center')
}
if (complete && !options.ties) {
points.neckTieLength = points.grainlineBottom
.shift(-90, 42)
.addText('bee:neckTieLength')
.addText(':')
.addText(utils.units(store.get('neckTieLength')))
//logo
points.logo = points.bust.shiftFractionTowards(points.bottomDart, 0.5)
snippets.logo = new Snippet('logo', points.logo).attr('data-scale', 0.7)
//tie measures
if (!options.ties || !expand) {
points.neckTieLength = points.topLeft
.shiftFractionTowards(points.bottomLeft, 0.7)
.addText('Neck Tie Length: ' + utils.units(store.get('neckTieLength')))
if (!options.crossBackTies) {
points.backTieLength = points.grainlineBottom
.shift(-90, 49)
.addText('bee:bandTieLength')
.addText(':')
points.backTieLength = points.topLeft
.shiftFractionTowards(points.bottomLeft, 0.8)
.addText(
utils.units(measurements.underbust + measurements.underbust * options.bandTieLength)
'Band Tie Length: ' + utils.units(measurements.underbust * (1 + options.bandTieLength))
)
}
}
// Dimensions
if (!options.crossBackTies) {
//paperless
if (paperless) {
//vertical distances
macro('vd', {
from: points.frontEdge,
to: points.lefti,
x: points.frontEdge.x - sa - 15,
id: 'hCasing',
from: points.bottomLeft,
to: paths.seam.bbox().bottomRight,
x: points.bottomLeft.x - sa - 15,
id: 'vd0',
})
macro('vd', {
from: points.frontEdge,
to: points.topRight,
x: points.frontEdge.x - sa - 30,
id: 'hLeft',
from: points.topMid,
to: points.bottomLeft,
x: points.bottomLeft.x - sa - 15,
id: 'vd1',
})
macro('vd', {
from: points.topRight,
to: paths.seam.bbox().bottomRight,
x: points.bottomLeft.x - sa - 30,
id: 'vd3',
})
macro('vd', {
from: points.topRight,
to: points.bottomRight,
x: points.sideEdge.x + sa + 15,
id: 'vd4',
})
}
macro('vd', {
from: points.lefti,
to: points.topLeft,
x: points.frontEdge.x - sa - 15,
id: 'hNoCasing',
})
macro('hd', {
from: points.topLeft,
to: points.topRight,
y: points.topRight.y - sa - 15,
id: 'tipWidth',
})
macro('hd', {
from: points.lefti,
to: points.topLeft,
y: points.topRight.y - sa - 15,
id: 'wLeftToTip',
})
macro('hd', {
from: points.topRight,
to: points.rightiOffset,
y: points.topRight.y - sa - 15,
id: 'wTipToRight',
})
macro('hd', {
from: points.frontEdge,
to: options.crossBackTies ? points.rightiOffset : points.sideEdge,
y: points.topRight.y - sa - 30,
id: 'wpToRight',
})
macro('vd', {
from: points.topRight,
to: options.crossBackTies ? points.rightiOffset : points.sideEdge,
x: points.sideEdge.x + sa + 20,
id: 'sdfsd',
})
if (!options.crossBackTies) {
macro('vd', {
id: 'hIncorrectEdgeRight',
from: points.sideEdge,
to: points.casingDart,
x: points.sideEdge.x + sa + 10,
to: paths.seam.bbox().bottomRight,
x: points.sideEdge.x + sa + 15,
id: 'vd5',
})
macro('vd', {
from: points.topRight,
to: paths.seam.bbox().bottomRight,
x: points.sideEdge.x + sa + 30,
id: 'vd6',
})
macro('vd', {
from: points.topMid,
to: points.dartEdge,
x: points.topMid.x,
id: 'vd7',
})
//horizontal distances
macro('hd', {
from: points.bottomLeft,
to: points.topLeft,
y: points.topLeft.y - sa - 15,
id: 'hd0',
})
macro('hd', {
id: 'wBottomHalfRight',
from: points.casingDart,
from: points.topLeft,
to: points.topRight,
y: points.topRight.y - sa - 30,
id: 'hd1',
})
macro('hd', {
from: points.topRight,
to: points.bottomRight,
y: points.topRight.y - sa - 15,
id: 'hd2',
})
macro('hd', {
from: points.bottomLeft,
to: points.sideEdge,
y: points.casingDart.y + sa + 20,
y: points.topRight.y - sa - 45,
id: 'hd3',
})
macro('hd', {
from: points.topMid,
to: points.dartEdge,
y: points.dartEdge.y,
id: 'hd4',
})
macro('hd', {
id: 'wBottomHalfLeft',
from: points.frontEdge,
to: points.casingDart,
y: points.casingDart.y + sa + 20,
})
macro('vd', {
id: 'hLeft',
from: points.bottomEdge,
to: points.topRight,
x: points.frontEdge.x - sa - 40,
})
}
if (options.crossBackTies) {
macro('vd', {
from: points.rightiOffset,
to: points.bottomEdge,
x: points.sideEdge.x + sa + 10,
to: points.dartEdge,
y: points.dartEdge.y + sa + 15,
id: 'hd5',
})
macro('hd', {
from: points.rightiOffset,
to: points.middleDart,
y: points.casingDart.y + sa + 20,
from: points.dartEdge,
to: paths.seam.bbox().bottomRight,
y: points.dartEdge.y + sa + 15,
id: 'hd6',
})
macro('hd', {
from: points.middleDart,
to: points.lefti,
y: points.casingDart.y + sa + 20,
from: points.frontEdge,
to: paths.seam.bbox().bottomRight,
y: points.dartEdge.y + sa + 30,
id: 'hd7',
})
macro('vd', {
from: points.bottomEdge,
to: points.lefti,
x: points.frontEdge.x - sa - 10,
})
macro('vd', {
from: points.bottomEdge,
//linear distances
macro('ld', {
from: points.topLeft,
to: points.topRight,
x: points.frontEdge.x - sa - 30,
d: sa + 15,
id: 'ld0',
})
}
macro('ld', {
from: points.rightiOffset,
to: points.righti,
})
if (complete && options.crossBackTies) {
paths.curve = new Path()
.move(points.lefti)
.curve_(points.leftControlOffset, points.middleDart)
.curve_(points.rightControlOffset, points.rightiOffset)
.hide()
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))
)
.hide()
for (let p of paths.curve.intersects(paths.dart)) {
points.rightDarti = points.bustA.shiftFractionTowards(p, 1)
macro('ld', {
from: points.topMid,
to: points.dartEdge,
id: 'ld1',
})
//crossBackTies distances
if (!options.crossBackTies) {
macro('vd', {
from: points.bottomLeft,
to: points.frontEdge,
x: points.bottomLeft.x - sa - 15,
id: 'vdC0',
})
macro('vd', {
from: points.bottomRight,
to: points.sideEdge,
x: points.sideEdge.x + sa + 15,
id: 'vdC1',
})
macro('hd', {
from: points.bottomRight,
to: points.sideEdge,
y: points.topRight.y - sa - 15,
id: 'hdC0',
})
}
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].hide()
}
let rightCurve = paths.curve.split(points.rightDarti)
for (let i in rightCurve) {
paths.rightCurve = rightCurve[i].hide()
}
store.set('gatherLength', paths.leftCurve.length() + paths.rightCurve.length())
}
return part
},
}
}

View file

@ -4,6 +4,7 @@ export const neckTie = {
name: 'bee.neckTie',
measurements: ['underbust', 'hpsToBust', 'hpsToWaistFront'],
options: {
//Style
ties: { bool: true, menu: 'style' },
crossBackTies: { bool: false, menu: 'style' },
bandLength: { pct: 85, min: 75, max: 90, menu: 'style' },
@ -12,13 +13,12 @@ export const neckTie = {
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],
},
snap: 6.35,
menu: 'style',
...pctBasedOn('bustSpan'),
},
pointedNeckTieEnds: { bool: false, menu: 'style' },
duoNeckTieColours: { bool: false, menu: 'style' },
reversible: { bool: false, menu: 'style' },
},
draft: ({
@ -30,162 +30,142 @@ export const neckTie = {
paths,
options,
units,
complete,
paperless,
macro,
measurements,
expand,
absoluteOptions,
part,
}) => {
if (!options.ties) part.hide()
//lock option
if (options.reversible) options.duoNeckTieColours = true
//measures
const neckTieLength = options.crossBackTies
? (Math.sqrt(
? 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
: (measurements.hpsToBust + measurements.hpsToBust * options.neckTieLength) / 2
store.set('neckTieLength', neckTieLength * 2)
Math.pow(
(measurements.underbust * options.bandLength - measurements.underbust * 0.5) * 0.5,
2
)
) *
(1 + options.neckTieLength)
: measurements.hpsToBust * (1 + options.neckTieLength)
const neckTieWidth = options.duoNeckTieColours
? absoluteOptions.neckTieWidth
: absoluteOptions.neckTieWidth * 2
store.set('neckTieLength', neckTieLength)
/*
* Don't bother unless expand is set
*/
if (!expand) {
if ((!expand && !options.pointedNeckTieEnds) || !options.ties) {
const extraSa = sa ? 2 * sa : 0
store.flag.note({
msg: `bee:cutNeckTie`,
notes: [sa ? 'flag:saIncluded' : 'flag:saExcluded', 'flag:partHiddenByExpand'],
notes: [sa ? 'flag:saIncluded' : 'flag:saExcluded'],
replace: {
width: units(absoluteOptions.neckTieWidth * 2 + extraSa),
length: units(neckTieLength * 2),
},
suggest: {
text: 'flag:show',
icon: 'expand',
update: {
settings: ['expand', 1],
},
width: units(neckTieWidth + extraSa),
length: units(neckTieLength),
},
})
// Also hint about expand
store.flag.preset('expand')
return part.hide()
}
//let's begin
points.topLeft = new Point(0, 0)
points.topRight = new Point(absoluteOptions.neckTieWidth * 2, points.topLeft.y)
points.topRight = new Point(neckTieWidth, points.topLeft.y)
points.bottomLeft = new Point(points.topLeft.x, neckTieLength)
points.bottomRight = new Point(points.topRight.x, neckTieLength)
points.bottomRight = new Point(points.topRight.x, points.bottomLeft.y)
points.topMid = new Point(neckTieWidth / 2, points.topLeft.y)
points.bottomMid = new Point(points.topMid.x, points.bottomLeft.y)
points.topMiddle = options.pointedTieEnds
? new Point(absoluteOptions.neckTieWidth, points.topLeft.y - absoluteOptions.neckTieWidth)
: new Point(absoluteOptions.neckTieWidth, points.topLeft.y)
points.topPeak = options.pointedNeckTieEnds
? options.duoNeckTieColours
? points.topRight.shift(90, neckTieWidth)
: points.topMid.shift(90, neckTieWidth / 2)
: points.topMid
points.bottomMiddle = new Point(points.topMiddle.x, neckTieLength)
//paths
paths.seam = new Path()
.move(points.bottomLeft)
.line(points.bottomRight)
.line(points.topRight)
.line(points.topPeak)
.line(points.topLeft)
.line(points.bottomLeft)
.close()
.addClass('fabric')
paths.seam = options.duoColorTies
? new Path()
.move(points.bottomMiddle)
.line(points.topMiddle)
.line(points.topLeft)
.line(points.bottomLeft)
.close()
.addClass('fabric')
: new Path()
.move(points.bottomRight)
.line(points.topRight)
.line(points.topMiddle)
.line(points.topLeft)
.line(points.bottomLeft)
.close()
.addClass('fabric')
if (sa) paths.sa = paths.seam.offset(sa).close().addClass('fabric sa')
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
/*
* Annotations
*/
points.cofLeft = points.bottomLeft.shift(0, absoluteOptions.neckTieWidth * (1 / 8))
points.grainlineLeft = points.topLeft.translate(
absoluteOptions.neckTieWidth * (1 / 8),
neckTieLength * (3 / 4)
)
// Cut list
if (options.reversible) {
store.cutlist.addCut({ cut: 2, from: 'fabric', onFold: true })
store.cutlist.addCut({ cut: 2, from: 'altFabric1', onFold: true })
} else {
store.cutlist.addCut({ cut: 4, from: 'fabric', onFold: true })
}
// Title
//details
//grainline
points.grainlineFrom = points.topLeft.shift(0, absoluteOptions.neckTieWidth / 2)
points.grainlineTo = new Point(points.grainlineFrom.x, points.bottomLeft.y)
macro('grainline', {
from: points.grainlineFrom,
to: points.grainlineTo,
})
//cutlist
store.cutlist.addCut({ cut: 2, from: 'fabric', identical: 'true' })
if (options.duoNeckTieColours)
store.cutlist.addCut({ cut: 2, from: 'constrast', identical: 'true' })
//title
points.title = points.topLeft.translate(
absoluteOptions.neckTieWidth * (1 / 8),
neckTieLength * (1 / 4)
absoluteOptions.neckTieWidth / 8,
points.bottomLeft.y / 4
)
macro('title', {
at: points.title,
nr: 2,
title: 'neck tie',
scale: 0.5,
title: 'neckTie',
scale: 0.2,
})
if (options.duoColorTies) {
points.cofRight = points.bottomLeft.shift(0, absoluteOptions.neckTieWidth * (7 / 8))
points.grainlineRight = points.grainlineLeft.shift(0, absoluteOptions.neckTieWidth * (7 / 8))
} else {
points.cofRight = points.bottomLeft.shift(0, absoluteOptions.neckTieWidth * (15 / 8))
points.grainlineRight = points.grainlineLeft.shift(0, absoluteOptions.neckTieWidth * (14 / 8))
if (complete)
paths.foldline = new Path()
.move(points.bottomMiddle)
.line(points.topMiddle)
.addText('foldLine', 'center fill-note text-sm')
.addClass('note help')
//fold line
if (!options.duoNeckTieColours) {
paths.foldline = new Path()
.move(points.topPeak)
.line(points.bottomMid)
.addText('foldLine', 'center fill-note text-sm')
.attr('class', 'note help')
}
//paperless
if (paperless) {
macro('vd', {
from: points.topLeft,
to: points.bottomLeft,
x: points.topLeft.x - sa - 15,
id: 'vd0',
})
macro('hd', {
from: points.bottomLeft,
to: points.bottomRight,
y: points.bottomLeft.y + sa + 15,
id: 'hd0',
})
if (options.pointedNeckTieEnds) {
macro('vd', {
from: points.topPeak,
to: points.topLeft,
x: points.topLeft.x - sa - 15,
id: 'vdP0',
})
macro('vd', {
from: points.topPeak,
to: points.bottomLeft,
x: points.topLeft.x - sa - 30,
id: 'vdP1',
})
if (!options.duoNeckTieColours) {
macro('hd', {
from: points.topLeft,
to: points.topPeak,
y: points.topPeak.y - sa - 15,
id: 'hdP0',
})
}
}
}
// Grainline
macro('grainline', {
from: points.grainlineLeft,
to: points.grainlineRight,
classes: {
text: 'text-sm fill-note',
line: 'stroke-sm',
},
})
// Cut on fold
macro('cutonfold', {
from: points.cofLeft,
to: points.cofRight,
offset: 10,
classes: {
text: 'text-sm center fill-note',
line: 'stroke-sm note',
},
})
// Dimensions
macro('vd', {
id: 'hLeft',
from: points.bottomLeft,
to: points.topMiddle,
x: points.topLeft.x - sa - 20,
})
macro('hd', {
id: 'wTop',
from: points.topLeft,
to: options.duoColorTies ? points.topMiddle : points.topRight,
y: points.topLeft.x - sa - 20,
})
return part
},
}
}

View file

@ -3,7 +3,7 @@ It is based on a garment they made and wanted to make available for other people
We worked of FreeSewing's body block Bella as a base, converting it to a single dart block to make the top.
During pattern testing one of our contributors TangerineShark made a variant with crossover back ties which we found so cool we added it to Bee!
You can get this variation by using [option Cross Back Ties](/docs/designs/bee/options#crossbackties).
Bee can also be made reversible by using options [Reversible](/docs/designs/bee/options#reversible) & [Duo Colours Ties](/docs/designs/bee/options#duocolorties).
Bee can also be made reversible by using options [Reversible](/docs/designs/bee/options#reversible), [Duo neck colour ties](/docs/designs/bee/options#duonecktiecolours) & [Duo band colour ties](/docs/designs/bee/options#duobandtiecolours).
With the previous pattern being retired you can use [Uma](/docs/designs/uma) to make a matching bikini bottom.
bobgeorgethe3rd

View file

@ -3,3 +3,9 @@ title: 'Band (chest) tie width'
---
Controls the width of the tie/band around your chest
:::note
This is a snap option and will snap to the nearest 1/4"
:::

View file

@ -0,0 +1,14 @@
---
title: Duo band tie colours
---
This option allows you to generate a pattern where the band ties use two colours rather than one.
Enable this option if you want band ties using two colours.
Leave it disabled (the default) if you want band ties using a single colour.
:::note
This is unavailable when using the cross back tie variation
:::

View file

@ -1,8 +0,0 @@
---
title: Duo color ties
---
This option allows you to generate a pattern where the ties use two colors rather than one.
Enable this option if you want ties using two colors.
Leave it disabled (the default) if you want ties using a single color.

View file

@ -0,0 +1,8 @@
---
title: Duo neck tie colours
---
This option allows you to generate a pattern where the neck ties use two colours rather than one.
Enable this option if you want neck ties using two colours.
Leave it disabled (the default) if you want neck ties using a single colour.

View file

@ -3,3 +3,9 @@ title: 'Neck tie width'
---
Controls the width of the ties around your neck
:::note
This is a snap option and will snap to the nearest 1/4"
:::

View file

@ -0,0 +1,8 @@
---
title: Pointed band tie ends
---
This option allows you to generate a pattern where the band ties have a pointy end, rather than a straight one.
Enable this option if you want your band ties to have pointy ends.
Disable this option (the default) if you want your band ties to have straight ends.

View file

@ -0,0 +1,8 @@
---
title: Pointed neck tie ends
---
This option allows you to generate a pattern where the neck ties have a pointy end, rather than a straight one.
Enable this option if you want your neck ties to have pointy ends.
Disable this option (the default) if you want your neck ties to have straight ends.

View file

@ -1,8 +0,0 @@
---
title: Pointed tie ends
---
This option allows you to generate a pattern where the ties have a pointy end, rather than a straight one.
Enable this option if you want your ties to have pointy ends.
Disable this option (the default) if you want your ties to have straight ends.

View file

@ -3,3 +3,10 @@ title: Reversible
---
Whether you want to make a fully reversible Bee or not.
:::note
This option reconfigures and locks other options to allow for a reversible Bee.
:::

View file

@ -42,38 +42,28 @@ You only need lining fabric if you intend to make the pattern reversible or if y
## Cutting Instructions {#cutting}
There are three variations of this pattern. **One Colour**, which is where the bikini top is made out of one colour. **Two Colours**, where the bikini top is made reversible by using two colours, and **Cross Back Tie Variant**, where the neck ties tie in the back replacing the band tie.
### One Colour (Non-Reversible)
**Main fabric**
- Cut **4 cup** parts.
- Cut **2 neck tie** parts.
- Cut **1 band tie** part.
- Cut **1 band tie** part on fold.
### Two Colours (Reversible)
:::note
This pattern is easily made reversible by buying a similar fabric to the main fabric and using it as contrast.
**Main fabric**
- Cut **2 cup** parts from main.
- Cut **2 neck tie** parts.
- Cut **1 band tie** part.
**Lining fabric**
- Cut **2 cup** parts.
- Cut **2 neck tie** parts.
- Cut **1 band tie** part.
- Cut **1 band tie** part on fold.
### Cross Back Tie Variant.
**Constrast Fabric**
**Main fabric**
- Cut **2 cup** parts.
- Cut **2 neck tie** parts.
- Cut **1 band tie** part on fold.
- Cut **4 cup** parts or Cut **2 cups** from main and lining if making reversible ties.
- Cut **2 neck tie** parts or Cut **2 neck ties** from main and lining if making reversible ties.
- Cut **1 band** part if making cross back tie variant instead of band tie variant.
However if you are using the Cross Back Tie variation the band is designed to **only** be cut from the main fabric.
:::note
This pattern is easily made reversible by buying a similar fabric to the main fabric and using it as contrast. To save confusion on instructions it will be referred to as the lining fabric.
When following the instructions use your contrasting pieces as the lining peices.
:::