1
0
Fork 0

feat(breanna): First Breanna release candidate

This commit is contained in:
Joost De Cock 2020-01-18 15:34:57 +01:00
parent aba39d6a53
commit d7cd438fb7
14 changed files with 122 additions and 70 deletions

View file

@ -37,7 +37,7 @@ export default {
'acrossBackFactor', 'acrossBackFactor',
'armholeDepthFactor', 'armholeDepthFactor',
'frontArmholeDeeper', 'frontArmholeDeeper',
//'shoulderSlopeReduction', 'shoulderSlopeReduction',
'sleeveWidthGuarantee', 'sleeveWidthGuarantee',
{ {
sleevecap: [ sleevecap: [
@ -96,26 +96,15 @@ export default {
options: { options: {
// Constants // Constants
collarFactor: 4.8, collarFactor: 4.8,
armholeDepthBase: 0.65, armholeDepthBase: 0.6,
breannaFitSleeve: true, breannaFitSleeve: true,
breannaFitCollar: true, breannaFitCollar: true,
// Percentages // Booleans
acrossBackFactor: { pct: 97, min: 93, max: 100 },
armholeDepthFactor: { pct: 100, min: 80, max: 120 },
shoulderDart: { bool: false }, shoulderDart: { bool: false },
shoulderDartSize: { pct: 7, min: 4, max: 10 },
shoulderDartLength: { pct: 85, min: 60, max: 100 },
waistDart: { bool: true }, waistDart: { bool: true },
waistDartSize: { pct: 10, min: 4, max: 15 },
waistDartLength: { pct: 85, min: 60, max: 100 },
verticalEase: { pct: 1, min: 0, max: 5 },
frontArmholeDeeper: { pct: 0.5, min: 0, max: 1.5 },
shoulderEase: { pct: 0, min: -2, max: 6 },
collarEase: { pct: 3.5, min: 0, max: 10 },
chestEase: { pct: 8, min: -4, max: 20 },
waistEase: { pct: 8, min: -4, max: 20 },
// Lists
primaryBustDart: { primaryBustDart: {
list: [ list: [
'06:00', '06:00',
@ -134,7 +123,7 @@ export default {
'16:00', '16:00',
'17:00' '17:00'
], ],
dflt: '14:00' dflt: '06:00'
}, },
secondaryBustDart: { secondaryBustDart: {
list: [ list: [
@ -155,16 +144,28 @@ export default {
'16:00', '16:00',
'17:00' '17:00'
], ],
dflt: '15:00' dflt: '13:30'
}, },
// Percentages
acrossBackFactor: { pct: 96, min: 93, max: 100 },
armholeDepthFactor: { pct: 100, min: 80, max: 120 },
shoulderDartSize: { pct: 7, min: 4, max: 10 },
shoulderDartLength: { pct: 85, min: 60, max: 100 },
waistDartSize: { pct: 10, min: 4, max: 15 },
waistDartLength: { pct: 85, min: 60, max: 100 },
verticalEase: { pct: 2, min: 0, max: 8 },
frontArmholeDeeper: { pct: 1, min: 0, max: 5 },
shoulderEase: { pct: 0, min: 0, max: 4 },
collarEase: { pct: 3.5, min: 0, max: 10 },
chestEase: { pct: 10, min: 5, max: 20 },
waistEase: { pct: 10, min: 5, max: 20 },
primaryBustDartShaping: { pct: 50, min: 25, max: 75 }, primaryBustDartShaping: { pct: 50, min: 25, max: 75 },
primaryBustDartLength: { pct: 85, min: 65, max: 95 }, primaryBustDartLength: { pct: 85, min: 65, max: 95 },
secondaryBustDartLength: { pct: 85, min: 65, max: 95 }, secondaryBustDartLength: { pct: 85, min: 65, max: 95 },
shoulderSlopeReduction: { pct: 0, min: 0, max: 100 },
//shoulderSlopeReduction: { pct: 0, min: 0, max: 100 },
bicepsEase: { pct: 15, min: 0, max: 50 }, bicepsEase: { pct: 15, min: 0, max: 50 },
cuffEase: { pct: 20, min: 0, max: 200 }, cuffEase: { pct: 20, min: 0, max: 50 },
sleevecapEase: { pct: 1, min: 0, max: 10 }, sleevecapEase: { pct: 1, min: 0, max: 10 },
sleevecapTopFactorX: { pct: 50, min: 25, max: 75 }, sleevecapTopFactorX: { pct: 50, min: 25, max: 75 },
sleevecapTopFactorY: { pct: 100, min: 35, max: 165 }, sleevecapTopFactorY: { pct: 100, min: 35, max: 165 },

View file

@ -1,6 +1,6 @@
{ {
"name": "@freesewing/breanna", "name": "@freesewing/breanna",
"version": "2.1.6", "version": "2.2.0-beta.0",
"description": "A FreeSewing pattern for a basic body block for womenswear", "description": "A FreeSewing pattern for a basic body block for womenswear",
"author": "Joost De Cock <joost@decock.org> (https://github.com/joostdecock)", "author": "Joost De Cock <joost@decock.org> (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/", "homepage": "https://freesewing.org/",

View file

@ -172,6 +172,9 @@ export default part => {
.length() * 2 .length() * 2
) )
// Anchor point
points.gridAnchor = points.cbNeck.clone()
// Complete pattern? // Complete pattern?
if (complete) { if (complete) {
// Title // Title
@ -277,12 +280,5 @@ export default part => {
}) })
} }
macro('pd', {
path: new Path()
.move(points.armhole)
.curve(points.armholeCp2, points.armholePitchCp1, points.armholePitch)
.curve(points.armholePitchCp2, points.shoulderCp1, points.shoulder),
d: 15
})
return part return part
} }

View file

@ -17,27 +17,29 @@ export default part => {
} = part.shorthand() } = part.shorthand()
// Shoulder // Shoulder
if (true) { points.cbHps = new Point(0, 0)
points.cbHps = new Point(0, 0) // Step 1/3: no vertical ease to make sure shoulder slope is not influenced
// Step 1/3: no vertical ease to make sure shoulder slope is not influenced points.cbWaist = new Point(0, measurements.hpsToWaistBack)
points.cbWaist = new Point(0, measurements.hpsToWaistBack) points.cbHips = new Point(0, measurements.hpsToHipsBack)
points.cbHips = new Point(0, measurements.hpsToHipsBack) points.shoulder = utils
points.shoulder = utils .circlesIntersect(
.circlesIntersect( points.cbHps,
points.cbHps, measurements.shoulderToShoulder / 2,
measurements.shoulderToShoulder / 2, points.cbHips,
points.cbHips, measurements.shoulderSlope,
measurements.shoulderSlope, 'y'
'y' )
) .shift()
.shift()
// Step 2/3: add vertical ease to waist and hips // Step 2/3: add vertical ease to waist and hips
points.cbWaist = new Point(0, measurements.hpsToWaistBack * (1 + options.verticalEase)) points.cbWaist = new Point(0, measurements.hpsToWaistBack * (1 + options.verticalEase))
points.cbHips = new Point(0, measurements.hpsToHipsBack * (1 + options.verticalEase)) points.cbHips = new Point(0, measurements.hpsToHipsBack * (1 + options.verticalEase))
}
// Neck // Neck
points.cbNeck = points.cbHips.shift(90, measurements.centerBackNeckToHips) points.cbNeck = points.cbHips.shift(
90,
measurements.centerBackNeckToHips * (1 + options.verticalEase)
)
points.hps = new Point( points.hps = new Point(
(measurements.neckCircumference * (1 + options.collarEase)) / options.collarFactor, (measurements.neckCircumference * (1 + options.collarEase)) / options.collarFactor,
0 0
@ -49,8 +51,16 @@ export default part => {
) )
points.waist = points.cbWaist.shift(0, (measurements.naturalWaist * (1 + options.waistEase)) / 4) points.waist = points.cbWaist.shift(0, (measurements.naturalWaist * (1 + options.waistEase)) / 4)
if (points.shoulder.y < points.hps.y) {
// Shoulder should never be higher than HPS
points.shoulder = utils.beamIntersectsY(points.shoulder, points.cbHips, points.hps.y)
} else {
// Take shoulder slope reduction into account
points.shoulder.y -= (points.shoulder.y - points.hps.y) * options.shoulderSlopeReduction
}
// Step 3/3: Add shoulder ease to shoulder point // Step 3/3: Add shoulder ease to shoulder point
points.shouder = points.hps.shiftOutwards( points.shoulder = points.hps.shiftOutwards(
points.shoulder, points.shoulder,
(measurements.shoulderToShoulder * options.shoulderEase) / 2 (measurements.shoulderToShoulder * options.shoulderEase) / 2
) )
@ -60,7 +70,8 @@ export default part => {
((measurements.highBust - measurements.highBustFront) * (1 + options.chestEase)) / 2, ((measurements.highBust - measurements.highBustFront) * (1 + options.chestEase)) / 2,
(points.shoulder.y + measurements.bicepsCircumference * options.armholeDepthBase) * (points.shoulder.y + measurements.bicepsCircumference * options.armholeDepthBase) *
options.armholeDepthFactor * options.armholeDepthFactor *
(1 + options.verticalEase) (1 + options.verticalEase) *
(1 + options.bicepsEase)
) )
points.armholePitch = new Point( points.armholePitch = new Point(
(measurements.shoulderToShoulder * options.acrossBackFactor * (1 + options.shoulderEase)) / 2, (measurements.shoulderToShoulder * options.acrossBackFactor * (1 + options.shoulderEase)) / 2,
@ -72,7 +83,7 @@ export default part => {
points.armholePitch.x points.armholePitch.x
) )
points.shoulderCp1 = points.shoulder points.shoulderCp1 = points.shoulder
.shiftTowards(points.hps, points.shoulder.dist(points.armholePitch) / 5) .shiftTowards(points.hps, points.shoulder.dist(points.armholePitch) / 8)
.rotate(90, points.shoulder) .rotate(90, points.shoulder)
points.armholePitchCp2 = points.armholePitch.shift( points.armholePitchCp2 = points.armholePitch.shift(
90, 90,

View file

@ -48,10 +48,8 @@ export default part => {
// Armhole deeper at the front // Armhole deeper at the front
if (options.frontArmholeDeeper > 0) { if (options.frontArmholeDeeper > 0) {
let deeper = (measurements.shoulderToShoulder * options.frontArmholeDeeper) / 2 for (let p of ['armholePitch', 'armholePitchCp1', 'armholePitchCp2'])
points.armholePitch = points.armholePitch.shift(180, deeper) points[p].x -= (measurements.shoulderToShoulder * options.frontArmholeDeeper) / 2
points.armholePitchCp1 = points.armholePitch.shift(180, deeper)
points.armholePitchCp2 = points.armholePitch.shift(180, deeper)
} }
// Bust // Bust
@ -64,14 +62,15 @@ export default part => {
// Work in room for bust from armhole pitch point down // Work in room for bust from armhole pitch point down
let bustDelta = let bustDelta =
(points.armhole.dx(points.bustSide) * points.armhole.dy(points.bustSide)) / (points.armhole.dx(points.bustSide) * points.armholePitch.dy(points.armhole)) /
points.armholePitch.dy(points.bustSide) points.armholePitch.dy(points.bustSide)
points.armhole = points.armhole.shift(0, bustDelta) points.armhole = points.armhole.shift(0, bustDelta)
// Adjust waist down to accomodate bust // Adjust waist down to accomodate bust
points.cfWaist = new Point( points.cfWaist = new Point(
0, 0,
measurements.hpsToHipsFront - (measurements.hpsToHipsBack - measurements.hpsToWaistBack) measurements.hpsToHipsFront * (1 + options.verticalEase) -
(measurements.hpsToHipsBack - measurements.hpsToWaistBack) * (1 + options.verticalEase)
) )
points.waist = utils.beamIntersectsY(points.armhole, points.bustSide, points.cfWaist.y) points.waist = utils.beamIntersectsY(points.armhole, points.bustSide, points.cfWaist.y)
points.waist = points.armhole.shiftTowards(points.waist, store.get('backSideSeamLength')) points.waist = points.armhole.shiftTowards(points.waist, store.get('backSideSeamLength'))

View file

@ -141,6 +141,9 @@ export default part => {
paths.seam.close().attr('class', 'fabric') paths.seam.close().attr('class', 'fabric')
paths.saBase.close().render = false paths.saBase.close().render = false
// Anchor point
points.gridAnchor = points.cfNeck.clone()
// Complete pattern? // Complete pattern?
if (complete) { if (complete) {
// Logo // Logo
@ -246,13 +249,5 @@ export default part => {
} }
} }
macro('pd', {
path: new Path()
.move(points.armhole)
.curve(points.armholeCp2, points.armholePitchCp1, points.armholePitch)
.curve(points.armholePitchCp2, points.shoulderCp1, points.shoulder),
d: 15
})
return part return part
} }

View file

@ -20,7 +20,8 @@ export default part => {
let top = paths.sleevecap.edge('topLeft').y let top = paths.sleevecap.edge('topLeft').y
points.centerWrist = new Point( points.centerWrist = new Point(
0, 0,
top + measurements.shoulderToWrist * (1 + options.sleeveLengthBonus) top +
measurements.shoulderToWrist * (1 + options.sleeveLengthBonus) * (1 + options.verticalEase)
) )
points.wristRight = points.centerWrist.shift( points.wristRight = points.centerWrist.shift(
0, 0,
@ -72,7 +73,7 @@ export default part => {
else if (q4Len > backTarget) points.backNotch = q4.shiftAlong(backTarget) else if (q4Len > backTarget) points.backNotch = q4.shiftAlong(backTarget)
else { else {
let q3 = new Path().move(points.capQ4).curve(points.capQ4Cp1, points.capQ3Cp2, points.capQ3) let q3 = new Path().move(points.capQ4).curve(points.capQ4Cp1, points.capQ3Cp2, points.capQ3)
points.backNotch = q3.shiftAlong(frontTarget - q4Len) points.backNotch = q3.shiftAlong(backTarget - q4Len)
} }
snippets.frontNotch = new Snippet('notch', points.frontNotch) snippets.frontNotch = new Snippet('notch', points.frontNotch)
snippets.backNotch = new Snippet('bnotch', points.backNotch) snippets.backNotch = new Snippet('bnotch', points.backNotch)

View file

@ -1,6 +1,6 @@
import Attributes from './attributes' import Attributes from './attributes'
import Point from './point' import Point from './point'
import Bezier from '@freesewing/bezier-js' import Bezier from 'bezier-js'
import { import {
linesIntersect, linesIntersect,
lineIntersectsCurve, lineIntersectsCurve,

View file

@ -1,6 +1,6 @@
import Path from './path' import Path from './path'
import Point from './point' import Point from './point'
import Bezier from '@freesewing/bezier-js' import Bezier from 'bezier-js'
export function capitalize(string) { export function capitalize(string) {
return string.charAt(0).toUpperCase() + string.slice(1) return string.charAt(0).toUpperCase() + string.slice(1)

View file

@ -0,0 +1,40 @@
shoulderDart:
title: Shoulder dart
description: Whether or not to inlude a dart at the shoulder to round the back
shoulderDartSize:
title: Shoulder dart size
description: The size of the shoulder dart
shoulderDartLength:
title: Shoulder dart length
description: The length of the shoulder dart
waistDart:
title: Waist dart
description: Whether or not to inlude a dart at the waist to round the back
waistDartSize:
title: Waist dart size
description: The size of the waist dart
waistDartLength:
title: Waist dart length
description: The length of the waist dart
verticalEase:
title: Vertical ease
description: The amount of ease to distribute along the length of the garment
waistEase:
title: Waist ease
description: The amount of ease at the waist
primaryBustDart:
title: Bust dart
description: Where to place the bust dart to shape the chest
primaryBustDartLength:
title: Bust dart length
description: The length of the bust dart
secondaryBustDart:
title: Secondary bust dart
description: Optionally include a secondary bust dart to distribute the shaping of the chest
secondaryBustDartLength:
title: Secondary bust dart length
description: The length of the secondary bust dart
primaryBustDartShaping:
title: Bust darts shaping
description: Controls the balance between the main and secondary bust darts

View file

@ -1,4 +1,5 @@
import brian from './brian.yml' import brian from './brian.yml'
import breanna from './breanna.yml'
import aaron from './aaron.yml' import aaron from './aaron.yml'
import simon from './simon.yml' import simon from './simon.yml'
import simone from './simone.yml' import simone from './simone.yml'
@ -26,6 +27,7 @@ import shared from '../../../shared-options.yml'
let patterns = { let patterns = {
brian, brian,
breanna,
aaron, aaron,
simon, simon,
simone, simone,

View file

@ -7,8 +7,11 @@ benjamin:
bent: bent:
description: This two-part sleeve block is the basis of our coat and jacket patterns. description: This two-part sleeve block is the basis of our coat and jacket patterns.
title: Bent body Block title: Bent body Block
breanna:
description: Breanna is a basic body block for womenswear.
title: Breanna body block
brian: brian:
description: Brian is a basic body block for men. description: Brian is a basic body block for menswear.
title: Brian body block title: Brian body block
bruce: bruce:
description: Bruce are comfortable yet stylish boxer briefs. description: Bruce are comfortable yet stylish boxer briefs.

View file

@ -4,6 +4,8 @@ benjamin:
dflt: brian dflt: brian
bent: bent:
dflt: brian dflt: brian
breanna:
dflt: brian
carlton: carlton:
dflt: brian dflt: brian
other: other:

View file

@ -4,6 +4,7 @@ const aaron = require('@freesewing/aaron').config
const benjamin = require('@freesewing/benjamin').config const benjamin = require('@freesewing/benjamin').config
const bent = require('@freesewing/bent').config const bent = require('@freesewing/bent').config
const brian = require('@freesewing/brian').config const brian = require('@freesewing/brian').config
const breanna = require('@freesewing/breanna').config
const bruce = require('@freesewing/bruce').config const bruce = require('@freesewing/bruce').config
const carlita = require('@freesewing/carlita').config const carlita = require('@freesewing/carlita').config
const carlton = require('@freesewing/carlton').config const carlton = require('@freesewing/carlton').config
@ -29,6 +30,7 @@ const patterns = {
benjamin, benjamin,
bent, bent,
brian, brian,
breanna,
bruce, bruce,
carlita, carlita,
carlton, carlton,