1
0
Fork 0

Merge pull request #6776 from HaasJona/add/bibi_finishing

[feature]: Bibi: Add waistband, cuff and neck finish option, improve side seam calculation
This commit is contained in:
Joost De Cock 2024-06-13 15:43:08 +02:00 committed by GitHub
commit cabf023019
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
132 changed files with 2590 additions and 497 deletions

View file

@ -9,6 +9,10 @@ Unreleased:
cathrin:
- Allow negative values in backDrop option. Fixes #6563
- Allow negative values for the frontRise options. Fixes #6563
bibi:
- Changed the algorithm to draft the side seam, so the measurements are followed more precisely
- Reduced default influence of the seat back measurement and added an option to adjust it.
- Added various options for ribbing and knit binding on waistband, armscyes/cuffs and neck hole and included more documentation
huey:
- The lengthBonus option default was changed from 0% to 15%. Fixes #6596
onyx:

View file

@ -4,7 +4,11 @@
"p": {
"back": "Back",
"front": "Front",
"sleeve": "Sleeve"
"sleeve": "Sleeve",
"waistband": "Waistband",
"cuff": "Cuff",
"neckBinding": "Neck Binding",
"armholeBinding": "Armhole Binding"
},
"s": {
"dartNo.t": "No bust dart",
@ -30,7 +34,23 @@
"length.knee.t": "Knee",
"length.knee.d": "Create a knee-length dress.",
"length.floor.t": "Floor",
"length.floor.d": "Create a floor-length dress. Use a negative length bonus to prevent the garment from actually dragging on the floor."
"length.floor.d": "Create a floor-length dress. Use a negative length bonus to prevent the garment from actually dragging on the floor.",
"cutCuff.t": "The cuff is not shown",
"cutCuff.d": "The **Cuff** (6) is a rectangular piece of ribbing fabric {{{ w }}} wide and {{{ l }}} long.",
"cutWaistband.t": "The waistband is not shown",
"cutWaistband.d": "The **Waistband** (5) is a rectangular piece of ribbing fabric {{{ w }}} wide and {{{ l }}} long.",
"cutNeckBinding.t": "The neck binding is not shown",
"cutNeckBinding.d": "The **Neck Binding** (3) is a rectangular piece of ribbing fabric {{{ w }}} wide and {{{ l }}} long.",
"cutArmholeBinding.t": "The armhole binding is not shown",
"cutArmholeBinding.d": "The **Armhole Binding** (4) is a rectangular piece of ribbing fabric {{{ w }}} wide and {{{ l }}} long.",
"useWaistRibbingNo.t": "No ribbing",
"useWaistRibbingNo.d": "Do not include ribbing",
"useWaistRibbingYes.t": "Include ribbing",
"useWaistRibbingYes.d": "Include ribbing on the waistband",
"useCuffRibbingNo.t": "No ribbing",
"useCuffRibbingNo.d": "Do not include ribbing",
"useCuffRibbingYes.t": "Include ribbing",
"useCuffRibbingYes.d": "Include ribbing on the sleeve"
},
"o": {
"draftForHighBust": {
@ -95,7 +115,7 @@
},
"flare": {
"t": "Flare",
"d": "How much fabric to use at the bottom hem of the design. Only applies when the design goes below the seat."
"d": "How much fabric to use at the bottom hem of the design. Only applies when the design goes below the waist."
},
"dart": {
"t": "Allow bust dart",
@ -124,6 +144,34 @@
"length": {
"t": "Length",
"d": "Which measurement line to use for the bottom hem. You can do fine adjustments using the bonus length option."
},
"useWaistRibbing": {
"t": "Waistband Ribbing",
"d": "Include ribbing on the waistband"
},
"useCuffRibbing": {
"t": "Cuff Ribbing",
"d": "Include ribbing on the sleeve"
},
"ribbingHeight": {
"t": "Ribbing Height",
"d": "Controls the height of the ribbing"
},
"ribbingStretch": {
"t": "Ribbing stretch",
"d": "Use this to adapt the pattern to how stretchy the ribbing that you are using is."
},
"bindingHeight": {
"t": "Knit binding height",
"d": "Controls the height of the knit binding for neck and armhole."
},
"seatBackAdjustment": {
"t": "Seat back adjustment",
"d": "Controls the influence of the seat back measurement."
},
"curvatureAdjustment": {
"t": "Curvature adjustment",
"d": "Controls how straight the side seam is above the hem."
}
}
}

View file

@ -0,0 +1,48 @@
import { front } from './front.mjs'
import { back } from './back.mjs'
import { draftKnitBinding } from './shared.mjs'
export const armholeBinding = {
name: 'bibi.armholeBinding',
after: [front, back],
options: {
bindingHeight: {
pct: 2.5,
min: 1.25,
max: 5,
menu: 'style',
snap: {
metric: [10, 15, 20, 25, 30],
imperial: [12.7, 19.05, 25.4, 31.75, 38.1],
},
toAbs: (val, { measurements }) =>
(measurements.hpsToWaistBack + measurements.waistToHips) * val,
},
},
draft: bibiArmholeBinding,
}
function bibiArmholeBinding({ part, store, points, macro }) {
if (store.separateSleeves) {
return part.hide()
}
draftKnitBinding(part, store.armholeSizeBack + store.armholeSizeFront)
/*
* Annotations
*/
// Cutlist
store.cutlist.setCut({ cut: 2, from: 'ribbing', identical: true })
// Title
macro('title', {
at: points.title,
nr: 4,
scale: 0.5,
rotation: 90,
title: 'armholeBinding',
})
return part
}

View file

@ -1,4 +1,5 @@
import { base } from '@freesewing/brian'
import { waistband } from './waistband.mjs'
import {
adjustSidePoints,
constructBackHem,
@ -15,92 +16,28 @@ export const back = {
measurements: ['hips', 'waist', 'hpsToWaistBack', 'chest', 'seat', 'seatBack', 'waistToSeat'],
optionalMeasurements: ['bustSpan', 'highBust', 'waistToUnderbust', 'waistToKnee', 'waistToFloor'],
hide: { from: true },
after: sleeve,
after: [waistband, sleeve],
options: {
// Brian overrides
s3Collar: 0,
s3Armhole: 0,
brianFitSleeve: true,
brianFitCollar: false,
bicepsEase: { pct: 5, min: 0, max: 50, menu: 'fit' },
collarEase: 0,
shoulderSlopeReduction: 0,
sleeveWidthGuarantee: 0.85,
frontArmholeDeeper: 0.01,
legacyArmholeDepth: false,
// Unused as legacyArmholeDepth is disabled, hide option in documentation
armholeDepthFactor: 0.5,
shoulderEase: { pct: 0, min: -2, max: 6, menu: 'fit' },
// Note: we reuse Brian's cuff ease as "armhole fullness"
cuffEase: {
pct: 20,
min: 0,
max: 200,
menu: (settings, mergedOptions) =>
mergedOptions.sleeves === false ? false : 'style.sleeves',
},
armholeDepth: {
pct: 2,
min: -10,
max: 50,
menu: (settings, mergedOptions) =>
mergedOptions?.legacyArmholeDepth ? false : 'style.sleeves',
},
armholeCurveBack: {
pct: 30,
min: -10,
max: 120,
menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'),
},
armholeDropBack: {
pct: 20,
min: -50,
max: 50,
menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'),
},
lengthBonus: { pct: 0, min: -30, max: 30, menu: 'style.length' },
draftForHighBust: { bool: true, menu: 'fit' },
// Bibi specific
fitWaist: { bool: true, menu: 'fit', order: 'EBA' },
waistEase: {
pct: 1,
min: -10,
max: 20,
menu: (settings, mergedOptions) => (mergedOptions.fitWaist ? 'fit' : false),
order: 'EBB',
},
hipsEase: { pct: 2, min: -5, max: 50, menu: 'fit', order: 'ECA' },
seatEase: { pct: 2, min: -5, max: 50, menu: 'fit', order: 'EDA' },
chestEase: { pct: 2, min: -5, max: 25, menu: 'fit', order: 'EAB' },
length: {
dflt: 'seat',
list: ['underbust', 'waist', 'hips', 'seat', 'knee', 'floor'],
menu: 'style.length',
},
flare: {
pct: 5,
min: 0,
max: 150,
menu: (settings, mergedOptions) =>
(mergedOptions.length === 'seat' && mergedOptions.lengthBonus > 0) ||
mergedOptions.length === 'knee' ||
mergedOptions.length === 'floor'
? 'style.length'
: false,
},
necklineWidth: { pct: 15, min: -5, max: 90, menu: 'style' },
strapWidth: {
pct: 40,
min: 5,
min: 15,
max: 100,
menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'),
},
sleeves: { bool: true, menu: 'style.sleeves' },
backNeckCutout: { pct: 6, min: 2, max: 110, menu: 'style' },
backNeckBend: { pct: 50, min: 0, max: 70, menu: 'style' },
seatBackAdjustment: {
pct: 20,
min: 0,
max: 100,
menu: 'advanced',
},
curvatureAdjustment: {
pct: 20,
min: 0.1,
max: 100,
menu: 'advanced',
},
},
draft: bibiBack,
}
@ -115,12 +52,10 @@ function bibiBack({
Snippet,
snippets,
options,
measurements,
absoluteOptions,
macro,
complete,
utils,
part,
log,
}) {
// Hide Brian paths
for (const key of Object.keys(paths)) paths[key].hide()
@ -140,15 +75,13 @@ function bibiBack({
delete points.cfNeck
delete points.cfNeckCp1
constructBackPoints(points, Point, measurements, options)
constructBackPoints(part)
adjustSidePoints(points, options)
adjustSidePoints(part)
correctArmHole(points, paths, Path, options, utils)
correctArmHole(part)
points.cbHem = new Point(0, points.cbWaist.y + measurements.waistToHips * options.lengthBonus)
constructBackHem(points, measurements, options, Point, paths, Path, log)
constructBackHem(part, options.useWaistRibbing ? -store.get('ribbingHeight') : 0)
store.set('backSideSeamLength', paths.sideSeam.length())
@ -171,20 +104,7 @@ function bibiBack({
.move(points.neck)
.curve(points.neckCp2, points.cbNeckCp1, points.cbNeck)
.addClass('fabric')
createArmHoles(
options,
store,
points,
paths,
Path,
snippets,
Snippet,
strapWidth,
options.armholeCurveBack,
options.armholeDropBack,
utils,
'bnotch'
)
createArmHoles(part, strapWidth, options.armholeCurveBack, options.armholeDropBack, 'bnotch')
paths.centerLine = new Path().move(points.cbNeck).line(points.cbHem).addClass('fabric')
@ -197,6 +117,9 @@ function bibiBack({
Math.min(paths.sideSeam.length() * 0.8, points.armhole.dy(points.cbWaist) * 0.5)
)
store.set('armholeSizeBack', paths.armhole.length())
store.set('neckSizeBack', paths.backNeck.length())
const reverse = paths.sideSeam.reverse()
snippets.gatherAreaStart = new Snippet('notch', reverse.shiftAlong(store.get('gatherAreaStart')))
snippets.gatherAreaBack = new Snippet(
@ -207,12 +130,11 @@ function bibiBack({
if (sa) {
paths.sa = new Path()
.move(points.cbHem)
.join(paths.hem.offset(sa * 3))
.join(paths.hem.offset(sa * (options.useWaistRibbing ? 1 : 3)))
.join(paths.sideSeam.offset(sa))
.join(paths.armhole.offset(sa))
.join(paths.armhole.offset(sa * (store.separateSleeves ? 1 : 0)))
.join(paths.shoulder.offset(sa))
.join(paths.backNeck.offset(sa))
.line(points.cbNeck)
.line(points.neck)
.attr('class', 'fabric sa')
}
@ -228,9 +150,19 @@ function bibiBack({
macro('title', { at: points.title, nr: 2, title: 'back' })
if (complete && points.hem.y > points.waist.y)
paths.waist = new Path().move(points.cbWaist).line(points.waist).attr('class', 'help')
if (complete) {
if (points.hem.y > points.waist.y)
paths.waist = new Path().move(points.cbWaist).line(points.waist).attr('class', 'help')
if (!store.separateSleeves) {
paths.armholeBinding = paths.armhole
.offset(-absoluteOptions.bindingHeight)
.addClass('various help')
}
paths.neckBinding = paths.backNeck
.offset(-absoluteOptions.bindingHeight)
.addClass('various help')
}
macro('pd', {
id: 'pArmhole',
path: paths.armhole.reverse(),
@ -284,7 +216,7 @@ function bibiBack({
x: points.armhole.x + sa + 30,
})
plotSideLineMeasurements(points, paths.sideSeam, utils, macro)
plotSideLineMeasurements(part, paths.sideSeam)
return part
}

121
designs/bibi/src/cuff.mjs Normal file
View file

@ -0,0 +1,121 @@
import { sleevecap as brianSleeveCap } from '@freesewing/brian'
import { hidePresets } from '@freesewing/core'
import { draftRibbing } from './shared.mjs'
export const cuff = {
name: 'bibi.cuff',
from: brianSleeveCap,
hide: hidePresets.HIDE_TREE,
options: {
// Brian overrides, placed here as this is the first loaded part that inherits from brian base
s3Collar: 0,
s3Armhole: 0,
brianFitSleeve: true,
brianFitCollar: false,
bicepsEase: { pct: 5, min: 0, max: 50, menu: 'fit' },
collarEase: 0,
shoulderSlopeReduction: 0,
sleeveWidthGuarantee: 0.85,
frontArmholeDeeper: 0.01,
legacyArmholeDepth: false,
// Unused as legacyArmholeDepth is disabled, hide option in documentation
armholeDepthFactor: 0.5,
shoulderEase: { pct: 0, min: -2, max: 6, menu: 'fit' },
// Note: we reuse Brian's cuff ease as "armhole fullness"
cuffEase: {
pct: 20,
min: 0,
max: 200,
menu: (settings, mergedOptions) =>
mergedOptions.sleeves === false ? false : 'style.sleeves',
},
armholeDepth: {
pct: 2,
min: -10,
max: 50,
menu: (settings, mergedOptions) =>
mergedOptions?.legacyArmholeDepth ? false : 'style.sleeves',
},
armholeCurveBack: {
pct: 30,
min: -10,
max: 120,
menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'),
},
armholeDropBack: {
pct: 20,
min: -50,
max: 50,
menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'),
},
// cuff specific settings
useCuffRibbing: {
bool: false,
menu: (settings, mergedOptions) =>
mergedOptions.sleeves && mergedOptions.sleeveLength >= 0.05 ? 'style' : false,
},
ribbingStretch: { pct: 15, min: 0, max: 30, menu: 'fit' },
ribbingHeight: {
pct: 10,
min: 5,
max: 15,
menu: (settings, mergedOptions) =>
mergedOptions.useWaistRibbing || mergedOptions.useCuffRibbing ? 'style' : false,
toAbs: (val, { measurements }) =>
(measurements.hpsToWaistBack + measurements.waistToHips) * val,
},
},
draft: bibiCuff,
}
function bibiCuff({ part, store, measurements, options, paths, points, Point, macro }) {
store.set(
'ribbingHeight',
(measurements.hpsToWaistBack + measurements.waistToHips) * options.ribbingHeight
)
if (!options.useCuffRibbing || !options.sleeves || options.sleeveLength < 0.05) {
store.set('cuffSize', 0)
return part.hide()
}
points.sleeveTip = paths.sleevecap.edge('top')
points.sleeveTop = new Point(0, points.sleeveTip.y) // Always in center
// Wrist
points.centerWrist = points.sleeveTop.shift(-90, measurements.shoulderToWrist)
points.wristRight = points.centerWrist.shift(0, (measurements.wrist * (1 + options.cuffEase)) / 2)
points.wristLeft = points.wristRight.rotate(180, points.centerWrist)
points.cuffRight = points.bicepsRight.shiftFractionTowards(
points.wristRight,
options.sleeveLength
)
points.cuffLeft = points.bicepsLeft.shiftFractionTowards(points.wristLeft, options.sleeveLength)
points.centerCuff = points.cuffRight.shiftFractionTowards(points.cuffLeft, 0.5)
store.set('cuffSize', points.cuffLeft.dist(points.cuffRight))
// clean up temporary stuff
paths.sleevecap.hide()
draftRibbing(part, store.cuffSize * (1 - options.ribbingStretch))
/*
* Annotations
*/
// Cutlist
store.cutlist.setCut({ cut: 2, from: 'ribbing', identical: true })
// Title
macro('title', {
at: points.title,
nr: 6,
scale: 0.5,
rotation: 90,
title: 'cuff',
})
return part
}

View file

@ -8,6 +8,7 @@ import {
correctArmHole,
createArmHoles,
plotSideLineMeasurements,
verticalSplit,
} from './shared.mjs'
export const front = {
@ -59,12 +60,11 @@ function bibiFront({
Snippet,
snippets,
options,
absoluteOptions,
measurements,
macro,
complete,
utils,
part,
log,
}) {
// Hide Brian paths
for (const key of Object.keys(paths)) paths[key].hide()
@ -84,7 +84,7 @@ function bibiFront({
delete points.cbHem
delete points.cbNeck
constructFrontPoints(points, Point, measurements, options)
constructFrontPoints(part)
// FBA
points.originalChest = points.chest
@ -114,9 +114,9 @@ function bibiFront({
points.shoulderCp1 = fba.rotateUpper(points.shoulderCp1)
points.shoulder = fba.rotateUpper(points.shoulder)
}
adjustSidePoints(points, options)
adjustSidePoints(part)
correctArmHole(points, paths, Path, options, utils)
correctArmHole(part)
const strapWidth = options.sleeves ? 0 : options.strapWidth
points.neck = points.hps.shiftFractionTowards(
@ -137,7 +137,7 @@ function bibiFront({
.move(points.neck)
.curve(points.neckCp2, points.cfNeckCp1, points.cfNeck)
.addClass('fabric')
constructFrontHem(points, measurements, options, Point, paths, Path, log)
constructFrontHem(part, options.useWaistRibbing ? -store.get('ribbingHeight') : 0)
store.set('frontSideSeamLength', paths.sideSeam.length())
const frontLength = store.get('frontSideSeamLength')
@ -145,7 +145,6 @@ function bibiFront({
const dartLength = frontLength - backLength
const constructDart = (path, tip, dartLength) => {
const length = path.length()
dartLength = Math.max(0, Math.min(dartLength, length))
const gatherArea = (store.get('gatherAreaLength') ?? 0) + dartLength
@ -159,9 +158,9 @@ function bibiFront({
const endDartAlpha = path.shiftAlong(offset + auxLength + dartLength)
const endSplit = path.shiftAlong(offset + gatherArea)
let tmp = path.split(startSplit)
let tmp = verticalSplit(Path, path, startSplit)
const pathBefore = tmp[0]
tmp = tmp[1].split(endSplit)
tmp = verticalSplit(Path, tmp[1], endSplit)
const pathGather = tmp[0]
const pathAfter = tmp[1]
const angleBefore = path.angleAt(startSplit)
@ -240,19 +239,10 @@ function bibiFront({
.addText('gather', 'center various help')
}
}
createArmHoles(
options,
store,
points,
paths,
Path,
snippets,
Snippet,
strapWidth,
options.armholeCurveFront,
0,
utils
)
createArmHoles(part, strapWidth, options.armholeCurveFront, 0)
store.set('armholeSizeFront', paths.armhole.length())
store.set('neckSizeFront', paths.frontNeck.length())
paths.centerLine = new Path().move(points.cfNeck).line(points.cfHem).addClass('fabric')
@ -267,32 +257,43 @@ function bibiFront({
})
if (sa) {
if (paths.sideSeam1)
if (paths.sideSeam1) {
paths.sa = new Path()
.move(points.cfHem)
.join(paths.hem.offset(sa * 3))
.join(paths.hem.offset(sa * (options.useWaistRibbing ? 1 : 3)))
.join(paths.sideSeam1.offset(sa))
.join(paths.sideSeam2.offset(sa))
.join(paths.armhole.offset(sa))
.join(paths.armhole.offset(sa * (store.separateSleeves ? 1 : 0)))
.join(paths.shoulder.offset(sa))
.join(paths.frontNeck.offset(sa))
.line(points.cfNeck)
.line(points.neck)
.attr('class', 'fabric sa')
else
} else {
paths.sa = new Path()
.move(points.cfHem)
.join(paths.hem.offset(sa * 3))
.join(paths.hem.offset(sa * (options.useWaistRibbing ? 1 : 3)))
.join(paths.sideSeam.offset(sa))
.join(paths.armhole.offset(sa))
.join(paths.armhole.offset(sa * (store.separateSleeves ? 1 : 0)))
.join(paths.shoulder.offset(sa))
.join(paths.frontNeck.offset(sa))
.line(points.cfNeck)
.line(points.neck)
.attr('class', 'fabric sa')
}
}
// Waist line
if (complete && points.hem.y > points.waist.y)
paths.waist = new Path().move(points.cfWaist).line(points.waist).attr('class', 'help')
if (complete) {
// Waist line
if (points.hem.y > points.waist.y) {
paths.waist = new Path().move(points.cfWaist).line(points.waist).attr('class', 'help')
}
if (!store.separateSleeves) {
paths.armholeBinding = paths.armhole
.offset(-absoluteOptions.bindingHeight)
.addClass('various help')
}
paths.neckBinding = paths.frontNeck
.offset(-absoluteOptions.bindingHeight)
.addClass('various help')
}
macro('pd', {
id: 'pArmhole',
@ -371,7 +372,7 @@ function bibiFront({
snippets.bustPoint = new Snippet('notch', points.bust)
plotSideLineMeasurements(points, paths.sideSeamWithDart, utils, macro)
plotSideLineMeasurements(part, paths.sideSeamWithDart)
return part
}

View file

@ -4,6 +4,10 @@ import { i18n as brianI18n } from '@freesewing/brian'
import { i18n as bibiI18n } from '../i18n/index.mjs'
import { front } from './front.mjs'
import { back } from './back.mjs'
import { waistband } from './waistband.mjs'
import { cuff } from './cuff.mjs'
import { armholeBinding } from './armholeBinding.mjs'
import { neckBinding } from './neckBinding.mjs'
import { sleeve } from './sleeve.mjs'
import {
constructFrontPoints,
@ -16,12 +20,14 @@ import {
constructFrontHem,
createArmHoles,
plotSideLineMeasurements,
draftRibbing,
draftKnitBinding,
} from './shared.mjs'
// Setup our new design
const Bibi = new Design({
data,
parts: [sleeve, back, front],
parts: [waistband, cuff, armholeBinding, neckBinding, sleeve, back, front],
})
// Merge translations
@ -34,6 +40,10 @@ export {
front,
back,
sleeve,
waistband,
neckBinding,
armholeBinding,
cuff,
constructFrontPoints,
constructBackPoints,
calculateFba,
@ -44,6 +54,8 @@ export {
constructFrontHem,
createArmHoles,
plotSideLineMeasurements,
draftRibbing,
draftKnitBinding,
Bibi,
i18n,
}

View file

@ -0,0 +1,44 @@
import { front } from './front.mjs'
import { back } from './back.mjs'
import { draftKnitBinding } from './shared.mjs'
export const neckBinding = {
name: 'bibi.neckBinding',
after: [front, back],
options: {
bindingHeight: {
pct: 2.5,
min: 1.25,
max: 5,
menu: 'style',
snap: {
metric: [10, 15, 20, 25, 30],
imperial: [12.7, 19.05, 25.4, 31.75, 38.1],
},
toAbs: (val, { measurements }) =>
(measurements.hpsToWaistBack + measurements.waistToHips) * val,
},
},
draft: bibiNeckBinding,
}
function bibiNeckBinding({ part, store, points, macro }) {
draftKnitBinding(part, 2 * (store.neckSizeBack + store.neckSizeFront))
/*
* Annotations
*/
// Cutlist
store.cutlist.setCut({ cut: 1, from: 'ribbing' })
// Title
macro('title', {
at: points.title,
nr: 3,
scale: 0.5,
rotation: 90,
title: 'neckBinding',
})
return part
}

View file

@ -1,4 +1,14 @@
function createLowerPoints(points, measurements, options, prefix) {
import { capitalize } from '@freesewing/core'
export function verticalSplit(Path, path, splitPoint) {
const tmp = path.split(splitPoint)
if (Array.isArray(tmp[0])) tmp[0] = new Path().move(splitPoint)
if (Array.isArray(tmp[1])) tmp[1] = new Path().move(splitPoint)
return tmp
}
function createLowerPoints(part, prefix) {
const { measurements, points } = part.shorthand()
// These lengths are typically not critical, so use a rough estimate if not given
// We don't want the user to need these measurements, as this design can also be used for shorter tops
if (typeof measurements.waistToKnee !== 'undefined') {
@ -17,10 +27,11 @@ function createLowerPoints(points, measurements, options, prefix) {
measurements.hpsToWaistBack * 2.5
)
}
points.sideTarget = points[prefix + 'Knee'].translate(points.seatBase.x * (1 + options.flare), 0)
points.sideTarget = points[prefix + 'Knee'].translate(points.seatBase.x * 1.2, 0)
}
export function constructFrontPoints(points, Point, measurements, options) {
export function constructFrontPoints(part) {
const { measurements, options, points, Point } = part.shorthand()
points.cfBust = new Point(0, measurements.hpsToBust)
if (measurements.bustSpan) {
points.bust = new Point(measurements.bustSpan / 2, measurements.hpsToBust)
@ -58,13 +69,17 @@ export function constructFrontPoints(points, Point, measurements, options) {
const seatExtra = (measurements.seatBack - seatFront) / 4
points.cfSeat = new Point(0, points.cfWaist.y + measurements.waistToSeat)
points.seatBase = new Point((measurements.seat * (1 + options.seatEase)) / 4, points.cfSeat.y)
points.seat = seatAdjustment(points.seatBase, points.hips, -seatExtra)
// points.cfSeat = points.cfSeat.shift(-90, -seatExtra * 2)
points.seat = seatAdjustment(
points.seatBase,
points.hips,
-seatExtra * options.seatBackAdjustment
)
createLowerPoints(points, measurements, options, 'cf')
createLowerPoints(part, 'cf')
}
export function constructBackPoints(points, Point, measurements, options) {
export function constructBackPoints(part) {
const { measurements, options, points, Point } = part.shorthand()
points.chest = new Point(
(measurements.chest * (1 + options.chestEase)) / 4,
measurements.hpsToBust
@ -86,10 +101,22 @@ export function constructBackPoints(points, Point, measurements, options) {
const seatFront = measurements.seat - measurements.seatBack
const seatExtra = (measurements.seatBack - seatFront) / 4
points.seatBase = new Point((measurements.seat * (1 + options.seatEase)) / 4, points.cbSeat.y)
points.seat = seatAdjustment(points.seatBase, points.hips, seatExtra)
points.seat = seatAdjustment(points.seatBase, points.hips, seatExtra * options.seatBackAdjustment)
// points.cbSeat = points.cbSeat.shift(-90, seatExtra * 2)
createLowerPoints(points, measurements, options, 'cb')
createLowerPoints(part, 'cb')
}
function newtonIterationStep(t, f) {
return t - (t * t * (3 - 2 * t) - f) / (-6 * (t - 1) * t)
}
function findT(f) {
let t = 0.5
for (let i = 0; i < 10; i++) {
t = newtonIterationStep(t, f)
}
return t
}
function seatAdjustment(seatBase, anchor, seatExtra) {
@ -133,78 +160,268 @@ export function calculateFba(anchor, bust, side, dx, Point) {
}
}
export function correctArmHole(points, paths, Path, options, utils) {
points.armholeCp1 = points.chest
export function correctArmHole(part) {
const { options, points, utils } = part.shorthand()
points.chestBelowArmhole = points.chest.y > points.armhole.y ? points.chest : points.armhole
if (!options.sleeves && points.armhole.y > points.chest.y) {
points.armhole = utils.beamIntersectsY(points.chest, points.waist, points.armhole.y)
points.armholeCp2 = points.armhole.shift(180, points._tmp1.dx(points.armhole) / 4)
}
if (points.armhole.y > points.armholeCp1.y * 0.8) {
const frac = Math.min(
1,
(points.armhole.y - points.armholeCp1.y * 0.8) / (0.2 * points.armholeCp1.y)
)
points.armholeCp1 = points.chest.shiftFractionTowards(
points.armholeCp2.rotate(90, points.armhole),
frac
if (points.armhole.y > points.chest.y * 0.8) {
points.armholeCp1 = points.chestBelowArmhole.shift(
points.armholeCp2.angle(points.armhole) - 90,
points.chest.y * 0.2
)
} else {
points.armholeCp1 = points.chest.shiftFractionTowards(points.armhole, -1)
}
}
function extendSideLine(points, intersectionY) {
const fraction = (intersectionY - points.seat.y) / points.seat.dy(points.sideTarget)
return points.seat.shiftFractionTowards(points.sideTarget, fraction)
const fraction = (intersectionY - points.baseBottom.y) / points.baseBottom.dy(points.sideTarget)
return points.baseBottom.shiftFractionTowards(points.sideTarget, fraction)
}
export function constructSideSeam(Path, Point, points, height, bottomSmoothness) {
/**
* Constructs a simple side seam curve, used for the part between the armpit/chest point and the waist
* @param Path path constructor
* @param points points collection
* @param {Point} start upper point
* @param {Point|null} cp1 first control point, can be null to use default
* @param {Point|null} cp2 second control point, can be null to use default
* @param end lower point (typically waist)
* @param endSmoothness relative length of the control point below end, determines curve
* @returns Psth
*/
function constructShortSideSeam(Path, points, start, cp1, cp2, end, endSmoothness) {
points.waistCp1 = cp1 ?? start.translate(0, start.dy(end) * 0.2)
points.hemCp2 = cp2 ?? end.translate(0, start.dy(end) * -endSmoothness)
return new Path().move(start).curve(points.waistCp1, points.hemCp2, end)
}
/**
* Calculates the control points for the side seam below the waist using bezier maths.
* @param Point point constructor
* @param start start point; This is typically the waist point
* @param {[Point]} inBetweenPoints array of points that the line should go through (or at least go right of)
* @param end end point, this is typically the point where the waistband meets the bottom hem
* @param defaultEndSmoothness relative length of the control point above the end point
* @returns {[Point, Point, Point]} cp1, cp2 and the end point (which might have been adjusted)
*/
function calculateControlPointsForHipCurve(
Point,
start,
inBetweenPoints,
end,
defaultEndSmoothness
) {
// loop used for correction if we don't find a solution
outer: for (;;) {
let resultB = null
let resultD = null
let minCurveFactor = null
// ensure the end point is right of the in-between points
for (const point of inBetweenPoints) {
if (point.x > end.x) {
end = new Point(point.x, end.y)
}
}
for (const point of inBetweenPoints) {
const xFactor = start.dx(point) / start.dx(end)
const yFactor = start.dy(point) / start.dy(end)
const c = start.dy(point) / start.dy(end)
const maxFactor = 0.95
if (xFactor > maxFactor && yFactor > maxFactor) {
// ignore points that are very close to the end point
continue
}
// Find the parameter t on the bezier curve for the in-between point
// based on its x location relative to start and end point
const t = findT(xFactor)
/* The resulting curve roughly looks like this, start and end are always vertical:
O Start
|
| b
|
O Cp1
O in between point
O Cp2
|
| d
|
O End
Start and End are given, and we need to figure out the distances b and d so the curve goes through the
in-between point. d defaults to the defaultEndSmoothness given as parameter and b needs to be figured out.
The general formula for the y coordinate of the
in-between point on the curve is |inBetweenPoint = (b)(3(1-t)²t)+(1-d)(3(1-t))+|
This formula assumes End is at (1/1) and Start is at (0/0), which is why we calculated the xFactor and yFactor above.
*/
/* First we check if we need to increase d above its default value, to catch an in-between point that's very
far on the upper right.
For this we assume some "default" b value and calculate d
*/
let defaultB = 0.5
let d = 1 - (c - 3 * defaultB * (1 - t) * (1 - t) * t - t * t * t) / (3 * (1 - t) * t * t)
// if d is above defaultEndSmoothness, increase it (but not more than 1.0)
d = Math.max(defaultEndSmoothness, Math.min(d, 1))
// now let's calculate the b for this d value
let b = (c - 3 * (1 - d) * (1 - t) * t * t - t * t * t) / (3 * (1 - t) * (1 - t) * t)
if (b < 0) {
// We haven't found a good solution. Let's shift the end point to the right and try again
end = end.translate(5, 0)
continue outer
}
// limit b to sensible values
b = Math.min(0.5, b)
// calculate d again, as it might have changed because we limited b
d = 1 - (c - 3 * b * (1 - t) * (1 - t) * t - t * t * t) / (3 * (1 - t) * t * t)
// limit d to sensible values, don't go below defaultEndSmoothness so the end stays vertical even
// if it could go inwards directly
d = Math.max(defaultEndSmoothness, Math.min(d, 1))
let curveFactor = b - d
// if we had multiple in-between-points find the one with the smallest b
if (d > 0 && (minCurveFactor === null || curveFactor < minCurveFactor)) {
resultB = b
resultD = d
minCurveFactor = curveFactor
}
}
if (resultB === null) {
// We had no relevant in-between points at all, so just generate a smooth curve
resultB = 0.5
resultD = defaultEndSmoothness
}
return [
start.translate(0, resultB * start.dy(end)),
end.translate(0, -resultD * start.dy(end)),
end,
]
}
}
/**
* does the same as path.intersectsY(sideOffset) with a small bugfix
* @param path Path
* @param sideOffset y coordinate
* @returns {[Point]} intersections
*/
function getIntersectionY(path, sideOffset) {
const y = path.intersectsY(sideOffset)
if (y.length > 0) return y
// Sometimes the intersection is directly on a node of the sidepath
// So shift the y coordinate a little bit.
// Intersecting the path exactly on the corner points sometimes doesn't work.
// See issue #3367
sideOffset += 0.001
return path.intersectsY(sideOffset)
}
export function constructSideSeam(part, height) {
const { points, options, paths, Path, Point } = part.shorthand()
const tempPoints = calculateControlPointsForHipCurve(
Point,
points.waist,
[points.hips],
points.seat,
options.curvatureAdjustment
)
const base = new Path()
.move(points.armhole)
.line(points.chestBelowArmhole)
.curve(points.armholeCp1, points.waistCp2, points.waist)
.smurve(points.hipsCp2, points.hips)
.smurve(points.seatCp2, points.seat)
const intersectionY = Math.min(height, points.seat.y) - bottomSmoothness
let bottom = base.intersectsY(height)[0]
.curve(tempPoints[0], tempPoints[1], tempPoints[2])
paths.base = base.hide()
points.baseBottom = tempPoints[2]
let bottom = getIntersectionY(base, height)[0]
if (!bottom) {
// below seat
bottom = extendSideLine(points, height)
}
points.hem = bottom
let intersection = base.intersectsY(intersectionY)[0]
let result
if (points.hem.y < points.waist.y) {
result = new Path()
.move(points.armhole)
.line(points.chestBelowArmhole)
.join(
constructShortSideSeam(
Path,
points,
points.chestBelowArmhole,
points.armholeCp1,
null,
points.hem,
options.curvatureAdjustment
)
)
} else {
result = new Path()
.move(points.armhole)
.line(points.chestBelowArmhole)
.curve(points.armholeCp1, points.waistCp2, points.waist)
if (!intersection) {
if (intersectionY >= points.seat.y) {
// below seat
intersection = extendSideLine(points, intersectionY)
let controlPoints
let inBetweenPoints
if (points.hem.y <= points.hips.y) {
inBetweenPoints = []
} else if (points.hem.y <= points.seat.y) {
inBetweenPoints = [points.hips]
} else {
//above armhole
intersection = points.armhole
inBetweenPoints = [points.hips, points.seat]
}
controlPoints = calculateControlPointsForHipCurve(
Point,
points.waist,
inBetweenPoints,
points.hem,
options.curvatureAdjustment
)
points.waistCp1 = controlPoints[0]
points.hemCp2 = controlPoints[1]
points.hem = controlPoints[2]
// flare out the hem
let flareFactor = options.flare / 2
if (points.hem.y < points.waist.y) {
flareFactor = 0
} else if (points.hem.y < points.seat.y) {
flareFactor *= points.waist.dy(points.hem) / points.waist.dy(points.seat)
}
points.waistCp1 = points.waistCp1.shiftFractionTowards(points.waist, flareFactor)
points.hemCp2 = points.hemCp2
.rotate(flareFactor * 45, points.waist)
.shiftFractionTowards(points.waist, flareFactor)
points.hem = points.hem.rotate(flareFactor * 90, points.waist)
result = result.curve(points.waistCp1, points.hemCp2, points.hem)
}
bottom.x = (bottom.x + intersection.x) / 2 // creates a smoother bottom as the bottom is vertical
points.intersection = intersection
const angle = base.angleAt(intersection)
if (!angle) {
return base
}
const intersectionCp1 = intersection.shift(angle, bottomSmoothness * 0.3)
const intersectionCp2 = new Point(bottom.x, bottom.y - bottomSmoothness * 0.3)
points.intersectionCp1 = intersectionCp1
points.intersectionCp2 = intersectionCp2
let result = base.split(intersection)[0]
if (!result.curve) {
result = new Path().move(points.armhole)
}
return result.curve(intersectionCp1, intersectionCp2, bottom).reverse()
return result.reverse()
}
export function adjustSidePoints(points, options) {
export function adjustSidePoints(part) {
const { options, points } = part.shorthand()
// Remove waist fitting if option is disabled
if (!options.fitWaist || points.waist.x > points.armhole.x) {
if (points.waist.x < points.armhole.x) {
@ -220,18 +437,9 @@ export function adjustSidePoints(points, options) {
if (points.hips.x < points.waist.x) {
points.hips.x = points.waist.x
}
// prevent excessive hips narrowing
if (points.hips.x < (points.waist.x + points.seat.x) / 2) {
points.hips.x = (points.waist.x + points.seat.x) / 2
}
// prevent smaller seat than hips
if (points.seat.x < points.hips.x) {
points.seat.x = points.hips.x
}
// prevent excessive waist narrowing
if (points.waist.x < 2 * points.hips.x - points.seat.x) {
points.waist.x = 2 * points.hips.x - points.seat.x
}
// curve points
points.waistCp2 = points.waist.shift(90, points.armhole.dy(points.waist) * 0.2)
@ -239,11 +447,8 @@ export function adjustSidePoints(points, options) {
points.hipsCp2 = points.waist.shiftFractionTowards(points.hips, 0.6)
}
function getBottomSmoothness(bottom, points) {
return (Math.min(bottom, points.seat.y) - points.armhole.y) * 0.3
}
export function constructBackHem(points, measurements, options, Point, paths, Path, log) {
export function constructBackHem(part, bonusLength = 0) {
const { measurements, options, points, paths, Path, Point, log } = part.shorthand()
let centerPoint
// Extra length for butt
@ -280,28 +485,30 @@ export function constructBackHem(points, measurements, options, Point, paths, Pa
centerPoint = points.cbSeat
}
let hemBottom = centerPoint.y + bonusLengthMeasurement * options.lengthBonus
let hemBottom = centerPoint.y + bonusLengthMeasurement * options.lengthBonus + bonusLength
if (hemBottom <= points.armhole.y * 1.1) {
log.warn('Adjusting hem as it would be above or too close to armhole.')
hemBottom = points.armhole.y * 1.1
}
if (hemBottom <= points.underbust.y) {
log.warn('Adjusting hem as it would be above the underbust.')
hemBottom = points.underbust.y
}
points.cbHem = new Point(0, hemBottom + extraBackLength)
points.midHem = new Point(points.hem.x * 0.66, points.cbHem.y)
paths.sideSeam = constructSideSeam(
Path,
Point,
points,
hemBottom,
getBottomSmoothness(hemBottom, points)
).addClass('fabric')
paths.sideSeam = constructSideSeam(part, hemBottom).addClass('fabric')
points.midHemCp1 = new Point(points.hem.x * 0.66, points.cbHem.y)
points.midHemCp2 = points.hem
.shiftTowards(points.hemCp2, points.hem.x * 0.1)
.rotate(90, points.hem)
paths.hem = new Path()
.move(points.cbHem)
.curve(points.midHem, points.midHem, points.hem)
.curve(points.midHemCp1, points.midHemCp2, points.hem)
.addClass('fabric')
}
export function constructFrontHem(points, measurements, options, Point, paths, Path, log) {
export function constructFrontHem(part, bonusLength = 0) {
const { measurements, options, points, paths, Path, Point, log } = part.shorthand()
let centerPoint
let bonusLengthMeasurement = measurements.hpsToWaistBack
switch (options.length) {
@ -332,41 +539,29 @@ export function constructFrontHem(points, measurements, options, Point, paths, P
centerPoint = points.cfSeat
}
let hemBottom = centerPoint.y + bonusLengthMeasurement * options.lengthBonus
let hemBottom = centerPoint.y + bonusLengthMeasurement * options.lengthBonus + bonusLength
if (hemBottom <= points.armhole.y * 1.1) {
log.warn('Adjusting hem as it would be above or too close to armhole.')
hemBottom = points.armhole.y * 1.1
}
if (hemBottom <= points.underbust.y) {
log.warn('Adjusting hem as it would be above the underbust.')
hemBottom = points.underbust.y
}
points.cfHem = new Point(0, hemBottom)
points.midHem = new Point(points.hem.x * 0.66, points.cfHem.y)
paths.sideSeam = constructSideSeam(
Path,
Point,
points,
hemBottom,
getBottomSmoothness(hemBottom, points)
).addClass('fabric')
paths.sideSeam = constructSideSeam(part, hemBottom).addClass('fabric')
points.midHemCp1 = new Point(points.hem.x * 0.66, points.cfHem.y)
points.midHemCp2 = points.hem
.shiftTowards(points.hemCp2, points.hem.x * 0.1)
.rotate(90, points.hem)
paths.hem = new Path()
.move(points.cfHem)
.curve(points.midHem, points.midHem, points.hem)
.curve(points.midHemCp1, points.midHemCp2, points.hem)
.addClass('fabric')
}
export function createArmHoles(
options,
store,
points,
paths,
Path,
snippets,
Snippet,
strapWidth,
armholeCurve,
armholeDrop,
utils,
notchType = 'notch'
) {
export function createArmHoles(part, strapWidth, armholeCurve, armholeDrop, notchType = 'notch') {
const { store, options, points, paths, Path, snippets, Snippet, utils } = part.shorthand()
if (options.sleeves) {
if (store.get('capSleeves')) {
const sleeveCapFactor = (options.sleeveLength + 0.2) * 4
@ -379,7 +574,10 @@ export function createArmHoles(
points.neck.angle(points.shoulder),
capLength * -0.2
)
points.armholePitchCp1 = points.sleeveCapStart.rotate(90, points.sleeveCap)
points.armholePitchCp1 = points.sleeveCap.shiftFractionTowards(
points.sleeveCapStart.rotate(90, points.sleeveCap),
0.5
)
points.sleeveCapCp = points.sleeveCap
.shiftTowards(points.armholePitchCp1, capLength * 0.3)
.rotate(-90, points.sleeveCap)
@ -443,7 +641,8 @@ export function createArmHoles(
}
}
export function plotSideLineMeasurements(points, sideSeam, utils, macro) {
export function plotSideLineMeasurements(part, sideSeam) {
const { points, macro, utils } = part.shorthand()
const offsets = {
seat: points.seat.y,
hips: points.hips.y,
@ -489,3 +688,175 @@ export function plotSideLineMeasurements(points, sideSeam, utils, macro) {
}
}
}
export function draftRibbing(part, length) {
const { store, measurements, options, points, paths, Path, Point, expand, sa, 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
)
}
const height = store.get('ribbingHeight')
if (expand) {
store.flag.preset('expandIsOn')
} else {
// Expand is off, do not draw the part but flag this to the user
const extraSa = sa ? 2 * sa : 0
store.flag.note({
msg: `bibi:cut${capitalize(part.name.split('.')[1])}`,
notes: [sa ? 'flag:saIncluded' : 'flag:saExcluded', 'flag:partHiddenByExpand'],
replace: {
w: units(2 * height + extraSa),
l: units(length + extraSa),
},
suggest: {
text: 'flag:show',
icon: 'expand',
update: {
settings: ['expand', 1],
},
},
})
// Also hint about expand
store.flag.preset('expandIsOff')
return part.hide()
}
points.topLeft = new Point(0, 0)
points.topRight = new Point(height * 2, 0)
points.topFold = new Point(height, 0)
points.bottomLeft = new Point(0, length)
points.bottomRight = new Point(points.topRight.x, length)
points.bottomFold = new Point(points.topFold.x, length)
paths.seam = new Path()
.move(points.bottomRight)
.line(points.topRight)
.line(points.topLeft)
.line(points.bottomLeft)
.line(points.bottomRight)
.close()
.addClass('various')
paths.fold = new Path().move(points.topFold).line(points.bottomFold).addClass('various help')
if (sa) paths.sa = paths.seam.offset(sa).addClass('various sa')
/*
* Annotations
*/
// Title
points.title = new Point(points.bottomRight.x / 3, points.bottomRight.y / 3)
// Dimensions
macro('vd', {
id: 'hFull',
from: points.bottomRight,
to: points.topRight,
x: points.topRight.x + sa + 15,
})
macro('hd', {
id: 'wFull',
from: points.topLeft,
to: points.topRight,
y: points.topRight.y - sa - 15,
})
}
export function draftKnitBinding(part, length) {
const { store, absoluteOptions, points, paths, Path, Point, expand, sa, macro, units } =
part.shorthand()
// Don't run this every time, except when sampling
if (typeof store.get('bindingHeight') === 'undefined' || part.context.settings.sample) {
store.set('bindingHeight', absoluteOptions.bindingHeight)
}
const height = store.get('bindingHeight')
if (expand) {
store.flag.preset('expandIsOn')
} else {
// Expand is off, do not draw the part but flag this to the user
const extraSa = sa ? 2 * sa : 0
store.flag.note({
msg: `bibi:cut${capitalize(part.name.split('.')[1])}`,
notes: [sa ? 'flag:saIncluded' : 'flag:saExcluded', 'flag:partHiddenByExpand'],
replace: {
w: units(4 * height),
l: units(length + extraSa),
},
suggest: {
text: 'flag:show',
icon: 'expand',
update: {
settings: ['expand', 1],
},
},
})
// Also hint about expand
store.flag.preset('expandIsOff')
return part.hide()
}
points.topLeft = new Point(0, 0)
points.topRight = new Point(height * 4, 0)
points.topFold = new Point(height, 0)
points.bottomLeft = new Point(0, length)
points.bottomRight = new Point(points.topRight.x, length)
points.bottomFold = new Point(points.topFold.x, length)
paths.seam = new Path()
.move(points.bottomRight)
.line(points.topRight)
.line(points.topLeft)
.line(points.bottomLeft)
.line(points.bottomRight)
.close()
.addClass('various')
paths.fold = new Path().move(points.topFold).line(points.bottomFold).addClass('various help')
if (sa) {
paths.sa = new Path()
.move(points.topLeft)
.line(points.topLeft.translate(0, -sa))
.line(points.topRight.translate(0, -sa))
.line(points.topRight)
.move(points.bottomLeft)
.line(points.bottomLeft.translate(0, sa))
.line(points.bottomRight.translate(0, sa))
.line(points.bottomRight)
.addClass('various sa')
}
/*
* Annotations
*/
// Title
points.title = new Point(points.bottomRight.x / 3, points.bottomRight.y / 3)
// Dimensions
macro('vd', {
id: 'hFull',
from: points.bottomRight,
to: points.topRight,
x: points.topRight.x + sa + 15,
})
macro('hd', {
id: 'wFull',
from: points.topLeft,
to: points.topRight,
y: points.topRight.y - sa - 15,
})
macro('hd', {
id: 'wFold',
from: points.bottomFold,
to: points.bottomRight,
y: points.bottomFold.y + sa + 15,
})
}

View file

@ -1,9 +1,11 @@
import { sleevecap as brianSleeveCap } from '@freesewing/brian'
import { hidePresets } from '@freesewing/core'
import { cuff } from './cuff.mjs'
export const sleeve = {
name: 'bibi.sleeve',
from: brianSleeveCap,
after: cuff,
hide: hidePresets.HIDE_TREE,
options: {
sleeveLength: {
@ -13,13 +15,6 @@ export const sleeve = {
menu: (settings, mergedOptions) =>
mergedOptions.sleeves === false ? false : 'style.sleeves',
},
cuffEase: {
pct: 20,
min: 0,
max: 200,
menu: (settings, mergedOptions) =>
mergedOptions.sleeves === false ? false : 'style.sleeves',
},
},
measurements: ['shoulderToWrist', 'wrist'],
draft: bibiSleeve,
@ -38,6 +33,7 @@ function bibiSleeve({
snippets,
Snippet,
part,
utils,
}) {
points.sleeveTip = paths.sleevecap.edge('top')
points.sleeveTop = new Point(0, points.sleeveTip.y) // Always in center
@ -46,14 +42,17 @@ function bibiSleeve({
store.set('sleeveLength', measurements.shoulderToWrist * options.sleeveLength)
store.set('capSleeves', options.sleeveLength < 0.05)
store.set('separateSleeves', true)
store.set('sleeveCapHeight', -points.sleeveTop.y)
if (store.get('capSleeves')) {
store.set('separateSleeves', false)
return part.hide()
}
if (!options.sleeves) {
store.set('sleeveLength', 0)
store.set('separateSleeves', false)
return part.hide()
}
@ -67,20 +66,59 @@ function bibiSleeve({
options.sleeveLength
)
points.cuffLeft = points.bicepsLeft.shiftFractionTowards(points.wristLeft, options.sleeveLength)
if (store.cuffSize > 0) {
let intersectionY
if (points.bicepsLeft.dy(points.cuffLeft) > store.ribbingHeight * 1.5) {
intersectionY = points.cuffLeft.y - store.ribbingHeight
} else {
intersectionY = store.ribbingHeight * 0.5
}
points.cuffLeft = utils.beamIntersectsY(points.bicepsLeft, points.cuffLeft, intersectionY)
points.cuffRight = utils.beamIntersectsY(points.bicepsRight, points.cuffRight, intersectionY)
}
points.centerCuff = points.cuffRight.shiftFractionTowards(points.cuffLeft, 0.5)
// Paths
paths.sleevecap.hide()
paths.seam = new Path()
.move(points.bicepsLeft)
.move(points.cuffLeft)
.move(points.cuffRight)
.line(points.cuffLeft)
.line(points.cuffRight)
.line(points.bicepsRight)
.join(paths.sleevecap)
.close()
.attr('class', 'fabric')
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
if (sa) {
if (store.cuffSize === 0) {
// modify seam allowance to add mirrored/hourglass shape
points.hemLeft = utils
.beamIntersectsY(points.bicepsRight, points.cuffRight, points.cuffRight.y + sa * 2)
.translate(points.cuffRight.dx(points.cuffLeft), 0)
points.hemRight = utils
.beamIntersectsY(points.bicepsLeft, points.cuffLeft, points.cuffLeft.y + sa * 2)
.translate(points.cuffLeft.dx(points.cuffRight), 0)
paths.saBottom = new Path()
.move(points.cuffLeft)
.line(points.hemLeft)
.line(points.hemRight)
.line(points.cuffRight)
.hide()
} else {
paths.saBottom = new Path().move(points.cuffLeft).line(points.cuffRight).hide()
}
paths.sa = new Path()
.move(points.bicepsLeft)
.join(paths.saBottom)
.line(points.bicepsRight)
.join(paths.sleevecap)
.close()
.offset(sa)
.attr('class', 'fabric sa')
}
/*
* Annotations
@ -103,7 +141,7 @@ function bibiSleeve({
snippets.logo = new Snippet('logo', points.logo)
// Title
macro('title', { at: points.centerBiceps, nr: 3, title: 'sleeve' })
macro('title', { at: points.centerBiceps, nr: 4, title: 'sleeve' })
// Notches
points.frontNotch = paths.sleevecap.shiftAlong(store.get('frontArmholeToArmholePitch'))

View file

@ -0,0 +1,121 @@
import { base } from '@freesewing/brian'
import {
adjustSidePoints,
constructBackHem,
constructBackPoints,
constructFrontHem,
constructFrontPoints,
correctArmHole,
draftRibbing,
} from './shared.mjs'
export const waistband = {
name: 'bibi.waistband',
from: base,
hide: { from: true },
options: {
// Bibi specific, places here as this is the earliest part that drafts the sideseam
fitWaist: { bool: true, menu: 'fit', order: 'EBA' },
waistEase: {
pct: 1,
min: -10,
max: 20,
menu: (settings, mergedOptions) => (mergedOptions.fitWaist ? 'fit' : false),
order: 'EBB',
},
hipsEase: { pct: 2, min: -5, max: 50, menu: 'fit', order: 'ECA' },
seatEase: { pct: 2, min: -5, max: 50, menu: 'fit', order: 'EDA' },
chestEase: { pct: 2, min: -5, max: 25, menu: 'fit', order: 'EAB' },
length: {
dflt: 'seat',
list: ['underbust', 'waist', 'hips', 'seat', 'knee', 'floor'],
menu: 'style.length',
},
flare: {
pct: 0,
min: 0,
max: 150,
menu: (settings, mergedOptions) =>
(mergedOptions.length === 'waist' && mergedOptions.lengthBonus > 0) ||
mergedOptions.length === 'hips' ||
mergedOptions.length === 'seat' ||
mergedOptions.length === 'knee' ||
mergedOptions.length === 'floor'
? 'style.length'
: false,
},
backNeckCutout: { pct: 6, min: 2, max: 110, menu: 'style' },
backNeckBend: { pct: 50, min: 0, max: 70, menu: 'style' },
lengthBonus: { pct: 0, min: -30, max: 30, menu: 'style.length' },
draftForHighBust: { bool: true, menu: 'fit' },
// waistband specific
useWaistRibbing: { bool: false, menu: 'style' },
ribbingStretch: { pct: 15, min: 0, max: 30, menu: 'fit' },
ribbingHeight: {
pct: 10,
min: 5,
max: 15,
menu: (settings, mergedOptions) =>
mergedOptions.useWaistRibbing || mergedOptions.useCuffRibbing ? 'style' : false,
toAbs: (val, { measurements }) =>
(measurements.hpsToWaistBack + measurements.waistToHips) * val,
},
},
draft: bibiWaistband,
}
function bibiWaistband({ part, store, measurements, options, paths, points, snippets, macro }) {
store.set(
'ribbingHeight',
(measurements.hpsToWaistBack + measurements.waistToHips) * options.ribbingHeight
)
if (!options.useWaistRibbing) {
return part.hide()
}
// draft a simple version of front and back to determine hem length
constructBackPoints(part)
adjustSidePoints(part)
correctArmHole(part)
constructBackHem(part)
store.set('backHemLength', paths.hem.length() * 2)
constructFrontPoints(part)
adjustSidePoints(part)
constructFrontHem(part)
store.set('frontHemLength', paths.hem.length() * 2)
// clean up temporary stuff
for (const key of Object.keys(paths)) delete paths[key]
for (const key of Object.keys(snippets)) delete snippets[key]
for (const key of Object.keys(points)) delete points[key]
draftRibbing(part, (store.frontHemLength + store.backHemLength) * (1 - options.ribbingStretch))
/*
* Annotations
*/
// Cutlist
store.cutlist.setCut({ cut: 1, from: 'ribbing' })
// Title
macro('title', {
at: points.title,
nr: 5,
scale: 0.5,
rotation: 90,
title: 'waistband',
})
return part
}

View file

@ -4,13 +4,25 @@ maintainers:
- Jonathan Haas
---
- Cut 1 back on the fold.
- Cut 1 front on the fold.
- Cut 2 sleeves _with good sides together_ (optional)
- If you cut sleeves separately, remember that one has to be a mirror image of the other.
- There is no sleeve part if sleeves are disabled or the sleeve length setting is below 5%
- **Main fabric**
- Cut 1 *Front* on the fold
- Cut 1 *Back* on the fold
- Cut 2 *Sleeve(s)* mirrored (if enabled)
- **Ribbing**
- Cut 1 *Neck Binding*
- Cut 2 *Armhole Binding(s)* or *Cuff(s)* (depending on selected options)
- Cut 1 *Waistband* (if enabled)
## Caveats
- There is extra hem allowance at the hem.
- Depending on how you want to finish the neck and armholes, choose an appropriate seam allowance.
- There is extra hem allowance at the bottom hem if there is no *Waistband* part.
- There is extra hem allowance at the sleeve part if there is no *Cuff* part.
- There is no seam allowance on the neck opening.
- There is no seam allowance on the armhole if the sleeve is disabled.
- There is no seam allowance on the long sides of the *Armhole Binding* and *Neck Binding* parts.
<Note>
You can cut the front or back parts on the fold, or you can cut the halves separately and sew them together. This is especially
useful if you only have smaller pieces of fabric or if you want to add buttons or zippers to your design. In this case, make sure
to add sufficient seam allowance on the center fold.
</Note>

View file

@ -1,7 +1,5 @@
---
title: "Bibi body block"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -6,8 +6,19 @@ maintainers:
Bibi is by default designed as a close-fitting top and is best suited to knit fabrics with some stretch, such as jersey.
Woven fabrics with good drape could also work. Increase ease settings and ensure the neck hole is large enough to fit a head through.
If your main fabric is elastic enough, can use strips of it to finish the waistband, armholes/cuffs and neck opening.
Alternatively, you can also use rib fabric or store-bought strips of knit binding.
<Tip>
If you're new to sewing, interlock jersey is nice to work with, as it doesn't roll up. Prefer jersey with a few percent spandex for better recovery. Fabric weights can also help you make your choice. A weight of 130-200 grams per square meter (or 4-6 ounces per square yard) is likely to be about right.
If you're new to sewing, interlock jersey is nice to work with, as it doesn't roll up.
Prefer jersey with a few percent spandex for better recovery.
Fabric weights can also help you make your choice.
A weight of 130-200 grams per square meter (or 4-6 ounces per square yard) is likely to be about right for a basic shirt.
</Tip>
<Note>
Woven fabrics with good drape and thicker fabrics such as sweat could also work.
Increase all ease settings to around 15% and ensure the neck hole is large enough to fit a head through.
Alternatively, you can also attach a zipper or buttons to the front or back to make it easier to put on.
</Note>

View file

@ -6,23 +6,36 @@ maintainers:
<Note>
###### Bibi is a pattern building block
###### Bibi is a customizable pattern building block
Bibi can be sewn as a simple top, but is mostly designed as a building block for other patterns or custom designs.
Bibi can be sewn as a simple top, but it is mostly designed as a building block for other patterns or custom designs.
Bibi is highly customizable, but it does not in itself represent a specific garment or style. Some option combinations might not make much sense.
Bibi is highly customizable, but it does not in itself represent a specific garment or style.
Some option combinations might not make much sense, and you may need to experiment with different options.
You may want to finish the hem, armholes, and/or neck using knit bands, knit binding or ribbing fabric.
In this case, you may want to look at instructions from other designs, like Aaron or Teagan.
These instructions give basic guidelines for that,
but you might also want to look at instructions from other designs, like Sven, Aaron or Teagan.
There is also lots of other stuff you could customize.
</Note>
<Note>
As with all knits and stretch fabrics, a serger/overlock will make your life easier.
If you don't have one, don't despair. You don't really need one.
All serged seams on Bibi can also be sewn with a short, narrow zigzag stitch (~2 mm wide) on a standard sewing machine.
For the topstitching steps, a coverlock works best, but if you don't have a coverlock, a twin needle will also give good results.
Of course, you can also use a zigzag stitch.
</Note>
### Step 0: Prepare the fabric
Cut out the parts including seam allowance and transfer markings and notches to the fabric.
Note that there are two different kinds of notches. You probably want to use a different notch shape or a different pen/chalk color for notches with an ×.
Note that there are two different kinds of notches. You probably want to use a different notch shape or a different pen/chalk color for ×-notches.
### Step 1: Prepare the front part
@ -33,7 +46,7 @@ If your pattern contains neither an indicated gathering section nor a dart, skip
#### Bust darts
If you drafted the pattern with _darts_, fold your front part _good sides together_ along the center line of the dart.
If the pattern was drafted with _darts_, fold your front part _good sides together_ along the center line of the dart.
Sew using an elastic stitch along the dart line from the side seam towards the bust.
Near the dart tip, make sure to stitch as parallel to the fold line as possible while still stitching over the folded edge.
@ -51,7 +64,7 @@ The stiches should have a longer stitch length setting, and you must *not* secur
Keep the thread ends loose and long.
Hold the bobbin threads with one hand tight and bunch together the fabric with the other hand until
you've gathered the side seam to the same length as the distance between the notches on the back part pattern.
you've gathered the section to the same length as the distance between the notches on the back part pattern.
Secure the threads by tying a knot.
@ -101,6 +114,94 @@ With the front part on top, sew using an elastic stitch. Repeat for both sides.
![sideseam.svg](sideseam.svg)
### Step 5: Hem the openings
### Step 5: Create the hem
If not using knit binding or knit bands fold over the fabric at the remaining openings _wrong sides together_ once and topstitch in place with an elastic stitch.
#### Using a waistband
If you've chosen to finish the hem with a waistband,
sew together the short sides of the waistband, _good sides together_,
to create a tube.
Then fold the fabric in half along its length, raw edges together, so the good sides are outside.
With the main body piece turned inside-out, pin the ring inside the bottom opening, matching raw edges.
Mark and align quarters for a consistent stretch.
The ribbing is a bit shorter, so stretch it a bit while pinning.
Sew using an elastic stitch.
Fold the hem to the outside.
Optional: Topstitch the seam allowance towards the main body piece to keep it in place.
![Attach the ribbing](ribbing.svg)
#### Simple hem
If you've chosen the option without a waistband,
fold over the hem allowance to the inside and topstitch in place using an elastic stitch.
### Step 6: Finish the neck
<Note>
This is explained in more detail in the [Teagan instructions](/docs/designs/teagan/instructions#step-3-sew-the-neck-finish) and on [this page](/docs/sewing/knit-binding).
</Note>
Turn the main body piece right side out.
Place the knit binding piece _good sides together_ on the back of the neck,
matching the raw edge of the neck opening.
The solid line on the pattern (where the seam allowance ends) should be exactly at the center back of the garment.
![Place your binding](knitbinding_a.svg)
Sew the neck binding to the main body piece.
The distance of the stitch to the raw edge is the width of the neck band
divided by four.
This is probably not equal to the standard seam allowance!
For example, if your knit band is 6 cm wide, sew 1.5 cm from the edge.
Place your presser foot 3 cm along the knit binding, so a 3 cm tail will be left unstitched.
This will help us join the ends of the binding later.
Stop sewing 3 cm before the end, leaving a tail like we did at the beginning.
![Sew binding in place](knitbinding_b.svg)
Sew the tails _good sides together_ to close the loop, making sure the neck binding is stretched evenly.
![Sew binding ends](knitbinding_c.svg)
Then sew down the remaining, unstitched length of the neck binding, keeping the same distance as before.
![Finish binding](knitbinding_d.svg)
Fold the neck binding upwards and to the inside of the top.
This will create a fold at the stitch line you just created,
and another one at the original raw edge from the front and back parts.
Topstitch the neck binding in place from the outside.
The inside edge can be left raw if you're using knit fabric.
Trim loose fabric from the inside to reduce bulk.
![Sew down binding](knitbinding_e.svg)
### Step 7: Finish the armholes
#### With sleeves
If your design has a sleeve part,
follow the waistband instructions again for the cuff or sleeve opening
and either attach a piece of ribbing or do a simple folded hem.
<Note>
Alternatively, you can also finish the bottom edge of the sleeves right at the start.
This is a little bit easier as you can work on flat fabric, but the inside of the sleeves won't be as clean
as the bottom seam will go right to the armhole opening and won't be hidden.
</Note>
#### Without sleeves
If your design is sleeveless or has only short cap sleeves as part of the main body,
finish the armholes the same way you finished the neckline.

View file

@ -0,0 +1,212 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="384"
height="384"
viewBox="0 0 101.6 101.6"
version="1.1"
id="svg1042"
sodipodi:docname="knitbinding_a.svg"
inkscape:version="1.4-beta (f21c272752, 2024-04-22, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs1036">
<marker
orient="auto"
refY="0"
refX="0"
id="cutonfoldFrom"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 12,-4 c -2,2 -2,6 0,8 z"
id="path837" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="cutonfoldTo"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 -12,-4 c 2,2 2,6 0,8 z"
id="path840" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="marker1619"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 12,-4 c -2,2 -2,6 0,8 z"
id="path1617" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="marker1623"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 -12,-4 c 2,2 2,6 0,8 z"
id="path1621" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="grainlineFrom"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 12,-4 c -2,2 -2,6 0,8 z"
id="path849" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="grainlineTo"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 -12,-4 c 2,2 2,6 0,8 z"
id="path852" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.1086321"
inkscape:cx="176.18057"
inkscape:cy="173.33512"
inkscape:document-units="mm"
inkscape:current-layer="layer3"
inkscape:document-rotation="0"
showgrid="false"
inkscape:window-width="2256"
inkscape:window-height="1427"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
fit-margin-left="0"
fit-margin-top="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<metadata
id="metadata1039">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Layer 2"
transform="translate(-17.523895,11.576236)"
style="display:inline">
<path
style="display:inline;fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 89.998601,12.4297 c -1.83729,-1.472742 -4.96577,5.345352 -7.1357,7.96638 l 16.60834,14.177442 C 100.45384,24.22535 95.062981,16.837961 89.998601,12.4297 Z"
id="path2"
sodipodi:nodetypes="cccc" />
<path
style="display:inline;fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 25.972261,11.760712 c 1.837299,-1.472741 4.827313,4.97613 6.997248,7.597158 L 16.499627,33.904534 c -0.982588,-10.348172 4.40826,-17.735561 9.472634,-22.143822 z"
id="path1-6"
sodipodi:nodetypes="cccc" />
<path
style="opacity:0;fill:#e6e6e6;stroke:none;stroke-width:0.26458333;stroke-dasharray:none"
d="M 53.756631,43.047126 C 50.587643,42.516062 46.576983,40.833428 43.625701,38.796788 37.262448,34.405591 32.153024,27.305454 28.493387,17.768679 c -0.556673,-1.450655 -1.012135,-2.727218 -1.012135,-2.836806 0,-0.109589 0.424895,0.139104 0.944208,0.552652 3.14914,2.507761 10.347749,4.616929 19.198902,5.625214 6.09872,0.694739 15.518744,0.824502 21.042355,0.289863 8.859816,-0.857557 15.236415,-2.745967 18.643769,-5.521298 1.156676,-0.942125 1.166392,-1.111159 -0.137925,2.399255 -2.370989,6.381227 -5.581692,11.669642 -9.672351,15.931526 -4.661255,4.856361 -10.175566,7.929456 -15.892129,8.856591 -2.045671,0.331774 -5.814094,0.322873 -7.85145,-0.01855 z"
id="path1772" />
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M -28.58077,125.30467 -28.72343,91.687419 C -2.5474122,91.333709 -1.3907122,62.041989 -9.8800172,22.802831 L 26.179986,11.554355 c -3.649014,13.668933 67.085951,14.282136 63.308921,-10e-7 L 125.54891,22.80283 c -12.40799,57.626849 2.91627,69.133759 18.84341,68.884589 l 0.16821,33.617251 z"
id="path6056-5"
sodipodi:nodetypes="ccccccccc" />
</g>
<g
inkscape:groupmode="layer"
id="layer6"
inkscape:label="Layer 3"
style="display:inline"
transform="translate(-4.6303613,16.435528)">
<path
style="fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 39.429081,17.121698 -0.127482,10.761124 c 13.916892,0.08499 24.557648,-2.14018 32.091448,-4.716771 18.46125,-6.313827 8.07863,-21.0170701 16.09712,-20.9598633 l -8.28639,-2.16721101 c -5.89285,0.72338859 0.5224,9.68847671 -7.66492,13.19449031 -6.11063,2.616722 -19.467713,4.695623 -32.109776,3.888231 z"
id="path930"
sodipodi:nodetypes="ccsccsc" />
<path
style="fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 87.490167,2.2061877 c 2.59216,1.6572789 0.085,4.0794557 2.80463,6.5016326 3.95197,1.9122447 9.68347,-20.3927853 17.592653,-20.2697953 l -8.668843,-2.804626 c -4.9545,0.0097 -9.32654,13.67254049 -13.43545,16.1432571 z"
id="path932"
sodipodi:nodetypes="cccccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
d="M 90.294797,8.7078203 83.790417,6.2771272"
id="path934"
sodipodi:nodetypes="cc" />
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 86.676995,7.1782464 -2.690334,-1.007794 0.04622,-0.3098913 c 0.08669,-0.5811896 0.325311,-1.3760665 0.553887,-1.8450405 0.455287,-0.9341111 1.162354,-1.4372544 2.24064,-1.5944159 l 0.570534,-0.083156 0.25994,0.1982669 c 0.374467,0.2856199 0.723453,0.7999279 0.850884,1.2539647 0.06079,0.2165973 0.141285,0.8887795 0.178877,1.4937382 0.08038,1.2935587 0.194789,1.7819494 0.570095,2.43362 0.15208,0.2640716 0.238953,0.4775139 0.193048,0.4743161 -0.0459,-0.0032 -1.294112,-0.4593214 -2.773791,-1.0136082 z"
id="path940" />
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 107.88745,-11.561975 c 2.98217,-0.09179 5.39119,12.05394439 8.08678,18.0809168 l -9.6897,-1.1585501 c -1.65006,-4.0373721 -1.56841,-10.0479543 -4.21291,-13.0600211 1.67711,-2.5420136 3.65155,-3.7814546 5.81583,-3.8623456 z"
id="path942"
sodipodi:nodetypes="ccccc" />
<path
style="fill:none;stroke:#ff0000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 39.414655,15.989951 c 0.101324,-1.545182 1.587641,0.245159 2.381302,-1.055491 0.571611,1.164255 2.439541,-0.457775 2.435536,1.224211"
id="path944"
sodipodi:nodetypes="ccc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458333;stroke-dasharray:none"
x="22.909008"
y="11.887934"
id="text948"><tspan
id="tspan946"
x="22.909008"
y="11.887934"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93889px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458333;stroke-opacity:1;stroke-dasharray:none"
sodipodi:role="line">seam allowance</tspan></text>
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-dasharray:0.52916774,0.26458333;stroke-dashoffset:0"
d="M 44.337425,17.295084 V 118.57176"
id="path1" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458333;stroke-dasharray:none"
x="43.739395"
y="-45.790478"
id="text1"
transform="rotate(90)"><tspan
id="tspan1"
x="43.739395"
y="-45.790478"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93889px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458333;stroke-opacity:1;stroke-dasharray:none"
sodipodi:role="line">center back</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,264 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="384"
height="384"
viewBox="0 0 101.6 101.6"
version="1.1"
id="svg1042"
sodipodi:docname="knitbinding_b.svg"
inkscape:version="1.4-beta (f21c272752, 2024-04-22, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs1036">
<marker
style="overflow:visible"
id="DartArrow"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Dart arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
transform="scale(-0.5)"
id="path6" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="cutonfoldFrom"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 12,-4 c -2,2 -2,6 0,8 z"
id="path837" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="cutonfoldTo"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 -12,-4 c 2,2 2,6 0,8 z"
id="path840" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="marker1619"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 12,-4 c -2,2 -2,6 0,8 z"
id="path1617" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="marker1623"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 -12,-4 c 2,2 2,6 0,8 z"
id="path1621" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="grainlineFrom"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 12,-4 c -2,2 -2,6 0,8 z"
id="path849" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="grainlineTo"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 -12,-4 c 2,2 2,6 0,8 z"
id="path852" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Mend"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
markerUnits="userSpaceOnUse"
preserveAspectRatio="none"
markerWidth="0.001"
markerHeight="0.001">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path979" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.208121"
inkscape:cx="153.29776"
inkscape:cy="199.038"
inkscape:document-units="mm"
inkscape:current-layer="layer3"
inkscape:document-rotation="0"
showgrid="false"
inkscape:window-width="2256"
inkscape:window-height="1427"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
fit-margin-left="0"
fit-margin-top="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<metadata
id="metadata1039">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Layer 2"
transform="translate(-17.523895,11.576236)"
style="display:inline">
<path
style="display:inline;fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 90.233003,12.001211 c -1.83729,-1.472742 -4.96577,5.345352 -7.1357,7.96638 l 16.60834,14.177442 c 0.982587,-10.348172 -4.40826,-17.735561 -9.47264,-22.143822 z"
id="path2-7"
sodipodi:nodetypes="cccc" />
<path
style="display:inline;fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 25.851698,11.982993 c 1.837299,-1.472741 4.827313,4.97613 6.997248,7.597158 L 16.379064,34.126815 c -0.982588,-10.348172 4.40826,-17.735561 9.472634,-22.143822 z"
id="path1-6"
sodipodi:nodetypes="cccc" />
<path
style="opacity:0;fill:#e6e6e6;stroke:none;stroke-width:0.26458333;stroke-dasharray:none"
d="M 53.643197,43.364474 C 50.474208,42.833411 46.463549,41.150777 43.512267,39.114136 37.149014,34.722939 32.03959,27.622802 28.379953,18.086028 27.82328,16.635373 27.367818,15.35881 27.367818,15.249221 c 0,-0.109588 0.424895,0.139105 0.944208,0.552652 3.14914,2.507761 10.347748,4.61693 19.198902,5.625214 6.09872,0.69474 15.518744,0.824502 21.042355,0.289863 8.859816,-0.857556 15.236414,-2.745967 18.643769,-5.521298 1.156676,-0.942124 1.166392,-1.111158 -0.137925,2.399256 -2.370989,6.381226 -5.581692,11.669642 -9.672351,15.931525 -4.661255,4.856361 -10.175566,7.929457 -15.892129,8.856591 -2.045671,0.331774 -5.814095,0.322874 -7.85145,-0.01855 z"
id="path1772" />
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -28.694204,125.62202 -0.14266,-33.617253 C -2.6608464,91.651057 -1.5041464,62.359337 -9.9934514,23.120179 L 26.066552,11.871704 c -3.649014,13.668932 67.085951,14.282135 63.308921,-10e-7 l 36.059997,11.248475 c -12.40799,57.626849 2.91627,69.133759 18.84341,68.884589 l 0.16821,33.617253 z"
id="path6056-5"
sodipodi:nodetypes="ccccccccc" />
</g>
<g
inkscape:groupmode="layer"
id="layer6"
inkscape:label="Layer 3"
style="display:inline"
transform="translate(-4.6303613,16.435528)">
<path
style="fill:#212178;fill-opacity:1;stroke:#212178;stroke-width:0.264583;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 86.563561,7.495595 -2.690334,-1.007794 0.04622,-0.3098913 c 0.08668,-0.5811896 0.325311,-1.3760664 0.553887,-1.8450405 0.455287,-0.9341111 1.162354,-1.4372544 2.240639,-1.5944159 l 0.570535,-0.083156 0.25994,0.1982669 c 0.374467,0.2856199 0.723452,0.7999279 0.850884,1.2539647 0.06079,0.2165973 0.141285,0.8887795 0.178877,1.4937382 0.08038,1.2935587 0.194789,1.7819494 0.570095,2.43362 0.15208,0.2640716 0.890492,0.8929879 0.844587,0.8897901 -0.0459,-0.0032 -1.945651,-0.8747954 -3.42533,-1.4290822 z"
id="path940"
sodipodi:nodetypes="scssscssssss" />
<path
style="fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 39.315647,17.439046 39.188165,28.20017 c 13.916892,0.08499 24.557648,-2.14018 32.091448,-4.716771 18.46125,-6.313827 8.07863,-21.0170695 16.09712,-20.9598627 l -8.28639,-2.167211 c -5.89285,0.7233886 0.5224,9.6884767 -7.66492,13.1944897 -6.11063,2.616722 -19.467713,4.695623 -32.109776,3.888231 z"
id="path930"
sodipodi:nodetypes="ccsccsc" />
<path
style="fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 87.376733,2.5235363 c 2.59216,1.6572789 0.085,4.0794557 2.80463,6.5016326 3.95197,1.9122451 9.68347,-20.3927859 17.592647,-20.2697959 l -8.668837,-2.804626 c -4.9545,0.0097 -9.32654,13.6725411 -13.43545,16.1432577 z"
id="path932"
sodipodi:nodetypes="cccccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
d="M 90.181363,9.0251689 83.676983,6.5944758"
id="path934"
sodipodi:nodetypes="cc" />
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 107.77401,-11.244627 c 2.98217,-0.09179 5.39119,12.053945 8.08678,18.0809174 l -9.6897,-1.1585501 c -1.65006,-4.0373721 -1.56841,-10.0479543 -4.21291,-13.0600211 1.67711,-2.542014 3.65155,-3.7814552 5.81583,-3.8623462 z"
id="path942"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-dasharray:0.52916774, 0.26458333;stroke-dashoffset:0"
d="M 44.223991,17.612432 V 118.88911"
id="path1" />
<path
style="display:inline;fill:none;stroke:#ff0000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 39.356459,16.307299 c 0.188292,-1.545182 7.637959,0.10495 8.261497,-1.13489 0.766215,1.189619 8.222177,-0.537175 8.214727,1.144811"
id="path944"
sodipodi:nodetypes="ccc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458333;stroke-dasharray:none"
x="40.947086"
y="14.029633"
id="text948"><tspan
id="tspan946"
x="40.947086"
y="14.029633"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93889px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458333;stroke-opacity:1;stroke-dasharray:none"
sodipodi:role="line">3 cm</tspan></text>
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-dasharray:0.52916774, 0.26458333;stroke-dashoffset:0"
d="m 39.285159,20.012623 c 7.596489,0.368908 11.203305,-0.342255 16.829994,-0.659609 m 17.45284,-4.076105 c 0,0 2.94256,-2.221195 3.73054,-3.816001"
id="path2"
sodipodi:nodetypes="cccc" />
<path
style="display:inline;fill:none;stroke:#ff0000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749998, 0.79374999;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#DartArrow)"
d="m 56.115153,19.353014 c 7.30966,-0.706184 11.73515,-1.423207 17.45284,-4.076105"
id="path968"
sodipodi:nodetypes="cc" />
<path
style="display:inline;fill:none;stroke:#ff0000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 37.597591,19.871911 c -1.545182,-0.101324 0.196165,-0.550723 -1.104485,-1.344384 1.402453,-0.968607 -0.56758,-1.292819 1.114406,-1.288814"
id="path3"
sodipodi:nodetypes="ccc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458333;stroke-dasharray:none"
x="29.879704"
y="20.174355"
id="text3"><tspan
id="tspan3"
x="29.879704"
y="20.174355"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93889px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458333;stroke-opacity:1;stroke-dasharray:none"
sodipodi:role="line">¼</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,212 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="384"
height="384"
viewBox="0 0 101.6 101.6"
version="1.1"
id="svg1945"
inkscape:version="1.4-beta (f21c272752, 2024-04-22, custom)"
sodipodi:docname="knitbinding_c.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs1939">
<marker
style="overflow:visible"
id="marker2802"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path2800" />
</marker>
<marker
style="overflow:visible"
id="marker2786"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path2784" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lstart"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path970" />
</marker>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter2964"
x="-0.29588719"
width="1.5917744"
y="-2.5257284"
height="6.0514569">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="7.7526409"
id="feGaussianBlur2966" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter2968"
x="-0.37198539"
width="1.7439708"
y="-2.8410583"
height="6.6821166">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="7.7526409"
id="feGaussianBlur2970" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.7391489"
inkscape:cx="155.34022"
inkscape:cy="224.33976"
inkscape:document-units="mm"
inkscape:current-layer="g4"
inkscape:document-rotation="0"
showgrid="false"
inkscape:window-width="2256"
inkscape:window-height="1427"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
fit-margin-bottom="0"
fit-margin-left="0"
fit-margin-top="-2"
fit-margin-right="-25"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<metadata
id="metadata1942">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="g4"
transform="matrix(0,1,1,0,1.3128794,-14.625652)">
<g
inkscape:label="Layer 1"
id="layer1"
transform="translate(-56.394461,-1.5)"
inkscape:groupmode="layer"
style="display:inline">
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 131.21921,-14.622155 C 114.43439,-10.788589 106.6636,-6.3333632 95.784505,5.2709458 118.5788,19.051063 116.81743,70.130745 87.702936,81.113394 116.29938,106.80865 150.80148,114.47578 227.57642,114.37217 V -14.622155 Z"
id="path2508"
sodipodi:nodetypes="cccccc" />
</g>
<g
id="layer2"
inkscape:label="Layer 2"
transform="translate(-56.39446,-1.5)"
inkscape:groupmode="layer">
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 95.255338,5.2709458 3.339187,-3.00651 6.318045,-9.5115241 C 139.90136,19.966337 131.3257,91.944705 75.412252,100.6347 L 73.868633,85.19852 C 99.173962,84.277849 104.6119,23.32687 95.255338,5.2709458 Z"
id="path1"
sodipodi:nodetypes="cccccc" />
<path
style="fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 95.255338,5.2709458 3.339187,-3.00651 6.318045,-9.5115241 c 18.85286,14.6632931 0.76169,77.3995363 -8.682155,95.3427433 l -6.528077,-8.910738 c 9.993827,-25.235891 17.533992,-51.840405 5.553,-73.9139712 z"
id="path2"
sodipodi:nodetypes="cccccc" />
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-dasharray:none"
d="m 109.81391,35.227387 -8.47562,-0.192627 -1.25208,10.145056 9.47086,0.09631 c 0.23614,-3.319474 0.68284,-6.596838 0.25684,-10.048739 z"
id="path4"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-dasharray:none"
d="m 100.84256,40.041285 9.21755,0.07649"
id="path3" />
<path
style="fill:none;stroke:#888a85;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.11666667,0.26458333;stroke-dashoffset:0;stroke-opacity:1"
d="M 98.517305,2.4734968 C 111.03639,23.383149 105.51834,50.90061 97.463545,69.501877"
id="path2715-3"
sodipodi:nodetypes="cc" />
<path
style="fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 95.255338,5.2709458 3.339187,-3.00651 6.318045,-9.5115241 C 139.90133,19.966337 131.32567,91.944705 75.412252,100.6347 L 73.868633,85.19852 C 103.4658,82.625014 126.20248,34.085971 95.255338,5.2709458 Z"
id="path2711"
sodipodi:nodetypes="cccccc" />
<path
style="fill:none;stroke:#888a85;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.11666667,0.26458333;stroke-dashoffset:0;stroke-opacity:1"
d="M 98.517305,2.4734968 C 120.43673,23.885457 119.22418,56.497761 100.04684,75.242545"
id="path2715"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ff0000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749998,0.79374999;stroke-dashoffset:0;stroke-opacity:1"
d="m 76.656037,84.709648 1.829795,15.422562"
id="path2719" />
</g>
<g
id="layer3"
inkscape:label="Layer 3"
transform="translate(-29.597051,-1.3557751)"
inkscape:groupmode="layer"
style="display:inline">
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 200.19068,71.678457 c -15.25553,0.98987 -46.55009,-0.48264 -61.63094,-8.92559 -10.94672,-6.34676 -16.81858,-12.228356 -16.76036,-23.990257 -0.17468,-17.235257 7.03361,-25.302962 19.61069,-29.7864582 14.26567,-5.880949 43.81622,-5.48177 58.60593,-5.423543 z"
id="path2741-4"
sodipodi:nodetypes="cccccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 98.700545,39.711714 121.79938,38.76261"
id="path2745-8"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:2.9;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter2968)"
d="m 132.44169,53.571936 50.55769,-7.054563"
id="path2952"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:2.9;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter2964)"
d="m 124.21137,19.474891 63.49105,7.93638"
id="path2954"
sodipodi:nodetypes="cc" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.8 KiB

View file

@ -0,0 +1,185 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="104.289mm"
height="64.997749mm"
viewBox="0 0 104.289 64.99775"
version="1.1"
id="svg1042"
sodipodi:docname="knitbinding_d.svg"
inkscape:version="1.4-beta (f21c272752, 2024-04-22, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs1036">
<marker
orient="auto"
refY="0"
refX="0"
id="cutonfoldFrom"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 12,-4 c -2,2 -2,6 0,8 z"
id="path837" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="cutonfoldTo"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 -12,-4 c 2,2 2,6 0,8 z"
id="path840" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="marker1619"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 12,-4 c -2,2 -2,6 0,8 z"
id="path1617" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="marker1623"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 -12,-4 c 2,2 2,6 0,8 z"
id="path1621" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="grainlineFrom"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 12,-4 c -2,2 -2,6 0,8 z"
id="path849" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="grainlineTo"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 -12,-4 c 2,2 2,6 0,8 z"
id="path852" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.7619523"
inkscape:cx="231.12999"
inkscape:cy="64.195391"
inkscape:document-units="mm"
inkscape:current-layer="layer3"
inkscape:document-rotation="0"
showgrid="false"
inkscape:window-width="2256"
inkscape:window-height="1427"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
fit-margin-left="0"
fit-margin-top="0"
fit-margin-right="0"
fit-margin-bottom="-50"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<metadata
id="metadata1039">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Layer 2"
transform="translate(-17.523895,-9.2381483)"
style="display:inline">
<path
style="fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 103.05553,12.775615 c -1.83729,-1.472742 -4.965773,5.345352 -7.135703,7.96638 l 16.608343,14.177442 c 0.98259,-10.348172 -4.40826,-17.735561 -9.47264,-22.143822 z"
id="path2"
sodipodi:nodetypes="cccc" />
<path
style="fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 39.877766,12.898636 c 1.837299,-1.472741 4.827313,4.97613 6.997248,7.597158 L 30.405132,35.042458 c -0.982588,-10.348172 4.40826,-17.735561 9.472634,-22.143822 z"
id="path1"
sodipodi:nodetypes="cccc" />
<path
style="opacity:0;fill:#e6e6e6;stroke:none;stroke-width:0.26458333;stroke-dasharray:none"
d="M 67.43886,44.277692 C 64.269871,43.746629 60.259211,42.063995 57.307929,40.027354 50.944677,35.636157 45.835252,28.53602 42.175615,18.999246 c -0.556673,-1.450655 -1.012134,-2.727218 -1.012134,-2.836807 0,-0.109588 0.424894,0.139105 0.944208,0.552652 3.149139,2.507761 10.347748,4.61693 19.198902,5.625214 6.098719,0.69474 15.518743,0.824503 21.042354,0.289863 8.859816,-0.857556 15.236415,-2.745967 18.643765,-5.521298 1.15668,-0.942124 1.1664,-1.111158 -0.13792,2.399256 -2.37099,6.381227 -5.581693,11.669642 -9.672352,15.931525 -4.661255,4.856361 -10.175565,7.929457 -15.892129,8.856591 -2.045671,0.331775 -5.814094,0.322874 -7.851449,-0.01855 z"
id="path1772" />
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -14.898542,126.53524 -0.14266,-33.617255 C 11.134816,92.564275 12.291516,63.272555 3.802211,24.033397 L 39.862214,12.784922 c -3.649014,13.668932 67.085956,14.282135 63.308926,-10e-7 l 36.06,11.248475 c -12.40799,57.626849 2.91627,69.133759 18.84341,68.884589 l 0.16821,33.617255 z"
id="path6056-5"
sodipodi:nodetypes="ccccccccc" />
<path
style="fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linejoin:round;stroke-dasharray:0.52916667,0.26458333;stroke-dashoffset:0;stroke-opacity:1"
d="M 70.361421,33.382449 V 86.394936"
id="path3" />
</g>
<g
inkscape:groupmode="layer"
id="layer6"
inkscape:label="Layer 3"
style="display:inline"
transform="translate(-4.6303623,-4.3788563)">
<path
style="fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 26.96868,7.9256296 c -1.173144,13.8657454 66.073215,13.0701694 63.308915,0 L 101.2718,11.282343 C 92.406815,32.687114 21.941546,34.884418 14.667712,11.736958 Z"
id="path897"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 57.287832,17.987908 57.060523,28.216736 53.87822,28.898659 54.105529,17.760602 Z"
id="path899"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 57.287832,17.987908 3.068648,-0.113653 -10e-7,10.683442 -3.295956,-0.340961 z"
id="path901"
sodipodi:nodetypes="ccccc" />
<path
style="fill:none;stroke:#888a85;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.79375,0.26458333;stroke-dashoffset:0;stroke-opacity:1"
d="m 23.078083,9.1229247 c 1.325959,5.6447973 6.857103,8.5619073 17.957276,10.4561343 m 28.868026,0.795576 c 11.63056,-1.136536 20.76073,-2.727687 24.32188,-11.2517108"
id="path903"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#ff0000;stroke-width:0.52916667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.11666667,0.52916667;stroke-dashoffset:0;stroke-opacity:1"
d="m 41.035359,19.579059 c 10.759212,1.856343 18.90439,1.66692 28.868026,0.795576"
id="path907"
sodipodi:nodetypes="cc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

View file

@ -0,0 +1,198 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="159.93233mm"
height="108.54454mm"
viewBox="0 0 159.93232 108.54455"
version="1.1"
id="svg1042"
sodipodi:docname="knitbinding_e.svg"
inkscape:version="1.4-beta (f21c272752, 2024-04-22, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs1036">
<marker
orient="auto"
refY="0"
refX="0"
id="cutonfoldFrom"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 12,-4 c -2,2 -2,6 0,8 z"
id="path837" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="cutonfoldTo"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 -12,-4 c 2,2 2,6 0,8 z"
id="path840" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="marker1619"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 12,-4 c -2,2 -2,6 0,8 z"
id="path1617" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="marker1623"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 -12,-4 c 2,2 2,6 0,8 z"
id="path1621" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="grainlineFrom"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 12,-4 c -2,2 -2,6 0,8 z"
id="path849" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="grainlineTo"
style="overflow:visible">
<path
class="note fill-note"
d="m 0,0 -12,-4 c 2,2 2,6 0,8 z"
id="path852" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.2006477"
inkscape:cx="362.58286"
inkscape:cy="97.324052"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
inkscape:window-width="2256"
inkscape:window-height="1427"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
fit-margin-left="-50"
fit-margin-top="10"
fit-margin-right="-50"
fit-margin-bottom="-100"
showguides="false"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<metadata
id="metadata1039">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Layer 2"
transform="translate(-23.239872,-3.3372213)"
style="display:inline">
<path
style="opacity:0;fill:#e6e6e6;stroke:none;stroke-width:1.00000001;stroke-dasharray:none"
d="m 331.13394,138.40275 c -11.97728,-2.00717 -27.13568,-8.36673 -38.29013,-16.06427 -24.05009,-16.59665 -43.3613,-43.431814 -57.193,-79.476316 -2.10396,-5.482791 -3.82539,-10.307596 -3.82539,-10.721789 0,-0.414193 1.6059,0.52575 3.56866,2.088763 11.90226,9.478153 39.1096,17.449813 72.56278,21.260652 23.05028,2.625787 58.65352,3.116229 79.53016,1.095545 33.48592,-3.241159 57.58645,-10.378458 70.46464,-20.867898 4.37169,-3.560785 4.40841,-4.199655 -0.52129,9.068052 -8.96122,24.118023 -21.09616,44.105734 -36.55692,60.213641 -17.61734,18.35475 -38.45883,29.9696 -60.06474,33.47373 -7.73167,1.25395 -21.97453,1.22031 -29.67477,-0.0701 z"
id="path1772"
transform="matrix(0.26458333,0,0,0.26458333,12.893534,4.8592926)" />
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 18.168653,211.74947 18.025993,90.118646 C 44.202011,89.764936 46.19322,65.892695 37.703915,26.653537 L 73.781784,14.817283 c -3.649014,13.668932 65.408226,14.460676 61.631196,0.17854 l 36.1533,11.635785 c -12.40799,57.626849 3.64832,63.736208 19.57546,63.487038 l -0.14266,121.630824 z"
id="path6056-5"
sodipodi:nodetypes="ccccccccc" />
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 37.703915,26.653537 c -24.953796,6.154228 -45.1269928,15.9416 -64.294319,26.153126 8.089907,18.756302 16.879168,38.762661 25.2797205,47.136938 7.0190594,-5.198039 11.5468555,-7.480346 19.3366685,-9.824958 l 6.123387,6.004198 C 57.916885,85.982448 46.221847,59.001395 37.703915,26.653537 Z"
id="path6738"
sodipodi:nodetypes="cccccc" />
<path
style="display:inline;fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 171.56628,26.631608 c 25.02259,4.844897 38.42957,11.062172 61.30019,16.747167 2.06032,21.700443 -14.8375,42.887212 -19.30227,55.15709 l -22.42246,-8.417219 -6.12339,6.0042 c -33.76751,-10.140394 -21.97,-37.143381 -13.45207,-69.491238 z"
id="path6738-0"
sodipodi:nodetypes="cccccc" />
</g>
<g
inkscape:groupmode="layer"
id="layer6"
inkscape:label="Layer 3"
style="display:inline"
transform="translate(-10.346338,1.5220713)">
<path
style="display:inline;fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 70.142756,23.657845 c 14.94398,4.474589 28.46092,3.601531 43.663054,-0.09861 L 126.25929,43.790209 79.912916,55.447311 55.752626,42.192058 Z"
id="path911"
sodipodi:nodetypes="cc" />
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 5.2751106,206.89018 5.1324507,85.259353 C 31.308469,84.905642 33.299685,61.033403 24.810381,21.794244 L 60.88825,9.9579903 C 72.043788,53.66644 112.56966,52.337792 122.51945,10.13653 l 36.1533,11.635785 c -12.40799,57.626852 3.64832,63.736202 19.57546,63.487038 l -0.14266,121.630827 z"
id="path6056"
sodipodi:nodetypes="ccccccccc" />
</g>
<g
inkscape:groupmode="layer"
id="layer7"
inkscape:label="Layer 4"
style="display:inline"
transform="translate(-10.346338,1.5220713)">
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 57.940254,10.895989 63.722093,8.8384112 C 75.934306,49.561629 109.81488,47.090675 119.60366,9.1235211 l 5.59578,1.9510079 C 111.45278,56.050963 71.310574,55.774782 57.940254,10.895989 Z"
id="path7299"
sodipodi:nodetypes="ccccc" />
</g>
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="Layer 5"
transform="translate(-64.263992)"
style="display:inline">
<path
style="fill:none;stroke:#ff0000;stroke-width:0.52916667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.11666667,0.52916667;stroke-dashoffset:0;stroke-opacity:1"
d="m 112.93855,12.074221 c 13.3078,44.243873 52.24214,43.067794 65.06864,0.231191"
id="path909"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ff0000;stroke-width:0.52916667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.11666667,0.52916667;stroke-dashoffset:0;stroke-opacity:1"
d="m 122.6385,22.606963 c 16.35542,5.268288 32.12374,3.647479 46.26929,0.222182"
id="path915"
sodipodi:nodetypes="cc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

View file

@ -0,0 +1,283 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="768"
height="384"
viewBox="0 0 203.2 101.6"
version="1.1"
id="svg1"
sodipodi:docname="ribbing.svg"
inkscape:version="1.4-beta (f21c272752, 2024-04-22, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="1.7583477"
inkscape:cx="427.95858"
inkscape:cy="201.04101"
inkscape:window-width="2256"
inkscape:window-height="1427"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g12" />
<defs
id="defs1" />
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.793753;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0"
id="rect19"
width="2.5814567"
height="93.69117"
x="-119.02913"
y="-4.9778972"
transform="scale(-1,1)" />
<g
id="g7"
transform="translate(-5.5460885,-18.187906)">
<path
style="fill:none;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:none"
d="M 91.30893,26.536944 C 49.990232,27.790876 39.356181,14.684787 23.673152,22.695673 c -3.209817,1.639574 -1.436385,5.325672 2.233379,6.716321 17.291783,6.552683 22.292387,-1.336377 65.402399,-2.87505 z"
id="path1"
sodipodi:nodetypes="caac" />
<path
d="m 35.046956,20.09283 c -3.847973,-0.08257 -7.453225,0.600221 -11.373982,2.602942 -1.189273,0.60748 -1.691051,1.496292 -1.669149,2.444812 v 0.05064 c 0.0684,1.598056 1.616824,3.35474 3.902604,4.220931 0.654554,0.248042 1.286863,0.468662 1.908927,0.676445 6.182222,-1.844046 12.058459,-0.674779 20.094898,1.065568 8.894731,-1.310695 20.97835,-3.81706 43.398901,-4.617289 -30.989023,0.940449 -44.71828,-6.196335 -56.262199,-6.444052 z"
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:none"
id="path6" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:none"
d="M 91.30893,35.601375 C 49.990232,36.855307 39.356181,23.749218 23.673152,31.760104 c -3.209817,1.639574 -1.436385,5.325672 2.233379,6.716321 17.291783,6.552683 22.292387,-1.336377 65.402399,-2.87505 z"
id="path2"
sodipodi:nodetypes="caac" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:none"
d="m 22.00344,24.948519 0.02257,9.565596"
id="path3" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:none"
d="m 91.30893,26.536943 v 9.064432"
id="path4" />
<path
d="m 22.003825,25.191227 0.02067,8.661487 0.0016,0.576192 c 0.167543,1.550389 1.676627,3.21219 3.880383,4.047298 17.291783,6.552683 22.292714,-1.336087 65.402726,-2.87476 v -9.064562 c -22.4206,0.800229 -34.504219,3.306594 -43.39895,4.617289 -7.560572,1.114098 -12.830169,1.361008 -20.094898,-1.065568 -0.622064,-0.207783 -1.254373,-0.428403 -1.908927,-0.676445 -2.28578,-0.866191 -3.834202,-2.622875 -3.902604,-4.220931 z"
style="fill:#233859;fill-opacity:1;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:none"
id="path5" />
<path
style="fill:#233859;fill-opacity:1;stroke:#ff0000;stroke-width:0.79375;stroke-linejoin:round;stroke-dasharray:1.5875, 0.79375;stroke-dashoffset:0"
d="m 88.338815,26.655376 0.07339,9.011579"
id="path7" />
</g>
<g
id="g12"
transform="translate(-1.2714714,10.173648)">
<path
d="m 48.202226,40.372213 a 27.322639,13.78366 0 0 0 -27.32288,13.783655 27.322639,13.78366 0 0 0 1.466577,4.363557 27.322639,13.78366 0 0 1 25.856303,-9.420096 27.322639,13.78366 0 0 1 25.886275,9.375138 27.322639,13.78366 0 0 0 1.436088,-4.318599 27.322639,13.78366 0 0 0 -27.322363,-13.783655 z"
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round"
id="path12" />
<path
d="m 20.879346,54.155868 v 8.727115 c 5e-6,7.612551 12.232913,13.783722 27.32288,13.783655 15.089765,-7.7e-5 27.322357,-6.171206 27.322363,-13.783655 v -8.727115 c -0.01947,1.468941 -0.504287,2.926868 -1.436088,4.318599 C 70.401125,64.11276 59.97126,67.926335 48.202226,67.939522 36.467894,67.926287 26.0607,64.134686 22.345923,58.519425 21.394343,57.114254 20.899101,55.640744 20.879346,54.155868 Z"
style="fill:#233859;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round"
id="path11" />
<g
id="g17">
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0"
d="m 48.202225,67.93952 v 8.727117 l 2.170182,-0.04286 c 0,0 0.13725,-8.733774 -0.193035,-8.722386 -0.330285,0.01138 -1.977147,0.03813 -1.977147,0.03813 v 0"
id="path13" />
<path
style="fill:#212178;fill-opacity:1;stroke:#000000;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0"
d="m 48.466809,67.93952 v 8.727117 l -2.170182,-0.04286 c 0,0 -0.13725,-8.733774 0.193035,-8.722386 0.330285,0.01138 1.977147,0.03813 1.977147,0.03813 v 0"
id="path14" />
</g>
<ellipse
style="fill:none;fill-opacity:1;stroke:#ffcc00;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:2.11666, 0.529166, 0.264583, 0.529166;stroke-dashoffset:0"
id="path15"
cx="48.202229"
cy="58.389206"
rx="27.53121"
ry="13.783654" />
</g>
<g
id="path16"
style="fill:#ff0000"
transform="translate(2.6458334)">
<path
style="fill:#ff0000;stroke-linejoin:round"
d="m 77.982422,63.542969 c -1.334697,-0.06834 -2.478516,0.04102 -2.478516,0.04102 l 0.07422,0.789063 c 0,0 1.096921,-0.104004 2.365234,-0.03906 1.268313,0.06494 2.69206,0.353908 3.251953,0.890625 0.790879,0.758142 1.408477,1.924888 1.679688,3.138672 0.271211,1.213785 0.19501,2.461549 -0.3125,3.398438 -0.201082,0.371207 -1.055361,0.781741 -1.884766,0.996093 -0.829405,0.214353 -1.58789,0.289063 -1.58789,0.289063 l 0.07617,0.789062 c 0,0 0.810411,-0.07586 1.710937,-0.308593 0.900526,-0.232733 1.93843,-0.566365 2.382813,-1.386719 0.629282,-1.161686 0.693487,-2.595735 0.390625,-3.951172 -0.302863,-1.355437 -0.974199,-2.645592 -1.90625,-3.539062 -0.885257,-0.848612 -2.427022,-1.039082 -3.761719,-1.107422 z"
id="path45" />
<g
id="g44"
style="fill:#ff0000">
<path
d="m 80.78677,76.095926 -7.930532,-2.058317 7.400276,-3.516521 c -1.239273,1.756235 -1.018554,4.076762 0.530256,5.574838 z"
style="fill:#ff0000;fill-rule:evenodd;stroke-width:0.7"
id="path44" />
</g>
</g>
<g
id="path18"
style="fill:#ff0000"
transform="translate(-2.1166667)">
<path
style="fill:#ff0000;stroke-linejoin:round"
d="m 15.433594,63.542969 c -1.334697,0.06834 -2.874509,0.25881 -3.759766,1.107422 -0.932051,0.89347 -1.603387,2.183625 -1.9062499,3.539062 -0.3028627,1.355437 -0.2386572,2.789486 0.3906249,3.951172 0.444383,0.820354 1.482286,1.153986 2.382813,1.386719 0.900526,0.232733 1.710937,0.308594 1.710937,0.308593 l 0.07422,-0.789062 c 0,0 -0.758486,-0.07471 -1.587891,-0.289063 -0.829405,-0.214352 -1.68173,-0.624886 -1.882812,-0.996093 -0.507511,-0.936889 -0.583712,-2.184653 -0.3125,-3.398438 0.271211,-1.213784 0.888808,-2.38053 1.679687,-3.138672 0.559894,-0.536717 1.98364,-0.825683 3.251953,-0.890625 1.268313,-0.06494 2.363282,0.03906 2.363282,0.03906 l 0.07617,-0.789063 c 0,0 -1.145771,-0.109356 -2.480468,-0.04102 z"
id="path41" />
<g
id="g40"
style="fill:#ff0000">
<path
d="m 13.160527,70.521088 7.400276,3.516521 -7.930532,2.058317 c 1.548147,-1.491107 1.768866,-3.811634 0.530256,-5.574838 z"
style="fill:#ff0000;fill-rule:evenodd;stroke-width:0.7"
id="path40" />
</g>
</g>
<rect
style="fill:#233859;fill-opacity:1;stroke:none;stroke-width:0.793753;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0"
id="rect18"
width="1.8198853"
height="94.088043"
x="-117.7384"
y="-5.374774"
transform="scale(-1,1)" />
<path
id="rect20"
style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.793754;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0"
d="m 124.8819,57.807544 c -2.32015,1.78e-4 -4.20088,1.88114 -4.20078,4.201293 v 26.704314 h 2.58124 v -26.704314 0 c -2e-5,-1.607389 0.0121,-1.62929 1.61954,-1.629266 1.60738,-1.8e-5 1.62007,0.02188 1.62005,1.629266 v 0 26.704314 h 2.58124 V 62.008837 c 1e-4,-2.320352 -1.88094,-4.201396 -4.20129,-4.201293 z"
sodipodi:nodetypes="ccccccccccccc" />
<path
id="rect21"
style="fill:#233859;fill-opacity:1;stroke:none;stroke-width:0.793754;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0"
d="m 124.8819,59.098421 a 2.9103775,2.9103775 0 0 0 -2.91042,2.910416 v 26.704314 h 1.82004 V 62.008837 a 1.0904921,1.0904921 0 0 1 1.09038,-1.090889 1.0904921,1.0904921 0 0 1 1.09037,1.090889 h 5.1e-4 v 26.704314 h 1.81953 V 62.008837 a 2.9103775,2.9103775 0 0 0 -2.91041,-2.910416 z" />
<path
style="fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:0.79375;stroke-linejoin:round;stroke-dasharray:1.5875, 0.79375;stroke-dashoffset:0"
d="M 129.08319,83.383283 H 115.91852"
id="path28" />
<rect
style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.793753;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0"
id="rect28"
width="2.5806777"
height="84.576996"
x="-196.68283"
y="-40.673668"
transform="scale(-1,1)" />
<rect
style="fill:#233859;fill-opacity:1;stroke:none;stroke-width:0.793753;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0"
id="rect29"
width="1.8191272"
height="82.141083"
x="-195.39212"
y="-41.070541"
transform="scale(-1,1)" />
<g
id="g31"
transform="rotate(180,177.11845,51.26731)"
style="stroke:none">
<path
id="path29"
style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.793754;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0"
d="m 171.22557,27.381563 c -2.32015,1.78e-4 -4.20088,1.88114 -4.20078,4.201293 V 58.28717 h 2.58124 v -26.704314 0 c -2e-5,-1.607389 0.0121,-1.62929 1.61954,-1.629266 1.60738,-1.8e-5 1.62007,0.02188 1.62005,1.629266 v 0 26.704314 h 2.58124 V 31.582856 c 1e-4,-2.320352 -1.88094,-4.201396 -4.20129,-4.201293 z"
sodipodi:nodetypes="ccccccccccccc" />
<path
id="path30"
style="fill:#233859;fill-opacity:1;stroke:none;stroke-width:0.793754;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0"
d="m 171.22557,28.67244 a 2.9103775,2.9103775 0 0 0 -2.91042,2.910416 V 58.28717 h 1.82004 V 31.582856 a 1.0904921,1.0904921 0 0 1 1.09038,-1.090889 1.0904921,1.0904921 0 0 1 1.09037,1.090889 h 5.1e-4 V 58.28717 h 1.81953 V 31.582856 a 2.9103775,2.9103775 0 0 0 -2.91041,-2.910416 z" />
<path
id="path32"
style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.793754;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0"
d="m 161.75426,50.645821 c -2.32015,1.78e-4 -4.20088,1.88114 -4.20078,4.201293 v 26.704314 h 2.58124 v -26.704314 0 c -2e-5,-1.607389 0.0121,-1.62929 1.61954,-1.629266 1.60738,-1.8e-5 1.62007,0.02188 1.62005,1.629266 v 0 3.610968 h 2.58124 v -3.610968 c 1e-4,-2.320352 -1.88094,-4.201396 -4.20129,-4.201293 z"
sodipodi:nodetypes="ccccccccccccc" />
<path
id="path33"
style="fill:#233859;fill-opacity:1;stroke:none;stroke-width:0.793754;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0"
d="m 161.75426,51.936698 c -1.60739,-2.3e-5 -2.91044,1.303027 -2.91042,2.910416 v 26.704314 h 1.82004 V 54.847114 c -2.2e-4,-0.602373 0.48801,-1.090827 1.09038,-1.090889 0.60237,6.7e-5 1.09059,0.48852 1.09037,1.090889 h 5.1e-4 v 3.67255 h 1.81953 v -3.67255 c 2e-5,-1.607385 -1.30303,-2.910434 -2.91041,-2.910416 z"
sodipodi:nodetypes="cccccccccccc" />
</g>
<path
style="fill:none;fill-opacity:1;stroke:#808080;stroke-width:0.79375;stroke-linejoin:round;stroke-dasharray:1.5875, 0.79375;stroke-dashoffset:0"
d="M 191.92183,47.687506 H 178.75665"
id="path31" />
<path
style="fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:0.79375;stroke-linejoin:round;stroke-dasharray:1.5875, 0.79375;stroke-dashoffset:0"
d="M 196.68382,46.629172 H 178.75665"
id="path34"
sodipodi:nodetypes="cc" />
<g
id="path35"
style="fill:#ff0000">
<path
style="fill:#ff0000;stroke-linejoin:round"
d="m 134.89453,61.519531 -0.31641,0.728516 c 0,0 2.5315,1.100957 5.34571,2.771484 2.81421,1.670528 5.89242,3.944649 6.95312,6.082031 2.5694,5.177509 2.38681,12.359894 -0.40429,17.423829 -0.81352,1.475964 -3.10263,3.043074 -5.1875,4.171875 -2.08488,1.128801 -3.94727,1.853515 -3.94727,1.853515 l 0.28711,0.740235 c 0,0 1.90326,-0.741169 4.03711,-1.896485 2.13385,-1.155316 4.51519,-2.688963 5.50586,-4.486328 2.93551,-5.325933 3.12425,-12.708798 0.41992,-18.158203 -1.22482,-2.468078 -4.39741,-4.714958 -7.25977,-6.414063 -2.86235,-1.699104 -5.43359,-2.816406 -5.43359,-2.816406 z"
id="path49" />
<g
id="g48"
style="fill:#ff0000">
<path
d="m 139.80084,97.02285 -8.19127,0.182314 6.16087,-5.401269 c -0.71338,2.027619 0.13177,4.200009 2.0304,5.218955 z"
style="fill:#ff0000;fill-rule:evenodd;stroke-width:0.7"
id="path48" />
</g>
</g>
<g
id="path36"
style="fill:#ac9393">
<path
style="fill:#ac9393;stroke-linejoin:round"
d="M 48.267578,27.423828 V 40.390625 H 49.0625 V 27.423828 Z"
id="path43" />
<g
id="g42"
style="fill:#ac9393">
<path
d="m 51.464992,38.990272 -2.8,7.7 -2.8,-7.7 c 1.631,1.4 3.962,1.4 5.6,0 z"
style="fill:#ac9393;fill-rule:evenodd;stroke-width:0.7"
id="path42" />
</g>
</g>
<g
id="path38"
style="fill:#ac9393">
<path
style="fill:#ac9393;stroke-linejoin:round"
d="m 92.078125,68.310547 v 0.794922 h 12.966795 v -0.794922 z"
id="path47" />
<g
id="g46"
style="fill:#ac9393">
<path
d="m 103.64415,65.908086 7.7,2.8 -7.7,2.8 c 1.4,-1.631 1.4,-3.962 0,-5.6 z"
style="fill:#ac9393;fill-rule:evenodd;stroke-width:0.7"
id="path46" />
</g>
</g>
<g
id="path39"
style="fill:#ac9393"
transform="translate(6.5413,6.593121)">
<path
style="fill:#ac9393;stroke-linejoin:round"
d="m 140.91211,51.808594 v 0.794922 h 12.96484 v -0.794922 z"
id="path51" />
<g
id="g50"
style="fill:#ac9393">
<path
d="m 152.47753,49.40577 7.7,2.8 -7.7,2.8 c 1.4,-1.631 1.4,-3.962 0,-5.6 z"
style="fill:#ac9393;fill-rule:evenodd;stroke-width:0.7"
id="path50" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -19,12 +19,18 @@ it also works fine as a base for unisex clothes or t-shirts.
However, it's also important to talk about what Bibi is not:
Bibi can be sewn as a simple top or dress, but it's mostly designed as a building block for other patterns or your custom designs.
Bibi can definitely be sewn as a simple top or dress,
but it's mainly designed as a building block for other patterns or your custom designs.
Bibi is highly customizable, but it does not itself represent a specific garment or follow a specific style.
Some option combinations might not make much sense and you'll have to experiment with different options
Bibi is highly customizable, but it does not necessarily represent a specific garment or follow a specific style.
Some option combinations might not make much sense, and you may have to experiment with different options
yourself to find the design you're looking for.
For example, when you make a dress with Bibi out of woven fabric, you'll have to ensure yourself that there
is enough room for leg movement.
Depending on the shape around the waist or the size of the neck hole,
you also may have to add buttons or zippers on the front or back so you can actually put it on.
Bibi is also not a standard block/sloper for woven fabric. It only does a very basic front bust adjustment
designed for stretchy knit fabric and will not work well as a base for fitted shirts and blouses from woven fabric.

View file

@ -0,0 +1,11 @@
---
title: "Knit binding height"
maintainers:
- Jonathan Haas
---
Controls the height of the knit binding on the neck and armhole.

View file

@ -0,0 +1,10 @@
---
title: "Curvature adjustment"
maintainers:
- Jonathan Haas
---
Adjust by how much the side seam goes straight up above the hem, by default.
This option will often not have much effect, if any. Fitting the hips and seat measurements (including ease) has priority
over this option and adjusting these ease settings instead is often a better idea.

View file

@ -4,7 +4,7 @@ maintainers:
- Jonathan Haas
---
If the garment is longer than the seat, this option controls how much it flares out towards the hem.
If the garment is longer than the waist, this option controls how much it flares out towards the hem.
In other words, this option controls how wide the bottom hem is around the legs.

View file

@ -4,12 +4,10 @@ maintainers:
- Jonathan Haas
---
Which measurement to use for the hem. If the length bonus is zero, the bottom of the garment will be at exactly the selected measurement.
Which measurement to use for the bottom hem.
If the length bonus is zero, the bottom of the garment will be at exactly the selected measurement.
Note that the options *underbust*, *knee* and *floor* require the corresponding optional vertical measurements.
If they are missing, a very rough estimate is used instead.
Use a negative length bonus when selecting *floor* to prevent the garment from actually dragging on the floor.

View file

@ -0,0 +1,11 @@
---
title: "Ribbing height"
maintainers:
- Jonathan Haas
---
Controls the height of the ribbing on the cuff and/or waistband.

View file

@ -0,0 +1,11 @@
---
title: "Ribbing stretch"
maintainers:
- Jonathan Haas
---
Controls how much the ribbing on the cuff and/or waistband is stretched relative to the fabric.

View file

@ -0,0 +1,10 @@
---
title: "Seat back adjustment"
maintainers:
- Jonathan Haas
---
Controls the influence of the seat back measurement on the garment width.
* At 0%, the front and back parts will have the same widths around the seat, equal to half the seat measurement (plus ease).
* At 100%, the back part will have a width equal to the seat back measurement (plus ease) and the front part will cover the remaining seat measurement (plus ease).

View file

@ -1,7 +1,5 @@
---
title: Shoulder slope reduction
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: Shoulder slope reduction
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: Shoulder slope reduction
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: Shoulder slope reduction
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: Shoulder slope reduction
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: Shoulder slope reduction
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap back X"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap back X"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap back X"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap back X"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap back X"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap back X"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap back Y"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap back Y"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap back Y"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap back Y"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap back Y"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap back Y"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap front X"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap front X"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap front X"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap front X"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap front X"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap front X"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap front Y"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap front Y"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap front Y"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap front Y"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap front Y"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap front Y"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q1 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q1 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q1 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q1 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q1 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q1 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q1 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q1 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q1 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q1 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q1 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q1 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q2 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q2 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q2 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q2 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q2 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q2 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q2 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q2 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q2 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q2 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q2 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q2 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 offset"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 offset"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 offset"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 offset"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 offset"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 upward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

View file

@ -1,7 +1,5 @@
---
title: "Sleevecap Q3 downward spread"
maintainers:
- Jonathan Haas
maintainers:
- Jonathan Haas
---

Some files were not shown because too many files have changed in this diff Show more