Merge branch 'main' of https://github.com/biou/yuri into main
This commit is contained in:
parent
3a36937527
commit
0f3b6214da
8 changed files with 22 additions and 155 deletions
|
@ -3,7 +3,7 @@ Yuri is a fancy zipless cardigan based on the Huey & Hugo hoodies #freesewing #f
|
|||
|
||||
Try it here : https://yuri-pattern.netlify.app/
|
||||
|
||||
<img src="yuri.svg" alt="preview of Yuri" width="200"/>
|
||||
<img src="yuri.svg" alt="preview of Yuri hoodie" width="200"/>
|
||||
|
||||
[](https://www.npmjs.com/package/yuri) [](https://standardjs.com)
|
||||
|
||||
|
@ -26,15 +26,15 @@ Repeat with the other front part and the other shoulder of the back.
|
|||
|
||||
### Step 2 : Attach the sleeves
|
||||
|
||||
- The side of the sleeve with the pointy edge at top is the back of the sleeve piece. It is also marked by a double notch on the pattern.
|
||||
- Match good sides of the sleeve seam to good sides of the front, matching the single notch on front to single notch on the sleeve piece. Stitch the seam. Do this for both sleeve pieces.
|
||||
- The side of the sleeve with the pointy edge at top is the back of the sleeve piece. It is also marked by a double notch on the pattern.
|
||||
- Match good sides of the sleeve seam to good sides of the front, matching the single notch on front to single notch on the sleeve piece. Stitch the seam. Do this for both sleeve pieces.
|
||||
- To finish the seam, you can use one of these methods:
|
||||
- Use a serger to sew and finish the seam in one step. This is fast and convenient, but produces a less-refined look.
|
||||
- If you do not have a serger, or would like a more refined look, sew a seam with a straight stitch on your conventional machine. Press the seam allowances apart on the wrong side. Then, edgestitch along both sides of the seam from the right side. Finally, trim the excess seam allowance. This produces a refined look, but takes longer.
|
||||
- Another serger-free option is to sew the seam with a straight stitch. Then stitch together the seam allowances with an additional
|
||||
- Another serger-free option is to sew the seam with a straight stitch. Then stitch together the seam allowances with an additional line of zig-zag alongside the straight stitch. Finally, trim the excess seam allowance. This simulates what a serger would do.
|
||||
|
||||
### Step 3 : Hem the cuffs
|
||||
As this pattern does not use ribbing by default, make a hem on the end of the sleeves to end it nicely.
|
||||
As this pattern does not use ribbing, make a hem on the end of the sleeves to end it nicely.
|
||||
|
||||
### Step 4: Close the Sides
|
||||
- Match the good sides together along sides and sleeves.
|
||||
|
|
|
@ -16,13 +16,10 @@ export default {
|
|||
'collarEase',
|
||||
'shoulderEase',
|
||||
'hipsEase',
|
||||
'ribbingStretch',
|
||||
],
|
||||
style: [
|
||||
'lengthBonus',
|
||||
'sleeveLengthBonus',
|
||||
'ribbing',
|
||||
'ribbingHeight',
|
||||
's3Collar',
|
||||
's3Armhole',
|
||||
],
|
||||
|
@ -91,7 +88,7 @@ export default {
|
|||
sleeve: 'sleeveBase',
|
||||
},
|
||||
hide: ['base', 'sleevecap', 'backBase', 'frontBase', 'sleeveBase'],
|
||||
parts: ['cuff', 'gusset', 'hoodSide', 'hoodCenter'],
|
||||
parts: ['gusset', 'hoodSide', 'hoodCenter'],
|
||||
options: {
|
||||
// Constants
|
||||
brianFitSleeve: true,
|
||||
|
@ -106,7 +103,7 @@ export default {
|
|||
bicepsEase: { pct: 8, min: 0, max: 20 },
|
||||
chestEase: { pct: 8, min: -4, max: 20 },
|
||||
collarEase: { pct: 20, min: 10, max: 30 },
|
||||
cuffEase: { pct: 20, min: 10, max: 60 },
|
||||
cuffEase: { pct: 30, min: 20, max: 60 },
|
||||
frontArmholeDeeper: { pct: 0.5, min: 0, max: 1.5 },
|
||||
lengthBonus: { pct: 10, min: 5, max: 15 },
|
||||
shoulderEase: { pct: 0.5, min: -2, max: 6 },
|
||||
|
@ -136,10 +133,6 @@ export default {
|
|||
sleeveWidthGuarantee: { pct: 90, min: 25, max: 100 },
|
||||
|
||||
// Options specific to Yuri
|
||||
ribbing: { bool: false },
|
||||
|
||||
ribbingHeight: { pct: 10, min: 5, max: 15 },
|
||||
hipsEase: { pct: 0, min: 0, max: 10 },
|
||||
ribbingStretch: { pct: 15, min: 0, max: 30 },
|
||||
},
|
||||
}
|
||||
|
|
|
@ -20,13 +20,6 @@ export default function (part) {
|
|||
if (['backArmhole', 'backCollar'].indexOf(i) === -1) delete paths[i]
|
||||
}
|
||||
|
||||
// Shorten body to take ribbing into account
|
||||
if (options.ribbing) {
|
||||
const rh = options.ribbingHeight * (measurements.hpsToWaistBack + measurements.waistToHips)
|
||||
for (const p of ['hem', 'cbHem']) points[p] = points[p].shift(90, rh)
|
||||
store.set('ribbingHeight', rh)
|
||||
}
|
||||
|
||||
// Shape side seam
|
||||
points.hips.x = (measurements.hips * (1 + options.hipsEase)) / 4
|
||||
points.hem.x = points.hips.x
|
||||
|
@ -81,7 +74,7 @@ export default function (part) {
|
|||
})
|
||||
macro('scalebox', { at: new Point(points.armholePitch.x / 2, points.cbWaist.y) })
|
||||
if (sa) {
|
||||
paths.sa = paths.hemBase.offset(options.ribbing ? sa : 3 * sa).join(paths.saBase.offset(sa))
|
||||
paths.sa = paths.hemBase.offset(3 * sa).join(paths.saBase.offset(sa))
|
||||
paths.sa
|
||||
.move(paths.sa.end())
|
||||
.line(points.cbNeck)
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
import { draftRibbing } from './shared'
|
||||
|
||||
export default (part) => {
|
||||
const { complete, points, measurements, options, macro } = part.shorthand()
|
||||
if (!options.ribbing) return part
|
||||
|
||||
draftRibbing(part, measurements.wrist * (1 + options.cuffEase) * (1 - options.ribbingStretch))
|
||||
|
||||
// Complete pattern?
|
||||
if (complete) {
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 7,
|
||||
title: 'cuff'
|
||||
})
|
||||
}
|
||||
|
||||
return part
|
||||
}
|
|
@ -22,11 +22,6 @@ export default function (part) {
|
|||
if (['frontArmhole', 'frontCollar'].indexOf(i) === -1) delete paths[i]
|
||||
}
|
||||
|
||||
// Shorten body to take ribbing into account
|
||||
if (options.ribbing) {
|
||||
for (const p of ['hem', 'cfHem']) points[p] = points[p].shift(90, store.get('ribbingHeight'))
|
||||
}
|
||||
|
||||
// Shape side seam
|
||||
points.hips.x = (measurements.hips * (1 + options.hipsEase)) / 4
|
||||
points.hem.x = points.hips.x
|
||||
|
@ -83,7 +78,7 @@ export default function (part) {
|
|||
snippets.button = new Snippet('button', points.cutonfoldVia1.shift(-70, 30)).attr('data-scale', '3.3')
|
||||
|
||||
if (sa) {
|
||||
paths.sa = paths.hemBase.offset(options.ribbing ? sa : 3 * sa).join(paths.saBase.offset(sa)).join(paths.buttonBase.offset(3 * sa))
|
||||
paths.sa = paths.hemBase.offset(3 * sa).join(paths.saBase.offset(sa)).join(paths.buttonBase.offset(3 * sa))
|
||||
paths.sa = paths.sa.line(paths.sa.start()).close().attr('class', 'fabric sa')
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,6 @@ import config from '../config'
|
|||
import draftBack from './back'
|
||||
import draftFront from './front'
|
||||
import draftSleeve from './sleeve'
|
||||
import draftCuff from './cuff'
|
||||
import draftGusset from './gusset'
|
||||
import draftHoodSide from './hoodside'
|
||||
import draftHoodCenter from './hoodcenter'
|
||||
|
@ -35,7 +34,6 @@ Pattern.prototype.draftSleeveBase = function (part) {
|
|||
Pattern.prototype.draftBack = draftBack
|
||||
Pattern.prototype.draftFront = draftFront
|
||||
Pattern.prototype.draftSleeve = draftSleeve
|
||||
Pattern.prototype.draftCuff = draftCuff
|
||||
Pattern.prototype.draftGusset = draftGusset
|
||||
Pattern.prototype.draftHoodSide = draftHoodSide
|
||||
Pattern.prototype.draftHoodCenter = draftHoodCenter
|
||||
|
|
|
@ -118,86 +118,3 @@ export const sharedDimensions = function (part, s) {
|
|||
}
|
||||
}
|
||||
|
||||
export const draftRibbing = function (part, length) {
|
||||
let {
|
||||
store,
|
||||
measurements,
|
||||
options,
|
||||
points,
|
||||
paths,
|
||||
Path,
|
||||
Point,
|
||||
sa,
|
||||
complete,
|
||||
paperless,
|
||||
macro,
|
||||
units,
|
||||
} = part.shorthand()
|
||||
// Don't run this every time, except when sampling
|
||||
if (typeof store.get('ribbingHeight') === 'undefined' || part.context.settings.sample) {
|
||||
store.set(
|
||||
'ribbingHeight',
|
||||
(measurements.hpsToWaistBack + measurements.waistToHips) * options.ribbingHeight
|
||||
)
|
||||
}
|
||||
let height = store.get('ribbingHeight')
|
||||
let gap = 25
|
||||
let lead = 50
|
||||
if (length < 125) lead = length / 3
|
||||
|
||||
points.topLeft = new Point(0, 0)
|
||||
points.topRight = new Point(height * 2, 0)
|
||||
points.leftGapStart = new Point(0, lead)
|
||||
points.rightGapEnd = new Point(points.topRight.x, lead)
|
||||
points.leftGapEnd = new Point(0, lead + gap)
|
||||
points.rightGapStart = new Point(points.topRight.x, lead + gap)
|
||||
points.bottomLeft = new Point(0, gap + 2 * lead)
|
||||
points.bottomRight = new Point(points.topRight.x, gap + 2 * lead)
|
||||
|
||||
paths.seam = new Path()
|
||||
.move(points.rightGapEnd)
|
||||
.line(points.topRight)
|
||||
.line(points.topLeft)
|
||||
.line(points.leftGapStart)
|
||||
.move(points.leftGapEnd)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomRight)
|
||||
.line(points.rightGapStart)
|
||||
.attr('class', 'various')
|
||||
|
||||
paths.hint = new Path()
|
||||
.move(points.leftGapStart)
|
||||
.line(points.leftGapEnd)
|
||||
.move(points.rightGapStart)
|
||||
.line(points.rightGapEnd)
|
||||
.attr('class', 'various dashed')
|
||||
|
||||
if (complete) {
|
||||
points.title = new Point(points.bottomRight.x / 2, points.bottomRight.y / 2)
|
||||
if (sa) {
|
||||
paths.sa = new Path()
|
||||
.move(points.topLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomRight)
|
||||
.line(points.topRight)
|
||||
.line(points.topLeft)
|
||||
.close()
|
||||
.offset(sa)
|
||||
.attr('class', 'various sa')
|
||||
}
|
||||
macro('vd', {
|
||||
from: points.bottomRight,
|
||||
to: points.topRight,
|
||||
x: points.topRight.x - 25,
|
||||
text: units(length),
|
||||
})
|
||||
}
|
||||
|
||||
if (paperless) {
|
||||
macro('hd', {
|
||||
from: points.topLeft,
|
||||
to: points.topRight,
|
||||
y: points.topRight.y - sa - 15,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,12 +17,6 @@ export default function (part) {
|
|||
if (p !== 'sleevecap') delete paths[p]
|
||||
}
|
||||
|
||||
// Shorten sleeve to take ribbing into account
|
||||
if (options.ribbing) {
|
||||
for (let p of ['wristLeft', 'wristRight'])
|
||||
points[p] = points[p].shift(90, store.get('ribbingHeight'))
|
||||
}
|
||||
|
||||
// Paths
|
||||
paths.saBase = new Path()
|
||||
.move(points.wristRight)
|
||||
|
@ -46,22 +40,18 @@ export default function (part) {
|
|||
to: new Point(0, points.backPitch.y),
|
||||
})
|
||||
if (sa) {
|
||||
if (options.ribbing) paths.sa = paths.seam.offset(sa)
|
||||
else {
|
||||
paths.sa = paths.saBase
|
||||
.clone()
|
||||
.offset(sa)
|
||||
.join(paths.hemBase.offset(3 * sa))
|
||||
.close()
|
||||
}
|
||||
paths.sa.attr('class', 'fabric sa')
|
||||
}
|
||||
}
|
||||
|
||||
// Paperless?
|
||||
if (paperless) {
|
||||
let hemSa = sa
|
||||
if (!options.ribbing) hemSa = 3 * sa
|
||||
const hemSa = 3 * sa
|
||||
macro('hd', {
|
||||
from: points.wristLeft,
|
||||
to: points.wristRight,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue