From d2fcf4e1bf5094c2dff7984b5e62624c1c35a4f5 Mon Sep 17 00:00:00 2001 From: Joost De Cock Date: Wed, 10 Mar 2021 20:27:50 +0100 Subject: [PATCH] wip(charlie): First draft of front panel --- packages/charlie/config/index.js | 2 +- packages/charlie/src/front.js | 116 ++++++++++++++++++++++++------- 2 files changed, 91 insertions(+), 27 deletions(-) diff --git a/packages/charlie/config/index.js b/packages/charlie/config/index.js index 1e6b8eb2cc0..ec040212d9c 100644 --- a/packages/charlie/config/index.js +++ b/packages/charlie/config/index.js @@ -90,7 +90,7 @@ export default { // Back pockets backPocketVerticalPlacement: { pct: 24, min: 18, max: 30 }, backPocketHorizontalPlacement: { pct: 55, min: 48, max: 62 }, - backPocketWidth: { pct: 55, min: 10, max: 90 }, + backPocketWidth: { pct: 55, min: 50, max: 60 }, backPocketDepth: { pct: 20, min: 10, max: 40 }, // Back pockets diff --git a/packages/charlie/src/front.js b/packages/charlie/src/front.js index b32f011f74a..598d177b5d1 100644 --- a/packages/charlie/src/front.js +++ b/packages/charlie/src/front.js @@ -1,4 +1,58 @@ export default (part) => { + // Helper method to draw the outseam path + const drawOutseam = () => { + // Helper object holding the Titan side seam path + let sideSeam = + points.waistOut.x < points.seatOut.x + ? new Path() + .move(points.styleWaistOut) + .curve(points.seatOut, points.kneeOutCp1, points.floorOut) + : new Path() + .move(points.styleWaistOut) + ._curve(points.seatOutCp1, points.seatOut) + .curve(points.seatOutCp2, points.kneeOutCp1, points.floorOut) + // Draw in pocket slant + points.pocketSlantTop = points.styleWaistIn.shiftFractionTowards( + points.styleWaistOut, + 1 - options.frontPocketSlantWidth + ) + // Find lowest possible pocket slant point + points.pocketSlantLowest = sideSeam.intersectsY(points.fork.y).pop() + // Length to lowest possible slant point + store.set( + 'slantLength', + sideSeam.split(points.pocketSlantLowest).shift().length() * options.frontPocketSlantDepth + ) + // Create actual slant point + points.pocketSlantBottom = sideSeam.shiftAlong(store.get('slantLength')) + + // Handy for later + store.set('frontSideSeam', sideSeam) + + return new Path() + .move(points.pocketSlantTop) + .line(points.pocketSlantBottom) + .join(sideSeam.split(points.pocketSlantBottom).pop()) + } + + // Helper method to draw the outline path + const drawPath = () => + drawOutseam() + .line(points.floorIn) + .curve(points.kneeInCp2, points.forkCp1, points.fork) + .join( + new Path() + .move(points.fork) + .curve(points.crotchSeamCurveCp1, points.crotchSeamCurveCp2, points.crotchSeamCurveStart) + .split(points.flyBottom) + .shift() + ) + .curve(points.flyCurveCp1, points.flyCurveCp2, points.flyCurveStart) + .line(points.flyTop) + .line(points.styleWaistIn) + .line(points.pocketSlantTop) + .close() + // Shorthand let { points, @@ -37,34 +91,44 @@ export default (part) => { points.flyCurveCp1 = points.flyBottom.shiftFractionTowards(points.flyCorner, options.flyCurve) points.flyCurveCp2 = points.flyCurveStart.shiftFractionTowards(points.flyCorner, options.flyCurve) - // Draw in pocket slant - points.pocketSlantTop = points.styleWaistIn.shiftFractionTowards( - points.styleWaistOut, - 1 - options.frontPocketSlantWidth - ) - // FIXME: This won't always describe the right curve, will it? - points.pocketSlantLowest = utils.lineIntersectsCurve( - points.fork, - points.fork.shiftFractionTowards(points.crotchSeamCurveCp1, 25), - points.styleWaistOut, - points.seatOut, - points.kneeOutCp1, - points.floorOut - ) - let sideSeam = new Path() - .move(points.styleWaistOut) - .curve(points.seatOut, points.kneeOutCp1, points.floorOut) - let slantDistOnCurve = sideSeam.split(points.pocketSlantLowest).shift().length() - points.pocketSlantBottom = sideSeam.shiftAlong(slantDistOnCurve * options.frontPocketSlantDepth) - - paths.fly = new Path() - .move(points.styleWaistIn) - .line(points.flyTop) - .line(points.flyCurveStart) - .curve(points.flyCurveCp2, points.flyCurveCp1, points.flyBottom) - paths.slant = new Path().move(points.pocketSlantTop).line(points.pocketSlantBottom) + // Draw path + paths.seam = drawPath().attr('class', 'fabric') if (complete) { + points.titleAnchor = new Point(points.knee.x, points.fork.y) + macro('title', { + at: points.titleAnchor, + nr: 2, + title: 'front' + }) + snippets.logo = new Snippet('logo', points.titleAnchor.shiftFractionTowards(points.knee, 0.5)) + points.topPleat = utils.beamsIntersect( + points.styleWaistIn, + points.styleWaistOut, + points.knee, + points.grainlineBottom + ) + macro('sprinkle', { + snippet: 'notch', + on: ['styleWaistIn', 'pocketSlantBottom', 'topPleat', 'grainlineBottom'] + }) + paths.flyHint = new Path() + .move(points.styleWaistIn) + .line(points.crotchSeamCurveStart) + .join( + new Path() + .move(points.crotchSeamCurveStart) + .curve(points.crotchSeamCurveCp2, points.crotchSeamCurveCp1, points.fork) + .split(points.flyBottom) + .shift() + ) + .attr('class', 'fabric stoke-sm dashed') + paths.slantHint = new Path() + .move(points.pocketSlantTop) + .line(points.styleWaistOut) + .join(store.get('frontSideSeam').split(points.pocketSlantBottom).shift()) + .attr('class', 'fabric stoke-sm dashed') + if (sa) { }