1
0
Fork 0

sparkles: Initial port of aaron from PHP to JS

This commit is contained in:
Joost De Cock 2018-08-27 14:12:14 +02:00
parent aebcf8e3ad
commit 255a94f97d
9 changed files with 307 additions and 255 deletions

1
packages/aaron/bundle.js Symbolic link
View file

@ -0,0 +1 @@
../plugins/plugin-bundle/dist/browser.js

View file

@ -20,18 +20,18 @@ export default {
collarEase: 0, collarEase: 0,
frontArmholeDeeper: 0, frontArmholeDeeper: 0,
armholeDepthFactor: 0.6, armholeDepthFactor: 0.6,
shoulderSlopeReduction: 0,
// Percentages // Percentages
armholeDrop: { val: 10, min: 0, max: 50 }, armholeDrop: { val: 10, min: 1, max: 75 },
backlineBend: { val: 0, min: 0, max: 8 }, backlineBend: { val: 50, min: 50, max: 100 },
chestEase: { val: 8, min: 0, max: 20 }, chestEase: { val: 8, min: 0, max: 20 },
hipsEase: { val: 8, min: 0, max: 20 }, hipsEase: { val: 8, min: 0, max: 20 },
lengthBonus: { val: 10, min:-20, max: 60 }, lengthBonus: { val: 10, min:-20, max: 60 },
necklineBend: { val: 60, min: 40, max: 100 }, necklineBend: { val: 100, min: 40, max: 100 },
necklineDrop: { val: 15, min: 10, max: 35 }, necklineDrop: { val: 20, min: 10, max: 35 },
shoulderSlopeReduction: { val: 0, min: 0, max: 8 },
stretchFactor: { val: 5, min: 0, max: 15 }, stretchFactor: { val: 5, min: 0, max: 15 },
shoulderStrapWidth: { val: 20, min: 10, max: 40 }, shoulderStrapWidth: { val: 15, min: 10, max: 40 },
shoulderStrapPlacement: { val: 50, min: 20, max: 80 }, shoulderStrapPlacement: { val: 40, min: 20, max: 80 },
} }
}; };

View file

@ -6,37 +6,37 @@
</head> </head>
<body> <body>
<div id="svg"></div> <div id="svg"></div>
<script src="freesewing.js"></script> <script src="https://unpkg.com/freesewing"></script>
<script src="https://unpkg.com/@freesewing/plugin-bundle"></script> <script src="https://unpkg.com/@freesewing/plugin-bundle"></script>
<script src="brian.js"></script> <script src="https://unpkg.com/@freesewing/brian"></script>
<script src="dist/browser.js"></script> <script src="dist/browser.js"></script>
<script src="tmp/theme.js"></script> <script src="https://unpkg.com/@freesewing/plugin-theme"></script>
<script src="tmp/designer.js"></script> <script src="https://unpkg.com/@freesewing/plugin-designer"></script>
<script src="tmp/models.js"></script> <script src="https://unpkg.com/@freesewing/plugin-validate"></script>
<script src="tmp/antmantest.js"></script> <script src="https://unpkg.com/@freesewing/plugin-debug"></script>
<script src="tmp/validate.js"></script> <script src="https://unpkg.com/@freesewing/models"></script>
<script src="tmp/debug.js"></script> <script src="https://unpkg.com/@freesewing/antman"></script>
<script> <script>
var pattern = freesewing.patterns.aaron var pattern = freesewing.patterns.aaron
.with(freesewing.plugins.validate) .with(freesewing.plugins.validate)
.with(freesewing.plugins.debug) .with(freesewing.plugins.debug)
.with(freesewing.plugins.theme) .with(freesewing.plugins.theme)
.with(freesewing.plugins.designer) .with(freesewing.plugins.designer)
console.log('freesewing', freesewing);
//pattern.settings.paperless = true; pattern.settings.paperless = true;
pattern.settings.measurements = freesewing.models.men.manSize36; pattern.settings.measurements = freesewing.models.men.manSize36;
pattern.settings.sa = 10; pattern.settings.sa = 10;
pattern.settings.units = 'metric'; pattern.settings.units = 'metric';
pattern.settings.sample = { pattern.settings.sample = {
type: 'measurement', type: 'measurement',
measurement: 'shoulderToShoulder' measurement: 'shoulderToShoulder'
} }
//pattern.sampleOption('lengthBonus');
//pattern.sampleOption('backlineBend');
//pattern.sampleMeasurement('bicepsCircumference'); //pattern.sampleMeasurement('bicepsCircumference');
//pattern.sampleModels(freesewing.antmantest); //pattern.sampleModels(freesewing.models.men);
pattern.draft(); pattern.draft();
//pattern.sample();
document.getElementById("svg").innerHTML = pattern.render(); document.getElementById("svg").innerHTML = pattern.render();
function pointHover(evt) { function pointHover(evt) {

View file

@ -911,52 +911,96 @@
} }
}, },
"@freesewing/brian": { "@freesewing/brian": {
"version": "0.6.6", "version": "0.7.3",
"resolved": "https://registry.npmjs.org/@freesewing/brian/-/brian-0.6.6.tgz", "resolved": "https://registry.npmjs.org/@freesewing/brian/-/brian-0.7.3.tgz",
"integrity": "sha512-ewoeHooiHEr1nXdWU0yK24cDODdnNPLK1KyMF+Vc3RIje9z8nKgn7IZR1cZTEjz9TuppAvZGCHkS2xJ8HGU6kw==", "integrity": "sha512-Oh3R1AHgN5zzl40Y8aqHoMB5Zkx7crkqq5J1/0nRN6hqDp2pH1IA5EP2gGr1NhsHAWZtxcnbYisoNg0l3NNM5g==",
"requires": { "requires": {
"@freesewing/plugin-bundle": "0.0.1", "@freesewing/plugin-bundle": "0.1.6",
"freesewing": "0.6.2" "freesewing": "0.10.1"
},
"dependencies": {
"@freesewing/plugin-bundle": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.1.6.tgz",
"integrity": "sha512-XhkI8bCbRQjsDoLJOpCtLc3YQbD54VPnhimso2cVonkICXW4TufgfRUQ/SNPfWBecblhaZkppF7mLpOcWZaXjQ==",
"requires": {
"@freesewing/plugin-cutonfold": "0.9.0",
"@freesewing/plugin-dimension": "0.5.2",
"@freesewing/plugin-grainline": "0.0.3",
"@freesewing/plugin-logo": "0.3.3",
"@freesewing/plugin-scalebox": "0.1.0",
"@freesewing/plugin-title": "0.6.2"
}
},
"@freesewing/plugin-dimension": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.5.2.tgz",
"integrity": "sha512-84wqa905cwprdKw8vqs5/y8VvphXdkeUgCgzfY28Y6N1L1MhKOn/Dpux2C9AN5xUpFv/aopuId/9b8fGjTuZww=="
},
"@freesewing/plugin-grainline": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.0.3.tgz",
"integrity": "sha512-Oa+FvjsdDfWxIoXa8bATYwj1Neg6q+gNQWJyX7j1HlJnEflsQtJBB8fqwcGJzeK/QDJauvbAm3sBJP30gMwSTw=="
},
"@freesewing/plugin-logo": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.3.3.tgz",
"integrity": "sha512-t9VBoZvFx0tR83bFQMpc4iH/oJaXVr41zX0N8AogTt+FEjnHnZSmCJGTfpYkPtp1mWJSc4ibS95Gyh9c4YNgGA=="
},
"freesewing": {
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.10.1.tgz",
"integrity": "sha512-SUQ0xvIClT7krbnUujeymZ1qNtR69p8MDCcqdKpbp1XVzhvYIpQLDPBos01434HrKGF8RmMnZUFGZNsJ/g6TIA==",
"requires": {
"bezier-js": "2.2.14",
"bin-pack": "1.0.2",
"hooks": "0.3.2"
}
}
} }
}, },
"@freesewing/plugin-bundle": { "@freesewing/plugin-bundle": {
"version": "0.0.1", "version": "0.1.6",
"resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.0.1.tgz", "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.1.6.tgz",
"integrity": "sha512-LLqw/HD23K1XmnuoPUbUK9PhrawcKemYn8eBjt1Jvqn9xD6HvndPeB8nwJ4/i/L02yA8ZqXTDnGvi5gMzc0kVw==", "integrity": "sha512-XhkI8bCbRQjsDoLJOpCtLc3YQbD54VPnhimso2cVonkICXW4TufgfRUQ/SNPfWBecblhaZkppF7mLpOcWZaXjQ==",
"requires": { "requires": {
"@freesewing/plugin-cutonfold": "0.9.0", "@freesewing/plugin-cutonfold": "0.9.0",
"@freesewing/plugin-dimension": "0.4.0", "@freesewing/plugin-dimension": "0.5.2",
"@freesewing/plugin-grainline": "0.0.2", "@freesewing/plugin-grainline": "0.0.3",
"@freesewing/plugin-logo": "0.3.2", "@freesewing/plugin-logo": "0.3.3",
"@freesewing/plugin-scalebox": "0.1.0",
"@freesewing/plugin-title": "0.6.2" "@freesewing/plugin-title": "0.6.2"
}
}, },
"dependencies": {
"@freesewing/plugin-cutonfold": { "@freesewing/plugin-cutonfold": {
"version": "0.9.0", "version": "0.9.0",
"resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.9.0.tgz", "resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.9.0.tgz",
"integrity": "sha512-FZC6bSaDMgXKDzIU5ynByHmiVIVDXKzB9rlxZyldv+q8c0T/xfJ/x15wcey2Bffj/pv37hzLI+CocwGLHjWH7g==" "integrity": "sha512-FZC6bSaDMgXKDzIU5ynByHmiVIVDXKzB9rlxZyldv+q8c0T/xfJ/x15wcey2Bffj/pv37hzLI+CocwGLHjWH7g=="
}, },
"@freesewing/plugin-dimension": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.5.2.tgz",
"integrity": "sha512-84wqa905cwprdKw8vqs5/y8VvphXdkeUgCgzfY28Y6N1L1MhKOn/Dpux2C9AN5xUpFv/aopuId/9b8fGjTuZww=="
},
"@freesewing/plugin-grainline": { "@freesewing/plugin-grainline": {
"version": "0.0.2", "version": "0.0.3",
"resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.0.2.tgz", "resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.0.3.tgz",
"integrity": "sha512-9aaUvxK9rdXMpOZhR+/Ew8VDa9CFmDKF8lULupETd99h0E8XT6iTVeiRWuufQ1hpidYzfshN3Iz2VIIjURj+mA==" "integrity": "sha512-Oa+FvjsdDfWxIoXa8bATYwj1Neg6q+gNQWJyX7j1HlJnEflsQtJBB8fqwcGJzeK/QDJauvbAm3sBJP30gMwSTw=="
}, },
"@freesewing/plugin-logo": { "@freesewing/plugin-logo": {
"version": "0.3.2", "version": "0.3.3",
"resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.3.2.tgz", "resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.3.3.tgz",
"integrity": "sha512-cYmMAcvWl7B0RC3LUaCNRVj98nDIsT47Uf+84fQAnsAeZeAyiA1Y1NmPlmb3n30znlFwiJYjII7cRBn73l6wGQ==" "integrity": "sha512-t9VBoZvFx0tR83bFQMpc4iH/oJaXVr41zX0N8AogTt+FEjnHnZSmCJGTfpYkPtp1mWJSc4ibS95Gyh9c4YNgGA=="
},
"@freesewing/plugin-scalebox": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/@freesewing/plugin-scalebox/-/plugin-scalebox-0.1.0.tgz",
"integrity": "sha512-CKPM5BjJI4p0dLHIFlhaw+Zn7QCbCq9j8R50oSQGuarUXKD4g6Vp2uQYK9NVFbxHBy9PBRpnRSQueN4OEzGdTw=="
}, },
"@freesewing/plugin-title": { "@freesewing/plugin-title": {
"version": "0.6.2", "version": "0.6.2",
"resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.6.2.tgz", "resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.6.2.tgz",
"integrity": "sha512-OpiM4qQ0kN8NAP/OZkjveiMcebwk/ZBwfng9sVFDxp3zAB1YisoYgYjFoURCqR7ePAMbAa66sXD+o0YgITR9wg==" "integrity": "sha512-OpiM4qQ0kN8NAP/OZkjveiMcebwk/ZBwfng9sVFDxp3zAB1YisoYgYjFoURCqR7ePAMbAa66sXD+o0YgITR9wg=="
}
}
},
"@freesewing/plugin-dimension": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.4.0.tgz",
"integrity": "sha512-W4O3p4LlvNVt9bRG/2obKrzAWqX7MogdX2E1TYN8nJX0+KMBKArvQyR6RnODXWHuK2Mh+KZkF/dqVKqAc9EMDg=="
}, },
"@samverschueren/stream-to-observable": { "@samverschueren/stream-to-observable": {
"version": "0.3.0", "version": "0.3.0",
@ -972,7 +1016,7 @@
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
"integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
"requires": { "requires": {
"mime-types": "2.1.19", "mime-types": "2.1.20",
"negotiator": "0.6.1" "negotiator": "0.6.1"
} }
}, },
@ -2886,9 +2930,9 @@
} }
}, },
"freesewing": { "freesewing": {
"version": "0.6.2", "version": "0.10.2",
"resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.6.2.tgz", "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.10.2.tgz",
"integrity": "sha512-6PhbiIRIOWWEOE0ZmQm7qGInnL1WA+dHFbVJkgAIBoBZUkEddIMxGSQV2/t3ZYyDad+jc+n5pjKSeWQgGu+7nQ==", "integrity": "sha512-TKS3J9lyx4CL5MNOHobiObRQGViCx6NJYr9tgr5QTXZ2Ledd2uaJDtN5dYCXaAXKdDV0Ejmv68jR7rp7G5KYFQ==",
"requires": { "requires": {
"bezier-js": "2.2.14", "bezier-js": "2.2.14",
"bin-pack": "1.0.2", "bin-pack": "1.0.2",
@ -4803,7 +4847,7 @@
"integrity": "sha1-RJhkS7+Bpm8Y3Y3/3vYcTBw3TKM=", "integrity": "sha1-RJhkS7+Bpm8Y3Y3/3vYcTBw3TKM=",
"requires": { "requires": {
"chokidar": "1.7.0", "chokidar": "1.7.0",
"colors": "1.3.1", "colors": "1.3.2",
"connect": "3.5.1", "connect": "3.5.1",
"cors": "2.8.4", "cors": "2.8.4",
"event-stream": "3.3.4", "event-stream": "3.3.4",
@ -4818,9 +4862,9 @@
}, },
"dependencies": { "dependencies": {
"colors": { "colors": {
"version": "1.3.1", "version": "1.3.2",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.3.1.tgz", "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz",
"integrity": "sha512-jg/vxRmv430jixZrC+La5kMbUWqIg32/JsYNZb94+JEmzceYbWKTsv1OuTp+7EaqiaWRR2tPcykibwCRgclIsw==" "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ=="
}, },
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
@ -5027,16 +5071,16 @@
"integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
}, },
"mime-db": { "mime-db": {
"version": "1.35.0", "version": "1.36.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
"integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw=="
}, },
"mime-types": { "mime-types": {
"version": "2.1.19", "version": "2.1.20",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
"integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
"requires": { "requires": {
"mime-db": "1.35.0" "mime-db": "1.36.0"
} }
}, },
"mimic-fn": { "mimic-fn": {
@ -6193,7 +6237,7 @@
"debug": "2.6.9", "debug": "2.6.9",
"escape-html": "1.0.3", "escape-html": "1.0.3",
"http-errors": "1.6.3", "http-errors": "1.6.3",
"mime-types": "2.1.19", "mime-types": "2.1.20",
"parseurl": "1.3.2" "parseurl": "1.3.2"
}, },
"dependencies": { "dependencies": {

View file

@ -28,7 +28,7 @@
"clean": "rimraf dist", "clean": "rimraf dist",
"pretty": "npx prettier --write \"src/*.js\"", "pretty": "npx prettier --write \"src/*.js\"",
"lint": "eslint --fix \"src/*.js\"", "lint": "eslint --fix \"src/*.js\"",
"watch": "npx webpack --watch", "watch": "rollup -w -c rollup.js -o dist/browser.js -f iife -n freesewing_patterns_aaron --footer 'freesewing.patterns.aaron = freesewing_patterns_aaron;'",
"browserbuild": "rollup -c rollup.js -o dist/browser.js -f iife -n freesewing_patterns_aaron --footer 'freesewing.patterns.aaron = freesewing_patterns_aaron;'", "browserbuild": "rollup -c rollup.js -o dist/browser.js -f iife -n freesewing_patterns_aaron --footer 'freesewing.patterns.aaron = freesewing_patterns_aaron;'",
"nodebuild": "rollup -c rollup.js -o dist/index.js -f cjs", "nodebuild": "rollup -c rollup.js -o dist/index.js -f cjs",
"modulebuild": "rollup -c rollup.js -o dist/index.mjs -f es", "modulebuild": "rollup -c rollup.js -o dist/index.mjs -f es",
@ -46,9 +46,9 @@
] ]
}, },
"dependencies": { "dependencies": {
"@freesewing/brian": "0.6.6", "@freesewing/brian": "0.7.3",
"@freesewing/plugin-bundle": "0.0.1", "@freesewing/plugin-bundle": "0.1.6",
"freesewing": "^0.6.2" "freesewing": "0.10.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.0.0-beta.56", "@babel/core": "7.0.0-beta.56",

View file

@ -1,57 +1,84 @@
import freesewing from "freesewing"; import { dimensions } from './shared';
import * as shared from "./shared";
var back = { var back = {
draft: function(part) { draft: function(part) {
// prettier-ignore // prettier-ignore
let {store, sa, points, Path, paths, Snippet, snippets, final, paperless, macro} = part.shorthand(); let {store, sa, Point, points, Path, paths, Snippet, snippets, options, final, paperless, macro, utils, units} = part.shorthand();
points.strapLeftCp2 = utils.beamsIntersect(
points.strapLeft,
points.strapCenter.rotate(90, points.strapLeft),
points.cbNeck,
points.cbNeck.shift(0,10)
);
points.armholeCp2 = points.aaronArmhole.shiftFractionTowards(points.armholeCorner, options.backlineBend);
points.strapRightCp1 = points.strapRight.shiftFractionTowards(points.armholeCorner, options.backlineBend);
// Seamline // Seamline
paths.seam = shared.seamLine("back", points, Path); paths.seam = new Path()
.move(points.cbNeck)
// Store lengths to fit sleeve .line(points.cbHips)
store.set("backArmholeLength", shared.armholeLength(points, Path)); .line(points.hips)
store.set( .line(points.waist)
"backShoulderToArmholePitch", .join(paths.side)
shared.shoulderToArmholePitch(points, Path) .curve(points.armholeCp2, points.strapRightCp1, points.strapRight)
); .line(points.strapLeft)
.curve(points.strapLeftCp2, points.cbNeck, points.cbNeck)
.close()
.attr("class", "fabric");
// Final? // Final?
if (final) { if (final) {
let neckOpeningLength = new Path()
.move(points.strapLeft)
.curve(points.strapLeftCp2, points.cbNeck, points.cbNeck)
.length() + store.get('frontNeckOpeningLength');
let armholeLength = new Path()
.move(points.aaronArmhole)
.curve(points.armholeCp2, points.strapRightCp1, points.strapRight)
.length() + store.get('frontArmholeLength');
points.bindinAnchor = new Point(points.aaronArmhole.x / 4, points.aaronArmhole.y)
.attr('data-text', 'cutTwoStripsToFinishTheArmholes')
.attr('data-text', ":\n")
.attr('data-text', "width")
.attr('data-text', ":")
.attr('data-text', units(sa*6))
.attr('data-text', "\n")
.attr('data-text', "length")
.attr('data-text', ":")
.attr('data-text', units(armholeLength * 0.95 + 2*sa))
.attr('data-text', "\n&nbsp;\n")
.attr('data-text', 'cutOneStripToFinishTheNeckOpening')
.attr('data-text', ":\n")
.attr('data-text', "width")
.attr('data-text', ":")
.attr('data-text', units(sa*6))
.attr('data-text', "\n")
.attr('data-text', "length")
.attr('data-text', ":")
.attr('data-text', units(neckOpeningLength * 0.95 + 2*sa))
.attr('data-text-lineheight', 6);
macro("cutonfold", { macro("cutonfold", {
from: points.cbNeck, from: points.cfNeck,
to: points.cbHips, to: points.cfHips,
grainline: true grainline: true
}); });
macro("title", { at: points.title, nr: 2, title: "back" }); macro("title", { at: points.title, nr: 2, title: "back" });
snippets.armholePitchNotch = new Snippet("bnotch", points.armholePitch); points.scaleboxAnchor = points.scalebox = points.title.shift(90, 100);
if (sa) paths.sa = paths.seam.offset(sa).attr("class", "fabric sa"); macro("scalebox", { at: points.scalebox });
} }
// Paperless? // Paperless?
if (paperless) { if (paperless) {
shared.dimensions(macro, points, Path, sa); dimensions(macro, points, sa);
macro("hd", {
from: points.cbHips,
to: points.hips,
y: points.hips.y + sa + 15
});
macro("vd", { macro("vd", {
from: points.cbHips, from: points.cbHips,
to: points.cbNeck, to: points.cbNeck,
x: points.cbHips.x - sa - 15 x: points.cbHips.x - sa - 15
}); });
macro("hd", {
from: points.cbNeck,
to: points.neck,
y: points.neck.y - sa - 15
});
macro("hd", {
from: points.cbNeck,
to: points.shoulder,
y: points.neck.y - sa - 30
});
} }
return part; return part;

View file

@ -1,4 +1,4 @@
//import * as shared from "./shared"; import { dimensions } from './shared';
var front = { var front = {
draft: function(part) { draft: function(part) {
@ -14,7 +14,7 @@ var front = {
points[`cb${key}`].x, points[`cb${key}`].x,
points[`cb${key}`].y points[`cb${key}`].y
); );
delete points[`cb${key}`]; //delete points[`cb${key}`];
} }
// Neckline // Neckline
@ -26,7 +26,7 @@ var front = {
points.strapCenter = points.neck.shiftFractionTowards(points.shoulder, options.shoulderStrapPlacement); points.strapCenter = points.neck.shiftFractionTowards(points.shoulder, options.shoulderStrapPlacement);
points.strapLeft = points.strapCenter.shiftTowards(points.neck, points.neck.dist(points.shoulder) * options.shoulderStrapWidth); points.strapLeft = points.strapCenter.shiftTowards(points.neck, points.neck.dist(points.shoulder) * options.shoulderStrapWidth);
points.strapRight = points.strapLeft.rotate(180, points.strapCenter); points.strapRight = points.strapLeft.rotate(180, points.strapCenter);
points.necklineCorner = utils.beamsCross( points.necklineCorner = utils.beamsIntersect(
points.strapLeft, points.strapLeft,
points.strapRight.rotate(-90, points.strapLeft), points.strapRight.rotate(-90, points.strapLeft),
points.cfNeck.shift(0, points.armholePitch.x/4), points.cfNeck.shift(0, points.armholePitch.x/4),
@ -40,36 +40,55 @@ var front = {
points.waist.x = points.hips.x; // Because stretch points.waist.x = points.hips.x; // Because stretch
points.waistCp2 = points.waist.shift(90,points.armhole.dy(points.waist)/2); points.waistCp2 = points.waist.shift(90,points.armhole.dy(points.waist)/2);
// Armhole drop
let side = new Path()
.move(points.hips)
.line(points.waist)
.curve(points.waistCp2, points.armhole, points.armhole);
let split = side.intersectsY(points.armhole.y * (1 + options.armholeDrop)).pop();
paths.side = side.split(split)[0];
paths.side.render = false;
points.aaronArmhole = split;
// Armhole // Armhole
points.armholeCorner = utils.beamsCross( points.armholeCorner = utils.beamsIntersect(
points.armhole, points.aaronArmhole,
points.armholeCp2, points.aaronArmhole.shift(180,10),
points.strapRight, points.strapRight,
points.strapLeft.rotate(90, points.strapRight) points.strapLeft.rotate(90, points.strapRight)
); );
points.armholeCp2 = points.armhole.shiftFractionTowards(points.armholeCorner, 0.8); points.armholeCp2 = points.aaronArmhole.shiftFractionTowards(points.armholeCorner, 0.8);
points.strapRightCp1 = points.strapRight.shiftFractionTowards(points.armholeCorner, 0.6); points.strapRightCp1 = points.strapRight.shiftFractionTowards(points.armholeCorner, 0.6);
// Armhole drop
console.log('cfneck', points.cfNeck);
console.log(measurements.naturalWaistToHip);
console.log(measurements.centerBackNeckToWaist);
// Seamline // Seamline
paths.seam = new Path() paths.seam = new Path()
.move(points.cfNeck) .move(points.cfNeck)
.line(points.cfHips) .line(points.cfHips)
.line(points.hips) .line(points.hips)
.line(points.waist) .line(points.waist)
.curve(points.waistCp2, points.armhole, points.armhole) .join(paths.side)
.curve(points.armholeCp2, points.strapRightCp1, points.strapRight) .curve(points.armholeCp2, points.strapRightCp1, points.strapRight)
.line(points.strapLeft) .line(points.strapLeft)
.curve(points.strapLeftCp2, points.cfNeckCp1, points.cfNeck) .curve(points.strapLeftCp2, points.cfNeckCp1, points.cfNeck)
.close() .close()
.attr("class", "fabric"); .attr("class", "fabric");
/*
// Store length of armhole and neck opening
store.set(
'frontArmholeLength',
new Path()
.move(points.aaronArmhole)
.curve(points.armholeCp2, points.strapRightCp1, points.strapRight)
.length()
);
store.set(
'frontNeckOpeningLength',
new Path()
.move(points.strapLeft)
.curve(points.cfNeckCp1, points.cfNeckCp1, points.cfNeck)
.length()
);
// Final? // Final?
if (final) { if (final) {
macro("cutonfold", { macro("cutonfold", {
@ -77,36 +96,46 @@ var front = {
to: points.cfHips, to: points.cfHips,
grainline: true grainline: true
}); });
points.title = new Point(points.waist.x/2, points.waist.y);
macro("title", { at: points.title, nr: 1, title: "front" }); macro("title", { at: points.title, nr: 1, title: "front" });
snippets.armholePitchNotch = new Snippet("notch", points.armholePitch); points.logo = points.title.shift(-90, 75);
if (sa) paths.sa = paths.seam.offset(sa).attr("class", "fabric sa"); snippets.logo = new Snippet("logo", points.logo);
if (sa) {
paths.saShoulder = new Path()
.move(points.strapRight)
.line(points.strapLeft)
.offset(sa)
.line(points.strapLeft)
.attr("class", "fabric sa");
paths.saShoulder
.move(points.strapRight)
.line(paths.saShoulder.start());
paths.saSide = paths.side
.offset(sa)
.line(points.aaronArmhole)
.attr("class", "fabric sa");
paths.saHem = new Path()
.move(points.cfHips)
.line(points.hips)
.offset(sa * 2.5).attr("class", "fabric sa")
.line(paths.saSide.start());
paths.saHem
.move(points.cfHips)
.line(paths.saHem.start());
}
} }
// Paperless? // Paperless?
if (paperless) { if (paperless) {
shared.dimensions(macro, points, Path, sa); dimensions(macro, points, sa);
macro("hd", {
from: points.cfHips,
to: points.hips,
y: points.hips.y + sa + 15
});
macro("vd", { macro("vd", {
from: points.cfHips, from: points.cfHips,
to: points.cfNeck, to: points.cfNeck,
x: points.cfHips.x - sa - 15 x: points.cfHips.x - sa - 15
}); });
macro("hd", {
from: points.cfNeck,
to: points.neck,
y: points.neck.y - sa - 15
});
macro("hd", {
from: points.cfNeck,
to: points.shoulder,
y: points.neck.y - sa - 30
});
} }
*/
return part; return part;
} }
}; };

View file

@ -13,8 +13,13 @@ var pattern = new freesewing.Pattern({ version: version, ...config })
pattern.draft = function() { pattern.draft = function() {
this.parts.base = this.draftBase(new pattern.Part()); this.parts.base = this.draftBase(new pattern.Part());
if (!this.needs("base", true)) this.parts.base.render = false;
if (this.needs(["back", "front"])) {
this.parts.front = this.draftFront(new pattern.Part().copy(this.parts.base)); this.parts.front = this.draftFront(new pattern.Part().copy(this.parts.base));
//this.parts.back = this.draftBack(this); }
if (this.needs(["back"])) {
this.parts.back = this.draftBack(new pattern.Part().copy(this.parts.front));
}
return pattern; return pattern;
}; };

View file

@ -1,91 +1,37 @@
export function seamLine(side, points, Path) { export function dimensions(macro, points, sa) {
let path = new Path(); macro("hd", {
if (side === "back") { from: points.cfHips,
path.move(points.cbNeck); to: points.hips,
path.line(points.cbHips); y: points.hips.y + sa * 2.5 + 15
} else {
path.move(points.cfNeck);
path.line(points.cfHips);
}
path
.line(points.hips)
.line(points.armhole)
.curve(points.armholeCp1, points.armholeCp2, points.armholeHollow)
.curve(
points.armholeHollowCp1,
points.armholeHollowCp2,
points.armholePitch
)
.curve(points.armholePitchCp1, points.armholePitchCp2, points.shoulder)
.line(points.neck);
if (side === "back") {
path.curve(points.neckCp1, points.cbNeck, points.cbNeck);
} else {
path.curve(points.neckCp1, points.neckCp2, points.cfNeck);
}
path.close().attr("class", "fabric");
return path;
}
export function armholeLength(points, Path) {
return new Path()
.move(points.armhole)
.curve(points.armholeCp1, points.armholeCp2, points.armholeHollow)
.curve(
points.armholeHollowCp1,
points.armholeHollowCp2,
points.armholePitch
)
.curve(points.armholePitchCp1, points.armholePitchCp2, points.shoulder)
.length();
}
export function shoulderToArmholePitch(points, Path) {
return new Path()
.move(points.armholePitch)
.curve(points.armholePitchCp1, points.armholePitchCp2, points.shoulder)
.length();
}
export function dimensions(macro, points, Path, sa) {
macro("pd", {
path: new Path()
.move(points.armhole)
.curve(points.armholeCp1, points.armholeCp2, points.armholeHollow)
.curve(
points.armholeHollowCp1,
points.armholeHollowCp2,
points.armholePitch
)
.curve(points.armholePitchCp1, points.armholePitchCp2, points.shoulder),
d: sa + 15
}); });
macro("pd", { macro("hd", {
path: new Path() from: points.cfNeck,
.move(points.armholePitch) to: points.strapLeft,
.curve(points.armholePitchCp1, points.armholePitchCp2, points.shoulder), y: points.neck.y - sa - 15
d: -15 });
macro("hd", {
from: points.cfNeck,
to: points.strapRight,
y: points.neck.y - sa - 30
}); });
macro("vd", { macro("vd", {
from: points.hips, from: points.hips,
to: points.armhole, to: points.aaronArmhole,
x: points.hips.x + sa + 15 x: points.aaronArmhole.x + sa + 15
}); });
macro("vd", { macro("vd", {
from: points.hips, from: points.hips,
to: points.armholePitch, to: points.strapRight,
x: points.hips.x + sa + 30 x: points.aaronArmhole.x + sa + 30
}); });
macro("vd", { macro("vd", {
from: points.hips, from: points.hips,
to: points.shoulder, to: points.strapLeft,
x: points.hips.x + sa + 45 x: points.aaronArmhole.x + sa + 45
}); });
macro("vd", { macro("hd", {
from: points.hips, from: points.cfNeck,
to: points.neck, to: points.aaronArmhole,
x: points.hips.x + sa + 60 y: points.neck.y - sa - 45
}); });
macro("ld", { from: points.neck, to: points.shoulder, d: sa + 15 });
} }