diff --git a/designs/teagan/src/back.mjs b/designs/teagan/src/back.mjs index f87587160f0..bb4e689d612 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() @@ -68,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 3fba97e2935..15608665669 100644 --- a/designs/teagan/src/front.mjs +++ b/designs/teagan/src/front.mjs @@ -18,20 +18,46 @@ function teaganFront({ macro, log, units, + getId, part, }) { // Hide Brian paths 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.curvedWaistEase)/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.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) + 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']) { @@ -63,9 +89,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) @@ -74,6 +111,7 @@ function teaganFront({ paths.seam = new Path() .move(points.cfHem) .join(paths.hemBase) + .join(paths.sideSeam) .join(paths.saBase) .line(points.cfHem) .close() @@ -105,6 +143,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') @@ -119,6 +158,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, @@ -150,7 +201,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, @@ -182,6 +233,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' }, + 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' }, 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")