diff --git a/designs/waralee/src/backpocket.mjs b/designs/waralee/src/backpocket.mjs index a137fd38dff..589ae97434a 100644 --- a/designs/waralee/src/backpocket.mjs +++ b/designs/waralee/src/backpocket.mjs @@ -1,14 +1,5 @@ -import { backPocketDepth, backPocketSize, backPocketVerticalOffset } from './options.mjs' +import { pantsProto } from './pantsproto.mjs' -/* - * We don't move this draft method under the part object - * because doing so changes the indentation which causes - * us to lose all history of changes to this method. - * - * So to maintain the history of contributions over the - * years, keeps this method here, and resist the urge to - * move it into the named export at the bottom of this file. - */ function waraleeBackPocket(part) { const { options, @@ -22,25 +13,30 @@ function waraleeBackPocket(part) { complete, paperless, macro, + sa, } = part.shorthand() - const pocketDepth = options.backPocketDepth + if (false == options.backPocket) { + return part + } + + let pocketDepth = options.backPocketDepth points.topLeft = new Point(0, 0) points.bottomLeft = points.topLeft.shift( 270, - (pocketDepth + 30) * 2 + - options.backPocketVerticalOffset * (measurements.crotchDepth - measurements.waistToHips) + pocketDepth /*+ 30*/ * 2 + + options.backPocketVerticalOffset * measurements.crotchDepth /*- measurements.waistToHips*/ ) points.topRight = points.topLeft.shift( 0, - options.backPocketSize * (measurements.crotchDepth - measurements.waistToHips) + 24 + options.backPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ /*+ 24*/ ) points.bottomRight = points.topRight.shift( 270, - (pocketDepth + 30) * 2 + - options.backPocketVerticalOffset * (measurements.crotchDepth - measurements.waistToHips) + pocketDepth /*+ 30*/ * 2 + + options.backPocketVerticalOffset * measurements.crotchDepth /*- measurements.waistToHips*/ ) paths.seam = new Path() @@ -67,6 +63,8 @@ function waraleeBackPocket(part) { .shift(-90, 25) .attr('data-text', 'Waralee') .attr('data-text-class', 'center') + + if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } // Paperless? @@ -88,11 +86,6 @@ function waraleeBackPocket(part) { export const backPocket = { name: 'waralee.backPocket', - measurements: ['crotchDepth', 'waistToHips'], - options: { - backPocketDepth, - backPocketSize, - backPocketVerticalOffset, - }, + after: pantsProto, draft: waraleeBackPocket, } diff --git a/designs/waralee/src/cutout.mjs b/designs/waralee/src/cutout.mjs index 28889c9f684..9de13390929 100644 --- a/designs/waralee/src/cutout.mjs +++ b/designs/waralee/src/cutout.mjs @@ -1,67 +1,47 @@ -import { CreateCrotchPoints } from './util.mjs' -import { waistRaise } from './options.mjs' +import { pantsProto } from './pantsproto.mjs' -/* - * We don't move this draft method under the part object - * because doing so changes the indentation which causes - * us to lose all history of changes to this method. - * - * So to maintain the history of contributions over the - * years, keeps this method here, and resist the urge to - * move it into the named export at the bottom of this file. - */ function waraleeCutout(part) { - const { - options, - measurements, - Point, - Path, - points, - paths, - Snippet, - snippets, - complete, - sa, - paperless, - macro, - } = part.shorthand() + const { options, Path, points, paths, Snippet, snippets, complete, sa, paperless, macro } = + part.shorthand() - const seatDepth = (measurements.crotchDepth - measurements.waistToHips) * (1 + options.waistRaise) - - points.mWaist = new Point(0, 0) - points.mHip = points.mWaist.shift(270, seatDepth) - - CreateCrotchPoints(part) - - points.mWaist1 = new Point(points.mWaist.x, points.fWaistSide.y) - points.mWaist2 = new Point(points.mWaist.x, points.bWaistSide.y) + let separateWaistband = options.separateWaistband + if ('waistband' == options.frontPocketStyle) { + separateWaistband = true + } paths.seam = new Path() .move(points.mWaist1) - .line(points.fWaistSide) - .curve(points.fWaistCrotchCP, points.fHipCrotchCP, points.mHip) - .curve(points.bHipCrotchCP, points.bWaistCrotchCP, points.bWaistSide) .line(points.mWaist2) - .line(points.mWaist1) + .line(separateWaistband ? points.bWaistSideSeam : points.bWaistSide) + .join(paths.backTopCutOut) + .join(paths.backBottomCutOut) + .join(paths.frontBottomCutOut) + .join(paths.frontTopCutOut) .close() .attr('class', 'fabric') + paths.cutout.setRender(false) + // Complete? if (complete) { - points.logo = points.mWaist.shift(270, 75) - snippets.logo = new Snippet('logo', points.logo) - points.title = points.logo.shift(-90, 55) + points.title = points.mWaist.shift(270, 75) macro('title', { nr: 2, at: points.title, - title: 'cutout', + title: 'cutOut', }) + points.logo = points.title.shift(270, 75) + + snippets.logo = new Snippet('logo', points.logo) + if (sa) { paths.seamAlternate = new Path() - .move(points.bWaistSide) - .curve(points.bWaistCrotchCP, points.bHipCrotchCP, points.mHip) - .curve(points.fHipCrotchCP, points.fWaistCrotchCP, points.fWaistSide) + .move(separateWaistband ? points.bWaistSideSeam : points.bWaistSide) + .join(paths.backTopCutOut) + .join(paths.backBottomCutOut) + .join(paths.frontBottomCutOut) + .join(paths.frontTopCutOut) paths.sa = paths.seamAlternate.offset(sa).attr('class', 'fabric sa') } @@ -72,12 +52,12 @@ function waraleeCutout(part) { macro('hd', { from: points.fWaistSide, to: points.mWaist, - y: points.mWaist.y, + y: (separateWaistband ? points.fWaistSideCp2 : points.mWaist).y, }) macro('hd', { from: points.mWaist, to: points.bWaistSide, - y: points.mWaist.y, + y: (separateWaistband ? points.fWaistSideCp2 : points.mWaist).y, }) macro('vd', { from: points.mWaist1, @@ -90,12 +70,13 @@ function waraleeCutout(part) { x: points.mWaist.x + 15, }) } + part.render = options.showMini return part } export const cutout = { name: 'waralee.cutout', - measurements: ['crotchDepth', 'waistToHips'], + from: pantsProto, draft: waraleeCutout, } diff --git a/designs/waralee/src/facings.mjs b/designs/waralee/src/facings.mjs index 26e8d6da192..7f00a14e9ae 100644 --- a/designs/waralee/src/facings.mjs +++ b/designs/waralee/src/facings.mjs @@ -1,14 +1,7 @@ -/* - * We don't move this draft method under the part object - * because doing so changes the indentation which causes - * us to lose all history of changes to this method. - * - * So to maintain the history of contributions over the - * years, keeps this method here, and resist the urge to - * move it into the named export at the bottom of this file. - */ +import { pantsProto } from './pantsproto.mjs' + function waraleeFacings(part) { - let { + const { options, measurements, Point, @@ -20,20 +13,21 @@ function waraleeFacings(part) { complete, paperless, macro, + sa, } = part.shorthand() let frontPocketSize = - options.frontPocketSize * (measurements.crotchDepth - measurements.waistToHips) + options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ let backPocketSize = - options.backPocketSize * (measurements.crotchDepth - measurements.waistToHips) + options.backPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ points.frontTL = new Point(0, 0) - points.frontTR = points.frontTL.shift(0, frontPocketSize + 24) + points.frontTR = points.frontTL.shift(0, frontPocketSize + sa + sa) points.frontBL = points.frontTL.shift(270, frontPocketSize / 2) points.frontBR = points.frontTR.shift(270, frontPocketSize / 2) points.backTL = points.frontBL.shift(270, 50) - points.backTR = points.backTL.shift(0, backPocketSize + 24) + points.backTR = points.backTL.shift(0, backPocketSize + sa + sa) points.backBL = points.backTL.shift(270, backPocketSize / 2) points.backBR = points.backTR.shift(270, backPocketSize / 2) @@ -45,6 +39,8 @@ function waraleeFacings(part) { .line(points.frontTL) .close() .attr('class', 'fabric') + .setRender(options.frontPocket && 'welt' == options.frontPocketStyle) + paths.backSeam = new Path() .move(points.backTL) .line(points.backBL) @@ -53,60 +49,70 @@ function waraleeFacings(part) { .line(points.backTL) .close() .attr('class', 'fabric') + .setRender(options.backPocket) // Complete? if (complete) { - points.frontTitle = points.frontTL.shift(270, 50).shift(0, 50) - macro('title', { - nr: 5, - at: points.frontTitle.shift(0, 30), - title: 'frontFacing', - prefix: 'front', - }) - points.frontLogo = points.frontTitle.shift(270, 0) - snippets.frontLogo = new Snippet('logo', points.frontLogo).attr('data-scale', 0.4) - points.frontText = points.frontLogo - .shift(-90, 25) - .attr('data-text', 'Waralee') - .attr('data-text-class', 'center') + if (options.frontPocket && 'welt' == options.frontPocketStyle) { + points.frontTitle = points.frontTL.shift(270, 30).shift(0, 40) + macro('title', { + nr: 5, + at: points.frontTitle.shift(0, 30), + title: 'frontFacing', + prefix: 'front', + scale: 0.6, + }) - points.backTitle = points.backTL.shift(270, 50).shift(0, 50) - macro('title', { - nr: 6, - at: points.backTitle.shift(0, 30), - title: 'backFacing', - prefix: 'back', - }) - points.backLogo = points.backTitle.shift(270, 0) - snippets.backLogo = new Snippet('logo', points.backLogo).attr('data-scale', 0.4) - points.backText = points.backLogo - .shift(-90, 25) - .attr('data-text', 'Waralee') - .attr('data-text-class', 'center') + points.frontLogo = points.frontTitle.shift(270, 0) + snippets.frontLogo = new Snippet('logo', points.frontLogo).attr('data-scale', 0.3) + points.frontText = points.frontLogo + .shift(-90, 15) + .attr('data-text', 'Waralee') + .attr('data-text-class', 'center') + } + if (options.backPocket) { + points.backTitle = points.backTL.shift(270, 30).shift(0, 40) + macro('title', { + nr: 6, + at: points.backTitle.shift(0, 30), + title: 'backFacing', + prefix: 'back', + scale: 0.6, + }) + points.backLogo = points.backTitle.shift(270, 0) + snippets.backLogo = new Snippet('logo', points.backLogo).attr('data-scale', 0.3) + points.backText = points.backLogo + .shift(-90, 15) + .attr('data-text', 'Waralee') + .attr('data-text-class', 'center') + } } - // Paperless? if (paperless) { - macro('hd', { - from: points.frontTL, - to: points.frontTR, - y: points.frontTL.y + 15, - }) - macro('hd', { - from: points.backTL, - to: points.backTR, - y: points.backTL.y + 15, - }) - macro('vd', { - from: points.frontTL, - to: points.frontBL, - x: points.frontTL.x + 15, - }) - macro('vd', { - from: points.backTL, - to: points.backBL, - x: points.backTL.x + 15, - }) + if (options.frontPocket && 'welt' == options.frontPocketStyle) { + macro('hd', { + from: points.frontTL, + to: points.frontTR, + y: points.frontTL.y + 15, + }) + macro('vd', { + from: points.frontTL, + to: points.frontBL, + x: points.frontTL.x + 15, + }) + } + if (options.backPocket) { + macro('hd', { + from: points.backTL, + to: points.backTR, + y: points.backTL.y + 15, + }) + macro('vd', { + from: points.backTL, + to: points.backBL, + x: points.backTL.x + 15, + }) + } } return part @@ -114,6 +120,6 @@ function waraleeFacings(part) { export const facings = { name: 'waralee.facings', - measurements: ['crotchDepth', 'waistToHips'], + after: pantsProto, draft: waraleeFacings, } diff --git a/designs/waralee/src/index.mjs b/designs/waralee/src/index.mjs index 5a491e1cd4d..ed9b0203222 100644 --- a/designs/waralee/src/index.mjs +++ b/designs/waralee/src/index.mjs @@ -6,14 +6,38 @@ import { pocket } from './pocket.mjs' import { backPocket } from './backpocket.mjs' import { facings } from './facings.mjs' import { mini } from './mini.mjs' +import { waistbandFront, waistbandBack, strapFront, strapBack } from './waistband.mjs' // Re-export skeleton parts so peope can re-use them import { pantsProto } from './pantsproto.mjs' // Setup our new design const Waralee = new Design({ data, - parts: [pants, cutout, pocket, backPocket, facings, mini], + parts: [ + pants, + cutout, + pocket, + backPocket, + facings, + mini, + waistbandFront, + waistbandBack, + strapFront, + strapBack, + ], }) // Named exports -export { pants, cutout, pocket, backPocket, facings, pantsProto, Waralee } +export { + pants, + cutout, + pocket, + backPocket, + facings, + mini, + waistbandFront, + waistbandBack, + strapFront, + strapBack, + Waralee, +} diff --git a/designs/waralee/src/mini.mjs b/designs/waralee/src/mini.mjs index 7d57a450029..a496db92c72 100644 --- a/designs/waralee/src/mini.mjs +++ b/designs/waralee/src/mini.mjs @@ -1,22 +1,17 @@ import { pantsProto } from './pantsproto.mjs' -/* - * We don't move this draft method under the part object - * because doing so changes the indentation which causes - * us to lose all history of changes to this method. - * - * So to maintain the history of contributions over the - * years, keeps this method here, and resist the urge to - * move it into the named export at the bottom of this file. - */ // This is an idea to keep the printing to a minimum. The whole patterns is rather large. // To keep you from printing it completely, you could print this part in paperless mode // and only have a single sheet with all the dimensions on it. -function waraleeMini(part) { - const { options, points, paths, Snippet, snippets, complete, sa, paperless, macro, store } = - part.shorthand() - const mini = options.minimizer +function waraleeMini(part) { + const { options, Path, points, paths, complete, sa, macro, store } = part.shorthand() + + let mini = options.minimizer + let separateWaistband = options.separateWaistband + if ('waistband' == options.frontPocketStyle) { + separateWaistband = true + } for (var p in points) { points[p].x = points[p].x / mini @@ -38,32 +33,127 @@ function waraleeMini(part) { .offset((-1 * store.get('hem')) / mini) .attr('class', 'fabric stroke-sm') + paths.cutOut = new Path() + .move(separateWaistband ? points.bWaistSideSeam : points.bWaistSide) + .line(points.mWaist2) + .line(points.mWaist1) + .line(separateWaistband ? points.fWaistSideSeam : points.fWaistSide) + .attr('class', 'help') + + paths.seam.setRender(true) + // Complete? if (complete) { - points.logo = points.fWaistFront.shift(270, 400) - snippets.logo = new Snippet('logo', points.logo) - points.text = points.logo - .shift(-90, 50) - .attr('data-text', 'hello') - .attr('data-text-class', 'center') + macro('scalebox', { at: points.mLeg.shift(-90, 35) }) + + if (options.frontPocket && 'welt' == options.frontPocketStyle) { + paths.frontPocket.setRender(true) + } + if (options.backPocket) { + paths.backPocket.setRender(true) + } if (sa) { - paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + paths.sa = paths.seam.offset(sa / mini).attr('class', 'fabric sa') + } + + points.pText1 = points.mHip + .shiftFractionTowards(points.mLeg, 0.5) + .attr('data-text', 'thisIsNotAPart') + .attr('data-text-class', 'center') + points.pText2 = points.mHip + .shiftFractionTowards(points.mLeg, 0.6) + .attr('data-text', 'doNotCutFromFabric') + .attr('data-text-class', 'center') + points.pText3 = points.mHip + .shiftFractionTowards(points.mLeg, 0.7) + .attr('data-text', 'useMeasurementsToCutFromFabric') + .attr('data-text-class', 'center') + + let fWaistSide = separateWaistband ? points.fWaistSideSeam : points.fWaistSide + let fWaistFrontOverlap = separateWaistband + ? points.fWaistFrontOverlapSeam + : points.fWaistFrontOverlap + let bWaistSide = separateWaistband ? points.bWaistSideSeam : points.bWaistSide + let bWaistBackOverlap = separateWaistband + ? points.bWaistBackOverlapSeam + : points.bWaistBackOverlap + + macro('hd', { + from: points.fWaistFrontOverlap, + to: fWaistSide, + y: fWaistSide.y + 10, + text: part.units(fWaistSide.dist(points.fWaistFrontOverlap) * mini), + }) + macro('hd', { + from: points.fLegFrontOverlap, + to: points.bLegBackOverlap, + y: points.bLegBackOverlap.y - 10, + text: part.units(points.fLegFrontOverlap.dist(points.bLegBackOverlap) * mini), + }) + macro('hd', { + from: points.bWaistBack, + to: points.bWaistBackOverlap, + y: points.bWaistBackOverlap.y + 20, + text: part.units(points.bWaistBackOverlap.dist(points.bWaistBack) * mini), + }) + macro('hd', { + from: points.fWaistFrontOverlap, + to: points.mHip, + y: points.mHip.y + 10, + text: part.units((points.mHip.x - points.fWaistFrontOverlap.x) * mini), + }) + macro('vd', { + from: fWaistFrontOverlap, + to: points.fLegFrontOverlap, + x: points.fLegFrontOverlap.x + 10, + text: part.units(fWaistFrontOverlap.dist(points.fLegFrontOverlap) * mini), + }) + macro('vd', { + from: points.bLegBackOverlap, + to: bWaistBackOverlap, + x: points.bLegBackOverlap.x - 10, + text: part.units(bWaistBackOverlap.dist(points.bLegBackOverlap) * mini), + }) + macro('vd', { + from: points.bLegBackOverlap, + to: bWaistSide, + x: bWaistSide.x + 10, + text: part.units((points.bLegBackOverlap.y - bWaistSide.y) * mini), + }) + + if (options.frontPocket && 'welt' == options.frontPocketStyle) { + macro('hd', { + from: fWaistFrontOverlap, + to: points.frontPocketBottom2, + y: points.frontPocketBottom2.y + 20, + text: part.units((points.frontPocketBottom2.x - fWaistFrontOverlap.x) * mini), + }) + macro('vd', { + from: fWaistFrontOverlap, + to: points.frontPocketBottom2, + x: points.frontPocketBottom2.x + 20, + text: part.units((points.frontPocketBottom2.y - fWaistFrontOverlap.y) * mini), + }) + } + + if (options.backPocket) { + macro('hd', { + from: points.backPocketRight, + to: bWaistBackOverlap, + y: bWaistBackOverlap.y + 40, + text: part.units((bWaistBackOverlap.x - points.backPocketRight.x) * mini), + }) + macro('vd', { + from: bWaistBackOverlap, + to: points.backPocketRight, + x: points.backPocketRight.x, + text: part.units((points.backPocketRight.y - bWaistBackOverlap.y) * mini), + }) } } - // Paperless? - if (paperless) { - macro('hd', { - from: points.fWaistSide, - to: points.mWaist, - y: points.fWaistSide.y, - text: part.units(points.fWaistSide.dist(points.mWaist) * mini), - }) - } - - // keep this secret for now: - part.render = false + part.render = options.showMini return part } @@ -71,6 +161,5 @@ function waraleeMini(part) { export const mini = { name: 'waralee.mini', from: pantsProto, - hide: true, draft: waraleeMini, } diff --git a/designs/waralee/src/options.mjs b/designs/waralee/src/options.mjs index b78770eee09..437459ffe31 100644 --- a/designs/waralee/src/options.mjs +++ b/designs/waralee/src/options.mjs @@ -1,6 +1,6 @@ // Fit export const backRaise = { pct: 10, min: 0, max: 25, menu: 'fit' } -export const waistRaise = { pct: 20, min: 0, max: 40, menu: 'fit' } +export const waistRaise = { pct: 0, min: -20, max: 40, menu: 'fit' } // Style export const hemWidth = { pct: 1.75, min: 1, max: 2.5, menu: 'style' } export const legShortening = { pct: 25, min: -10, max: 50, menu: 'style' } @@ -11,17 +11,26 @@ export const waistbandWidth = { pct: 3.5, min: 2, max: 5, menu: 'style' } // Advanced export const crotchFront = { pct: 30, min: 10, max: 70, menu: 'advanced' } export const crotchBack = { pct: 45, min: 10, max: 70, menu: 'advanced' } -export const crotchFactorFrontHor = { pct: 85, min: 10, max: 100, menu: 'advanced' } -export const crotchFactorFrontVer = { pct: 25, min: 10, max: 70, menu: 'advanced' } +export const crotchFactorFrontHor = { pct: 90, min: 10, max: 100, menu: 'advanced' } +export const crotchFactorFrontVer = { pct: 30, min: 10, max: 70, menu: 'advanced' } export const crotchFactorBackHor = { pct: 90, min: 10, max: 100, menu: 'advanced' } export const crotchFactorBackVer = { pct: 60, min: 20, max: 90, menu: 'advanced' } // Static values -export const minimizer = 5 +export const minimizer = 4 export const frontPocketVerticalOffset = 0.07 export const frontPocketHorizontalOffset = 0.18 -export const frontPocketSize = 0.65 +export const frontPocketSize = 0.45 export const frontPocketDepthFactor = 1.6 export const backPocketDepth = 140 -export const backPocketVerticalOffset = 0.15 +export const backPocketVerticalOffset = 0.2 export const backPocketHorizontalOffset = 0.045 -export const backPocketSize = 0.65 +export const backPocketSize = 0.45 +// Added later +export const frontWaistAdjustment = 0.163 +export const backWaistAdjustment = 0.3 +export const crotchEase = 1.08 +export const frontPocketStyle = { dflt: 'welt', list: ['welt', 'waistband'], menu: 'style' } +export const showMini = { bool: true, menu: 'options' } +export const fitWaist = { bool: true, menu: 'fit' } +export const separateWaistband = { bool: false, menu: 'style' } +export const knotInFront = { bool: true, menu: 'style' } diff --git a/designs/waralee/src/pants.mjs b/designs/waralee/src/pants.mjs index ac6e94ec8ae..4c0cae7d21e 100644 --- a/designs/waralee/src/pants.mjs +++ b/designs/waralee/src/pants.mjs @@ -1,133 +1,158 @@ import { pantsProto } from './pantsproto.mjs' -/* - * We don't move this draft method under the part object - * because doing so changes the indentation which causes - * us to lose all history of changes to this method. - * - * So to maintain the history of contributions over the - * years, keeps this method here, and resist the urge to - * move it into the named export at the bottom of this file. - */ function waraleePants(part) { - const { options, points, paths, Snippet, snippets, complete, sa, paperless, macro, store } = + const { options, points, Path, paths, Snippet, snippets, complete, sa, paperless, macro, store } = part.shorthand() - paths.waistFoldBack = paths.waistBack - .offset(-1 * store.get('waistBand')) - .attr('class', 'fabric stroke-sm') - paths.waistFoldFront = paths.waistFront - .offset(-1 * store.get('waistBand')) - .attr('class', 'fabric stroke-sm') + let separateWaistband = options.separateWaistband + if ('waistband' == options.frontPocketStyle) { + separateWaistband = true + } + + if (false == separateWaistband) { + paths.waistFoldBack = new Path() + .move(points.bWaistSideHem) + .line(separateWaistband ? points.bWaistBackSeam : points.bWaistBackHem) + .line(separateWaistband ? points.bWaistBackSeam : points.bWaistBackOverlapHem) + .attr('class', 'fabric stroke-sm') + paths.waistFoldFront = new Path() + .move(points.fWaistSideHem) + .line(points.fWaistFrontOverlapHem) + .attr('class', 'fabric stroke-sm') + } paths.frontFold = paths.front.offset(-1 * store.get('hem')).attr('class', 'fabric stroke-sm') paths.legFold = paths.leg.offset(-1 * store.get('hem')).attr('class', 'fabric stroke-sm') paths.backFold = paths.back.offset(-1 * store.get('hem')).attr('class', 'fabric stroke-sm') + paths.seam.setRender(true) + // Complete? if (complete) { - points.logo = points.fWaistFront.shift(270, 400) - snippets.logo = new Snippet('logo', points.logo) - points.title = points.logo.shift(-90, 50) + points.title = points.fWaistFront.shift(270, 400) macro('title', { nr: 1, at: points.title, title: 'pants', }) + + points.logo = points.title.shift(270, 75) + + snippets.logo = new Snippet('logo', points.logo) + macro('scalebox', { at: points.mHip.shift(-90, 70) }) if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } + if (options.frontPocket && 'welt' == options.frontPocketStyle) { + paths.frontPocket.setRender(true) + } + if (options.backPocket) { + paths.backPocket.setRender(true) + } + // Paperless? if (paperless) { + let fWaistSide = separateWaistband ? points.fWaistSideSeam : points.fWaistSide + let bWaistSide = separateWaistband ? points.bWaistSideSeam : points.bWaistSide macro('hd', { - from: points.fWaistSide, - to: points.mWaist, - y: points.fWaistSide.y, + from: fWaistSide, + to: points.mWaist1, + y: fWaistSide.y, }) macro('hd', { from: points.fWaistFrontOverlap, - to: points.mWaist, - y: points.fWaistSide.y - sa - 15, + to: points.mWaist1, + y: fWaistSide.y - sa - 15, }) macro('hd', { from: points.mWaist, - to: points.bWaistSide, - y: points.bWaistSide.y, + to: bWaistSide, + y: bWaistSide.y, }) macro('hd', { - from: points.mWaist, - to: points.bWaistBack, - y: points.bWaistSide.y - sa - 15, + from: points.mWaist1, + to: separateWaistband ? points.bWaistBackSeam : points.bWaistBack, + y: bWaistSide.y - sa - 15, }) macro('hd', { - from: points.mWaist, - to: points.bWaistBackOverlap, - y: points.bWaistSide.y - sa - 30, + from: points.mWaist1, + to: separateWaistband ? points.bWaistBackSeam : points.bWaistBackOverlap, + y: bWaistSide.y - sa - 30, }) macro('vd', { - from: points.mWaist, + from: points.mWaist1, to: points.mHip, x: points.mWaist.x, }) macro('vd', { - from: points.bWaistSide, - to: points.bWaistBack, - x: points.bWaistSide.x + 15, + from: bWaistSide, + to: separateWaistband ? points.bWaistBackSeam : points.bWaistBack, + x: bWaistSide.x + 15, }) macro('vd', { - from: points.bWaistBackOverlap, + from: separateWaistband ? points.bWaistBackSeam : points.bWaistBackOverlap, to: points.bLegBackOverlap, x: points.bLegBackOverlap.x - 30, }) - - if (options.frontPocket) { + if (false == separateWaistband) { macro('vd', { from: points.fWaistSide, + to: points.fWaistSideHem, + x: points.fWaistSide.x + 10, + }) + } + + if (options.frontPocket && 'welt' == options.frontPocketStyle) { + macro('vd', { + from: fWaistSide, to: points.frontPocketTop, x: points.frontPocketTop.x, }) macro('vd', { - from: points.fWaistSide, + from: fWaistSide, to: points.frontPocketBottom, x: points.frontPocketBottom.x, }) macro('hd', { from: points.frontPocketTop, - to: points.fWaistSide, + to: fWaistSide, y: points.frontPocketTop.y, }) macro('hd', { from: points.frontPocketBottom, - to: points.fWaistSide, + to: fWaistSide, y: points.frontPocketBottom.y, }) } + if (options.backPocket) { macro('vd', { - from: points.bWaistSide, + from: bWaistSide, to: points.backPocketLeft, x: points.backPocketLeft.x, }) macro('vd', { - from: points.bWaistSide, + from: bWaistSide, to: points.backPocketRight, x: points.backPocketRight.x, }) macro('hd', { - from: points.bWaistSide, + from: bWaistSide, to: points.backPocketLeft, y: points.backPocketLeft.y, }) macro('hd', { - from: points.bWaistSide, + from: bWaistSide, to: points.backPocketRight, y: points.backPocketRight.y, }) } } + part.render = options.showMini == false + return part } diff --git a/designs/waralee/src/pantsproto.mjs b/designs/waralee/src/pantsproto.mjs index 688c985a8e0..b58f8240d10 100644 --- a/designs/waralee/src/pantsproto.mjs +++ b/designs/waralee/src/pantsproto.mjs @@ -1,29 +1,88 @@ import { pluginBundle } from '@freesewing/plugin-bundle' -import { CreateCrotchPoints } from './util.mjs' import * as options from './options.mjs' -/* - * We don't move this draft method under the part object - * because doing so changes the indentation which causes - * us to lose all history of changes to this method. - * - * So to maintain the history of contributions over the - * years, keeps this method here, and resist the urge to - * move it into the named export at the bottom of this file. - */ function waraleePantsProto(part) { const { options, measurements, Point, Path, points, paths, store } = part.shorthand() - const seatDepth = (measurements.crotchDepth - measurements.waistToHips) * (1 + options.waistRaise) - const circumference = measurements.seat - const circumference4 = circumference / 4 - store.set('waistBand', measurements.inseam * options.waistbandWidth) - store.set('hem', measurements.inseam * options.hemWidth) - const waistBand = store.get('waistBand') + let seatDepth = + measurements.crotchDepth /* - measurements.waistToHips */ * + (1 + options.waistRaise) * + options.crotchEase + let circumference = measurements.seat + let waist = + typeof measurements.waist == 'undefined' || false == options.fitWaist + ? measurements.seat + : measurements.waist + let waistBack = + typeof measurements.waistBack == 'undefined' || false == options.fitWaist + ? waist / 2 + : measurements.waistBack + + let separateWaistband = options.separateWaistband + if ('waistband' == options.frontPocketStyle) { + separateWaistband = true + } + + if (circumference < waist) { + circumference = waist + } + + let circumference4 = circumference / 4 + let hem = measurements.inseam * options.hemWidth + let waistBand = measurements.inseam * options.waistbandWidth + store.set('waistBand', waistBand) + store.set('hem', hem) points.mWaist = new Point(0, 0) - CreateCrotchPoints(part) + points.mHip = points.mWaist.shift(270, seatDepth) + + points.fWaistSide = points.mWaist + .shift(180, options.crotchFront * circumference4) + .shift(90, waistBand) + points.fWaistCrotchCP = points.fWaistSide.shift( + 270, + seatDepth * options.crotchFactorFrontVer + waistBand + ) + points.fHipCrotchCP = points.mHip.shift( + 180, + options.crotchFront * circumference4 * options.crotchFactorFrontHor + ) + + points.fHipSide = points.mHip.shift(180, options.crotchFront * circumference4) + + points.bWaistSide = points.mWaist + .shift(0, options.crotchBack * circumference4) + .shift(90, waistBand) + .shift(90, options.backRaise * seatDepth) + points.bWaistCrotchCP = points.bWaistSide.shift(270, seatDepth * options.crotchFactorBackVer) + points.bHipCrotchCP = points.mHip.shift( + 0, + options.crotchBack * circumference4 * options.crotchFactorBackHor + ) + + points.bHipSide = points.mHip.shift(0, options.crotchBack * circumference4) + + points.fCutOutHip = new Path() + .move(points.fWaistSide) + .curve(points.fWaistCrotchCP, points.fHipCrotchCP, points.mHip) + .shiftAlong(measurements.waistToHips + waistBand) + points.bCutOutHip = new Path() + .move(points.bWaistSide) + .curve(points.bWaistCrotchCP, points.bHipCrotchCP, points.mHip) + .shiftAlong(measurements.waistToHips + waistBand + options.backRaise * seatDepth) + + let waistSeatDifferenceBack = measurements.seat / 2 - waistBack + let waistSeatDifferenceFront = measurements.seat / 2 - (waist - waistBack) + + points.bWaistAdjusted = points.bWaistSide.shift( + 0, + waistSeatDifferenceBack * options.backWaistAdjustment + ) + points.fWaistAdjusted = points.fWaistSide.shift( + 180, + waistSeatDifferenceFront * options.frontWaistAdjustment + ) points.mLeg = points.mHip.shift(270, measurements.inseam * (1 - options.legShortening)) points.fLegSide = points.mLeg.shift(180, options.crotchFront * circumference4) @@ -54,33 +113,126 @@ function waraleePantsProto(part) { points.bLegBackOverlap = points.bLegBack.shift(0, options.waistOverlap * circumference4) points.bWaistSideTemp = points.bWaistSide.shift(0, 2) // This is a trick to make the offset() call work. Without it, the offset is crossing the cutout line. + + let fPaths = new Path() + .move(points.fWaistSide) + .curve(points.fWaistCrotchCP, points.fHipCrotchCP, points.mHip) + .split(points.fCutOutHip) + + let bPaths = new Path() + .move(points.bWaistSide) + .curve(points.bWaistCrotchCP, points.bHipCrotchCP, points.mHip) + .split(points.bCutOutHip) + + fPaths[0].setRender(false) + fPaths[1].setRender(false) + bPaths[0].setRender(false) + bPaths[1].setRender(false) + + points.fCutOutHipCp1 = fPaths[1].ops[1].cp1.shiftFractionTowards(points.fCutOutHip, 1.25) + points.fCutOutHipCp2 = fPaths[1].ops[1].cp1.clone() + points.mHipCp1 = fPaths[1].ops[1].cp2.clone() + points.mHipCp2 = bPaths[1].ops[1].cp2.clone() + points.bCutOutHipCp1 = bPaths[1].ops[1].cp1.clone() + points.bCutOutHipCp2 = bPaths[1].ops[1].cp1.shiftFractionTowards(points.bCutOutHip, 1.25) + + paths.frontBottomCutOut = new Path() + .move(points.mHip) + .curve(points.mHipCp1, points.fCutOutHipCp2, points.fCutOutHip) + .setRender(false) + paths.backBottomCutOut = new Path() + .move(points.bCutOutHip) + .curve(points.bCutOutHipCp1, points.mHipCp2, points.mHip) + .setRender(false) + + paths.frontTopCutOut = new Path() + .move(points.fCutOutHip) + .curve(points.fCutOutHipCp1, points.fWaistAdjusted, points.fWaistAdjusted) + .setRender(false) + paths.backTopCutOut = new Path() + .move(points.bWaistAdjusted) + .curve(points.bWaistAdjusted, points.bCutOutHipCp2, points.bCutOutHip) + .setRender(false) + + points.fWaistSideHem = paths.frontTopCutOut.reverse().shiftAlong(waistBand) + points.fWaistSideSeam = paths.frontTopCutOut.reverse().shiftAlong(waistBand * 2) + points.fWaistSide = points.fWaistSideSeam.flipY(points.fWaistSideHem) + points.bWaistSideHem = paths.backTopCutOut.shiftAlong(waistBand) + points.bWaistSideSeam = paths.backTopCutOut.shiftAlong(waistBand * 2) + points.bWaistSide = points.bWaistSideSeam.flipY(points.bWaistSideHem) + + points.fWaistFrontOverlapHem = points.fWaistFrontOverlap.shift(270, waistBand) + points.bWaistBackHem = points.bWaistBack.shift(270, waistBand) + points.bWaistBackOverlapHem = points.bWaistBackOverlap.shift(270, waistBand) + points.fWaistFrontOverlapSeam = points.fWaistFrontOverlap.shift(270, waistBand * 2) + points.bWaistBackSeam = points.bWaistBack.shift(270, waistBand * 2) + points.bWaistBackOverlapSeam = points.bWaistBackOverlap.shift(270, waistBand * 2) + points.fWaistSideCp2 = paths.frontTopCutOut.split(points.fWaistSideSeam)[0].ops[1].cp2.clone() + + points.fWaistSideCp2 = paths.frontTopCutOut.split(points.fWaistSideSeam)[0].ops[1].cp2.clone() + points.fWaistHipCp1 = paths.frontTopCutOut.split(points.fWaistSideSeam)[0].ops[1].cp1.clone() + points.bWaistSideCp1 = paths.backTopCutOut.split(points.bWaistSideSeam)[1].ops[1].cp1.clone() + points.bWaistHipCp2 = paths.backTopCutOut.split(points.bWaistSideSeam)[1].ops[1].cp2.clone() + + if (separateWaistband) { + points.mWaist1 = new Point(points.mWaist.x, points.fWaistSideSeam.y) + // points.mWaist = new Point(points.mWaist.x, points.fWaistSideSeam.y) + } else { + points.mWaist1 = new Point(points.mWaist.x, points.fWaistSide.y) + } + if (separateWaistband) { + points.mWaist2 = new Point(points.mWaist.x, points.bWaistSideSeam.y) + } else { + points.mWaist2 = new Point(points.mWaist.x, points.bWaistSide.y) + } + + paths.frontTopCutOut = new Path() + .move(points.fCutOutHip) + .curve(points.fCutOutHipCp1, points.fWaistSideCp2, points.fWaistSideSeam) + .setRender(false) + if (false == separateWaistband) { + paths.frontTopCutOut.line(points.fWaistSideHem) + paths.frontTopCutOut.line(points.fWaistSide) + } + if (false == separateWaistband) { + paths.backTopCutOut = new Path() + .move(points.bWaistSide) + .line(points.bWaistSideHem) + .line(points.bWaistSideSeam) + } else { + paths.backTopCutOut = new Path().move(points.bWaistSideSeam) + } + paths.backTopCutOut + .curve(points.bWaistSideCp1, points.bCutOutHipCp2, points.bCutOutHip) + .setRender(false) + + paths.cutout = paths.backTopCutOut + .join(paths.backBottomCutOut) + .join(paths.frontBottomCutOut) + .join(paths.frontTopCutOut) + .setRender(false) + paths.waistBack = new Path() - .move(points.bWaistBackOverlap) - .line(points.bWaistBack) - .line(points.bWaistSideTemp) // This is a trick to make the offset() call work. Without it, the offset is crossing the cutout line. - .line(points.bWaistSide) + .move(separateWaistband ? points.bWaistBackOverlapSeam : points.bWaistBackOverlap) + .line(separateWaistband ? points.bWaistBackSeam : points.bWaistBack) + // .line(points.bWaistSideTemp) // This is a trick to make the offset() call work. Without it, the offset is crossing the cutout line. + .line(separateWaistband ? points.bWaistSideSeam : points.bWaistSide) .setRender(false) paths.waistFront = new Path() - .move(points.fWaistSide) - .line(points.fWaistFront) - .line(points.fWaistFrontOverlap) + .move(separateWaistband ? points.fWaistSideSeam : points.fWaistSide) + .line(separateWaistband ? points.fWaistFrontOverlapSeam : points.fWaistFrontOverlap) .setRender(false) paths.front = new Path() - .move(points.fWaistFrontOverlap) + .move(separateWaistband ? points.fWaistFrontOverlapSeam : points.fWaistFrontOverlap) .line(points.fHipFrontOverlap) .line(points.fLegFrontOverlap) .setRender(false) paths.back = new Path() .move(points.bLegBackOverlap) .line(points.bHipBackOverlap) - .line(points.bWaistBackOverlap) + .line(separateWaistband ? points.bWaistBackOverlapSeam : points.bWaistBackOverlap) .setRender(false) paths.leg = new Path().move(points.fLegFrontOverlap).line(points.bLegBackOverlap).setRender(false) - paths.cutout = new Path() - .move(points.bWaistSide) - .curve(points.bWaistCrotchCP, points.bHipCrotchCP, points.mHip) - .curve(points.fHipCrotchCP, points.fWaistCrotchCP, points.fWaistSide) - .setRender(false) paths.seam = paths.waistFront .join(paths.front) @@ -90,19 +242,22 @@ function waraleePantsProto(part) { .join(paths.cutout) .close() .attr('class', 'fabric') + .setRender(false) + if (options.frontPocket) { - points.frontPocketTop = points.fWaistSide + points.frontPocketTop = points.fWaistSideSeam .shift( 270, - options.frontPocketVerticalOffset * (measurements.crotchDepth - measurements.waistToHips) + - waistBand * 2 + options.frontPocketVerticalOffset * + measurements.crotchDepth /*- measurements.waistToHips*/ + + waistBand * (separateWaistband ? 1 : 2) ) .shift(180, options.frontPocketHorizontalOffset * measurements.seat) points.frontPocketTop2 = points.frontPocketTop.shift(340, 12) points.frontPocketBottom = points.frontPocketTop.shift( 250, - options.frontPocketSize * (measurements.crotchDepth - measurements.waistToHips) + options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ ) points.frontPocketBottom2 = points.frontPocketBottom.shift(340, 12) @@ -113,6 +268,7 @@ function waraleePantsProto(part) { .line(points.frontPocketTop2) .close() .attr('class', 'fabric') + .setRender(false) } if (options.backPocket) { @@ -120,19 +276,19 @@ function waraleePantsProto(part) { .shiftTowards(points.bWaistSide, options.backPocketHorizontalOffset * measurements.seat) .shift( 270, - options.backPocketVerticalOffset * (measurements.crotchDepth - measurements.waistToHips) + - waistBand * 2 + options.backPocketVerticalOffset * measurements.crotchDepth /*- measurements.waistToHips*/ + + waistBand * (separateWaistband ? 1 : 2) ) points.backPocketLeft = points.bWaistBack .shiftTowards( points.bWaistSide, options.backPocketHorizontalOffset * measurements.seat + - options.backPocketSize * (measurements.crotchDepth - measurements.waistToHips) + options.backPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ ) .shift( 270, - options.backPocketVerticalOffset * (measurements.crotchDepth - measurements.waistToHips) + - waistBand * 2 + options.backPocketVerticalOffset * measurements.crotchDepth /*- measurements.waistToHips*/ + + waistBand * (separateWaistband ? 1 : 2) ) points.backPocketRight2 = points.backPocketRight.shift( points.backPocketRight.angle(points.backPocketLeft) + 90, @@ -150,6 +306,7 @@ function waraleePantsProto(part) { .line(points.backPocketRight) .close() .attr('class', 'fabric') + .setRender(false) } part.render = false @@ -160,8 +317,9 @@ function waraleePantsProto(part) { export const pantsProto = { name: 'waralee.pantsProto', hide: true, - measurements: ['crotchDepth', 'waistToHips', 'seat', 'inseam'], + measurements: ['seat', 'inseam', 'crotchDepth', 'waistToHips'], + optionalMeasurements: ['waist', 'waistBack'], options, - plugins: [ pluginBundle ], + plugins: [pluginBundle], draft: waraleePantsProto, } diff --git a/designs/waralee/src/pocket.mjs b/designs/waralee/src/pocket.mjs index 27aa84790a2..5358fe8a28d 100644 --- a/designs/waralee/src/pocket.mjs +++ b/designs/waralee/src/pocket.mjs @@ -1,12 +1,5 @@ -/* - * We don't move this draft method under the part object - * because doing so changes the indentation which causes - * us to lose all history of changes to this method. - * - * So to maintain the history of contributions over the - * years, keeps this method here, and resist the urge to - * move it into the named export at the bottom of this file. - */ +import { pantsProto } from './pantsproto.mjs' + function waraleePocket(part) { const { options, @@ -23,35 +16,77 @@ function waraleePocket(part) { macro, } = part.shorthand() - const pocketDepth = + if (false == options.frontPocket) { + return part + } + + const c = 0.55191502449351 + + let pocketDepth = (measurements.crotchDepth - measurements.waistToHips) * options.frontPocketDepthFactor + let frontPocketSize = + options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ - points.topLeft = new Point(0, 0) - points.bottomLeft = points.topLeft.shift(270, pocketDepth) + if ('welt' == options.frontPocketStyle) { + points.topLeft = new Point(0, 0) + points.bottomLeft = points.topLeft.shift(270, pocketDepth) - points.topRight = points.topLeft.shift(0, pocketDepth * (1 / 3)) - points.bottomRight = points.topRight.shift(290, pocketDepth * (5 / 6)) + points.topRight = points.topLeft.shift(0, pocketDepth * (1 / 3)) + points.bottomRight = points.topRight.shift(290, pocketDepth * (5 / 6)) - points.bottomLeftCP = points.bottomLeft.shift(0, pocketDepth * (1 / 6)) - points.bottomRightCP = points.bottomRight.shift(225, pocketDepth * (1 / 4)) + points.bottomLeftCP = points.bottomLeft.shift(0, pocketDepth * (1 / 6)) + points.bottomRightCP = points.bottomRight.shift(225, pocketDepth * (1 / 4)) - paths.seam = new Path() - .move(points.topLeft) - .line(points.bottomLeft) - .curve(points.bottomLeftCP, points.bottomRightCP, points.bottomRight) - .line(points.topRight) - .line(points.topLeft) - .close() - .attr('class', 'fabric') + paths.seam = new Path() + .move(points.topLeft) + .line(points.bottomLeft) + .curve(points.bottomLeftCP, points.bottomRightCP, points.bottomRight) + .line(points.topRight) + .line(points.topLeft) + .close() + .attr('class', 'fabric') + } else { + points.topLeft = new Point(0, 0) + points.topRight = points.topLeft.shift(0, frontPocketSize) + points.bottomLeft = points.topLeft.shift(270, frontPocketSize * 1.5) + points.bottomRight = points.topRight.shift(270, frontPocketSize * 1.5) + points.bottomLeftCornerUp = points.bottomLeft.shift(90, frontPocketSize / 4) + points.bottomLeftCornerUpCp1 = points.bottomLeftCornerUp.shift(270, (frontPocketSize / 4) * c) + points.bottomLeftCornerOver = points.bottomLeft.shift(0, frontPocketSize / 4) + points.bottomLeftCornerOverCp2 = points.bottomLeftCornerOver.shift( + 180, + (frontPocketSize / 4) * c + ) + points.bottomRightCornerUp = points.bottomRight.shift(90, frontPocketSize / 4) + points.bottomRightCornerUpCp2 = points.bottomRightCornerUp.shift(270, (frontPocketSize / 4) * c) + points.bottomRightCornerOver = points.bottomRight.shift(180, frontPocketSize / 4) + points.bottomRightCornerOverCp1 = points.bottomRightCornerOver.shift( + 0, + (frontPocketSize / 4) * c + ) + + paths.seam = new Path() + .move(points.topLeft) + .line(points.bottomLeftCornerUp) + .curve( + points.bottomLeftCornerUpCp1, + points.bottomLeftCornerOverCp2, + points.bottomLeftCornerOver + ) + .line(points.bottomRightCornerOver) + .curve( + points.bottomRightCornerOverCp1, + points.bottomRightCornerUpCp2, + points.bottomRightCornerUp + ) + .line(points.topRight) + .line(points.topLeft) + .close() + .attr('class', 'fabric') + } // Complete? if (complete) { - macro('cutonfold', { - from: points.topLeft, - to: points.bottomLeft, - margin: 5, - offset: 10, - }) points.title = points.topLeft.shift(270, 75).shift(0, 50) macro('title', { nr: 3, @@ -66,49 +101,74 @@ function waraleePocket(part) { .attr('data-text', 'Waralee') .attr('data-text-class', 'center') + if ('welt' == options.frontPocketStyle) { + macro('cutonfold', { + from: points.topLeft, + to: points.bottomLeft, + margin: 5, + offset: 10, + }) + } if (sa) { - paths.sa = new Path() - .move(points.bottomLeft) - .join( - new Path() - .move(points.bottomLeft) - .curve(points.bottomLeftCP, points.bottomRightCP, points.bottomRight) - .line(points.topRight) - .line(points.topLeft) - .offset(sa) - ) - .line(points.topLeft) - .attr('class', 'fabric sa') + if ('welt' == options.frontPocketStyle) { + paths.sa = new Path() + .move(points.bottomLeft) + .join( + new Path() + .move(points.bottomLeft) + .curve(points.bottomLeftCP, points.bottomRightCP, points.bottomRight) + .line(points.topRight) + .line(points.topLeft) + .offset(sa) + ) + .line(points.topLeft) + .attr('class', 'fabric sa') + } else { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } } } // Paperless? if (paperless) { - macro('hd', { - from: points.topLeft, - to: points.topRight, - y: points.topLeft.y + 15, - }) - macro('hd', { - from: points.bottomLeft, - to: points.bottomRight, - y: points.bottomRight.y, - }) - macro('vd', { - from: points.topLeft, - to: points.bottomLeft, - x: points.topLeft.x + 15, - }) - macro('vd', { - from: points.topRight, - to: points.bottomRight, - x: points.bottomRight.x, - }) - macro('vd', { - from: points.bottomRight, - to: points.bottomLeft, - x: points.bottomRight.x, - }) + if ('welt' == options.frontPocketStyle) { + macro('hd', { + from: points.topLeft, + to: points.topRight, + y: points.topLeft.y + 15, + }) + macro('hd', { + from: points.bottomLeft, + to: points.bottomRight, + y: points.bottomRight.y, + }) + macro('vd', { + from: points.topLeft, + to: points.bottomLeft, + x: points.topLeft.x + 15, + }) + macro('vd', { + from: points.topRight, + to: points.bottomRight, + x: points.bottomRight.x, + }) + macro('vd', { + from: points.bottomRight, + to: points.bottomLeft, + x: points.bottomRight.x, + }) + } else { + macro('hd', { + from: points.topLeft, + to: points.topRight, + y: points.topLeft.y + 15, + }) + macro('vd', { + from: points.topLeft, + to: points.bottomLeftCornerOver, + x: points.bottomLeftCornerOver.x, + }) + } } return part @@ -116,6 +176,6 @@ function waraleePocket(part) { export const pocket = { name: 'waralee.pocket', - measurements: ['crotchDepth', 'waistToHips'], + after: pantsProto, draft: waraleePocket, } diff --git a/designs/waralee/src/util.mjs b/designs/waralee/src/util.mjs deleted file mode 100644 index 3ce88b9113f..00000000000 --- a/designs/waralee/src/util.mjs +++ /dev/null @@ -1,37 +0,0 @@ -function CreateCrotchPoints(part) { - let { options, measurements, points, store } = part.shorthand() - - let seatDepth = (measurements.crotchDepth - measurements.waistToHips) * (1 + options.waistRaise) - let circumference = measurements.seat - let circumference4 = circumference / 4 - - points.mHip = points.mWaist.shift(270, seatDepth) - - points.fWaistSide = points.mWaist - .shift(180, options.crotchFront * circumference4) - .shift(90, store.get('waistBand')) - points.fWaistCrotchCP = points.fWaistSide.shift( - 270, - seatDepth * options.crotchFactorFrontVer + store.get('waistBand') - ) - points.fHipCrotchCP = points.mHip.shift( - 180, - options.crotchFront * circumference4 * options.crotchFactorFrontHor - ) - - points.fHipSide = points.mHip.shift(180, options.crotchFront * circumference4) - - points.bWaistSide = points.mWaist - .shift(0, options.crotchBack * circumference4) - .shift(90, store.get('waistBand')) - .shift(90, options.backRaise * seatDepth) - points.bWaistCrotchCP = points.bWaistSide.shift(270, seatDepth * options.crotchFactorBackVer) - points.bHipCrotchCP = points.mHip.shift( - 0, - options.crotchBack * circumference4 * options.crotchFactorBackHor - ) - - points.bHipSide = points.mHip.shift(0, options.crotchBack * circumference4) -} - -export { CreateCrotchPoints } diff --git a/designs/waralee/src/waistband.mjs b/designs/waralee/src/waistband.mjs new file mode 100644 index 00000000000..383f542be37 --- /dev/null +++ b/designs/waralee/src/waistband.mjs @@ -0,0 +1,211 @@ +import { pantsProto } from './pantsproto.mjs' + +function waraleeWaistband(type, part) { + const { + options, + measurements, + Point, + Path, + points, + paths, + Snippet, + snippets, + complete, + paperless, + macro, + sa, + store, + } = part.shorthand() + + const WidthReduction = 6 + let waistBand = store.get('waistBand') + let waistBandLengthFront = points.fWaistSideHem.dist(points.fWaistFrontOverlapHem) + let waistBandLengthBack = + points.bWaistSideHem.dist(points.bWaistBackHem) + + points.bWaistBackHem.dist(points.bWaistBackOverlapHem) + + let strapLength = measurements.waist + measurements.crotchDepth * 1.75 + let partNr = 0 + let partN = 0 + + switch (type) { + case 'waistBandFront': + if (false == options.separateWaistband && 'welt' == options.frontPocketStyle) { + return part + } + partNr = 9 + points.tr = points.fWaistSide + points.mr = points.fWaistSideHem + points.br = points.fWaistSideSeam + points.ml = points.fWaistSideHem.shift(180, (waistBandLengthFront / WidthReduction) * 2) + points.tl = points.ml.shift(90, waistBand) + points.bl = points.ml.shift(270, waistBand) + + macro('hd', { + from: points.ml, + to: points.mr, + y: points.mr.y, + text: part.units(waistBandLengthFront), + }) + + break + + case 'waistBandBack': + if (false == options.separateWaistband && 'welt' == options.frontPocketStyle) { + return part + } + partNr = 10 + points.tl = points.bWaistSide + points.ml = points.bWaistSideHem + points.bl = points.bWaistSideSeam + points.mr = points.bWaistSideHem.shift(0, (waistBandLengthBack / WidthReduction) * 2) + points.tr = points.mr.shift(90, waistBand) + points.br = points.mr.shift(270, waistBand) + + macro('hd', { + from: points.ml, + to: points.mr, + y: points.mr.y, + text: part.units(waistBandLengthBack), + }) + + break + + case 'strapFront': + partNr = 7 + strapLength -= waistBandLengthFront * 2 + strapLength += options.knotInFront ? measurements.waist / 2 : 0 + + points.mr = new Point(0, 0) + points.tr = points.mr.shift(90, waistBand) + points.br = points.mr.shift(270, waistBand) + points.ml = points.mr.shift(180, (waistBandLengthFront / WidthReduction) * 2) + points.tl = points.ml.shift(90, waistBand) + points.bl = points.ml.shift(270, waistBand) + + macro('hd', { + from: points.ml, + to: points.mr, + y: points.mr.y, + text: part.units(strapLength), + }) + + break + + case 'strapBack': + partNr = 8 + strapLength -= waistBandLengthBack * 2 + strapLength += options.knotInFront ? 0 : measurements.waist / 2 + + points.mr = new Point(0, 0) + points.tr = points.mr.shift(90, waistBand) + points.br = points.mr.shift(270, waistBand) + points.ml = points.mr.shift(180, (waistBandLengthFront / WidthReduction) * 2) + points.tl = points.ml.shift(90, waistBand) + points.bl = points.ml.shift(270, waistBand) + + macro('hd', { + from: points.ml, + to: points.mr, + y: points.mr.y, + text: part.units(strapLength), + }) + + break + } + + points.zigzagTop = points.tr.shift(180, waistBandLengthFront / WidthReduction) + points.zigzagTopR = points.zigzagTop.shift(0, waistBand / 8) + points.zigzagTopT = points.zigzagTop.shift(90, waistBand / 4) + points.zigzagTopL = points.zigzagTop.shift(180, waistBand / 8) + points.zigzagTopB = points.zigzagTop.shift(270, waistBand / 4) + points.zigzagBottom = points.br.shift(180, waistBandLengthFront / WidthReduction) + points.zigzagBottomR = points.zigzagBottom.shift(0, waistBand / 8) + points.zigzagBottomT = points.zigzagBottom.shift(90, waistBand / 4) + points.zigzagBottomL = points.zigzagBottom.shift(180, waistBand / 8) + points.zigzagBottomB = points.zigzagBottom.shift(270, waistBand / 4) + + paths.ZZtop = new Path() + .move(points.zigzagTopR) + .line(points.zigzagTopT) + .line(points.zigzagTopB) + .line(points.zigzagTopL) + .attr('class', 'dotted') + paths.ZZbottom = new Path() + .move(points.zigzagBottomR) + .line(points.zigzagBottomT) + .line(points.zigzagBottomB) + .line(points.zigzagBottomL) + .attr('class', 'dotted') + paths.right = new Path() + .move(points.zigzagBottomR) + .line(points.br) + .line(points.mr) + .line(points.tr) + .line(points.zigzagTopR) + paths.left = new Path() + .move(points.zigzagBottomL) + .line(points.bl) + .line(points.ml) + .line(points.tl) + .line(points.zigzagTopL) + + paths.seam = new Path() + .move(points.br) + .line(points.mr) + .line(points.tr) + .line(points.tl) + .line(points.ml) + .line(points.bl) + .line(points.br) + .close() + .setRender(false) + + // Complete? + if (complete) { + if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + + points.title = points.tl.shiftFractionTowards(points.br, 0.2).shift(270, 20) + macro('title', { + nr: partNr, + at: points.title, + title: type, + prefix: 'front', + scale: 0.4, + }) + + points.logo = points.tl.shiftFractionTowards(points.br, 0.8) + snippets.logo = new Snippet('logo', points.logo).attr('data-scale', 0.3) + } + // Paperless? + if (paperless) { + macro('vd', { + from: points.tr, + to: points.br, + x: points.br.x + sa + 10, + }) + } + + return part +} + +export const waistbandFront = { + name: 'waralee.waistbandFront', + from: pantsProto, + draft: (part) => waraleeWaistband('waistBandFront', part), +} +export const waistbandBack = { + name: 'waralee.waistbandBack', + from: pantsProto, + draft: (part) => waraleeWaistband('waistBandBack', part), +} +export const strapFront = { + name: 'waralee.strapFront', + from: pantsProto, + draft: (part) => waraleeWaistband('strapFront', part), +} +export const strapBack = { + name: 'waralee.strapBack', + from: pantsProto, + draft: (part) => waraleeWaistband('strapBack', part), +} diff --git a/markdown/org/docs/patterns/waralee/options/fitwaist/en.md b/markdown/org/docs/patterns/waralee/options/fitwaist/en.md new file mode 100644 index 00000000000..3594f733f51 --- /dev/null +++ b/markdown/org/docs/patterns/waralee/options/fitwaist/en.md @@ -0,0 +1,6 @@ +--- +title: "Fit waist" +--- + +This setting uses the waist measurement to adjust the shaping of the front and back. It will draw in the +waist above the hips if your measurements indicate that the pattern should for a better fit. \ No newline at end of file diff --git a/markdown/org/docs/patterns/waralee/options/frontpocketstyle/en.md b/markdown/org/docs/patterns/waralee/options/frontpocketstyle/en.md new file mode 100644 index 00000000000..265fbcef41b --- /dev/null +++ b/markdown/org/docs/patterns/waralee/options/frontpocketstyle/en.md @@ -0,0 +1,5 @@ +--- +title: "Front pocket style" +--- + +Change the front pocket from welt pocket to one that is hidden in the front seam. \ No newline at end of file diff --git a/markdown/org/docs/patterns/waralee/options/knotinfront/en.md b/markdown/org/docs/patterns/waralee/options/knotinfront/en.md new file mode 100644 index 00000000000..050136b8a2a --- /dev/null +++ b/markdown/org/docs/patterns/waralee/options/knotinfront/en.md @@ -0,0 +1,6 @@ +--- +title: "Knot in Front" +--- + +Normally the Waralee is closed with the tie in the front. This allows you to change +that to a bow tie in the back. \ No newline at end of file diff --git a/markdown/org/docs/patterns/waralee/options/separatewaistband/en.md b/markdown/org/docs/patterns/waralee/options/separatewaistband/en.md new file mode 100644 index 00000000000..cb7fa3b2b66 --- /dev/null +++ b/markdown/org/docs/patterns/waralee/options/separatewaistband/en.md @@ -0,0 +1,8 @@ +--- +title: "Separate waist band" +--- + +This setting changes the way the waistband is constructed. Normally the waistband is just +folded over, like a hem. Turning this option on will generate a separate waistband. + +Mainly used for hiding the pockets in the waistband seam. \ No newline at end of file diff --git a/markdown/org/docs/patterns/waralee/options/showmini/en.md b/markdown/org/docs/patterns/waralee/options/showmini/en.md new file mode 100644 index 00000000000..4f5331a11a4 --- /dev/null +++ b/markdown/org/docs/patterns/waralee/options/showmini/en.md @@ -0,0 +1,7 @@ +--- +title: "Show mini" +--- + +Show the mini form of the main pants. This reduces the amount of pages that need to be printed dramatically. +Just use the measurements in the mini part to cut out the main pants part. +