diff --git a/config/changelog.yaml b/config/changelog.yaml index 1107ba58d3a..a505810dfcf 100644 --- a/config/changelog.yaml +++ b/config/changelog.yaml @@ -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 diff --git a/packages/i18n/src/locales/en/options/simon.yml b/packages/i18n/src/locales/en/options/simon.yml index 57eb2c1210c..5fa274b7bc3 100644 --- a/packages/i18n/src/locales/en/options/simon.yml +++ b/packages/i18n/src/locales/en/options/simon.yml @@ -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 diff --git a/packages/simon/config/index.js b/packages/simon/config/index.js index 65c47ef89d3..309d5e33b9d 100644 --- a/packages/simon/config/index.js +++ b/packages/simon/config/index.js @@ -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 }, }, } diff --git a/packages/simon/src/back.js b/packages/simon/src/back.js index 38b39fa6987..bf14c1259a1 100644 --- a/packages/simon/src/back.js +++ b/packages/simon/src/back.js @@ -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', {