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:
commit
cabf023019
132 changed files with 2590 additions and 497 deletions
|
@ -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:
|
||||
|
|
|
@ -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."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
48
designs/bibi/src/armholeBinding.mjs
Normal file
48
designs/bibi/src/armholeBinding.mjs
Normal 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
|
||||
}
|
|
@ -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
121
designs/bibi/src/cuff.mjs
Normal 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
|
||||
}
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
44
designs/bibi/src/neckBinding.mjs
Normal file
44
designs/bibi/src/neckBinding.mjs
Normal 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
|
||||
}
|
|
@ -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)t²)+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,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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'))
|
||||
|
|
121
designs/bibi/src/waistband.mjs
Normal file
121
designs/bibi/src/waistband.mjs
Normal 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
|
||||
}
|
|
@ -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>
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Bibi body block"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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.
|
|||
|
||||

|
||||
|
||||
### 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.
|
||||
|
||||

|
||||
|
||||
#### 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.
|
||||
|
||||

|
||||
|
||||
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 the tails _good sides together_ to close the loop, making sure the neck binding is stretched evenly.
|
||||
|
||||

|
||||
|
||||
Then sew down the remaining, unstitched length of the neck binding, keeping the same distance as before.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
### 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.
|
||||
|
|
212
markdown/org/docs/designs/bibi/instructions/knitbinding_a.svg
Normal file
212
markdown/org/docs/designs/bibi/instructions/knitbinding_a.svg
Normal 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 |
264
markdown/org/docs/designs/bibi/instructions/knitbinding_b.svg
Normal file
264
markdown/org/docs/designs/bibi/instructions/knitbinding_b.svg
Normal 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 |
212
markdown/org/docs/designs/bibi/instructions/knitbinding_c.svg
Normal file
212
markdown/org/docs/designs/bibi/instructions/knitbinding_c.svg
Normal 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 |
185
markdown/org/docs/designs/bibi/instructions/knitbinding_d.svg
Normal file
185
markdown/org/docs/designs/bibi/instructions/knitbinding_d.svg
Normal 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 |
198
markdown/org/docs/designs/bibi/instructions/knitbinding_e.svg
Normal file
198
markdown/org/docs/designs/bibi/instructions/knitbinding_e.svg
Normal 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 |
283
markdown/org/docs/designs/bibi/instructions/ribbing.svg
Normal file
283
markdown/org/docs/designs/bibi/instructions/ribbing.svg
Normal 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 |
|
@ -19,11 +19,17 @@ 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
|
||||
yourself to find the design you're looking for.
|
||||
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.
|
||||
|
|
11
markdown/org/docs/designs/bibi/options/bindingheight/en.md
Normal file
11
markdown/org/docs/designs/bibi/options/bindingheight/en.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Knit binding height"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
||||
Controls the height of the knit binding on the neck and armhole.
|
||||
|
||||
|
||||
|
||||
|
|
@ -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.
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
11
markdown/org/docs/designs/bibi/options/ribbingheight/en.md
Normal file
11
markdown/org/docs/designs/bibi/options/ribbingheight/en.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Ribbing height"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
||||
Controls the height of the ribbing on the cuff and/or waistband.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/bibi/options/ribbingstretch/en.md
Normal file
11
markdown/org/docs/designs/bibi/options/ribbingstretch/en.md
Normal 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.
|
||||
|
||||
|
||||
|
||||
|
|
@ -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).
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: Shoulder slope reduction
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: Shoulder slope reduction
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: Shoulder slope reduction
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: Shoulder slope reduction
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: Shoulder slope reduction
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: Shoulder slope reduction
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap back X"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap back X"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap back X"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap back X"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap back X"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap back X"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap back Y"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap back Y"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap back Y"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap back Y"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap back Y"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap back Y"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap front X"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap front X"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap front X"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap front X"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap front X"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap front X"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap front Y"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap front Y"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap front Y"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap front Y"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap front Y"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap front Y"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q1 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q1 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q1 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q1 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q1 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q1 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q1 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q1 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q1 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q1 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q1 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q1 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q2 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q2 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q2 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q2 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q2 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q2 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q2 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q2 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q2 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q2 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q2 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q2 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 offset"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 offset"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 offset"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 offset"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 offset"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 upward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
title: "Sleevecap Q3 downward spread"
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
maintainers:
|
||||
- Jonathan Haas
|
||||
---
|
||||
|
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue