breaking(simon): Replace yokeDart option by roundBack option
This option address fitting for a rounded back. Something `yokeDart` used to do by adding a dart to the side of the yoke. However, in doing so `yokeDart` would change the lenght of the armhole which is not ideal. The now `roundBack` option instead lengtens the back in the middle, tapering off towards the sides. Thereby accomplishing the same alteration without influencing the lenght of the armhole.
This commit is contained in:
parent
af2ee352c7
commit
6c58069570
4 changed files with 44 additions and 62 deletions
|
@ -14,6 +14,7 @@
|
|||
See [#642](https://github.com/freesewing/freesewing/issues/642)
|
||||
- The `s3collar and `s3armhole` options now allow shifting the shoulder seam
|
||||
(`s3` is short for *Shift Shoulder Seam*)
|
||||
- Added the `roundBack` option to replace the `yokeDart` option
|
||||
sven: *s3optsAdded
|
||||
|
||||
Changed:
|
||||
|
@ -43,6 +44,10 @@
|
|||
tutorial:
|
||||
- Set department in the config to one of the newly accepted values
|
||||
|
||||
Removed:
|
||||
simon:
|
||||
- The `yokeDart` option is replaced by the `roundBack` option
|
||||
|
||||
2.16.2:
|
||||
date: 2021-05-05
|
||||
|
||||
|
|
|
@ -134,6 +134,10 @@ hemStyle:
|
|||
baseball: Baseball hem
|
||||
slashed: Slashed hem
|
||||
|
||||
roundBack:
|
||||
title: Round back
|
||||
description: To fit a round(er) back, this adds length to the center back (at the yoke) that tapers of towards the sides.
|
||||
|
||||
seperateButtonholePlacket:
|
||||
title: Seperate buttonhole placket
|
||||
description: Draft a separate buttonhole placket.
|
||||
|
@ -158,10 +162,6 @@ waistEase:
|
|||
title: Waist ease
|
||||
description: The amount of ease at your (natural) waist.
|
||||
|
||||
yokeDart:
|
||||
title: Yoke dart
|
||||
description: Whether to include a dart at the sides of the yoke to fit a rounder back.
|
||||
|
||||
yokeHeight:
|
||||
title: Yoke height
|
||||
description: Controls the height of the yoke
|
||||
|
|
|
@ -19,7 +19,7 @@ export default {
|
|||
'sleeveLengthBonus',
|
||||
'waistEase',
|
||||
'hipsEase',
|
||||
'yokeDart',
|
||||
'roundBack',
|
||||
],
|
||||
style: [
|
||||
'hemStyle',
|
||||
|
@ -218,9 +218,10 @@ export default {
|
|||
hemCurve: { pct: 50, min: 25, max: 100 },
|
||||
hipsEase: { pct: 15, min: 10, max: 35 },
|
||||
lengthBonus: { pct: 25, min: -4, max: 60 },
|
||||
roundBack: { pct: 0, min: 0, max: 10 },
|
||||
shoulderEase: { pct: 2, min: 0, max: 15 },
|
||||
shoulderSlopeReduction: { pct: 0, min: 0, max: 8 },
|
||||
yokeHeight: { pct: 55, min: 10, max: 100 },
|
||||
yokeHeight: { pct: 55, min: 10, max: 90 },
|
||||
// s3 is short for Shoulder Seam Shift
|
||||
s3Collar: { pct: 0, min: -100, max: 100 },
|
||||
s3Armhole: { pct: 0, min: -100, max: 100 },
|
||||
|
@ -247,7 +248,6 @@ export default {
|
|||
sleeveLengthBonus: { pct: 0, min: -40, max: 10 },
|
||||
sleevePlacketLength: { pct: 25, min: 15, max: 35 },
|
||||
waistEase: { pct: 15, min: 10, max: 35 },
|
||||
yokeDart: { pct: 0, min: 0, max: 15 },
|
||||
backDartShaping: { pct: 25, min: 5, max: 75 },
|
||||
},
|
||||
}
|
||||
|
|
|
@ -98,15 +98,33 @@ export default (part) => {
|
|||
paths.backArmholeBack = back.setRender(false)
|
||||
}
|
||||
|
||||
// Round back
|
||||
paths.armhole = new Path()
|
||||
.move(points.armhole)
|
||||
.curve(points.armholeCp2, points.armholeHollowCp1, points.armholeHollow)
|
||||
.curve(points.armholeHollowCp2, points.armholePitchCp1, points.armholePitch)
|
||||
if (options.yokeHeight < 1 && options.yokeHeight > 0) paths.armhole = paths.armhole.join(paths.backArmholeBack)
|
||||
else if (options.yokeHeight === 0) paths.armhole = paths.armhole.join(paths.backArmhole)
|
||||
paths.armhole.render = false
|
||||
|
||||
if (options.roundBack > 0) {
|
||||
points.cbTop = points.cbYoke.shift(90, points.armholePitch.x * options.roundBack)
|
||||
points.cbTopCp1 = points.cbTop.shift(0, points.armholePitch.x * 0.5)
|
||||
paths.roundedBack = new Path().move(points.armholeYokeSplit)._curve(points.cbTopCp1, points.cbTop).line(points.cbYoke)
|
||||
}
|
||||
|
||||
// Box pleat
|
||||
if (options.boxPleat) {
|
||||
points.boxPleatLeft = points.cbYoke.shift(0, options.boxPleatWidth / 2)
|
||||
points.boxPleatLeft = paths.roundedBack
|
||||
? points.cbTop.shift(0, options.boxPleatWidth / 2)
|
||||
: points.cbYoke.shift(0, options.boxPleatWidth / 2)
|
||||
points.boxPleatMid = points.boxPleatLeft.shift(0, options.boxPleatFold)
|
||||
points.boxPleatRight = points.boxPleatMid.shift(0, options.boxPleatFold)
|
||||
points.boxPleatLeftBottom = new Point(points.boxPleatLeft.x, points.armholeHollowCp2.y)
|
||||
points.boxPleatMidBottom = new Point(points.boxPleatMid.x, points.armholeHollowCp2.y)
|
||||
points.boxPleatRightBottom = new Point(points.boxPleatRight.x, points.armholeHollowCp2.y)
|
||||
paths.armhole.setRender(true).attr('class', 'stroke-xl highlight debug canvas')
|
||||
paths.armhole = paths.armhole.translate(options.boxPleatFold * 2, 0)
|
||||
for (let p of [
|
||||
'armholePitch',
|
||||
'armholePitchCp1',
|
||||
|
@ -115,52 +133,11 @@ export default (part) => {
|
|||
'armholeHollowCp1',
|
||||
'armholeCp2',
|
||||
'armhole',
|
||||
'armholeYokeSplit'
|
||||
])
|
||||
points[p] = points[p].shift(0, options.boxPleatFold * 2)
|
||||
}
|
||||
|
||||
// Yoke dart
|
||||
paths.armhole = new Path()
|
||||
.move(points.armhole)
|
||||
.curve(points.armholeCp2, points.armholeHollowCp1, points.armholeHollow)
|
||||
.curve(points.armholeHollowCp2, points.armholePitchCp1, points.armholePitch)
|
||||
if (options.yokeHeight < 1 && options.yokeHeight > 0) paths.armhole = paths.armhole.join(paths.backArmholeBack)
|
||||
else if (options.yokeHeight === 0) paths.armhole = paths.armhole.join(paths.backArmhole)
|
||||
|
||||
/*
|
||||
paths.armhole.render = false
|
||||
if (options.yokeDart > 0) {
|
||||
points.tmp1 = points.armholePitch.shift(
|
||||
-90,
|
||||
points.armholePitch.dy(points.armhole) * options.yokeDart
|
||||
)
|
||||
points.tmp2 = points.tmp1.shift(180, 50)
|
||||
points.tmp3 = points.tmp1.shift(0, 50)
|
||||
points.yokeDartEdge = utils.lineIntersectsCurve(
|
||||
points.tmp2,
|
||||
points.tmp3,
|
||||
points.armholePitch,
|
||||
points.armholePitchCp1,
|
||||
points.armholeHollowCp2,
|
||||
points.armholeHollow
|
||||
)
|
||||
points.yokeDartTip = points.armholePitch.shift(180, points.armholePitch.x * 0.4)
|
||||
points.yokeDartTipCp1 = points.armholePitch.shiftFractionTowards(points.yokeDartTip, 0.4)
|
||||
paths.armhole = paths.armhole.split(points.yokeDartEdge)[0]
|
||||
paths.armhole._curve(points.yokeDartTipCp1, points.yokeDartTip)
|
||||
// Adapt armhole length to accomodate dart
|
||||
store.set(
|
||||
'backArmholeLength',
|
||||
store.get('backArmholeLength') - points.yokeDartEdge.dist(points.armholePitch)
|
||||
)
|
||||
}
|
||||
*/
|
||||
// Never make the hips more narrow than the waist because that looks silly
|
||||
//if (points.hem.x < points.waist.x) {
|
||||
// points.hem.x = points.waist.x
|
||||
// points.hips.x = points.waist.x
|
||||
// points.hipsCp2.x = points.waist.x
|
||||
//}
|
||||
|
||||
// Draft hem
|
||||
switch (options.hemStyle) {
|
||||
|
@ -175,7 +152,6 @@ export default (part) => {
|
|||
.curve(points.hipsCp2, points.waistCp1, points.waist)
|
||||
.curve_(points.waistCp2, points.armhole)
|
||||
.join(paths.armhole)
|
||||
.line(points.cbYoke)
|
||||
paths.hemBase = new Path()
|
||||
.move(points.cbHem)
|
||||
.line(points.bballStart)
|
||||
|
@ -194,7 +170,6 @@ export default (part) => {
|
|||
.curve(points.hipsCp2, points.waistCp1, points.waist)
|
||||
.curve_(points.waistCp2, points.armhole)
|
||||
.join(paths.armhole)
|
||||
.line(points.cbYoke)
|
||||
paths.hemBase = new Path()
|
||||
.move(points.cbHem)
|
||||
.line(points.slashEnd)
|
||||
|
@ -207,9 +182,11 @@ export default (part) => {
|
|||
.curve(points.hipsCp2, points.waistCp1, points.waist)
|
||||
.curve_(points.waistCp2, points.armhole)
|
||||
.join(paths.armhole)
|
||||
.line(points.cbYoke)
|
||||
paths.hemBase = new Path().move(points.cbHem).line(points.hem)
|
||||
}
|
||||
// Take rounded back into account
|
||||
if (paths.roundedBack) paths.saBase = paths.saBase.join(paths.roundedBack)
|
||||
else paths.saBase = paths.saBase.line(points.cbYoke)
|
||||
|
||||
// Paths
|
||||
paths.saBase.render = false
|
||||
|
@ -336,26 +313,26 @@ export default (part) => {
|
|||
to: points.armhole,
|
||||
x: points.hips.x + 60 + sa,
|
||||
})
|
||||
if (options.yokeDart > 0) {
|
||||
if (options.roundBack > 0) {
|
||||
macro('vd', {
|
||||
from: points.armhole,
|
||||
to: points.yokeDartEdge,
|
||||
to: points.armholeYokeSplit,
|
||||
x: points.armhole.x + 15 + sa,
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.armhole,
|
||||
to: points.yokeDartTip,
|
||||
to: points.cbTop,
|
||||
x: points.armhole.x + 30 + sa,
|
||||
})
|
||||
macro('hd', {
|
||||
from: points.cbYoke,
|
||||
to: points.yokeDartTip,
|
||||
y: points.cbYoke.y - 15 - sa,
|
||||
from: points.cbTop,
|
||||
to: points.armholePitch,
|
||||
y: points.cbTop.y - 15 - sa,
|
||||
})
|
||||
macro('hd', {
|
||||
from: points.cbYoke,
|
||||
to: points.yokeDartEdge,
|
||||
y: points.cbYoke.y - 30 - sa,
|
||||
from: points.cbTop,
|
||||
to: points.armholeYokeSplit,
|
||||
y: points.cbTop.y - 30 - sa,
|
||||
})
|
||||
} else {
|
||||
macro('vd', {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue