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)
|
See [#642](https://github.com/freesewing/freesewing/issues/642)
|
||||||
- The `s3collar and `s3armhole` options now allow shifting the shoulder seam
|
- The `s3collar and `s3armhole` options now allow shifting the shoulder seam
|
||||||
(`s3` is short for *Shift Shoulder Seam*)
|
(`s3` is short for *Shift Shoulder Seam*)
|
||||||
|
- Added the `roundBack` option to replace the `yokeDart` option
|
||||||
sven: *s3optsAdded
|
sven: *s3optsAdded
|
||||||
|
|
||||||
Changed:
|
Changed:
|
||||||
|
@ -43,6 +44,10 @@
|
||||||
tutorial:
|
tutorial:
|
||||||
- Set department in the config to one of the newly accepted values
|
- 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:
|
2.16.2:
|
||||||
date: 2021-05-05
|
date: 2021-05-05
|
||||||
|
|
||||||
|
|
|
@ -134,6 +134,10 @@ hemStyle:
|
||||||
baseball: Baseball hem
|
baseball: Baseball hem
|
||||||
slashed: Slashed 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:
|
seperateButtonholePlacket:
|
||||||
title: Seperate buttonhole placket
|
title: Seperate buttonhole placket
|
||||||
description: Draft a separate buttonhole placket.
|
description: Draft a separate buttonhole placket.
|
||||||
|
@ -158,10 +162,6 @@ waistEase:
|
||||||
title: Waist ease
|
title: Waist ease
|
||||||
description: The amount of ease at your (natural) waist.
|
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:
|
yokeHeight:
|
||||||
title: Yoke height
|
title: Yoke height
|
||||||
description: Controls the height of the yoke
|
description: Controls the height of the yoke
|
||||||
|
|
|
@ -19,7 +19,7 @@ export default {
|
||||||
'sleeveLengthBonus',
|
'sleeveLengthBonus',
|
||||||
'waistEase',
|
'waistEase',
|
||||||
'hipsEase',
|
'hipsEase',
|
||||||
'yokeDart',
|
'roundBack',
|
||||||
],
|
],
|
||||||
style: [
|
style: [
|
||||||
'hemStyle',
|
'hemStyle',
|
||||||
|
@ -218,9 +218,10 @@ export default {
|
||||||
hemCurve: { pct: 50, min: 25, max: 100 },
|
hemCurve: { pct: 50, min: 25, max: 100 },
|
||||||
hipsEase: { pct: 15, min: 10, max: 35 },
|
hipsEase: { pct: 15, min: 10, max: 35 },
|
||||||
lengthBonus: { pct: 25, min: -4, max: 60 },
|
lengthBonus: { pct: 25, min: -4, max: 60 },
|
||||||
|
roundBack: { pct: 0, min: 0, max: 10 },
|
||||||
shoulderEase: { pct: 2, min: 0, max: 15 },
|
shoulderEase: { pct: 2, min: 0, max: 15 },
|
||||||
shoulderSlopeReduction: { pct: 0, min: 0, max: 8 },
|
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
|
// s3 is short for Shoulder Seam Shift
|
||||||
s3Collar: { pct: 0, min: -100, max: 100 },
|
s3Collar: { pct: 0, min: -100, max: 100 },
|
||||||
s3Armhole: { 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 },
|
sleeveLengthBonus: { pct: 0, min: -40, max: 10 },
|
||||||
sleevePlacketLength: { pct: 25, min: 15, max: 35 },
|
sleevePlacketLength: { pct: 25, min: 15, max: 35 },
|
||||||
waistEase: { pct: 15, min: 10, max: 35 },
|
waistEase: { pct: 15, min: 10, max: 35 },
|
||||||
yokeDart: { pct: 0, min: 0, max: 15 },
|
|
||||||
backDartShaping: { pct: 25, min: 5, max: 75 },
|
backDartShaping: { pct: 25, min: 5, max: 75 },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,15 +98,33 @@ export default (part) => {
|
||||||
paths.backArmholeBack = back.setRender(false)
|
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
|
// Box pleat
|
||||||
if (options.boxPleat) {
|
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.boxPleatMid = points.boxPleatLeft.shift(0, options.boxPleatFold)
|
||||||
points.boxPleatRight = points.boxPleatMid.shift(0, options.boxPleatFold)
|
points.boxPleatRight = points.boxPleatMid.shift(0, options.boxPleatFold)
|
||||||
points.boxPleatLeftBottom = new Point(points.boxPleatLeft.x, points.armholeHollowCp2.y)
|
points.boxPleatLeftBottom = new Point(points.boxPleatLeft.x, points.armholeHollowCp2.y)
|
||||||
points.boxPleatMidBottom = new Point(points.boxPleatMid.x, points.armholeHollowCp2.y)
|
points.boxPleatMidBottom = new Point(points.boxPleatMid.x, points.armholeHollowCp2.y)
|
||||||
points.boxPleatRightBottom = new Point(points.boxPleatRight.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 [
|
for (let p of [
|
||||||
'armholePitch',
|
'armholePitch',
|
||||||
'armholePitchCp1',
|
'armholePitchCp1',
|
||||||
|
@ -115,52 +133,11 @@ export default (part) => {
|
||||||
'armholeHollowCp1',
|
'armholeHollowCp1',
|
||||||
'armholeCp2',
|
'armholeCp2',
|
||||||
'armhole',
|
'armhole',
|
||||||
|
'armholeYokeSplit'
|
||||||
])
|
])
|
||||||
points[p] = points[p].shift(0, options.boxPleatFold * 2)
|
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
|
// Draft hem
|
||||||
switch (options.hemStyle) {
|
switch (options.hemStyle) {
|
||||||
|
@ -175,7 +152,6 @@ export default (part) => {
|
||||||
.curve(points.hipsCp2, points.waistCp1, points.waist)
|
.curve(points.hipsCp2, points.waistCp1, points.waist)
|
||||||
.curve_(points.waistCp2, points.armhole)
|
.curve_(points.waistCp2, points.armhole)
|
||||||
.join(paths.armhole)
|
.join(paths.armhole)
|
||||||
.line(points.cbYoke)
|
|
||||||
paths.hemBase = new Path()
|
paths.hemBase = new Path()
|
||||||
.move(points.cbHem)
|
.move(points.cbHem)
|
||||||
.line(points.bballStart)
|
.line(points.bballStart)
|
||||||
|
@ -194,7 +170,6 @@ export default (part) => {
|
||||||
.curve(points.hipsCp2, points.waistCp1, points.waist)
|
.curve(points.hipsCp2, points.waistCp1, points.waist)
|
||||||
.curve_(points.waistCp2, points.armhole)
|
.curve_(points.waistCp2, points.armhole)
|
||||||
.join(paths.armhole)
|
.join(paths.armhole)
|
||||||
.line(points.cbYoke)
|
|
||||||
paths.hemBase = new Path()
|
paths.hemBase = new Path()
|
||||||
.move(points.cbHem)
|
.move(points.cbHem)
|
||||||
.line(points.slashEnd)
|
.line(points.slashEnd)
|
||||||
|
@ -207,9 +182,11 @@ export default (part) => {
|
||||||
.curve(points.hipsCp2, points.waistCp1, points.waist)
|
.curve(points.hipsCp2, points.waistCp1, points.waist)
|
||||||
.curve_(points.waistCp2, points.armhole)
|
.curve_(points.waistCp2, points.armhole)
|
||||||
.join(paths.armhole)
|
.join(paths.armhole)
|
||||||
.line(points.cbYoke)
|
|
||||||
paths.hemBase = new Path().move(points.cbHem).line(points.hem)
|
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
|
||||||
paths.saBase.render = false
|
paths.saBase.render = false
|
||||||
|
@ -336,26 +313,26 @@ export default (part) => {
|
||||||
to: points.armhole,
|
to: points.armhole,
|
||||||
x: points.hips.x + 60 + sa,
|
x: points.hips.x + 60 + sa,
|
||||||
})
|
})
|
||||||
if (options.yokeDart > 0) {
|
if (options.roundBack > 0) {
|
||||||
macro('vd', {
|
macro('vd', {
|
||||||
from: points.armhole,
|
from: points.armhole,
|
||||||
to: points.yokeDartEdge,
|
to: points.armholeYokeSplit,
|
||||||
x: points.armhole.x + 15 + sa,
|
x: points.armhole.x + 15 + sa,
|
||||||
})
|
})
|
||||||
macro('vd', {
|
macro('vd', {
|
||||||
from: points.armhole,
|
from: points.armhole,
|
||||||
to: points.yokeDartTip,
|
to: points.cbTop,
|
||||||
x: points.armhole.x + 30 + sa,
|
x: points.armhole.x + 30 + sa,
|
||||||
})
|
})
|
||||||
macro('hd', {
|
macro('hd', {
|
||||||
from: points.cbYoke,
|
from: points.cbTop,
|
||||||
to: points.yokeDartTip,
|
to: points.armholePitch,
|
||||||
y: points.cbYoke.y - 15 - sa,
|
y: points.cbTop.y - 15 - sa,
|
||||||
})
|
})
|
||||||
macro('hd', {
|
macro('hd', {
|
||||||
from: points.cbYoke,
|
from: points.cbTop,
|
||||||
to: points.yokeDartEdge,
|
to: points.armholeYokeSplit,
|
||||||
y: points.cbYoke.y - 30 - sa,
|
y: points.cbTop.y - 30 - sa,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
macro('vd', {
|
macro('vd', {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue