diff --git a/designs/lumira/src/gusset.mjs b/designs/lumira/src/gusset.mjs index 6f8a36abfe0..6aa9061a167 100644 --- a/designs/lumira/src/gusset.mjs +++ b/designs/lumira/src/gusset.mjs @@ -10,6 +10,8 @@ export const gusset = { backInsertTopCpAngle: 0, backInsertGussetCp: 0.2, frontBulgeLift: 1.75, + frontBulgeForwardPercentage: 0.125, + frontBulgeMiddleShift: 0.65, buttLift: { pct: 30, min: 0, @@ -39,10 +41,10 @@ export const gusset = { paths, Snippet, snippets, - complete, options, macro, utils, + log, part, }) => { const waistLowering = store.get('waistLowering') @@ -56,12 +58,6 @@ export const gusset = { (options.cyclingChamois ? 0.0125 : options.frontBulgeSize) * measurements.crossSeamFront const backInsertGussetCpAngle = options.cyclingChamois ? 0 : 90 * options.buttLift - const RotatePoints = ({ center, angle, pointsArray }) => { - pointsArray.forEach((pointName) => { - points[pointName] = points[pointName].rotate(angle, center) - }) - } - points.backInsertCenterTop = new Point(0, 0) points.backInsertOutsideGusset = points.backInsertCenterTop .shift( @@ -69,7 +65,7 @@ export const gusset = { measurements.crossSeamBack - measurements.waistToHips - waistLowering - backGussetLength ) .shift(0, gussetWidth) - points.backInsertCenterGusset = new Point(0, points.backInsertOutsideGusset.y).addCircle(10) + points.backInsertCenterGusset = new Point(0, points.backInsertOutsideGusset.y) points.backInsertCenterSeat = points.backInsertCenterTop.shift( 270, @@ -113,71 +109,50 @@ export const gusset = { points.backInsertCenterBottom = points.backInsertOutsideBottom.shift(180, gussetWidth) if (frontBulge) { - const frontLength = store.get('frontLength') + const bulgeSplitForward = measurements.crossSeamFront * options.frontBulgeForwardPercentage + const frontLength = store.get('frontLength') - bulgeSplitForward + const rotateAngle = utils.rad2deg(Math.acos(frontLength / (frontLength + frontBulgeSize))) / 2 - console.log({ frontBulgeSize: frontBulgeSize }) - console.log({ frontLength: frontLength }) - const rotateAngle = utils.rad2deg(Math.acos(frontLength / (frontLength + frontBulgeSize))) - const frontCircleCircumference = frontLength * (180 / rotateAngle) - const frontCircleRadius = frontCircleCircumference / Math.PI - const frontOutsideCircumference = (frontCircleRadius + gussetWidth) * Math.PI - const frontOutsideSector = frontOutsideCircumference / (180 / rotateAngle) - console.log({ - rotateAngle: rotateAngle, - frontCircleCircumference: frontCircleCircumference, - frontCircleRadius: frontCircleRadius, - frontOutsideCircumference: frontOutsideCircumference, - frontOutsideSector: frontOutsideSector, - frontLength: frontLength, - frontBulgeSize: frontBulgeSize, - frontBulge: frontLength + frontBulgeSize, - }) + points.frontOutsideSplit = points.backInsertOutsideBottom.shift(270, bulgeSplitForward) + points.frontCenterSplit = points.frontOutsideSplit.shift(180, gussetWidth) + points.frontOutside = points.frontOutsideSplit.shift(270 + rotateAngle, frontLength) - points.frontOutside = points.backInsertOutsideBottom.shift(270 + rotateAngle, frontLength) - - const thisCbqc = cbqc * (rotateAngle / 45) - points.backInsertOutsideBottomCp1 = points.backInsertOutsideBottom - .shift(270, thisCbqc * frontLength) - .addCircle(4) - .addCircle(6) + const thisCbqc = cbqc * 0.75 //(rotateAngle / 22.5) + points.frontOutsideSplitCp1 = points.frontOutsideSplit.shift(270, thisCbqc * frontLength) var diff = 0 var iter = 0 do { - points.frontOutside = points.frontOutside - .shiftTowards(points.backInsertOutsideBottom, diff) - .addCircle(10) - points.frontOutsideCp = points.frontOutside - .shift(90 + rotateAngle * 2, thisCbqc * frontLength) - .addCircle(8) + points.frontOutside = points.frontOutside.shiftTowards(points.frontOutsideSplit, diff) + points.frontOutsideCp = points.frontOutside.shift( + 90 + rotateAngle * 2, + thisCbqc * frontLength + ) paths.frontOutside = new Path() .move(points.frontOutside) - // .line(points.frontOutside) - .curve( - points.frontOutsideCp, - points.backInsertOutsideBottomCp1, - points.backInsertOutsideBottom - ) + .curve(points.frontOutsideCp, points.frontOutsideSplitCp1, points.frontOutsideSplit) + .hide() diff = paths.frontOutside.length() - frontLength - console.log({ i: iter, d: diff }) } while (iter++ < 100 && (diff > 1 || diff < -1)) + if (iter >= 100) { + log.info('couldNotFitFrontOutside') + } points.frontOutsideHips = paths.frontOutside.shiftAlong( measurements.waistToHips - waistLowering - waistbandSize ) const frontCenterAngle = points.frontOutside.angle(points.frontOutsideHips) - 90 console.log({ frontCenterAngle: frontCenterAngle }) - points.frontCenter = points.frontOutside - .shift(180 + frontCenterAngle, gussetWidth) - .addCircle(5) - .addCircle(10) - points.frontCenterHips = points.frontOutsideHips - .shift(180 + frontCenterAngle, gussetWidth) - .addCircle(5) - .addCircle(10) + points.frontCenterOutside = points.frontOutside.shift(180 + frontCenterAngle, gussetWidth) + // .addCircle(5) + // .addCircle(10) + points.frontCenterHips = points.frontOutsideHips.shift(180 + frontCenterAngle, gussetWidth) + // .addCircle(5) + // .addCircle(10) - points.backInsertCenterBottom.addCircle(4) + points.backInsertCenterBottom + //.addCircle(4) const gussetCpLength = points.backInsertCenterGusset.dist(points.backInsertCenterBottom) @@ -186,53 +161,62 @@ export const gusset = { gussetCpLength * 1 // gussetCpLength * options.frontBulgeLift ) + points.frontCenterSplitCp = points.frontCenterSplit.shift( + 270, + gussetCpLength * 1 + // gussetCpLength * options.frontBulgeLift + ) //.addCircle(10) - points.frontCenterHipsCp9 = paths.frontOutside.shiftAlong(gussetCpLength).addCircle(20) + // points.frontCenterHipsCp9 = paths.frontOutside.shiftAlong(gussetCpLength).addCircle(20) points.frontCenterHipsCp = paths.frontOutside .shiftAlong(gussetCpLength) .shift(180 + frontCenterAngle, gussetWidth) - // points.frontCenterHipsCp = points.frontCenterHips.shift( - // frontCenterAngle, - // gussetCpLength * (1 / options.frontBulgeLift) - // ) - points.frontCenterMiddle = points.frontCenterHipsCp - .shift( - 90 + frontCenterAngle, - points.frontCenterHipsCp.dist(points.backInsertCenterBottomCp) / 2 - ) - .addCircle(6) + + points.frontCenterMiddle = points.frontCenterHipsCp.shift( + 90 + frontCenterAngle, + points.frontCenterHipsCp.dist(points.frontCenterSplitCp) * options.frontBulgeMiddleShift + ) + points.frontCenterMiddle = points.frontCenterHipsCp.shiftFractionTowards( + points.frontCenterSplitCp, + options.frontBulgeMiddleShift + ) + + // .addCircle(3) + // .addCircle(6) + // .addCircle(9) var diff = 0 var iter = 0 do { - points.frontCenterMiddle = points.frontCenterMiddle.shift( - 180 + frontCenterAngle * 0.5, - diff + points['frontCenterMiddle' + iter] = points.frontCenterMiddle.clone() + + points.frontCenterMiddle = points.frontCenterMiddle.shift(frontCenterAngle * 0.5, diff) + // .addCircle(3) + // .addCircle(6) + // .addCircle(9) + points.frontCenterMiddleCp1 = points.frontCenterMiddle.shift( + 90 + frontCenterAngle * 0.6, + gussetCpLength * (1 - options.frontBulgeMiddleShift) ) - points.frontCenterMiddleCp1 = points.frontCenterMiddle - .shift(90 + frontCenterAngle * 0.6, gussetCpLength * 0.8) - .addCircle(3) + // .addCircle(3) // points.frontCenterMiddleCp1.x = 0 - points.frontCenterMiddleCp2 = points.frontCenterMiddle - .shift(270 + frontCenterAngle * 0.6, gussetCpLength * 0.9) - .addCircle(3) - .addCircle(6) - .addCircle(9) + points.frontCenterMiddleCp2 = points.frontCenterMiddle.shift( + 270 + frontCenterAngle * 0.6, + gussetCpLength * 0.9 + ) + // .addCircle(3) + // .addCircle(6) + // .addCircle(9) const frontGussetPath = new Path() - .move(points.frontCenter) + .move(points.frontCenterOutside) .line(points.frontCenterHips) .curve(points.frontCenterHipsCp, points.frontCenterMiddleCp2, points.frontCenterMiddle) - .curve( - points.frontCenterMiddleCp1, - points.backInsertCenterBottomCp, - points.backInsertCenterBottom - ) - - paths.frontCenterGussetPath = frontGussetPath.clone().addClass('note') + .curve(points.frontCenterMiddleCp1, points.frontCenterSplitCp, points.frontCenterSplit) + paths['frontCenterGussetPath' + iter] = frontGussetPath.clone().addClass('note') console.log({ frontGussetPath: frontGussetPath }) - diff = frontLength + frontBulgeSize - frontGussetPath.length() + diff = frontGussetPath.length() - (frontLength + frontBulgeSize) console.log({ i: iter, @@ -240,63 +224,30 @@ export const gusset = { fl: frontLength + frontBulgeSize, pl: frontGussetPath.length(), }) - } while (iter++ < 1 && (diff > 1 || diff < -1)) + } while (iter++ < 20 && (diff > 1 || diff < -1)) + if (iter >= 20) { + log.info('couldNotFitFrontGussetPath') + } + const frontGussetAngle = points.frontCenterMiddle.angle(points.backInsertCenterBottom) console.log({ frontGussetAngle: frontGussetAngle }) paths.frontBulge = new Path() - .move(points.backInsertCenterBottom) - .curve( - points.backInsertCenterBottomCp, - points.frontCenterMiddleCp1, - points.frontCenterMiddle - ) + .move(points.frontCenterSplit) + .curve(points.frontCenterSplitCp, points.frontCenterMiddleCp1, points.frontCenterMiddle) .curve(points.frontCenterMiddleCp2, points.frontCenterHipsCp, points.frontCenterHips) .hide() // snippets.front = new Snippet('notch', paths.frontBulge.shiftFractionAlong(0.5)) paths.front = new Path() - .move(points.backInsertCenterBottom) + .move(points.frontCenterSplit) .join(paths.frontBulge) - .line(points.frontCenter) + .line(points.frontCenterOutside) .join(paths.frontOutside) + .line(points.backInsertOutsideBottom) .hide() - paths.backGusset = new Path() - .move(points.backInsertOutsideGusset) - .curve( - points.backInsertOutsideGussetCp1, - points.backInsertCenterTopCp1, - points.backInsertCenterTop - ) - - macro('mirror', { - clone: true, - mirror: [new Point(0, 1000), new Point(0, -1000)], - points: [ - 'backInsertCenterTop', - 'backInsertCenterBottom', - 'backInsertCenterTop', - 'backInsertOutsideGusset', - 'frontOutside', - 'backInsertOutsideBottom', - ], - paths: ['front', 'frontBulge', 'backGusset', 'backInsertCircle', 'frontOutside'], - prefix: 'mirror', - }) - - console.log({ Gpoints: JSON.parse(JSON.stringify(points)) }) - console.log({ Gpaths: JSON.parse(JSON.stringify(paths)) }) - - paths.seam = new Path() - .move(points.backInsertCenterBottom) - .join(paths.front) - .line(points.backInsertOutsideGusset) - .join(paths.backGusset) - .join(paths.mirrorBackGusset.reverse()) - .line(points.mirrorBackInsertOutsideBottom) - .join(paths.mirrorFront.reverse()) - .close() + points.frontCenter = points.frontCenterSplit.clone() } else { const frontGussetAngle = store.get('frontGussetAngle') const frontGussetLength = store.get('frontGussetLength') @@ -311,134 +262,76 @@ export const gusset = { ) paths.front = new Path() - .move(points.backInsertCenterBottom) - .line(points.frontCenter) + // .move(points.backInsertCenterBottom) + // .line(points.frontCenter) + .move(points.frontCenter) .curve( points.frontCenterCp, points.backInsertOutsideBottomCp, points.backInsertOutsideBottom ) .hide() - - paths.backGusset = new Path() - .move(points.backInsertOutsideGusset) - .curve( - points.backInsertOutsideGussetCp1, - points.backInsertCenterTopCp1, - points.backInsertCenterTop - ) - - paths.seam = new Path() - .move(points.backInsertCenterTop) - .line(points.backInsertCenterBottom) - .join(paths.front) - .line(points.backInsertOutsideGusset) - .join(paths.backGusset) - .close() } + paths.backGusset = new Path() + .move(points.backInsertOutsideGusset) + .curve( + points.backInsertOutsideGussetCp1, + points.backInsertCenterTopCp1, + points.backInsertCenterTop + ) + .hide() + + paths.seamSA = new Path() + .move(points.frontCenter) + .join(paths.front) + .line(points.backInsertOutsideGusset) + .join(paths.backGusset) + .hide() + + paths.seam = new Path() + .move(points.backInsertCenterTop) + .line(points.frontCenter) + .join(paths.seamSA) + .close() + if (sa) { - paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + if (frontBulge) { + const pathSA = paths.seamSA.offset(sa) + paths.saOffset = pathSA.split(pathSA.intersectsX(0)[0])[1].hide() + } else { + paths.saOffset = paths.seamSA.offset(sa).hide() + } + paths.sa = new Path() + .move(points.frontCenter) + .line(points.frontCenter.shift(270, sa)) + .move(paths.saOffset.start()) + .join(paths.saOffset) + .line(points.backInsertCenterTop.shift(90, sa)) + .line(points.backInsertCenterTop) + .attr('class', 'fabric sa') } - snippets.circle5 = new Snippet('notch', points.backInsertOutsideBottom) + snippets.middle = new Snippet('notch', points.backInsertOutsideBottom) snippets.circle4 = new Snippet('notch', points.backInsertOutsideGusset) snippets.circle3 = new Snippet('notch', paths.backGusset.shiftFractionAlong(0.25)) snippets.circle2 = new Snippet('notch', paths.backGusset.shiftFractionAlong(0.5)) snippets.circle1 = new Snippet('notch', paths.backGusset.shiftFractionAlong(0.75)) + snippets.circle0 = new Snippet('notch', points.backInsertCenterTop) + + console.log({ Gpoints: JSON.parse(JSON.stringify(points)) }) + console.log({ Gpaths: JSON.parse(JSON.stringify(paths)) }) console.log({ Gstore: JSON.parse(JSON.stringify(store)) }) console.log({ Gmeasurements: JSON.parse(JSON.stringify(measurements)) }) + macro('cutonfold', { + from: points.backInsertCenterTop, + to: points.frontCenter, + }) + + store.cutlist.addCut({ cut: 2, from: 'fabric' }) + return part }, } -// if (frontBulge) { -// const frontLength = store.get('frontLength') - -// points.frontCenter = points.backInsertCenterBottom.shift( -// 270, -// measurements.crossSeamFront - waistLowering - waistbandSize -// ) -// points.frontOutside = points.frontCenter.shift(0, gussetWidth) -// points.frontOutsideHips = points.frontOutside.shift( -// 90, -// measurements.waistToHips - waistLowering - waistbandSize -// ) - -// const gussetCpLength = points.backInsertOutsideGusset.dist(points.backInsertOutsideBottom) - -// points.backInsertOutsideBottomCp = points.backInsertOutsideBottom.shift( -// 270, -// gussetCpLength * options.frontBulgeLift -// ) -// points.frontOutsideHipsCp = points.frontOutsideHips.shift( -// 90, -// gussetCpLength * (1 / options.frontBulgeLift) -// ) -// points.frontOutsideMiddle = points.frontOutsideHipsCp.shift( -// 90, -// points.frontOutsideHipsCp.dist(points.backInsertOutsideBottomCp) / 2 -// ) - -// var diff = 0 -// var iter = 0 -// do { -// points.frontOutsideMiddle = points.frontOutsideMiddle.shift(0, diff) -// points.frontOutsideMiddleCp1 = points.frontOutsideMiddle.shift(90, gussetCpLength) -// points.frontOutsideMiddleCp2 = points.frontOutsideMiddle.shift(270, gussetCpLength) - -// const frontGussetPath = new Path() -// .move(points.frontOutside) -// .line(points.frontOutsideHips) -// .curve(points.frontOutsideHipsCp, points.frontOutsideMiddleCp2, points.frontOutsideMiddle) -// .curve( -// points.frontOutsideMiddleCp1, -// points.backInsertOutsideBottomCp, -// points.backInsertOutsideBottom -// ) - -// diff = frontLength + frontBulgeSize - frontGussetPath.length() -// } while (iter++ < 3 && (diff > 1 || diff < -1)) - -// paths.frontBulge = new Path() -// .move(points.frontOutsideHips) -// .curve(points.frontOutsideHipsCp, points.frontOutsideMiddleCp2, points.frontOutsideMiddle) -// .curve( -// points.frontOutsideMiddleCp1, -// points.backInsertOutsideBottomCp, -// points.backInsertOutsideBottom -// ) -// .hide() -// snippets.front = new Snippet('notch', paths.frontBulge.shiftFractionAlong(0.5)) - -// paths.front = new Path() -// .move(points.backInsertCenterBottom) -// .line(points.frontCenter) -// .line(points.frontOutside) -// .line(points.frontOutsideHips) -// .join(paths.frontBulge) -// .hide() -// } else { -// const frontGussetAngle = store.get('frontGussetAngle') -// const frontGussetLength = store.get('frontGussetLength') -// points.frontCenter = points.backInsertCenterBottom.shift(270, frontGussetLength) -// points.frontCenterCp = points.frontCenter.shift( -// 90 - frontGussetAngle / 2, -// frontGussetLength / 3 -// ) -// points.backInsertOutsideBottomCp = points.backInsertOutsideBottom.shift( -// 270, -// frontGussetLength / 3 -// ) - -// paths.front = new Path() -// .move(points.backInsertCenterBottom) -// .line(points.frontCenter) -// .curve( -// points.frontCenterCp, -// points.backInsertOutsideBottomCp, -// points.backInsertOutsideBottom -// ) -// .hide() -// } diff --git a/designs/lumira/src/leg.mjs b/designs/lumira/src/leg.mjs index 5a9848b0ae2..6ab92e5eebf 100644 --- a/designs/lumira/src/leg.mjs +++ b/designs/lumira/src/leg.mjs @@ -1,27 +1,9 @@ -import { pctBasedOn } from '@freesewing/core' import { shape } from './shape.mjs' export const leg = { name: 'lumira.leg', from: shape, - draft: ({ - measurements, - store, - sa, - Point, - points, - Path, - paths, - Snippet, - snippets, - complete, - options, - macro, - utils, - part, - }) => { - // paths.center = new Path().move(points.centerWaist).line(points.centerAnkle) - + draft: ({ store, sa, points, Path, paths, Snippet, snippets, options, macro, part }) => { if (options.frontBulge || options.cyclingChamois) { snippets.front = new Snippet('notch', paths.front.shiftFractionAlong(0.5)) } @@ -53,13 +35,39 @@ export const leg = { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } + macro('grainline', { + from: points.centerHips, + to: points.centerKnee, + }) + + store.cutlist.addCut({ cut: 2, from: 'fabric' }) + + points.gridAnchor = points.centerWaistband.clone() + + points.logo = points.centerUpperLeg.shiftFractionTowards(points.frontWaistband, 0.6) + snippets.logo = new Snippet('logo', points.logo) + + points.title = points.centerKnee.shiftFractionTowards(points.frontWaistband, 0.5) + macro('title', { + at: points.title, + nr: 1, + title: 'leg', + align: 'center', + }) + + points.scalebox = points.centerSeat + .shiftFractionTowards(points.frontWaistband, 0.5) + .shiftFractionTowards(points.title, 0.5) + macro('scalebox', { + at: points.scalebox, + }) + snippets.circle1 = new Snippet('notch', paths.backCircle.shiftFractionAlong(0.25)) snippets.circle2 = new Snippet('notch', paths.backCircle.shiftFractionAlong(0.5)) snippets.circle3 = new Snippet('notch', paths.backCircle.shiftFractionAlong(0.75)) - snippets.circle4 = new Snippet('notch', points.backCircleGusset) - snippets.circle5 = new Snippet('notch', points.frontGusset) - - console.log({ w: measurements.waist / 2, len: points.backWaist.dist(points.frontWaist) }) + snippets.circle4 = new Snippet('notch', points.backHips) + snippets.circle5 = new Snippet('notch', points.backCircleGusset) + snippets.circle6 = new Snippet('notch', points.frontGusset) return part }, diff --git a/designs/lumira/src/shape.mjs b/designs/lumira/src/shape.mjs index c048c06a0e8..9c80bf27e73 100644 --- a/designs/lumira/src/shape.mjs +++ b/designs/lumira/src/shape.mjs @@ -24,6 +24,7 @@ export const shape = { options: { // Constants gussetCompensation: 1.03, + // Booleans frontBulge: { bool: false, @@ -37,7 +38,7 @@ export const shape = { ease: { pct: -10, min: -30, max: 0, menu: 'fit' }, waistLowering: { pct: 35, min: 0, max: 60, menu: 'style' }, gussetWidth: { - pct: 10, + pct: 16, min: 1, max: 30, ...pctBasedOn('crossSeamFront'), @@ -70,23 +71,7 @@ export const shape = { menu: (settings, mergedOptions) => (mergedOptions?.waistband ? 'style' : false), }, }, - draft: ({ - measurements, - store, - sa, - Point, - points, - Path, - paths, - Snippet, - snippets, - complete, - options, - macro, - utils, - part, - }) => { - let a + draft: ({ measurements, store, Point, points, Path, paths, options, utils, part }) => { const cpDistanceDivider = 3.5 const waistLowering = measurements.waistToHips * options.waistLowering const waistReduction = options.waistband ? measurements.waist * options.waistReduction : 0 @@ -109,11 +94,6 @@ export const shape = { store.set('frontGussetLength', frontGussetLength) const ReduceWaist = (pathName, pointName, distance) => { - console.log({ pathName: pathName, distance: distance, l: paths[pathName] }) - console.log({ paths: JSON.parse(JSON.stringify(paths)) }) - console.log({ points: JSON.parse(JSON.stringify(points)) }) - console.log({ pn: pathName + 'Waist', p: points[pathName + 'Waist'] }) - const newPoint = paths[pathName].shiftAlong(distance) if (newPoint.sitsRoughlyOn(points[pathName + 'Waist'])) { return @@ -127,37 +107,41 @@ export const shape = { } paths[pathName] = pTemp[1].hide() } - const ControlPoints = (p1, p2, p3) => { + var angle if (p1 === undefined) { - a = p2.angle(p3) + 180 + angle = p2.angle(p3) + 180 } else if (p3 === undefined) { - a = p2.angle(p1) + angle = p2.angle(p1) } else { - a = Math.abs(p2.angle(p1) - p2.angle(p3)) / 2 + angle = Math.abs(p2.angle(p1) - p2.angle(p3)) / 2 } - // const t1 = p2.shift(p2.angle(p1) + a - 90, p2.dist(p1) / 3) - // const t3 = p2.shift(p2.angle(p3) - a + 90, p2.dist(p3) / 3) return { cp1: - p1 !== undefined - ? p2.shift(p2.angle(p1) + a - 90, p2.dist(p1) / cpDistanceDivider) - : null, - cp3: p3 !== undefined - ? p2.shift(p2.angle(p3) - a + 90, p2.dist(p3) / cpDistanceDivider) + ? p2.shift(p2.angle(p3) - angle + 90, p2.dist(p3) / cpDistanceDivider) + : null, + cp2: + p1 !== undefined + ? p2.shift(p2.angle(p1) + angle - 90, p2.dist(p1) / cpDistanceDivider) : null, } } const CreateControlPoints = (names) => { for (var i = 0; i < names.length; i++) { var cp = ControlPoints(points[names[i - 1]], points[names[i]], points[names[i + 1]]) - if (cp.cp1) points[names[i] + 'Cp2'] = cp.cp1 - if (cp.cp3) points[names[i] + 'Cp1'] = cp.cp3 + if (cp.cp1) points[names[i] + 'Cp1'] = cp.cp1 + if (cp.cp2) points[names[i] + 'Cp2'] = cp.cp2 } } + const ExtendPath = (path, length = 100) => { + return new Path() + .move(path.shiftAlong(1).shiftOutwards(path.start(), length)) + .line(path.start()) + .join(path) + .line(path.reverse().shiftAlong(1).shiftOutwards(path.end(), length)) + } - const waistBackFrontRatio = measurements.waistBack / measurements.waistFront const seatBackFrontRatio = measurements.seatBack / measurements.seatFront const crossSeamBackFrontRatio = measurements.crossSeamBack / measurements.crossSeamFront const waistToInseam = measurements.waistToFloor - measurements.inseam @@ -221,28 +205,9 @@ export const shape = { measurements.seatFront * 0.5 * ease ) - // AdjustUpperLegPoints('front') - // AdjustUpperLegPoints('back') CreateControlPoints(['frontWaist', 'frontSeat', 'frontUpperLeg']) CreateControlPoints(['backWaist', 'backSeat', 'backUpperLeg']) - // paths.front = new Path() - // .move(points.frontAnkle) - // .line(points.frontKnee) - // .line(points.frontUpperLeg) - // paths.back = new Path().move(points.backAnkle).line(points.backKnee).line(points.backUpperLeg) - - // paths.frontCrotch1 = new Path() - // .move(points.frontWaist) - // .curve(points.frontWaist, points.frontSeatCp2, points.frontSeat) - // .curve(points.frontSeatCp1, points.frontUpperLegCp2, points.frontUpperLeg) - // paths.backCrotch1 = new Path() - // .move(points.backWaist) - // .curve(points.backWaist, points.backSeatCp2, points.backSeat) - // .curve(points.backSeatCp1, points.backUpperLegCp2, points.backUpperLeg) - - points.frontUpperLeg1 = points.centerUpperLeg.shift(0, (measurements.upperLeg / 2) * ease) - points.backUpperLeg1 = points.centerUpperLeg.shift(180, (measurements.upperLeg / 2) * ease) points.frontUpperLegCp2 = points.frontUpperLeg.shiftFractionTowards(points.centerUpperLeg, 0.5) points.frontUpperLegCp2Temp = points.frontUpperLeg.shiftFractionTowards( points.centerUpperLeg, @@ -252,40 +217,26 @@ export const shape = { paths.center = new Path().move(points.centerWaist).line(points.centerAnkle).hide() - // paths.frontT = new Path() - // .move(points.frontWaist) - // ._curve(points.frontUpperLegCp2, points.frontUpperLeg1) - // paths.backT = new Path() - // .move(points.backWaist) - // ._curve(points.backUpperLegCp2, points.backUpperLeg1) - paths.frontTemp = new Path() - .move(points.frontWaist) - ._curve(points.frontUpperLegCp2Temp, points.frontUpperLeg1) - .hide() - // .addClass('note') paths.front = new Path() .move(points.frontWaist) - ._curve(points.frontUpperLegCp2, points.frontUpperLeg1) + ._curve(points.frontUpperLegCp2, points.frontUpperLeg) .hide() paths.back = new Path() .move(points.backWaist) - ._curve(points.backUpperLegCp2, points.backUpperLeg1) + ._curve(points.backUpperLegCp2, points.backUpperLeg) .hide() - - // paths.front2 = paths.front.clone().unhide() ;['center', 'front', 'back'].forEach((prefix) => { ReduceWaist(prefix, 'Waist', waistLowering) }) + points.frontHips = paths.front.shiftAlong(measurements.waistToHips - waistLowering) points.backHips = paths.back.shiftAlong(measurements.waistToHips - waistLowering) paths.frontTop = paths.front.split(points.frontHips)[0].hide() paths.backTop = paths.back.split(points.backHips)[0].hide() ;['center', 'front', 'back'].forEach((prefix) => { - // points[prefix +'Waist'].addCircle(3) points[prefix + 'Waistband'] = points[prefix + 'Waist'].clone() ReduceWaist(prefix, 'Waistband', waistbandSize) - // points[prefix +'Waistband'].addCircle(6) }) points.frontWaistbandCp = paths.frontTop.shiftAlong(waistbandSize / 2) @@ -302,23 +253,19 @@ export const shape = { ._curve(points.backWaistbandCp, points.backWaistband) .hide() - // paths.back.unhide() + points.frontGusset = points.frontUpperLeg.shiftTowards(points.frontKnee, gussetWidth) + points.backGusset = points.backUpperLeg.shiftTowards(points.backKnee, gussetWidth) - points.frontGusset = points.frontUpperLeg1.shiftTowards(points.frontKnee, gussetWidth) - points.backGusset = points.backUpperLeg1.shiftTowards(points.backKnee, gussetWidth) - - points.frontGussetJoin = paths.front.reverse().shiftAlong(frontGussetLength) //.addCircle(3).addCircle(5) + points.frontGussetJoin = paths.front.reverse().shiftAlong(frontGussetLength) if (frontBulge) { - // paths.frontBulge = paths.front.offset(gussetWidth) - // .addClass('note') - // const frontBulgeSize = options.frontBulgeSize *measurements.crossSeamFront + paths.front = ExtendPath(paths.front.offset(gussetWidth)).hide() - paths.front = paths.front.offset(gussetWidth).hide() points.frontWaistband = paths.front.intersects( new Path().move(points.frontWaistband).line(points.centerWaistband) )[0] - if (false == points.frontWaistband.sitsRoughlyOn(paths.front.ops[0].to)) { + + if (false == points.frontWaistband.sitsRoughlyOn(paths.front.start())) { console.log({ pf: paths.front, p: points.frontWaistband, @@ -326,10 +273,15 @@ export const shape = { }) paths.front = paths.front.split(points.frontWaistband)[1].hide() } + + ////// + // something goes wrong here + ////// + points.frontGusset = paths.front.intersects( - new Path().move(points.frontUpperLeg1).line(points.frontKnee) + new Path().move(points.frontUpperLeg).line(points.frontKnee) )[0] - if (false == points.frontGusset.sitsRoughlyOn(paths.front.reverse().ops[0].to)) { + if (false == points.frontGusset.sitsRoughlyOn(paths.front.end())) { console.log({ pf: paths.front, p: points.frontWaistband, @@ -337,37 +289,8 @@ export const shape = { }) paths.front = paths.front.split(points.frontGusset)[0].hide() } - - // points.frontGussetCp = points.frontUpperLegCp2.clone() - // points.frontWaist = points.frontWaist.shiftTowards(points.backWaist, gussetWidth) - // points.frontWaistband = points.frontWaistband.shiftTowards(points.backWaistband, gussetWidth) - - // console.log({ - // frontGussetCp: points.frontGussetCp, - // frontWaistband: points.frontWaistband, - // frontGusset: points.frontGusset, - // }) - // var iter = 0 - // var diff = 0 - // do { - // points.frontGussetCp = points.frontGussetCp.shift(0, diff) - // paths.front = new Path() - // .move(points.frontWaistband) - // ._curve(points.frontGussetCp, points.frontGusset) - // .hide() - - // diff = paths.front.length() - ((measurements.crossSeamFront *options.gussetCompensation) - waistLowering - waistbandSize) - - // console.log({ - // i: iter, - // d: diff, - // fl: paths.front.length(), - // csf: measurements.crossSeamFront - waistLowering, - // p: paths.front, - // }) - // } while (iter++ < 50 && (diff > 1 || diff < -1)) } else { - points.frontGussetCp = points.frontGusset.shiftFractionTowards(points.centerUpperLeg, 0.1) //.addCircle(3) + points.frontGussetCp = points.frontGusset.shiftFractionTowards(points.centerUpperLeg, 0.1) if (points.frontGussetCp.x < points.frontGussetJoin.x) { points.frontGussetCp.x = points.frontGussetJoin.x } @@ -382,7 +305,7 @@ export const shape = { const pFrontGussetPoint = pFrontGusset.shiftAlong(1) const pFront = new Path() .move(points.frontWaist) - ._curve(points.frontUpperLegCp2, points.frontUpperLeg1) + ._curve(points.frontUpperLegCp2, points.frontUpperLeg) .hide() const pFrontPoint = pFront.shiftAlong(1) if ( @@ -391,9 +314,9 @@ export const shape = { points.frontGussetJoinCp = points.frontGussetJoin.shift( pFrontPoint.angle(points.frontGussetJoin), frontGussetLength - gussetWidth - ) //.addCircle(10) + ) } else { - points.frontGussetJoinCp = points.frontGussetJoin.clone() //.addCircle(18).addCircle(12) + points.frontGussetJoinCp = points.frontGussetJoin.clone() } paths.frontGusset = new Path() @@ -407,21 +330,12 @@ export const shape = { ) store.set('frontGussetAngle', frontGussetAngle * 2) - paths.frontTempGusset = paths.front.offset(gussetWidth).hide() - paths.front = paths.front.split(points.frontGussetJoin)[0].join(paths.frontGusset).hide() } store.set('frontLength', paths.front.length()) ;['front', 'back'].forEach((prefix) => { CreateControlPoints([prefix + 'UpperLeg', prefix + 'Knee', prefix + 'Ankle']) }) - // paths.frontTemp2 = paths.front.clone().addClass('lining').unhide() - - console.log({ - fc: measurements.crossSeamFront, - pl: paths.front.length() + waistLowering + waistbandSize, - plt: paths.frontTemp.length(), - }) paths.backTempGusset = paths.back.offset(-1 * gussetWidth).hide() @@ -436,6 +350,8 @@ export const shape = { .line(points.frontAnkle) .hide() + store.set('waistLength', paths.waist.length()) + const backHips = paths.back.shiftFractionAlong(0.99) const backHipsAngle = points.backHips.angle(backHips) + 90 @@ -446,13 +362,11 @@ export const shape = { backHipsAngle, measurements.hips * 0.25 * 0.5 * ease * backGussetWidth ) - // .addCircle(9) points.backCircleUpperLegCp1 = points.backUpperLegToHips.shift( 0, measurements.upperLeg * 0.25 * ease * backGussetWidth ) - // .addCircle(5) paths.back = paths.back.split(points.backHips)[0].hide() @@ -464,11 +378,6 @@ export const shape = { points.backCircleGusset = paths.backTempCircle.intersects(paths.backTempGusset)[1] const pathBackGusset = paths.backTempGusset.split(points.backCircleGusset) - console.log({ - pathBackGusset: pathBackGusset, - t0: undefined === pathBackGusset[0].ops, - t1: undefined === pathBackGusset[1].ops, - }) if (undefined !== pathBackGusset[1].ops) { paths.backGusset = paths.backTempGusset.split(points.backCircleGusset)[1].hide() } else { @@ -479,20 +388,10 @@ export const shape = { store.set('backGussetLength', paths.backGusset.length()) store.set('backCircleLength', paths.backCircle.length()) - points.backCircleIntersect = paths.backCircle.intersects( - new Path().move(points.backSeat).line(points.centerSeat) - )[0] - // .addCircle(10) - console.log({ - dist: points.backCircleIntersect.dist(points.centerSeat), - pct: - points.backCircleIntersect.dist(points.centerSeat) / - points.backSeat.dist(points.centerSeat), - }) - console.log({ points: JSON.parse(JSON.stringify(points)) }) - console.log({ paths: JSON.parse(JSON.stringify(paths)) }) - console.log({ store: JSON.parse(JSON.stringify(store)) }) - console.log({ measurements: JSON.parse(JSON.stringify(measurements)) }) + // console.log({ points: JSON.parse(JSON.stringify(points)) }) + // console.log({ paths: JSON.parse(JSON.stringify(paths)) }) + // console.log({ store: JSON.parse(JSON.stringify(store)) }) + // console.log({ measurements: JSON.parse(JSON.stringify(measurements)) }) return part }, diff --git a/designs/lumira/src/waistband.mjs b/designs/lumira/src/waistband.mjs index a432b160839..6199098ea98 100644 --- a/designs/lumira/src/waistband.mjs +++ b/designs/lumira/src/waistband.mjs @@ -24,11 +24,12 @@ export const waistband = { return part.hide() } - const gussetWidth = store.get('gussetWidth') + const waistLength = store.get('waistLength') const waistbandSize = store.get('waistbandSize') + const gussetWidth = options.frontBulge ? store.get('gussetWidth') : 0 const topLength = points.backWaist.dist(points.frontWaist) + gussetWidth - const bottomLength = points.backWaistband.dist(points.frontWaistband) + gussetWidth + const bottomLength = waistLength + gussetWidth const magic1 = 0.35 points.topFront = new Point(Math.min(topLength, bottomLength) / 2, 0) @@ -103,20 +104,14 @@ export const waistband = { .line(points.topFront) .close() - // paths.seam = new Path() - // .move(points.frontWaist) - // .line(points.centerWaist) - // .line(points.backWaist) - // .join(paths.backTop) - // .line(points.centerWaistband) - // .line(points.frontWaistband) - // .join(paths.frontTop.reverse()) - // .close() - if (sa) { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } + macro('cutonfold', { + from: points.bottomFront, + to: points.topFront, + }) if (gussetWidth > 0) { snippets.gusset = new Snippet('notch', paths.bottom.shiftAlong(gussetWidth)) }