diff --git a/config/changelog.yaml b/config/changelog.yaml index 1c12d695019..1107ba58d3a 100644 --- a/config/changelog.yaml +++ b/config/changelog.yaml @@ -2,12 +2,19 @@ date: Unreleased Added: - bent: + bent: &s3optsAdded - The `s3collar and `s3armhole` options now allow shifting the shoulder seam (`s3` is short for *Shift Shoulder Seam*) - brian: + brian: *s3optsAdded + carlita: *s3optsAdded + carlton: *s3optsAdded + huey: *s3optsAdded + simon: + - Added support for configuring the height of the Yoke. + 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*) + sven: *s3optsAdded Changed: components: @@ -15,8 +22,20 @@ See https://github.com/freesewing/freesewing/issues/1043 - Changed antman references to antperson + diana: *s3optsConst + - Set brian `s3` options as constants + hugo: *s3optsConst + jaeger: *s3optsConst i18n: - Changed antman references to antperson + plugin-bundle: + - Include plugin-buttons + - Include plugin-mirror + plugin-buttons: + - Is now included in plugin-bundle + plugin-mirror: + - Is now included in plugin-bundle + Fixed: charlie: diff --git a/packages/i18n/src/locales/en/options/simon.yml b/packages/i18n/src/locales/en/options/simon.yml index 8e2448ed7c5..57eb2c1210c 100644 --- a/packages/i18n/src/locales/en/options/simon.yml +++ b/packages/i18n/src/locales/en/options/simon.yml @@ -161,3 +161,7 @@ waistEase: 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 diff --git a/packages/simon/config/index.js b/packages/simon/config/index.js index ec3f51fd5f4..65c47ef89d3 100644 --- a/packages/simon/config/index.js +++ b/packages/simon/config/index.js @@ -22,13 +22,14 @@ export default { 'yokeDart', ], style: [ - 'splitYoke', - 's3Collar', - 's3Armhole', 'hemStyle', 'hemCurve', 'boxPleat', 'backDarts', + 'splitYoke', + 'yokeHeight', + 's3Collar', + 's3Armhole', { closure: [ 'extraTopButton', @@ -128,7 +129,7 @@ export default { frontLeft: 'front', buttonPlacket: 'front', buttonholePlacket: 'front', - yoke: 'backBase', + yoke: 'back', sleeveBase: 'front', sleeve: 'sleeveBase', }, @@ -219,6 +220,7 @@ export default { lengthBonus: { pct: 25, min: -4, max: 60 }, shoulderEase: { pct: 2, min: 0, max: 15 }, shoulderSlopeReduction: { pct: 0, min: 0, max: 8 }, + yokeHeight: { pct: 55, min: 10, max: 100 }, // s3 is short for Shoulder Seam Shift s3Collar: { pct: 0, min: -100, max: 100 }, s3Armhole: { pct: 0, min: -100, max: 100 }, diff --git a/packages/simon/src/back.js b/packages/simon/src/back.js index 7a379ec014d..38b39fa6987 100644 --- a/packages/simon/src/back.js +++ b/packages/simon/src/back.js @@ -77,7 +77,27 @@ export default (part) => { points.hipsCp2 = points.hips.shift(90, points.waist.dy(points.hips) / 4) // Cut off at yoke - points.cbYoke = new Point(0, points.armholePitch.y) + const neverAboveCbNeck = () => (points.cbNeck.dy(points.cbYoke) < 10) ? (points.cbYoke.y = points.cbNeck.y + 10) : null + if (options.yokeHeight === 1) { + points.cbYoke = new Point(0, points.armholePitch.y) + neverAboveCbNeck() + points.armholeYokeSplit = points.armholePitch.clone() + paths.backArmholeYoke = paths.backArmhole + } + else if (options.yokeHeight === 0) { + points.cbYoke = new Point(0, points.s3ArmholeSplit.y) + neverAboveCbNeck() + points.armholeYokeSplit = points.s3ArmholeSplit.clone() + paths.backArmholeBack = paths.backArmhole + } else { + points.cbYoke = new Point(0, points.s3ArmholeSplit.y + (points.s3ArmholeSplit.dy(points.armholePitch) * options.yokeHeight)) + neverAboveCbNeck() + points.armholeYokeSplit = paths.backArmhole.intersectsY(points.cbYoke.y).pop() + const [back,yoke] = paths.backArmhole.split(points.armholeYokeSplit) + paths.backArmholeYoke = yoke.setRender(false) + paths.backArmholeBack = back.setRender(false) + } + // Box pleat if (options.boxPleat) { @@ -104,6 +124,10 @@ export default (part) => { .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( @@ -130,7 +154,7 @@ export default (part) => { 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 diff --git a/packages/simon/src/yoke.js b/packages/simon/src/yoke.js index 046c1826bb1..0153eafa155 100644 --- a/packages/simon/src/yoke.js +++ b/packages/simon/src/yoke.js @@ -14,17 +14,15 @@ export default (part) => { } = part.shorthand() for (let id in paths) { - if (['backCollar', 'backArmhole'].indexOf(id) === -1) delete part.paths[id] + if (['backCollar', 'backArmhole', 'backArmholeYoke'].indexOf(id) === -1) delete part.paths[id] } - // Cut off at yoke - points.cbYoke = new Point(0, points.armholePitch.y) - // Paths paths.saBase = new Path() .move(points.cbYoke) - .line(points.armholePitch) - .join(paths.backArmhole) + .line(points.armholeYokeSplit) + if (options.yokeHeight > 0) paths.saBase = paths.saBase.join(paths.backArmholeYoke) + paths.saBase = paths.saBase .line(points.s3CollarSplit) .join(paths.backCollar) if (options.splitYoke) paths.saBase = paths.saBase.line(points.cbYoke).close()