1
0
Fork 0

Merge pull request #3275 from anna-puk/teagan-inward-curve-at-waist

Teagan inward curve at waist
This commit is contained in:
Joost De Cock 2023-04-10 11:41:10 +02:00 committed by GitHub
commit f86149e7dc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 94 additions and 13 deletions

View file

@ -25,9 +25,20 @@ function teaganBack({
// Draw seamline
paths.hemBase = new Path().move(points.cfHem).line(points.hem).hide()
paths.saBase = new Path()
if (options.curveToWaist) {
paths.sideSeam = new Path()
.move(points.hem)
.curve_(points.waistCp2, points.armhole)
.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.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')

View file

@ -18,12 +18,35 @@ function teaganFront({
macro,
log,
units,
getId,
part,
}) {
// Hide Brian paths
for (let key of Object.keys(paths)) paths[key].hide()
// Adapt fit to waist
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
@ -32,6 +55,9 @@ function teaganFront({
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()
paths.saBase = new Path()
if (options.curveToWaist) {
paths.sideSeam = new Path()
.move(points.hem)
.curve_(points.waistCp2, points.armhole)
.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.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' },

View file

@ -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').
<Note>
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.
</Note>
## 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")