diff --git a/designs/paco/src/back.mjs b/designs/paco/src/back.mjs index 60eaf7e4357..0c4bb980ec0 100644 --- a/designs/paco/src/back.mjs +++ b/designs/paco/src/back.mjs @@ -76,7 +76,7 @@ function pacoBack({ // Adapt waist so we can get these pants over our bum without a zipper let delta = (measurements.seat * options.legBalance) / 2 - points.styleWaistIn.dist(points.styleWaistOut) - let angle = points.styleWaistIn.angle(points.styleWaistOut) + let angle = points.styleWaistInNoAngle.angle(points.styleWaistOut) points.styleWaistOut = points.styleWaistOut.shift(angle, delta) points.seatOut = points.seatOut.shift(angle, delta) diff --git a/designs/paco/src/front.mjs b/designs/paco/src/front.mjs index fc8488a3107..ed724c21d21 100644 --- a/designs/paco/src/front.mjs +++ b/designs/paco/src/front.mjs @@ -88,7 +88,7 @@ function pacoFront({ let delta = (measurements.seat * (1 - options.legBalance)) / 2 - points.styleWaistIn.dist(points.styleWaistOut) - let angle = points.styleWaistIn.angle(points.styleWaistOut) + let angle = points.styleWaistInNoAngle.angle(points.styleWaistOut) points.styleWaistOut = points.styleWaistOut.shift(angle, delta) points.seatOut = points.seatOut.shift(angle, delta) diff --git a/designs/titan/src/back.mjs b/designs/titan/src/back.mjs index 421822bca1d..0cccd59266c 100644 --- a/designs/titan/src/back.mjs +++ b/designs/titan/src/back.mjs @@ -17,6 +17,7 @@ function titanBack({ sa, absoluteOptions, log, + units, part, }) { /* @@ -199,7 +200,7 @@ function titanBack({ // Revert back to the previous rotation. for (const i of rotate) { points[i] = saved[i] - } + } points.fork = saved.fork points.forkCp2 = saved.forkCp2 } @@ -237,6 +238,25 @@ function titanBack({ points.styleWaistIn = points.waistIn.clone() points.styleWaistOut = points.waistOut.clone() } + // Now angle the waist (if requested) + // create a backup of the unangled position, for use in dependent patterns + points.styleWaistInNoAngle = points.styleWaistIn.clone() + if (options.waistAngle != 0 && (options.useWaistAngleFor === 'both' || options.useWaistAngleFor === 'backOnly') ) { + // calculate how much to add/subtract + // assume that from the crossSeamCurveStart upwards, the crotch seam will be vertical + // base of the triangle is then horizontal distance from crossSeamCurveStart to fork + let triangleBase, triangleHeight + // use positive value for triangleBase: positive angle means higher back + triangleBase = points.fork.dx(points.crossSeamCurveStart) + // length of opposite side is length of adjacent side times tangent of the angle + triangleHeight = Math.tan(options.waistAngle * Math.PI/180) * triangleBase + + // top of cross seam is a straight line, so just extend + points.styleWaistIn = points.crossSeamCurveStart.shiftOutwards(points.styleWaistIn,triangleHeight) + + // report the change in height + log.info(['additionalHeightCenterBack',units(triangleHeight)]) + } // Adapt the vertical placement of the seat control point to the lowered waist points.seatOutCp2.y = points.seatOut.y - points.styleWaistOut.dy(points.seatOut) / 2 @@ -425,6 +445,17 @@ export const back = { lengthBonus: { pct: 2, min: -20, max: 10, menu: 'style' }, crotchDrop: { pct: 2, min: 0, max: 15, menu: 'style' }, fitKnee: { bool: false, menu: 'style' }, + waistAngle: { deg: 0, min: -20, max: 20, menu: 'style' }, + useWaistAngleFor: { + dflt: "both", + list: [ + "both", + "backOnly", + "frontOnly", + ], + menu: 'style' + }, + // Advanced legBalance: { pct: 57.5, min: 52.5, max: 62.5, menu: 'advanced' }, crossSeamCurveStart: { pct: 85, min: 60, max: 100, menu: 'advanced' }, diff --git a/designs/titan/src/front.mjs b/designs/titan/src/front.mjs index cf681510581..8e478bd922e 100644 --- a/designs/titan/src/front.mjs +++ b/designs/titan/src/front.mjs @@ -16,6 +16,7 @@ function titanFront({ sa, absoluteOptions, log, + units, part, }) { /* @@ -260,7 +261,7 @@ function titanFront({ // Revert back to the previous rotation. for (const i of rotate) { points[i] = saved[i] - } + } points.fork = saved.fork } if (Math.abs(delta) > 1 || Math.abs(delta) > Math.abs(previous_delta)) { @@ -315,6 +316,25 @@ function titanFront({ points.styleWaistIn = points.waistIn.clone() points.styleWaistOut = points.waistOut.clone() } + // Now angle the waist (if requested) + // create a backup of the unangled position, for use in dependent patterns + points.styleWaistInNoAngle = points.styleWaistIn.clone() + if (options.waistAngle != 0 && (options.useWaistAngleFor === 'both' || options.useWaistAngleFor === 'frontOnly') ) { + // calculate how much to add/subtract + // assume that from the crossSeamCurveStart upwards, the crotch seam will be vertical + // base of the triangle is then horizontal distance from crossSeamCurveStart to fork + let triangleBase, triangleHeight + // use negative value for triangleBase: positive angle means lower front + triangleBase = points.fork.dx(points.crotchSeamCurveStart) + // length of opposite side is length of adjacent side times tangent of the angle + triangleHeight = Math.tan(options.waistAngle * Math.PI/180) * triangleBase + + // top of cross seam is a straight line, so just extend + points.styleWaistIn = points.crotchSeamCurveStart.shiftOutwards(points.styleWaistIn,triangleHeight) + + // report the change in height + log.info(['heightReductionCenterFront',units(-triangleHeight)]) + } // Seamline paths.seam = drawPath().attr('class', 'fabric')