export default function(part) { let { store, macro, Point, Path, points, paths, complete, paperless, snippets, Snippet, sa, options, measurements, utils } = part.shorthand(); let angle = -12; let bulge = measurements.hipsToUpperLeg * options.bulge; points.hipSide = new Point(0, 0); points.hipCb = new Point(store.get("hipFront"), 0); points.legSide = points.hipSide.shift( -90 - angle, measurements.hipsToUpperLeg ); points.legSideCp = points.legSide.shift(0, store.get("legFront")); points.legInner = points.legSideCp.shift(-100, store.get("gusset") / 2); points.crossSeam = points.legSideCp.shift(80, store.get("gusset") / 2); points.legSideCp = points.legSide.shiftFractionTowards(points.legSideCp, 0.4); points.seatCb = points.hipCb.shift( -90 - angle - 5, measurements.hipsToUpperLeg * 0.67 ); points._tmp2 = points.crossSeam.shift(angle, 20); points._tmp3 = utils.beamsIntersect( points.crossSeam, points._tmp2, points.hipCb, points.seatCb ); points.seatCp = points.seatCb.shiftFractionTowards(points._tmp3, 0.7); points.crossSeamCp = points.crossSeam.shiftFractionTowards(points._tmp3, 0.7); points.midFront = points.hipCb.shiftFractionTowards(points.seatCb, 0.6); points.midFrontCpTop = points.hipCb.shiftFractionTowards(points.seatCb, 0.3); points.midFrontCpBottom = points.hipCb.shiftFractionTowards( points.seatCb, 0.9 ); points.midBulge = points.midFront.shift(angle * -1, bulge); points.bulgeCpTop = points.midFrontCpTop.shift(angle * -1, bulge); points.bulgeCpBottom = points.midFrontCpBottom.shift(angle * -1, bulge); points.midSide = points.hipSide.shiftFractionTowards(points.legSide, 0.5); points.hipSideCpBottom = points.hipSide.shiftFractionTowards( points.legSide, 0.2 ); points.midSideCpTop = points.hipSide.shiftFractionTowards( points.legSide, 0.2 ); points.midSideCpBottom = points.hipSide.shiftFractionTowards( points.legSide, 0.7 ); points.legSideCpTop = points.hipSide.shiftFractionTowards( points.legSide, 0.8 ); points.midSideBulge = points.midSide.shift(angle * -1, bulge * -1); points.midSideBulgeCpTop = points.midSideCpTop.shift(angle * -1, bulge * -1); points.midSideBulgeCpBottom = points.midSideCpBottom.shift( angle * -1, bulge * -1 ); // Now reduce the legs points.reducedLegInner = new Path() .move(points.legSide) .curve_(points.legSideCp, points.legInner) .shiftFractionAlong(1 - options.legReduction); points.reducedLegInnerCp = points.legInner.rotate(90, points.reducedLegInner); points.reducedCrossSeam = new Path() .move(points.crossSeam) .curve(points.crossSeamCp, points.seatCp, points.seatCb) .shiftFractionAlong(options.legReduction * 2); // Lengthen legs if (options.legBonus > 0) { let shift = measurements.hipsToUpperLeg * options.legBonus; points.legSide = points.legSide.shift(-90, shift); points.legSideCp = points.legSideCp.shift(-90, shift); points.reducedLegInner = points.reducedLegInner(-90, shift); } // Rise if (options.rise > 0) { let shift = measurements.hipsToUpperLeg * options.rise; points.hipSide = points.hipSide.shift(90, shift); points.hipCb = points.hipCb.shift(0, shift); } // Back rise if (options.backRise > 0) { let shift = measurements.hipsToUpperLeg * options.backRise; points.hipSide = points.hipSide.shift(90, shift / 2); points.hipCbCp = new Point(points.hipCb.x / 2, points.hipCb.y); } console.log(points.hipSideCpBottom); // Paths paths.saBase = new Path() // Use full crossSeam path .move(points.crossSeam) .curve(points.crossSeamCp, points.seatCp, points.seatCb) .split(points.reducedCrossSeam) // Now split it .pop() // Return the relevant part .curve(points.midFrontCpBottom, points.bulgeCpBottom, points.midBulge) // Continue from here .curve(points.bulgeCpTop, points.midFrontCpTop, points.hipCb); if (options.backRise > 0) paths.saBase.curve_(points.hipCbCp, points.hipSide); else paths.saBase.line(points.hipSide); paths.saBase .curve(points.midSideCpTop, points.midSideBulgeCpTop, points.midSideBulge) .curve(points.midSideBulgeCpBottom, points.legSideCpTop, points.legSide); paths.saBase = new Path() .move(points.reducedLegInner) .line(points.reducedCrossSeam) .join(paths.saBase); paths.hemBase = new Path() .move(points.legSide) .curve_(points.legSideCp, points.reducedLegInner); paths.saBase.render = false; paths.hemBase.render = false; paths.seam = paths.saBase.join(paths.hemBase).attr("class", "fabric"); /** Uncomment this to see the reduced crossSeam paths.xred = new Path() .move(points.reducedLegInner) .line(points.legInner) .line(points.crossSeam) */ // Complete? if (complete) { points.logo = points.hipSide.shiftFractionTowards(points.seatCb, 0.3); points.title = points.hipSide.shiftFractionTowards(points.seatCb, 0.7); snippets.logo = new Snippet("logo", points.logo); macro("title", { at: points.title, nr: 2, title: "front" }); if (sa) { paths.sa = paths.hemBase .offset(3 * sa) .join(paths.saBase.offset(sa)) .close() .attr("class", "fabric sa"); } } // Paperless? if (paperless) { macro("vd", { from: points.legSide, to: points.hipSide, x: points.hipSide.x - sa - 15 }); macro("vd", { from: points.reducedLegInner, to: points.hipSide, x: points.hipSide.x - sa - 30 }); macro("vd", { from: points.reducedLegInner, to: points.reducedCrossSeam, x: points.reducedCrossSeam.x + sa + 15 }); macro("vd", { from: points.reducedLegInner, to: points.hipCb, x: points.reducedCrossSeam.x + sa + 30 }); macro("hd", { from: points.hipSide, to: points.hipCb, y: points.hipSide.y - sa - 15 }); macro("hd", { from: points.hipSide, to: points.reducedCrossSeam, y: points.hipSide.y - sa - 30 }); macro("hd", { from: points.legSide, to: points.reducedLegInner, y: points.reducedLegInner.y + 3 * sa + 15 }); macro("hd", { from: points.legSide, to: points.reducedCrossSeam, y: points.reducedLegInner.y + 3 * sa + 30 }); } return part; }