@freesewing/theo
Version:
A FreeSewing pattern for classic trousers
4 lines • 91.1 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../src/index.js", "../config/index.js", "../src/back.js", "../src/front.js", "../src/waistband-interfacing-left.js", "../src/waistband-interfacing-right.js", "../src/waistband-left.js", "../src/waistband-right.js", "../src/waistband-lining-left.js", "../src/waistband-lining-right.js", "../src/fly-piece.js", "../src/fly-shield.js", "../src/side-piece.js", "../src/front-pocket-bag.js", "../src/back-inner-pocket-bag.js", "../src/back-outer-pocket-bag.js", "../src/back-pocket-facing.js", "../src/back-pocket-interfacing.js", "../src/belt-loop.js"],
"sourcesContent": ["import freesewing from '@freesewing/core'\nimport plugins from '@freesewing/plugin-bundle'\nimport config from '../config'\n// Parts\nimport draftBack from './back'\nimport draftFront from './front'\nimport draftWaistbandInterfacingLeft from './waistband-interfacing-left'\nimport draftWaistbandInterfacingRight from './waistband-interfacing-right'\nimport draftWaistbandLeft from './waistband-left'\nimport draftWaistbandRight from './waistband-right'\nimport draftWaistbandLiningLeft from './waistband-lining-left'\nimport draftWaistbandLiningRight from './waistband-lining-right'\nimport draftFlyPiece from './fly-piece'\nimport draftFlyShield from './fly-shield'\nimport draftSidePiece from './side-piece'\nimport draftFrontPocketBag from './front-pocket-bag'\nimport draftBackInnerPocketBag from './back-inner-pocket-bag'\nimport draftBackOuterPocketBag from './back-outer-pocket-bag'\nimport draftBackPocketFacing from './back-pocket-facing'\nimport draftBackPocketInterfacing from './back-pocket-interfacing'\nimport draftBeltLoop from './belt-loop'\n\n// Create design\nconst Theo = new freesewing.Design(config, plugins)\n\n// Attach draft methods to prototype\nTheo.prototype.draftBack = (part) => draftBack(part)\nTheo.prototype.draftFront = (part) => draftFront(part)\nTheo.prototype.draftWaistbandInterfacingLeft = (part) => draftWaistbandInterfacingLeft(part)\nTheo.prototype.draftWaistbandInterfacingRight = (part) => draftWaistbandInterfacingRight(part)\nTheo.prototype.draftWaistbandLiningLeft = (part) => draftWaistbandLiningLeft(part)\nTheo.prototype.draftWaistbandLiningRight = (part) => draftWaistbandLiningRight(part)\nTheo.prototype.draftWaistbandLeft = (part) => draftWaistbandLeft(part)\nTheo.prototype.draftWaistbandRight = (part) => draftWaistbandRight(part)\nTheo.prototype.draftFlyPiece = (part) => draftFlyPiece(part)\nTheo.prototype.draftFlyShield = (part) => draftFlyShield(part)\nTheo.prototype.draftSidePiece = (part) => draftSidePiece(part)\nTheo.prototype.draftFrontPocketBag = (part) => draftFrontPocketBag(part)\nTheo.prototype.draftBackInnerPocketBag = (part) => draftBackInnerPocketBag(part)\nTheo.prototype.draftBackOuterPocketBag = (part) => draftBackOuterPocketBag(part)\nTheo.prototype.draftBackPocketFacing = (part) => draftBackPocketFacing(part)\nTheo.prototype.draftBackPocketInterfacing = (part) => draftBackPocketInterfacing(part)\nTheo.prototype.draftBeltLoop = (part) => draftBeltLoop(part)\n\n// Named exports\nexport { config, Theo }\n\n// Default export\nexport default Theo\n", "import { version } from '../package.json'\nimport configHelpers from '@freesewing/config-helpers'\nconst { steps, pctBasedOn } = configHelpers\n\nexport default {\n version,\n name: 'theo',\n deprecated: 'charlie',\n design: 'Joost De Cock',\n code: 'Joost De Cock',\n department: 'bottoms',\n type: 'pattern',\n difficulty: 4,\n optionGroups: {\n fit: ['backRise', 'wedge'],\n style: ['waistbandWidth', 'lengthBonus', 'legWidth'],\n },\n measurements: ['crotchDepth', 'hips', 'inseam', 'knee', 'seat', 'waistToHips'],\n dependencies: {},\n inject: {\n front: 'back',\n waistbandLeft: 'waistbandInterfacingLeft',\n waistbandRight: 'waistbandInterfacingRight',\n waistbandLiningLeft: 'waistbandInterfacingLeft',\n waistbandLiningRight: 'waistbandInterfacingRight',\n flyPiece: 'front',\n flyShield: 'flyPiece',\n sidePiece: 'front',\n frontPocketBag: 'front',\n backOuterPocketBag: 'backInnerPocketBag',\n backPocketInterfacing: 'backPocketFacing',\n },\n hide: [],\n parts: ['waistbandInterfacingLeft', 'waistbandInterfacingRight', 'backPocketFacing', 'beltLoop'],\n options: {\n // Constants\n\n // Millimeter\n //waistbandWidth: { mm: 40, min: 5, max: 80 },\n waistbandWidth: { pct: 3, min: 2, max: 6, snap: steps, ...pctBasedOn('waistToFloor') },\n\n // Percentages\n legWidth: { pct: 10, min: 0, max: 30 },\n backRise: { pct: 3.5, min: 0.5, max: 8 },\n lengthBonus: { pct: 0, min: -10, max: 10 },\n wedge: { pct: 0, min: -3, max: 3 },\n },\n}\n", "export default function (part) {\n const {\n store,\n sa,\n Point,\n points,\n Path,\n paths,\n absoluteOptions,\n options,\n complete,\n paperless,\n macro,\n utils,\n measurements,\n snippets,\n Snippet,\n raise,\n } = part.shorthand()\n\n // This pattern needs a rewrite\n raise.warning(\n 'Theo in its current incarnation is deprecated. A complete rewrite based on our Titan block is on [our v3 roadmap](https://github.com/freesewing/freesewing/discussions/1278). Until that time, if it works, great. If not \u00AF\\\\\\\\__(\u30C4)\\\\__/\u00AF'\n )\n\n const calculateSlashCorner = () => {\n points[901] = utils.beamsIntersect(points[20], points[19], points[26], points[4])\n points[902] = points[901].clone()\n const step = -0.1\n let i = 0\n while (points[901].dist(points[902]) < 25) {\n i++\n points[902] = points[901].rotate(i * step, points[26])\n }\n\n return i * step\n }\n\n // Store\n store.set('lengthBonus', measurements.inseam * options.lengthBonus)\n store.set('backReduction', (measurements.hips / -4) * options.wedge)\n store.set('legWidth', (measurements.knee * (1 + options.legWidth)) / 2)\n store.set('backRise', measurements.hips * options.backRise)\n\n // Points\n points[0] = new Point(0, 0)\n points[1] = new Point(\n 0,\n measurements.crotchDepth - measurements.waistToHips - absoluteOptions.waistbandWidth\n )\n points[2] = new Point(0, points[1].y + measurements.inseam + store.get('lengthBonus'))\n points[201] = points[2].shift(-90, 10)\n points[202] = new Point(store.get('legWidth') / 4, points[201].y)\n points[203] = points[202].flipX()\n points[3] = new Point(0, points[1].y + measurements.inseam / 2 + 50)\n points[4] = new Point(0, points[1].y - (measurements.crotchDepth - measurements.waistToHips) / 4)\n points[5] = new Point(10 - measurements.seat / 8, points[1].y)\n points[9] = new Point(\n points[5].x - measurements.seat / 16 - 5 + store.get('backReduction'),\n points[5].y\n )\n points[16] = new Point(points[5].x - points[1].dx(points[5]) / 4, points[5].y)\n points[1601] = points[16].shift(135, 45)\n points[1602] = points[1601].shift(45, 25)\n points[1603] = points[1601].shift(-135, 45)\n points[17] = new Point(points[16].x, points[4].y)\n points[18] = new Point(points[16].x, 0)\n points[19] = new Point(points[16].x, points[16].y + points[16].dy(points[18]) / 2)\n points[20] = new Point(points[18].x + 20, points[18].y)\n points[1901] = points[20].shiftOutwards(points[19], 25)\n points[21] = points[19].shiftOutwards(points[20], 10)\n points[22] = new Point(\n points[9].x + points[5].dx(points[9]) / 2 - 5 + store.get('backReduction'),\n points[9].y\n )\n points[23] = new Point(points[22].x, points[22].y + 5)\n points[24] = new Point(points[20].x + measurements.hips / 4 + 45, points[20].y)\n points[25] = points[21].shiftFractionTowards(points[24], 0.5)\n points[2501] = points[25].shiftTowards(points[24], 120)\n points[2502] = points[2501].rotate(-90, points[25])\n points[2503] = points[25].shiftTowards(points[24], 12.5)\n points[2504] = points[25].shiftTowards(points[21], 12.5)\n points[26] = new Point(points[17].x + measurements.seat / 4 + 30, points[17].y)\n points[2601] = points[24].shiftFractionTowards(points[26], 1, 4)\n points[27] = new Point(points[2].x + store.get('legWidth') / 2 + 20, points[2].y)\n points[2701] = new Point(points[27].x, points[27].y - 50)\n points[2702] = points[2701].flipX()\n points[28] = points[27].flipX()\n points[29] = new Point(points[3].x + store.get('legWidth') / 2 + 15 + 20, points[3].y)\n points[2901] = points[27].shiftFractionTowards(points[29], 1.6)\n points[30] = points[29].flipX()\n points[3001] = points[28].shiftFractionTowards(points[30], 1.6)\n\n // Slash and rotate around point 26\n let corner = calculateSlashCorner()\n const rotateThese = [24, 2501, 2502, 2503, 2504, 25, 21, 20, 19, 1901, 2601]\n for (let id of rotateThese) {\n let newId = '90' + id\n points[newId] = points[id].rotate(corner, points[26])\n }\n\n // These need to be moved 1cm to the left as per instructions after slash\n points[901601] = points[1601].shift(180, 10)\n points[901602] = points[1602].shift(180, 10)\n points[901603] = points[1603].shift(180, 10)\n // Add endpoint for pleat line\n points[900] = utils.beamsIntersect(points[9021], points[9024], points[0], points[1])\n\n // Points without seam allowance\n points[-21] = points[9021].shiftTowards(points[902504], 10)\n points[-2101] = points[-21].shift(points[9020].angle(points[9021]), -10)\n points[-24] = points[9024].shiftTowards(points[9021], 10)\n points[-2104] = points[-24].shift(points[9024].angle(points[26]), 10)\n points[-2501] = points[902504].shiftTowards(points[902502], 10)\n points[-2502] = points[902503].shiftTowards(points[902502], 10)\n points[-2503] = points[902504].shiftTowards(points[902502], 60)\n points[-2504] = points[902503].shiftTowards(points[902502], 60)\n points[-26] = points[26].shift(points[9024].angle(points[9021]), 10)\n points[-2601] = points[-2104].shiftFractionTowards(points[-26], 1.4)\n points[-2901] = points[2901].shift(points[2901].angle(points[29]) - 90, 10)\n points[-29] = points[29].shift(points[2901].angle(points[29]) - 90, 10)\n points[-2701] = points[2701].shift(180, 10)\n\n points[-27] = new Path().move(points[27])._curve(points[202], points[201]).shiftAlong(10)\n points[-28] = points[-27].flipX()\n points[-2702] = points[-2701].flipX()\n points[-30] = points[-29].flipX()\n points[-3001] = points[3001].shift(points[30].angle(points[3001]) + 90, -10)\n points[-23] = new Path().move(points[23])._curve(points[901603], points[901601]).shiftAlong(10)\n points[-2301] = new Path().move(points[-23])._curve(points[-3001], points[-30]).shiftAlong(10)\n points[-900] = new Point(points[900].x, points[900].y + 10)\n points[-901603] = points[901603].shift(points[901603].angle(points[901601]) + 90, -10)\n points[-901601] = points[901601].shift(points[901603].angle(points[901601]) + 90, -10)\n points[-901602] = points[901602].shift(points[901603].angle(points[901601]) + 90, -10)\n points[-901901] = points[901901].shift(points[901601].angle(points[9019]) + 90, -10)\n points[-9019] = points[9019].shift(points[901901].angle(points[9019]) + 90, -10)\n\n // Extra SA at back seam\n points[9021] = points[-21].shift(points[-2501].angle(points[-2101]), 40)\n\n // Extra SA at hem\n points[-2710] = points[-27].shift(-90, 60)\n points[-2810] = points[-2710].flipX()\n points[-20110] = points[201].shift(-90, 60)\n points[-20210] = points[202].shift(-90, 60)\n points[-20310] = points[203].shift(-90, 60)\n\n // Raise waistband\n points[66601] = points[-2101].shiftTowards(points[-21], store.get('backRise'))\n\n // Original dart without raise\n points[66602] = utils.beamsIntersect(points[66601], points[-2104], points[902502], points[-2501])\n points[66603] = utils.beamsIntersect(points[66601], points[-2104], points[902502], points[-2502])\n points[66605] = points[-2101].shiftTowards(points[-21], store.get('backRise') + 10)\n points[66606] = new Point(\n points[66602].x + points[66601].dx(points[66605]),\n points[66602].y + points[66601].dy(points[66605])\n )\n points[66607] = utils.beamsIntersect(points[66606], points[66605], points[901601], points[9021])\n\n // Construct the back dart with raise\n points.dartTop = points[66601].shiftFractionTowards(points[-2104], 0.5)\n points.dartTip = points.dartTop.shift(\n points[-2104].angle(points[66601]) + 90,\n points.dartTop.dist(points[902502])\n )\n points.dartTopLeft = points.dartTop.shiftTowards(\n points[66601],\n points[66602].dist(points[66603]) / 2\n )\n points.dartTopRight = points.dartTop.shiftTowards(\n points[-2104],\n points[66602].dist(points[66603]) / 2\n )\n\n // Reconstruct back pocket with raise\n points.pocketCenterLeft = points.dartTopLeft.shiftTowards(points.dartTip, 60)\n points.pocketCenterRight = points.dartTopRight.shiftTowards(points.dartTip, 60)\n points.pocketEdgeLeft = points.pocketCenterLeft.shift(\n points.pocketCenterLeft.angle(points.dartTip) - 90,\n 70\n )\n points.pocketEdgeRight = points.pocketCenterRight.shift(\n points.pocketCenterRight.angle(points.dartTip) + 90,\n 70\n )\n\n // Extend back pleat to include rise\n points[-900] = utils.beamsIntersect(points[900], points[-900], points[66601], points[66602])\n\n // Paths\n // This is the original Aldrich path, which includes seam allowance\n paths.aldrich = new Path()\n .move(points[23])\n ._curve(points[901603], points[901601])\n .curve(points[901602], points[901901], points[9019])\n .line(points[9021])\n .line(points[902504])\n .line(points[902502])\n .line(points[902503])\n .line(points[9024])\n .line(points[26])\n .curve(points[902601], points[2901], points[29])\n .curve(points[29], points[2701], points[27])\n .curve(points[27], points[202], points[201])\n .curve_(points[203], points[28])\n .curve_(points[2702], points[30])\n .curve_(points[3001], points[23])\n .close()\n paths.aldrich.render = false\n\n // This is the path we use, no seam allowance\n paths.hemBase = new Path()\n .move(points[-27])\n ._curve(points[202], points[201])\n .curve_(points[203], points[-28])\n paths.saBase1 = new Path()\n .move(points[-28])\n .curve_(points[-2702], points[-30])\n .curve_(points[-3001], points[-2301])\n ._curve(points[-901603], points[-901601])\n .curve(points[-901602], points[-901901], points[-9019])\n .line(points[66601])\n .line(points.dartTopLeft)\n paths.saBase2 = new Path()\n .move(points.dartTopRight)\n .line(points[-2104])\n .line(points[-26])\n .curve(points[-2601], points[-2901], points[-29])\n .curve(points[-29], points[-2701], points[-27])\n paths.seam = paths.saBase1\n .clone()\n .line(points.dartTip)\n .line(points.dartTopRight)\n .join(paths.saBase2)\n .join(paths.hemBase)\n .close()\n .attr('class', 'fabric')\n paths.hemBase.render = false\n paths.saBase1.render = false\n paths.saBase2.render = false\n\n // Store length of the inseam and side seam\n store.set(\n 'backInseamLength',\n new Path().move(points[-2301]).curve_(points[-3001], points[-30]).length() +\n new Path().move(points[30])._curve(points[-2702], points[-28]).length()\n )\n store.set(\n 'backSideseamLength',\n points[-2104].dist(points[-26]) +\n new Path().move(points[-26]).curve(points[-2601], points[-2901], points[-29]).length() +\n new Path().move(points[-29])._curve(points[-2701], points[-27]).length()\n )\n\n // Complete pattern?\n if (complete) {\n if (sa) {\n paths.sa = paths.saBase1\n .offset(-1 * sa)\n .join(paths.saBase2.offset(-1 * sa))\n .join(paths.hemBase.offset(-3 * sa))\n .close()\n .attr('class', 'fabric sa')\n }\n paths.pocket = new Path()\n .move(points.pocketEdgeLeft)\n .line(points.pocketCenterLeft)\n .move(points.pocketCenterRight)\n .line(points.pocketEdgeRight)\n .attr('class', 'fabric dashed')\n\n points.grainlineTop = new Point(0, points[-2104].y)\n points.grainlineBottom = points[2].clone()\n macro('grainline', {\n from: points.grainlineBottom,\n to: points.grainlineTop,\n })\n points.title = new Point(0, points[-2301].y)\n macro('title', { at: points.title, title: 'back', nr: 1 })\n points.logo = points.title.shift(-90, 70)\n snippets.logo = new Snippet('logo', points.logo)\n points.scalebox = points.logo.shift(-90, 70)\n macro('scalebox', { at: points.scalebox })\n macro('sprinkle', {\n snippet: 'notch',\n on: ['pocketEdgeLeft', 'pocketEdgeRight'],\n })\n }\n\n // Paperless?\n if (paperless) {\n macro('ld', {\n from: points[66601],\n to: points.dartTopLeft,\n d: sa + 15,\n })\n macro('ld', {\n from: points.dartTopLeft,\n to: points.dartTopRight,\n d: sa + 15,\n })\n macro('ld', {\n from: points[66601],\n to: points[-2104],\n d: sa + 30,\n })\n macro('ld', {\n from: points.pocketEdgeLeft,\n to: points.pocketCenterLeft,\n d: 15,\n })\n macro('ld', {\n from: points.pocketCenterRight,\n to: points.pocketEdgeRight,\n d: 15,\n })\n macro('ld', {\n from: points.dartTip,\n to: points.dartTop,\n d: 30,\n })\n macro('ld', {\n from: points.dartTip,\n to: points.pocketCenterRight,\n d: -15,\n })\n macro('hd', {\n from: points[-2301],\n to: points[66601],\n y: points[66601].y - sa - 45,\n })\n macro('hd', {\n from: points[66601],\n to: points[-2104],\n y: points[66601].y - sa - 45,\n })\n macro('hd', {\n from: points[-2301],\n to: points[-2104],\n y: points[66601].y - sa - 60,\n })\n macro('vd', {\n from: points[-2301],\n to: points[66601],\n x: points[-2301].x - sa - 15,\n })\n macro('vd', {\n from: points[201],\n to: points[-2301],\n x: points[-2301].x - sa - 15,\n })\n macro('vd', {\n from: points[201],\n to: points[66601],\n x: points[-2301].x - sa - 30,\n })\n macro('hd', {\n from: points[-28],\n to: points[-27],\n y: points[201].y + 3 * sa + 15,\n })\n macro('vd', {\n from: points[-27],\n to: points[-2104],\n x: points[-2104].x + sa + 15,\n })\n }\n\n return part\n}\n", "export default function (part) {\n let {\n store,\n sa,\n Point,\n points,\n Path,\n paths,\n options,\n complete,\n paperless,\n macro,\n utils,\n measurements,\n snippets,\n raise,\n } = part.shorthand()\n\n // Let's warn about some common issues\n if ((measurements.crotchDepth - measurements.waistToHips) / measurements.hips < 0.15)\n raise.warning(\n 'There is little vertical space to draw the cross seam. Perhaps double-check the seath depth and waist to hips measurements'\n )\n\n // Clean up inheritedpaths & snippets\n for (let id in paths) delete paths[id]\n for (let id in snippets) delete snippets[id]\n\n points[1] = new Point(\n points[0].x,\n measurements.crotchDepth - measurements.waistToHips - options.waistbandWidth + 10\n )\n points[2] = new Point(points[0].x, points[1].y + measurements.inseam + store.get('lengthBonus'))\n points[3] = new Point(points[0].x, points[1].y + measurements.inseam / 2 + 50)\n points[4] = new Point(\n points[0].x,\n points[1].y - (measurements.crotchDepth - measurements.waistToHips) / 4\n )\n points[5] = new Point(points[0].x - measurements.seat / 8 + 10, points[1].y)\n points[501] = points[5].shift(135, 30)\n points[502] = points[501].shift(45, 30)\n points[503] = points[501].shift(-135, 30)\n points[6] = new Point(points[5].x, points[4].y)\n points[7] = new Point(points[5].x, points[0].y)\n points[8] = new Point(points[6].x + measurements.seat / 4 + 20, points[6].y)\n points[801] = new Point(\n points[8].x,\n points[8].y - (measurements.crotchDepth - measurements.waistToHips) / 4\n )\n points[802] = new Point(\n points[8].x,\n points[8].y + (measurements.crotchDepth - measurements.waistToHips) / 4\n )\n points[9] = new Point(\n points[5].x - measurements.seat / 16 - 5 + store.get('backReduction'),\n points[5].y\n )\n points[10] = new Point(points[7].x + 10, points[7].y)\n points[1001] = points[10].shiftTowards(points[6], 10)\n points[1002] = new Point(points[0].x, points[1001].y)\n points[11] = new Point(points[10].x + measurements.hips / 4 + 25, points[10].y)\n points[12] = new Point(points[2].x + store.get('legWidth') / 2, points[2].y)\n points[1201] = new Point(points[12].x, points[12].y - 50)\n points[13] = points[12].flipX()\n points[1301] = points[1201].flipX()\n points[14] = new Point(points[3].x + store.get('legWidth') / 2 + 15, points[3].y)\n points[1401] = points[12].shiftOutwards(points[14], points[1].dy(points[3]) / 2)\n points[1402] = points[1401].flipX()\n\n points[15] = points[14].flipX()\n points[40] = new Path().move(points[1001]).curve_(points[1002], points[11]).shiftAlong(50)\n points[41] = new Point(\n points[40].x + points[1001].dx(points[6]),\n points[40].y + points[1001].dy(points[6])\n )\n let tmp = new Path().move(points[6])._curve(points[502], points[501])\n points[42] = tmp.shiftAlong(tmp.length() / 2)\n points[43] = points[42].shift(-35, 10)\n points['43beam'] = points[42].shift(-35, 40) // We use this to find curve intersection later\n points[44] = points[43].shift(0, 20)\n points[45] = points[40].shiftOutwards(points[41], 20)\n\n points[-1001] = new Path().move(points[1001]).curve_(points[1002], points[11]).shiftAlong(10)\n points[-100101] = points[-1001].shift(points[1001].angle(points[6]), 10)\n points[-1002] = points[1002].shift(90, -10)\n points[-11] = new Path().move(points[11])._curve(points[801], points[8]).shiftAlong(10)\n points[-1101] = new Path().move(points[11])._curve(points[1002], points[1001]).shiftAlong(10)\n points[-1102] = new Point(\n points[-1101].x + points[11].dx(points[-11]),\n points[-1101].y + points[11].dy(points[-11])\n )\n points[-801] = points[801].shift(0, -10)\n points[-8] = points[8].shift(0, -10)\n points[-802] = points[802].shift(0, -10)\n points[-1401] = points[1401].shift(points[1401].angle(points[14]) + 90, -10)\n points[-14] = points[14].shift(points[1401].angle(points[14]) + 90, -10)\n points[-1201] = points[1201].shift(0, -10)\n points[-12] = points[12].shift(0, -10)\n points[-13] = points[13].shift(0, 10)\n points[-1301] = points[1301].shift(0, 10)\n points[-15] = points[-14].flipX()\n points[-1402] = points[-1401].flipX()\n points[-901] = new Path().move(points[9])._curve(points[503], points[501]).shiftAlong(10)\n points[-902] = new Path().move(points[9])._curve(points[1402], points[15]).shiftAlong(10)\n points[-9] = new Point(\n points[-902].x + points[9].dx(points[-901]),\n points[-902].y + points[9].dy(points[-901])\n )\n points[-501] = points[501].shift(points[503].angle(points[502]) - 90, 10)\n points[-502] = points[502].shift(points[503].angle(points[502]) - 90, 10)\n points[-503] = points[503].shift(points[503].angle(points[502]) - 90, 10)\n points[-6] = points[6].shift(points[6].angle(points[1001]) - 90, 10)\n points[-40] = points[40].shiftTowards(points[41], 10)\n\n // Smooth fly curve a bit at -6\n points['-6cp'] = points[-100101].shiftOutwards(points[-6], points[-6].dist(points[-502]) / 2)\n\n // Make sure fly ends on curve\n let pretipX = utils.lineIntersectsCurve(\n points[42],\n points['43beam'],\n points[-501],\n points[-502],\n points['-6cp'],\n points[-6]\n )\n // If we found mulitple points, that's not a great sign.\n // But at least we need a point instead of an array things we break\n if (Array.isArray(points.flyPretipX)) points.flyPretipX = pretipX.pop()\n // If we found no points then we're screwed\n if (points.flyPreTip) points.flyPretipX = pretipX\n else {\n raise.warning(`\n Unable to determine fly end\n\n We improvised to prevent the pattern from falling apart.\n But this is almost certainly going to be a bad pattern since we're in uncharted territory.\n `)\n points.flyPretipX = new Path()\n .move(points[-6])\n .curve(points['-6cp'], points[-502], points[-501])\n .shiftFractionAlong(0.75)\n }\n\n points[43] = points.flyPretipX.clone()\n // Slant pocket\n points[60] = new Path().move(points[-1102])._curve(points[-1002], points[-100101]).shiftAlong(50)\n let curve = new Path().move(points[-1102])._curve(points[-801], points[-8])\n let len = curve.length()\n if (len >= 190) points[61] = curve.shiftAlong(190)\n else\n points[61] = new Path()\n .move(points[-8])\n .curve(points[-802], points[-1401], points[-14])\n .shiftAlong(190 - len)\n\n // Paths\n // This is the original Aldrich path, which includes seam allowance\n paths.aldrich = new Path()\n .move(points[9])\n ._curve(points[503], points[501])\n .curve_(points[502], points[6])\n .line(points[1001])\n .curve_(points[1002], points[11])\n ._curve(points[801], points[8])\n .curve(points[802], points[1401], points[14])\n ._curve(points[1201], points[12])\n .line(points[13])\n .curve_(points[1301], points[15])\n .curve_(points[1402], points[9])\n .close()\n\n // This is the path we use, no seam allowance\n paths.hemBase = new Path().move(points[-12]).line(points[-13])\n paths.saBase = new Path()\n .move(points[-13])\n .curve_(points[-1301], points[-15])\n .curve_(points[-1402], points[-9])\n ._curve(points[-503], points[-501])\n .curve(points[-502], points['-6cp'], points[-6])\n .line(points[-100101])\n .curve_(points[-1002], points[-1102])\n ._curve(points[-801], points[-8])\n .curve(points[-802], points[-1401], points[-14])\n ._curve(points[-1201], points[-12])\n\n paths.seam = paths.hemBase.clone().join(paths.saBase).close().attr('class', 'fabric')\n\n paths.aldrich.render = false\n paths.hemBase.render = false\n paths.saBase.render = false\n\n // Complete pattern?\n if (complete) {\n if (sa) {\n paths.sa = paths.hemBase\n .offset(-3 * sa)\n .join(paths.saBase.offset(-1 * sa))\n .close()\n .attr('class', 'fabric sa')\n }\n paths.fly = new Path()\n .move(points[43])\n .curve(points[44], points[45], points[41])\n .line(points[-40])\n .attr('class', 'fabric dashed')\n paths.pocket = new Path().move(points[60]).line(points[61]).attr('class', 'fabric dashed')\n paths.lining = new Path().move(points[-14]).line(points[-15]).attr('class', 'lining dashed')\n macro('title', { at: points.title, title: 'front', nr: 2 })\n macro('sprinkle', {\n snippet: 'notch',\n on: [60, 61, 43],\n })\n }\n\n // Paperless?\n if (paperless) {\n macro('hd', {\n from: points[-9],\n to: points[-100101],\n y: points[-1102].y - sa - 15,\n })\n macro('hd', {\n from: points[-100101],\n to: points[-1102],\n y: points[-1102].y - sa - 15,\n })\n macro('hd', {\n from: points[-9],\n to: points[-1102],\n y: points[-1102].y - sa - 15,\n })\n macro('hd', {\n from: points[-9],\n to: points[-8],\n y: points[-1102].y - sa - 30,\n })\n macro('vd', {\n from: points[-9],\n to: points[-100101],\n x: points[-9].x - sa - 15,\n })\n macro('vd', {\n from: points[-9],\n to: points[-1102],\n x: points[-9].x - sa - 30,\n })\n macro('vd', {\n from: points[-13],\n to: points[-9],\n x: points[-9].x - sa - 30,\n })\n macro('vd', {\n from: points[-12],\n to: points[-1102],\n x: points[-8].x + sa + 15,\n })\n macro('hd', {\n from: points[-13],\n to: points[-12],\n y: points[-12].y + 3 * sa + 15,\n })\n }\n\n return part\n}\n", "export default function (part) {\n let {\n Point,\n points,\n Path,\n paths,\n absoluteOptions,\n complete,\n paperless,\n measurements,\n macro,\n snippets,\n Snippet,\n } = part.shorthand()\n\n points[0] = new Point(0, 0)\n points[2] = new Point(absoluteOptions.waistbandWidth, measurements.hips / 2 + 60)\n points[1] = new Point(points[2].x, points[0].y)\n points[3] = new Point(points[0].x, points[2].y)\n\n paths.seam = new Path()\n .move(points[0])\n .line(points[1])\n .line(points[2])\n .line(points[3])\n .line(points[0])\n .close()\n .attr('class', 'interfacing')\n\n // Complete pattern?\n if (complete) {\n points.title = points[0].shiftFractionTowards(points[2], 0.5)\n macro('title', {\n at: points.title,\n title: 'waistbandInterfacingLeft',\n nr: '3a',\n scale: 0.5,\n rotation: -90,\n })\n points.logo = new Point(points[2].x / 2, 45)\n snippets.logo = new Snippet('logo', points.logo).attr('data-scale', 0.7)\n }\n\n // Paperless?\n if (paperless) {\n macro('hd', {\n from: points[3],\n to: points[2],\n y: points[2].y + 15,\n })\n macro('vd', {\n from: points[2],\n to: points[1],\n x: points[2].x + 15,\n })\n }\n\n return part\n}\n", "export default function (part) {\n let {\n Point,\n points,\n Path,\n paths,\n absoluteOptions,\n complete,\n paperless,\n measurements,\n macro,\n snippets,\n Snippet,\n } = part.shorthand()\n\n points[0] = new Point(0, 0)\n points[2] = new Point(absoluteOptions.waistbandWidth, measurements.hips / 2 + 40)\n points[1] = new Point(points[2].x, points[0].y)\n points[3] = new Point(points[0].x, points[2].y)\n\n paths.seam = new Path()\n .move(points[0])\n .line(points[1])\n .line(points[2])\n .line(points[3])\n .line(points[0])\n .close()\n .attr('class', 'interfacing')\n\n // Complete pattern?\n if (complete) {\n points.title = points[0].shiftFractionTowards(points[2], 0.5)\n macro('title', {\n at: points.title,\n title: 'waistbandInterfacingRight',\n nr: '3b',\n scale: 0.5,\n rotation: -90,\n })\n points.logo = new Point(points[2].x / 2, 45)\n snippets.logo = new Snippet('logo', points.logo).attr('data-scale', 0.7)\n }\n\n // Paperless?\n if (paperless) {\n macro('hd', {\n from: points[3],\n to: points[2],\n y: points[2].y + 15,\n })\n macro('vd', {\n from: points[2],\n to: points[1],\n x: points[2].x + 15,\n })\n }\n\n return part\n}\n", "export default function (part) {\n let { Point, points, macro, paths, complete, sa, paperless } = part.shorthand()\n\n paths.seam.attributes.set('class', 'fabric')\n\n // Complete pattern?\n if (complete) {\n if (sa) paths.sa = paths.seam.offset(-1 * sa).attr('class', 'fabric sa')\n points.title = points[0].shiftFractionTowards(points[2], 0.5)\n macro('title', {\n at: points.title,\n title: 'waistbandLeft',\n nr: '4a',\n scale: 0.5,\n rotation: -90,\n })\n points.grainlineTop = new Point(points[2].x / 2, 0)\n points.grainlineBottom = new Point(points[2].x / 2, points[2].y, 0)\n macro('grainline', {\n from: points.grainlineBottom,\n to: points.grainlineTop,\n })\n }\n\n // Paperless?\n if (paperless) {\n macro('hd', {\n from: points[3],\n to: points[2],\n y: points[2].y + sa + 15,\n })\n macro('vd', {\n from: points[2],\n to: points[1],\n x: points[2].x + sa + 15,\n })\n }\n\n return part\n}\n", "export default function (part) {\n let { Point, points, macro, paths, complete, sa, paperless } = part.shorthand()\n\n paths.seam.attributes.set('class', 'fabric')\n\n // Complete pattern?\n if (complete) {\n if (sa) paths.sa = paths.seam.offset(-1 * sa).attr('class', 'fabric sa')\n points.title = points[0].shiftFractionTowards(points[2], 0.5)\n macro('title', {\n at: points.title,\n title: 'waistbandRight',\n nr: '4b',\n scale: 0.5,\n rotation: -90,\n })\n points.grainlineTop = new Point(points[2].x / 2, 0)\n points.grainlineBottom = new Point(points[2].x / 2, points[2].y, 0)\n macro('grainline', {\n from: points.grainlineBottom,\n to: points.grainlineTop,\n })\n }\n\n // Paperless?\n if (paperless) {\n macro('hd', {\n from: points[3],\n to: points[2],\n y: points[2].y + sa + 15,\n })\n macro('vd', {\n from: points[2],\n to: points[1],\n x: points[2].x + sa + 15,\n })\n }\n\n return part\n}\n", "export default function (part) {\n let { Point, snippets, Snippet, macro, points, paths, Path, complete, sa, paperless } =\n part.shorthand()\n\n points[0] = points[0].shift(180, 80)\n points[3] = points[3].shift(180, 80)\n\n paths.seam = new Path()\n .move(points[0])\n .line(points[1])\n .line(points[2])\n .line(points[3])\n .line(points[0])\n .close()\n .attr('class', 'lining')\n\n // Complete pattern?\n if (complete) {\n if (sa) paths.sa = paths.seam.offset(-1 * sa).attr('class', 'lining sa')\n points.title = points[0].shiftFractionTowards(points[2], 0.5)\n macro('title', {\n at: points.title,\n title: 'waistbandLiningLeft',\n nr: '5a',\n scale: 0.5,\n rotation: -90,\n })\n points.logo = points.title.shift(90, 70)\n snippets.logo = new Snippet('logo', points.logo)\n points.grainlineTop = new Point(points[2].x / 2, 0)\n points.grainlineBottom = new Point(points[2].x / 2, points[2].y, 0)\n macro('grainline', {\n from: points.grainlineBottom,\n to: points.grainlineTop,\n })\n }\n\n // Paperless?\n if (paperless) {\n macro('hd', {\n from: points[3],\n to: points[2],\n y: points[2].y + sa + 15,\n })\n macro('vd', {\n from: points[2],\n to: points[1],\n x: points[2].x + sa + 15,\n })\n }\n\n return part\n}\n", "export default function (part) {\n let { Point, macro, snippets, Snippet, points, paths, Path, complete, sa, paperless } =\n part.shorthand()\n\n points[0] = points[0].shift(180, 80)\n points[3] = points[3].shift(180, 80)\n\n paths.seam = new Path()\n .move(points[0])\n .line(points[1])\n .line(points[2])\n .line(points[3])\n .line(points[0])\n .close()\n .attr('class', 'lining')\n\n // Complete pattern?\n if (complete) {\n if (sa) paths.sa = paths.seam.offset(-1 * sa).attr('class', 'lining sa')\n points.title = points[0].shiftFractionTowards(points[2], 0.5)\n macro('title', {\n at: points.title,\n title: 'waistbandLiningRight',\n nr: '5b',\n scale: 0.5,\n rotation: -90,\n })\n points.logo = points.title.shift(90, 70)\n snippets.logo = new Snippet('logo', points.logo)\n points.grainlineTop = new Point(points[2].x / 2, 0)\n points.grainlineBottom = new Point(points[2].x / 2, points[2].y, 0)\n macro('grainline', {\n from: points.grainlineBottom,\n to: points.grainlineTop,\n })\n }\n\n // Paperless?\n if (paperless) {\n macro('hd', {\n from: points[3],\n to: points[2],\n y: points[2].y + sa + 15,\n })\n macro('vd', {\n from: points[2],\n to: points[1],\n x: points[2].x + sa + 15,\n })\n }\n\n return part\n}\n", "export default function (part) {\n let { snippets, Point, macro, points, Path, paths, complete, sa, paperless } = part.shorthand()\n // Clean up paths from paperless dimensions\n for (let id in paths) delete paths[id]\n for (let id in snippets) delete snippets[id]\n\n // We need to split the crotch curve at the bottom of the fly\n paths.fly = new Path()\n .move(points[-501])\n .curve(points[-502], points['-6cp'], points[-6])\n .split(points[43])\n .pop()\n paths.fly.render = false\n\n // We need to split the waist curve at the edge of the fly\n let waist = new Path().move(points[-100101]).curve_(points[-1002], points[-1102])\n points.splitWaist = waist.shiftAlong(points[-100101].dist(points[-40]))\n paths.waist = waist.split(points.splitWaist).shift()\n paths.waist.render = false\n\n paths.seam = paths.waist\n .clone()\n .line(points[41])\n .curve(points[45], points[44], points[43])\n .join(paths.fly)\n .line(points[-100101])\n .close()\n .attr('class', 'fabric')\n\n // Complete pattern?\n if (complete) {\n if (sa) paths.sa = paths.seam.offset(sa * -1).attr('class', 'fabric sa')\n points.title = points[9019].clone()\n macro('title', {\n at: points.title,\n title: 'flyPiece',\n nr: 6,\n scale: 0.7,\n })\n points.grainlineTop = points[-100101].shiftFractionTowards(points.splitWaist, 0.3)\n points.grainlineBottom = new Point(points.grainlineTop.x, points[41].y)\n macro('grainline', {\n from: points.grainlineBottom,\n to: points.grainlineTop,\n })\n delete paths.pocket\n delete paths.lining\n delete snippets.logo\n macro('scalebox', false)\n }\n\n // Paperless?\n if (paperless) {\n macro('hd', {\n from: points[-100101],\n to: points.splitWaist,\n y: points.splitWaist.y - sa - 15,\n })\n macro('hd', {\n from: points.flyPretipX,\n to: points.splitWaist,\n y: points.splitWaist.y - sa - 30,\n })\n macro('vd', {\n from: points.flyPretipX,\n to: points.splitWaist,\n x: points.splitWaist.x + sa + 15,\n })\n }\n\n return part\n}\n", "export default function (part) {\n let { macro, points, Path, paths, complete, sa, paperless } = part.shorthand()\n\n // Add points to make shift not impact curves\n points.leftTop = points[-100101].shift(180, 20)\n points.new43 = points[43].shift(180, 20)\n\n // New path\n paths.seam = new Path()\n .move(points.leftTop)\n .join(paths.waist)\n .line(points[41])\n .curve(points[45], points[44], points[43])\n .line(points.new43)\n .join(paths.fly.translate(-20, 0))\n .line(points.leftTop)\n .close()\n .attr('class', 'fabric')\n\n // Complete pattern?\n if (complete) {\n if (sa) paths.sa = paths.seam.offset(sa * -1).attr('class', 'fabric sa')\n macro('title', {\n at: points.title,\n title: 'flyShield',\n nr: 7,\n scale: 0.7,\n })\n }\n\n // Paperless?\n if (paperless) {\n macro('hd', {\n from: points.leftTop,\n to: points.splitWaist,\n y: points.splitWaist.y - sa - 15,\n })\n macro('hd', {\n from: points.new43,\n to: points.splitWaist,\n y: points.splitWaist.y - sa - 30,\n })\n macro('vd', {\n from: points.new43,\n to: points.splitWaist,\n x: points.splitWaist.x + sa + 15,\n })\n }\n\n return part\n}\n", "export default function (part) {\n let { macro, Point, points, Path, paths, complete, sa, paperless, snippets } = part.shorthand()\n // Clean up paths from paperless dimensions\n for (let id in paths) delete paths[id]\n for (let id in snippets) delete snippets[id]\n\n // Add points\n points.topLeft = new Path()\n .move(points[-1102])\n ._curve(points[-1002], points[-100101])\n .shiftAlong(100)\n points.bottomLeft = points[61].shift(180, 50)\n\n // Split waist curve\n paths.waist = new Path()\n .move(points[-1102])\n ._curve(points[-1002], points[-100101])\n .split(points.topLeft)\n .shift()\n paths.waist.render = false\n\n // Split side curve\n paths.side = new Path().move(points[-8]).curve(points[-802], points[-1401], points[-14])\n let split = paths.side.split(points[61]).shift()\n if (split) paths.side = split.reverse()\n else\n paths.side = new Path()\n .move(points[-8])\n .curve_(points[-801], points[-1102])\n .split(points[61])\n .pop()\n paths.side.render = false\n\n paths.seam = new Path()\n .move(points.topLeft)\n .line(points.bottomLeft)\n .line(points[61])\n .join(paths.side)\n .join(paths.waist)\n .close()\n .attr('class', 'fabric')\n\n // Complete pattern?\n if (complete) {\n paths.pocket = new Path()\n .move(points[60])\n .line(points[61])\n .attr('class', 'fabric stroke-sm lashed')\n if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')\n macro('scalebox', false)\n delete paths.fly\n delete paths.lining\n points.grainlineTop = points[60].clone()\n points.grainlineBottom = new Point(points.grainlineTop.x, points.bottomLeft.y)\n macro('grainline', {\n from: points.grainlineBottom,\n to: points.grainlineTop,\n })\n points.title = points[-801].shift(180, 40)\n macro('title', { at: points.title, title: 'sidePiece', nr: 8 })\n }\n\n // Paperless?\n if (paperless) {\n macro('hd', {\n from: points.topLeft,\n to: points[-1102],\n y: points[-1102].y - sa - 15,\n })\n macro('hd', {\n from: points.topLeft,\n to: points[-8],\n y: points[-1102].y - sa - 30,\n })\n macro('hd', {\n from: points.bottomLeft,\n to: points[61],\n y: points.bottomLeft.y + sa + 15,\n })\n macro('hd', {\n from: points.bottomLeft,\n to: points[-8],\n y: points.bottomLeft.y + sa + 30,\n })\n macro('vd', {\n from: points.bottomLeft,\n to: points.topLeft,\n x: points.topLeft.x - sa - 15,\n })\n macro('vd', {\n from: points.bottomLeft,\n to: points[-1102],\n x: points.topLeft.x - sa - 30,\n })\n }\n\n return part\n}\n", "export default function (part) {\n let { Point, points, Path, paths, complete, sa, paperless, macro, snippets, Snippet } =\n part.shorthand()\n\n // Clean up inherited paths & snippets\n for (let id in paths) delete paths[id]\n delete snippets['43-notch']\n\n // Additional points\n points[810] = new Point(points[60].x, points[-1102].y + 300)\n points[811] = new Point(points[-8].x, points[810].y)\n points[812] = new Point(points[0].x, points[810].y)\n points[813] = points[-100101].shiftTowards(points[-6], 70)\n points[814] = points[813].shift(0, 40)\n points[815] = new Point(points[0].x, points[814].y)\n points[816] = new Point(points[-40].x - sa, points[-40].y - sa)\n points[817] = points[813].shift(0, 30)\n points[818] = new Point(points[814].x - sa, points[814].y + sa)\n\n // Paths\n paths.seam = new Path()\n .move(points[-100101])\n .curve_(points[-1002], points[-1102])\n ._curve(points[-801], points[-8])\n .curve(points[-802], points[811], points[810])\n .curve(points[812], points[815], points[814])\n .line(points[813])\n .line(points[-100101])\n .close()\n .attr('class', 'lining')\n\n paths.flyEdge = new Path().move(points[-40]).line(points[814]).attr('class', 'lining lashed')\n\n paths.pocket = new Path().move(points[60]).line(points[61]).attr('class', 'lining lashed')\n\n // Complete pattern?\n if (complete || paperless) {\n points.grainlineTop = points[60].clone()\n points.grainlineBottom = new Point(points.grainlineTop.x, points[810].y)\n }\n if (complete) {\n if (sa) {\n paths.sa = paths.seam.offset(-1 * sa).attr('class', 'lining sa')\n paths.flyEdeSa = new Path().move(points[816]).line(points[818]).attr('class', 'lining sa')\n }\n points.title = points.dartTip.clone()\n macro('title', { at: points.title, title: 'frontPocketBag', nr: 9 })\n macro('grainline', {\n from: points.grainlineBottom,\n to: points.grainlineTop,\n })\n points.logo = new Point(points[60].x, points[61].y)\n snippets.logo = new Snippet('logo', points.logo)\n delete paths.fly\n delete paths.lining\n macro('scalebox', false)\n }\n\n // Paperless?\n if (paperless) {\n macro('hd', {\n from: points[813],\n to: points[-8],\n y: points.grainlineBottom.y + sa + 15,\n })\n macro('hd', {\n from: points[-40],\n to: points[-8],\n y: points[-1102].y - sa - 15,\n })\n macro('hd', {\n from: points[-100101],\n to: points[-8],\n y: points[-1102].y - sa - 30,\n })\n macro('vd', {\n from: points.grainlineBottom,\n to: points[-1102],\n x: points[-8].x + sa + 15,\n })\n macro('vd', {\n from: points.grainlineBottom,\n to: points[813],\n x: points[813].x - sa - 15,\n })\n macro('vd', {\n from: points.grainlineBottom,\n to: points[-100101],\n x: points[813].x - sa - 30,\n })\n }\n\n return part\n}\n", "export default function (part) {\n let { macro, measurements, Point, points, Path, paths, complete, sa, paperless } =\n part.shorthand()\n\n let width = measurements.hips * 0.16\n let height = width * 1.43\n\n points.topRight = new Point(width / 2, 0)\n points.topLeft = points.topRight.flipX()\n points.bottomRight = new Point(width / 2, height)\n points.bottomLeft = points.bottomRight.flipX()\n points.weltLeft = new Point(points.topLeft.x + 15, points.topLeft.y + width / 3)\n points.weltRight = new Point(points.topRight.x - 15, points.topRight.y + width / 3)\n\n macro('round', {\n from: points.topLeft,\n to: points.bottomRight,\n via: points.bottomLeft,\n radius: width / 12,\n prefix: 'left',\n })\n macro('round', {\n from: points.bottomLeft,\n to: points.topRight,\n via: points.bottomRight,\n radius: width / 12,\n prefix: 'right',\n })\n\n paths.seam = new Path()\n .move(points.topLeft)\n .line(points.leftStart)\n .curve(points.leftCp1, points.leftCp2, points.leftEnd)\n .line(points.rightStart)\n .curve(points.rightCp1, points.rightCp2, points.rightEnd)\n .line(points.topRight)\n .line(points.topLeft)\n .close()\n .attr('class', 'lining')\n paths.welt = new Path()\n .move(points.weltLeft)\n .line(points.weltRight)\n .attr('class', 'lining dashed')\n\n // Complete pattern?\n if (complete) {\n if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'lining sa')\n points.title = new Point(0, height / 2)\n macro('title', { at: points.title, title: 'backInnerPocketBag', nr: 10 })\n points.grainlineTop = new Point(width / -3, 0)\n points.grainlineBottom = new Point(width / -3, height)\n macro('grainline', {\n from: points.grainlineBottom,\n to: points.grainlineTop,\n })\n macro('sprinkle', {\n snippet: 'notch',\n on: ['weltLeft', 'weltRight'],\n })\n }\n\n // Paperless?\n if (paperless) {\n macro('hd', {\n from: points.weltLeft,\n to: points.weltRight,\n y: points.weltLeft.y + 15,\n })\n macro('hd', {\n from: points.leftStart,\n to: points.rightEnd,\n y: points.leftEnd.y + sa + 15,\n })\n macro('vd', {\n from: points.rightStart,\n to: points.topRight,\n x: points.topRight.x + sa + 15,\n })\n }\n\n return part\n}\n", "export default function (part) {\n let { macro, points, Path, paths, complete, sa, paperless } = part.shorthand()\n\n // Make bag 2cm longer\n points.topRight = points.topRight.shift(90, 20)\n points.topLeft = points.topLeft.shift(90, 20)\n\n paths.seam = new Path()\n .move(points.topLeft)\n .line(points.leftStart)\n .curve(points.leftCp1, points.leftCp2, points.leftEnd)\n .line(points.rightStart)\n .curve(points.rightCp1, points.rightCp2, points.rightEnd)\n .line(points.topRight)\n .line(points.topLeft)\n .close()\n .attr('class', 'lining')\n paths.welt = new Path()\n .move(points.weltLeft)\n .line(points.weltRight)\n .attr('class', 'lining dashed')\n\n // Complete pattern?\n if (complete) {\n if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'lining sa')\n macro('title', { at: points.title, title: 'backInnerPocketBag', nr: 11 })\n }\n\n // Paperless?\n if (paperless) {\n }\n\n return part\n}\n", "export default function (part) {\n let { macro, measurements, Point, points, Path, paths, complete, paperless } = part.shorthand()\n\n let width = measurements.hips * 0.16\n let height = width / 2\n\n points.topRight = new Point(width / 2, 0)\n points.topLeft = points.topRight.flipX()\n points.bottomRight = new Point(width / 2, height)\n points.bottomLeft = points.bottomRight.flipX()\n points.weltLeft = new Point(points.topLeft.x + 15, points.topLeft.y + height / 2)\n points.weltRight = new Point(points.topRight.x - 15, points.topRight.y + height / 2)\n\n paths.seam = new Path()\n .move(points.topLeft)\n .line(points.bottomLeft)\n .line(points.bottomRight)\n .line(points.topRight)\n .line(points.topLeft)\n .close()\n .attr('class', 'fabric')\n paths.welt = new Path()\n .move(points.weltLeft)\n .line(points.weltRight)\n .attr('class', 'fabric dashed')\n\n // Complete pattern?\n if (complete) {\n points.title = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)\n macro('title', { at: points.title, title: 'backPocketFacing', nr: 12 })\n points.grainlineTop = points.topLeft.shiftFractionTowards(points.topRight, 0.2)\n points.grainlineBottom = new Point(points.grainlineTop.x, points.bottomLeft.y)\n macro('grainline', {\n from: points.grainlineBottom,\n to: points.grainlineTop,\n })\n macro('sprinkle', {\n snippet: 'notch',\n on: ['weltLeft', 'weltRight'],\n })\n }\n\n // Paperless?\n if (paperless) {\n macro('hd', {\n from: points.bottomLeft,\n to: points.bottomRight,\n y: points.bottomLeft.y + 15,\n })\n macro('vd', {\n from: points.bottomRight,\n to: points.topRight,\n x: points.bottomRight.x + 15,\n })\n }\n\n return part\n}\n", "export default function (part) {\n let { macro, points, paths, complete, paperless } = part.shorthand()\n\n paths.seam.attributes.set('class', 'interfacing')\n paths.welt.attributes.set('class', 'interfacing dashed')\n\n // Complete pattern?\n if (complete) {\n macro('title', {\n at: points.title,\n title: 'backPocketInterfacing',\n nr: 13,\n })\n macro('grainline', false)\n }\n\n // Paperless?\n if (paperless) {\n }\n\n return part\n}\n", "export default function (part) {\n let { absoluteOptions, Point, points, Path, paths, complete, paperless, macro