import { backSideBoundary } from "./shared"; export default function(part) { let { store, complete, points, utils, measurements, options, macro, Point, paths, Path } = part.shorthand(); /** * Add side part from back to front, draw front style line */ backSideBoundary(part, true); paths.pathToSplit = new Path() .move(points.armhole) .curve(points.armholeCp2, points.armholeHollowCp1, points.armholeHollow) .attr("class", "lining stroke-xl"); points.split = paths.pathToSplit.shiftFractionAlong(0.5); let halves = paths.pathToSplit.split(points.split); paths.split1 = halves.pop().attr("class", "lining stroke-xxl"); paths.split2 = halves.pop().attr("class", "canvas stroke-xxl"); // We need to add these control points as we'll rotate them later // The path.ops property is where it's at points.splitCp2 = paths.split1.ops[1].cp1; points.armholeHollowCp1 = paths.split1.ops[1].cp2; // We need to add these control points for the side points.sideArmholeCp2 = paths.split2.ops[1].cp1; points.sideSplitCp1 = paths.split2.ops[1].cp2; points.fsArmhole = points.split.clone(); points.fsWaist = new Point( points.waist.x * options.sideFrontPlacement, points.waist.y ); points.fsWaistCp2 = points.fsWaist.shift(90, points.split.dy(points.waist)/2); points.fsHips = new Point(points.fsWaist.x, points.hips.y); points.fsHem = new Point(points.fsWaist.x, points.hem.y); /** Uncomment this to see the style line without shaping */ paths.fs = new Path() .move(points.fsHem) .line(points.fsWaist) .curve_(points.fsWaistCp2, points.fsArmhole) .attr("class", "stroke-xl lining lashed") /** * Shape the front/side seam */ points.waist = points.fsWaist.shift(180, store.get("waistReduction") * options.reduceWaistStandardFraction); points.waistCp2 = new Point( points.waist.x, points.fsWaistCp2.y ); points.hips = points.fsHips.shift(180, store.get("hipsReduction") * options.reduceHipsStandardFraction); points.waistCp1 = points.waist.shift(-90, points.waist.dy(points.hips)/3); points.hipsCp2 = points.hips.shift(90, points.waist.dy(points.hips)/3); points.hem = new Point(points.hips.x, points.hem.y); points.sideHips = points.hips.flipX(points.fsWaist); points.sideHem = points.hem.flipX(points.fsWaist); points.sideWaist = points.waist.flipX(points.fsWaist); points.sideWaistCp1 = points.waistCp1.flipX(points.fsWaist); points.sideWaistCp2 = points.waistCp2.flipX(points.fsWaist); points.sideHipsCp2 = points.hipsCp2.flipX(points.fsWaist); // Match side seam length by shifting armhole upwards let frontLength = new Path() .move(points.hem) .line(points.hips) .curve(points.hipsCp2, points.waistCp1, points.waist) .curve_(points.waistCp2, points.split) .length(); let sideLength = new Path() .move(points.sideHem) .line(points.sideHips) .curve(points.sideHipsCp2, points.sideWaistCp1, points.sideWaist) .curve_(points.sideWaistCp2, points.split) .length(); points.sideArmhole = points.armhole.shift(90, frontLength - sideLength); points.sideArmholeCp2 = points.sideArmholeCp2.shift(90, frontLength - sideLength); points.bsArmholeCp2 = points.bsArmholeCp2.shift(90, frontLength - sideLength); /** * Shape the side/back seam (15% of reduction x 2) */ points.bsWaist = points.bsWaist.shift(180, store.get("waistReduction") * options.reduceWaistStandardFraction); points.bsWaistCp2 = new Point(points.bsWaist.x, points.sideWaistCp2.y); points.bsWaistCp1 = new Point(points.bsWaist.x, points.sideWaistCp1.y); points.bsHips = points.bsHips.shift(180, store.get("hipsReduction") * options.reduceHipsStandardFraction); points.bsHipsCp2 = new Point(points.bsHips.x, points.sideHipsCp2.y); points.bsHem = new Point(points.bsHips.x, points.sideHem.y); /** * Drop hem center front */ points.cfHem = points.cfHem.shift(-90, points.cfHem.y * options.centerFrontHemDrop); // When the hem slope would end of side and front were sewn together points.hemDropEnd = points.hem.shift(0, points.sideHem.dx(points.bsHem)); points.hem = utils.beamsIntersect( points.cfHem, points.hemDropEnd, points.hips, points.hem ); points.sideHem = points.hem.flipX(points.fsHem); /** * Front dart (12.5% of reduction x 2) */ points.dart = new Point( points.waist.x * options.frontDartPlacement, points.waist.y ); points.dartTop = points.dart.shift(90, points.armhole.dy(points.waist) / 1.5); points.dartBottom = points.dart.shift(-90, points.waist.dy(points.hips) / 1.5); points.dartRight = points.dart.shift(0, store.get("waistReduction") * options.reduceWaistDartFraction); points.dartLeft = points.dartRight.flipX(points.dart); points.dartRightCpTop = points.dartRight.shift(90, points.dartTop.dy(points.dart)/3); points.dartLeftCpTop = points.dartRightCpTop.flipX(points.dart); points.dartRightCpBottom = points.dartRight.shift(-90, points.dart.dy(points.dartBottom)/3); points.dartLeftCpBottom = points.dartRightCpBottom.flipX(points.dart); // Front pocket points.frontPocketAnchor = new Point( points.hips.x * options.frontPocketPlacement, points.dartRightCpBottom.y ); let width = points.hips.x * options.frontPocketWidth; let depth = width * options.frontPocketDepth; points.frontPocketTopLeft = points.frontPocketAnchor.shift(180, width/2); points.frontPocketTopRight = points.frontPocketTopLeft.flipX(points.frontPocketAnchor); points.frontPocketBottomLeft = points.frontPocketTopLeft.shift(-90, depth); points.frontPocketBottomRight = points.frontPocketBottomLeft.flipX(points.frontPocketAnchor); store.set("pocketWidth", width); store.set("pocketDepth", depth); points.frontPocketTopEnd = utils.curveIntersectsY( points.waist, points.waistCp1, points.hipsCp2, points.hips, points.frontPocketTopLeft.y ); points.frontPocketBottomEnd = utils.beamIntersectsY( points.hips, points.hem, points.frontPocketBottomLeft.y ); paths.dart = new Path() .move(points.dartRight) .curve_(points.dartRightCpTop, points.dartTop) ._curve(points.dartLeftCpTop, points.dartLeft) .curve_(points.dartLeftCpBottom, points.dartBottom) ._curve(points.dartRightCpBottom, points.dartRight) .close(); paths.frontShaping = new Path() .move(points.hem) .line(points.hips) .curve(points.hipsCp2, points.waistCp1, points.waist) .curve_(points.waistCp2, points.split) ._curve(points.sideWaistCp2, points.sideWaist) .curve(points.sideWaistCp1, points.sideHipsCp2, points.sideHips) .line(points.sideHem) .attr("class", "stroke-xxl various lashed"); paths.sideShaping = new Path() .move(points.bsHem) .line(points.bsHips) .curve(points.bsHipsCp2, points.bsWaistCp1, points.bsWaist) .curve_(points.bsWaistCp2, points.bsArmholeHollow) .attr("class", "stroke-xl facing lashed"); return part; }