From 98851f9a88497d0c63d06b173fc0654f71c6c907 Mon Sep 17 00:00:00 2001 From: anna-puk <100537439+anna-puk@users.noreply.github.com> Date: Sun, 18 Dec 2022 21:08:46 +0100 Subject: [PATCH 1/6] new option: inward curve at waist with corresponding waist ease - default values and range to be refined --- designs/teagan/src/back.mjs | 16 +++++++++-- designs/teagan/src/front.mjs | 54 +++++++++++++++++++++++++++++------- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/designs/teagan/src/back.mjs b/designs/teagan/src/back.mjs index f87587160f0..1bcf9d74633 100644 --- a/designs/teagan/src/back.mjs +++ b/designs/teagan/src/back.mjs @@ -25,9 +25,20 @@ function teaganBack({ // Draw seamline paths.hemBase = new Path().move(points.cfHem).line(points.hem).hide() + if (options.curveToWaist) { + paths.sideSeam = new Path() + .move(points.hem) + .curve(points.hipsCp2,points.waistCp1, points.waist) + .curve_(points.waistCp2,points.armhole) + .hide() + } else { + paths.sideSeam = new Path() + .move(points.hem) + .curve_(points.waistCp2,points.armhole) + .hide() + } paths.saBase = new Path() - .move(points.hem) - .curve_(points.waistCp2, points.armhole) + .move(points.armhole) .curve(points.armholeCp2, points.armholeHollowCp1, points.armholeHollow) .curve(points.armholeHollowCp2, points.shoulderCp1, points.shoulder) .line(points.neck) @@ -36,6 +47,7 @@ function teaganBack({ paths.seam = new Path() .move(points.cfHem) .join(paths.hemBase) + .join(paths.sideSeam) .join(paths.saBase) .line(points.cfHem) .close() diff --git a/designs/teagan/src/front.mjs b/designs/teagan/src/front.mjs index 99652904f5a..bfd3c5f7feb 100644 --- a/designs/teagan/src/front.mjs +++ b/designs/teagan/src/front.mjs @@ -23,14 +23,34 @@ function teaganFront({ for (let key of Object.keys(paths)) paths[key].hide() // Adapt fit to waist - let width - if (measurements.waist > measurements.hips) - width = (measurements.waist * (1 + options.hipsEase)) / 4 - else width = (measurements.hips * (1 + options.hipsEase)) / 4 - points.hem.x = width - points.hips.x = width - points.waist.x = width - points.waistCp2 = points.waist.shift(90, points.armhole.dy(points.waist) / 3) + if (options.curveToWaist) { + let midWidth, lowerWidth + + midWidth = measurements.waist * (1 + options.waistEase)/4 + lowerWidth = measurements.hips * (1 + options.hipsEase)/4 + points.hem.x = lowerWidth + points.hips.x = lowerWidth + points.waist.x = midWidth + + // control points should be somewhat evenly spaced around waist + let cpAbove, cpBelow + cpAbove = points.armhole.dy(points.waist) * 0.6 + cpBelow = points.hips.dy(points.waist) * 0.25 + points.waistCp1 = points.waist.shift(90, cpBelow*2/3 - cpAbove/3) + points.waistCp2 = points.waist.shift(90, cpAbove*2/3 - cpBelow/3) + points.hipsCp2 = points.hips.shift(90,points.waist.dy(points.hips) * 0.45) + } else { + let width + if (measurements.waist > measurements.hips) + width = (measurements.waist * (1 + options.hipsEase)) / 4 + else width = (measurements.hips * (1 + options.hipsEase)) / 4 + points.hem.x = width + points.hips.x = width + points.waist.x = width + points.waistCp2 = points.waist.shift(90, points.armhole.dy(points.waist) / 3) + } + + // Clone cb (center back) into cf (center front) for (let key of ['Neck', 'Shoulder', 'Armhole', 'Hips', 'Hem']) { @@ -62,9 +82,20 @@ function teaganFront({ // Draw seamline paths.hemBase = new Path().move(points.cfHem).line(points.hem).hide() + if (options.curveToWaist) { + paths.sideSeam = new Path() + .move(points.hem) + .curve(points.hipsCp2,points.waistCp1, points.waist) + .curve_(points.waistCp2,points.armhole) + .hide() + } else { + paths.sideSeam = new Path() + .move(points.hem) + .curve_(points.waistCp2,points.armhole) + .hide() + } paths.saBase = new Path() - .move(points.hem) - .curve_(points.waistCp2, points.armhole) + .move(points.armhole) .curve(points.armholeCp2, points.armholeHollowCp1, points.armholeHollow) .curve(points.armholeHollowCp2, points.shoulderCp1, points.shoulder) .line(points.neck) @@ -73,6 +104,7 @@ function teaganFront({ paths.seam = new Path() .move(points.cfHem) .join(paths.hemBase) + .join(paths.sideSeam) .join(paths.saBase) .line(points.cfHem) .close() @@ -181,6 +213,8 @@ export const front = { backNeckCutout: { pct: 8, min: 4, max: 12, menu: 'fit' }, // Teagan specific draftForHighBust: { bool: false, menu: 'fit' }, + curveToWaist: { bool: false, menu: 'fit' }, + waistEase: { pct: 15, min: 8, max: 30, menu: 'fit' }, hipsEase: { pct: 18, min: 8, max: 30, menu: 'fit' }, necklineDepth: { pct: 25, min: 20, max: 40, menu: 'style' }, necklineWidth: { pct: 30, min: 10, max: 50, menu: 'style' }, From 06ccf1e8c071837d33181e6d433bd3ad3791e311 Mon Sep 17 00:00:00 2001 From: anna-puk <100537439+anna-puk@users.noreply.github.com> Date: Wed, 21 Dec 2022 22:09:59 +0100 Subject: [PATCH 2/6] titan: fix paperless --- designs/teagan/src/front.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designs/teagan/src/front.mjs b/designs/teagan/src/front.mjs index bfd3c5f7feb..649ef81217e 100644 --- a/designs/teagan/src/front.mjs +++ b/designs/teagan/src/front.mjs @@ -17,6 +17,7 @@ function teaganFront({ macro, log, units, + getId, part, }) { // Hide Brian paths @@ -181,7 +182,7 @@ function teaganFront({ y: points.neck.y - sa - 45, }) // These dimensions are only for the front - let id = part.getId() + let id = getId() macro('vd', { id, from: points.cfHem, From a5f7b10e6eb62fe35e9a835afe22f08a8455dda2 Mon Sep 17 00:00:00 2001 From: anna-puk <100537439+anna-puk@users.noreply.github.com> Date: Wed, 21 Dec 2022 23:04:02 +0100 Subject: [PATCH 3/6] updating paperless for curveToWaist option --- designs/teagan/src/front.mjs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/designs/teagan/src/front.mjs b/designs/teagan/src/front.mjs index 649ef81217e..58f804d2dcd 100644 --- a/designs/teagan/src/front.mjs +++ b/designs/teagan/src/front.mjs @@ -39,7 +39,7 @@ function teaganFront({ cpBelow = points.hips.dy(points.waist) * 0.25 points.waistCp1 = points.waist.shift(90, cpBelow*2/3 - cpAbove/3) points.waistCp2 = points.waist.shift(90, cpAbove*2/3 - cpBelow/3) - points.hipsCp2 = points.hips.shift(90,points.waist.dy(points.hips) * 0.45) + points.hipsCp2 = points.hips.shift(90,points.waist.dy(points.hips) * 0.3) } else { let width if (measurements.waist > measurements.hips) @@ -151,6 +151,18 @@ function teaganFront({ to: points.hem, y: points.hem.y + sa * 2.5 + 15, }) + if (options.curveToWaist) { + macro('hd', { + from: points.waist, + to: points.hem, + y: points.hem.y + sa * 2.5 + 30 + }) + macro('vd', { + from: points.hem, + to: points.waist, + x: points.waist.x - 15, + }) + } macro('vd', { from: points.hem, to: points.armhole, @@ -215,7 +227,7 @@ export const front = { // Teagan specific draftForHighBust: { bool: false, menu: 'fit' }, curveToWaist: { bool: false, menu: 'fit' }, - waistEase: { pct: 15, min: 8, max: 30, menu: 'fit' }, + waistEase: { pct: 25, min: 8, max: 40, menu: 'fit' }, hipsEase: { pct: 18, min: 8, max: 30, menu: 'fit' }, necklineDepth: { pct: 25, min: 20, max: 40, menu: 'style' }, necklineWidth: { pct: 30, min: 10, max: 50, menu: 'style' }, From d670a9cd3efb49495d13813a1084f45c674503a5 Mon Sep 17 00:00:00 2001 From: anna-puk <100537439+anna-puk@users.noreply.github.com> Date: Wed, 21 Dec 2022 23:22:36 +0100 Subject: [PATCH 4/6] documentation (and warning) for new curve-to-waist option (sample image not generated yet) --- designs/teagan/src/front.mjs | 5 +++++ .../patterns/teagan/options/curvetowaist/en.md | 15 +++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 markdown/org/docs/patterns/teagan/options/curvetowaist/en.md diff --git a/designs/teagan/src/front.mjs b/designs/teagan/src/front.mjs index 58f804d2dcd..954997af5f9 100644 --- a/designs/teagan/src/front.mjs +++ b/designs/teagan/src/front.mjs @@ -40,6 +40,11 @@ function teaganFront({ points.waistCp1 = points.waist.shift(90, cpBelow*2/3 - cpAbove/3) points.waistCp2 = points.waist.shift(90, cpAbove*2/3 - cpBelow/3) points.hipsCp2 = points.hips.shift(90,points.waist.dy(points.hips) * 0.3) + + // warn if we're making a barrel-shaped shirt + if (midWidth > lowerWidth) { + log.warning('width at waist exceeds width at hips; consider disabling the curve to waist option for a more standard shape') + } } else { let width if (measurements.waist > measurements.hips) diff --git a/markdown/org/docs/patterns/teagan/options/curvetowaist/en.md b/markdown/org/docs/patterns/teagan/options/curvetowaist/en.md new file mode 100644 index 00000000000..4ff6954021e --- /dev/null +++ b/markdown/org/docs/patterns/teagan/options/curvetowaist/en.md @@ -0,0 +1,15 @@ +--- +title: "Curve to waist" +--- + +Choose this option to draft Teagan to curve towards your waist before curving towards the hips. + +If waist measurement (plus ease) is smaller than hips (plus ease), this creates an hourglass shape such as found in 'fitted' or 'ladies' T-shirts (as opposed to 'regular' or 'unisex'). + + +This option can also be used when the waist measurement exceeds the hip measurement, but this results in a non-standard T-shirt shape which may be impossible to put on. + + +## Effect of this option on the pattern + +![This image shows the effect of this option by superimposing several variants that have a different value for this option](teagan_curvetowaist_sample.svg "Effect of this option on the pattern") From f8dad952180ddb3103cbab790cf5cc965015798a Mon Sep 17 00:00:00 2001 From: anna-puk <100537439+anna-puk@users.noreply.github.com> Date: Sun, 22 Jan 2023 15:01:01 +0100 Subject: [PATCH 5/6] fix seam allowance (neglected to do this when initially implementing the curved waist) --- designs/teagan/src/back.mjs | 1 + designs/teagan/src/front.mjs | 1 + 2 files changed, 2 insertions(+) diff --git a/designs/teagan/src/back.mjs b/designs/teagan/src/back.mjs index 1bcf9d74633..bb4e689d612 100644 --- a/designs/teagan/src/back.mjs +++ b/designs/teagan/src/back.mjs @@ -80,6 +80,7 @@ function teaganBack({ paths.sa = new Path() .move(points.cfHem) .join(paths.hemBase.offset(sa * 3)) + .join(paths.sideSeam.offset(sa)) .join(paths.saBase.offset(sa)) .line(points.cbNeck) .attr('class', 'fabric sa') diff --git a/designs/teagan/src/front.mjs b/designs/teagan/src/front.mjs index 954997af5f9..97506abc737 100644 --- a/designs/teagan/src/front.mjs +++ b/designs/teagan/src/front.mjs @@ -142,6 +142,7 @@ function teaganFront({ paths.sa = new Path() .move(points.cfHem) .join(paths.hemBase.offset(sa * 3)) + .join(paths.sideSeam.offset(sa)) .join(paths.saBase.offset(sa)) .line(points.cfNeck) .attr('class', 'fabric sa') From bb9cc1053fdc6d02062b7df7d0fefc2e8a96b534 Mon Sep 17 00:00:00 2001 From: anna-puk <100537439+anna-puk@users.noreply.github.com> Date: Sun, 22 Jan 2023 15:05:50 +0100 Subject: [PATCH 6/6] rename waistEase to curvedWaistEase since the option only has an effect if curveToWaist is enabled --- designs/teagan/src/front.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designs/teagan/src/front.mjs b/designs/teagan/src/front.mjs index 97506abc737..0512d069014 100644 --- a/designs/teagan/src/front.mjs +++ b/designs/teagan/src/front.mjs @@ -27,7 +27,7 @@ function teaganFront({ if (options.curveToWaist) { let midWidth, lowerWidth - midWidth = measurements.waist * (1 + options.waistEase)/4 + midWidth = measurements.waist * (1 + options.curvedWaistEase)/4 lowerWidth = measurements.hips * (1 + options.hipsEase)/4 points.hem.x = lowerWidth points.hips.x = lowerWidth @@ -233,7 +233,7 @@ export const front = { // Teagan specific draftForHighBust: { bool: false, menu: 'fit' }, curveToWaist: { bool: false, menu: 'fit' }, - waistEase: { pct: 25, min: 8, max: 40, menu: 'fit' }, + curvedWaistEase: { pct: 25, min: 8, max: 40, menu: 'fit' }, hipsEase: { pct: 18, min: 8, max: 30, menu: 'fit' }, necklineDepth: { pct: 25, min: 20, max: 40, menu: 'style' }, necklineWidth: { pct: 30, min: 10, max: 50, menu: 'style' },