[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:
parent
3cba9e4020
commit
d973cb4248
15 changed files with 642 additions and 620 deletions
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
},
|
||||
}
|
||||
}
|
|
@ -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
|
||||
},
|
||||
}
|
||||
}
|
|
@ -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
|
||||
},
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
||||
:::
|
||||
|
|
|
@ -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
|
||||
|
||||
:::
|
|
@ -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.
|
|
@ -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.
|
|
@ -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"
|
||||
|
||||
:::
|
|
@ -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.
|
|
@ -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.
|
|
@ -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.
|
|
@ -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.
|
||||
|
||||
:::
|
|
@ -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.
|
||||
:::
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue