1
0
Fork 0

construction: Started working on the armhole

This commit is contained in:
joostdecock 2018-07-18 18:19:46 +00:00 committed by Joost De Cock
parent e5fe4cc2d2
commit dc8766724e
5 changed files with 204 additions and 202 deletions

File diff suppressed because one or more lines are too long

View file

@ -6,41 +6,58 @@
</head>
<body>
<div id="svg"></div>
<script type="text/javascript" src="dist/browser/bundle.js"></script></body>
<script>
var pattern = freesewing_patterns_brian;
pattern.settings.measurements = {
bicepsCircumference: 305,
centerBackNeckToWaist: 495,
chestCircumference: 965,
hipsCircumference: 838,
naturalWaistToHip: 110,
neckCircumference: 391,
shoulderSlope: 49,
shoulderToShoulder: 444,
shoulderToWrist: 680,
wristCircumference: 185
};
pattern.draft();
document.getElementById("svg").innerHTML = pattern.render();
function pointHover(evt) {
var point = evt.target;
var id = point.id;
var cx = point.getAttribute('x');
var cy = point.getAttribute('y');
console.log('Point '+id+' ( '+cx+' , '+cy+' )');
var scale = 2;
cx = cx-scale*cx;
cy = cy-scale*cy;
point.setAttribute("transform", 'matrix('+scale+', 0, 0, '+scale+', '+cx+', '+cy+')');
pointUnhover(id);
}
function pointUnhover(id) {
setTimeout(function(){
document.getElementById(id).removeAttribute("transform", '');
}, 500);
}
console.log(pattern.parts.backBlock.points);
</script>
<script type="text/javascript" src="dist/browser/bundle.js"></script>
<script type="text/javascript" src="theme-default.js"></script>
<script type="text/javascript" src="theme-designer.js"></script>
<script>
var pattern = freesewing_patterns_brian;
pattern.settings.measurements = {
bicepsCircumference: 305,
centerBackNeckToWaist: 495,
chestCircumference: 965,
hipsCircumference: 838,
naturalWaistToHip: 110,
neckCircumference: 391,
shoulderSlope: 49,
shoulderToShoulder: 444,
shoulderToWrist: 680,
wristCircumference: 185
};
//pattern.on('preRenderSvg', function(next) {
// this.style += 'path { fill: red;}';
// next();
//});
//pattern.on('preRenderSvg', function(next) {
// this.style += 'path { stroke: green; stroke-width: 30;}';
// next();
//});
//pattern.on('postRenderSvg', function(next) {
// this.svg = this.svg.replace('green', 'yellow');
// next();
//});
console.log(pattern);
//console.log(freesewing_theme_default);
pattern.loadPlugin(freesewing_theme_designer);
pattern.loadPlugin(freesewing_theme_default);
pattern.draft();
document.getElementById("svg").innerHTML = pattern.render();
function pointHover(evt) {
var point = evt.target;
var id = point.id;
var cx = point.getAttribute('x');
var cy = point.getAttribute('y');
console.log('Point '+id+' ( '+cx+' , '+cy+' )');
var scale = 2;
cx = cx-scale*cx;
cy = cy-scale*cy;
point.setAttribute("transform", 'matrix('+scale+', 0, 0, '+scale+', '+cx+', '+cy+')');
pointUnhover(id);
}
function pointUnhover(id) {
setTimeout(function(){
document.getElementById(id).removeAttribute("transform", '');
}, 500);
}
</script>
</body>
</html>

View file

@ -921,6 +921,11 @@
"integrity": "sha512-s4DEKMSMU02YR5qeXI4U9/DvyrUzUIheN+JSArGRd70Pzv7ZRKMyNlzrA837h9C8eMmoU9TDFPJtqh8S29dwmQ==",
"dev": true
},
"@freesewing/theme-default": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/@freesewing/theme-default/-/theme-default-0.0.2.tgz",
"integrity": "sha512-FOCROdVvOOVZ5jWiF8Bof1qN827xLbf0+TWstcBxYUNAA85aDc1NdTj7FUBJTtg9xJcuZ6+iktpo88dhT+46ow=="
},
"@webassemblyjs/ast": {
"version": "1.5.13",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz",
@ -2247,9 +2252,9 @@
"integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
},
"bezier-js": {
"version": "2.2.13",
"resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-2.2.13.tgz",
"integrity": "sha512-RLQV6Jr6g7J5IDJXFYUhbwBJjuFi1JTsA2PdsVMnwbT7fQhZvEwtI7YF4k+6DEpXsRQ3o3iPj+cOaMP5DjtKsg==",
"version": "2.2.14",
"resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-2.2.14.tgz",
"integrity": "sha512-CcEwvcCbYY2eEmxEGfR5F6xbDRwTdkRuoChMPtZ18pthLCeIyfPqD8WeL1s7ojaowUbTODiOUyEKjynuObzYaQ==",
"requires": {
"live-server": "^1.2.0"
}
@ -2836,6 +2841,16 @@
"finalhandler": "0.5.1",
"parseurl": "~1.3.1",
"utils-merge": "1.0.0"
},
"dependencies": {
"debug": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
"integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
"requires": {
"ms": "0.7.1"
}
}
}
},
"connect-history-api-fallback": {
@ -3029,11 +3044,18 @@
"dev": true
},
"debug": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
"integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "0.7.1"
"ms": "2.0.0"
},
"dependencies": {
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
},
"decamelize": {
@ -3368,9 +3390,9 @@
"dev": true
},
"eslint-scope": {
"version": "3.7.3",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz",
"integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
"integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
"dev": true,
"requires": {
"esrecurse": "^4.1.0",
@ -3682,6 +3704,16 @@
"on-finished": "~2.3.0",
"statuses": "~1.3.1",
"unpipe": "~1.0.0"
},
"dependencies": {
"debug": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
"integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
"requires": {
"ms": "0.7.1"
}
}
}
},
"find-cache-dir": {
@ -3775,9 +3807,9 @@
}
},
"freesewing": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.3.0.tgz",
"integrity": "sha512-SyI29kykGZH56mxMKHGXyMlVjVfBpH5sLyLZP3QVAe3+DJ3XCusa9VYmrHB1UeeuPXBSCwtPScBpqGPGcEA9DQ==",
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.3.1.tgz",
"integrity": "sha512-8rkwGJHvAVxLPm33LDENjgJfiXgPHpUI4uY0W5ZsVOv9MZjTzJEMbwCcCQ7xgcUNGM2GjhiCAwwEQnFPQHdd/g==",
"requires": {
"bezier-js": "^2.2.13"
}
@ -3855,21 +3887,19 @@
"bundled": true,
"optional": true,
"requires": {
"delegates": "1.0.0",
"readable-stream": "2.3.6"
"delegates": "^1.0.0",
"readable-stream": "^2.0.6"
}
},
"balanced-match": {
"version": "1.0.0",
"bundled": true,
"optional": true
"bundled": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"optional": true,
"requires": {
"balanced-match": "1.0.0",
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
@ -3880,18 +3910,15 @@
},
"code-point-at": {
"version": "1.1.0",
"bundled": true,
"optional": true
"bundled": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
"optional": true
"bundled": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
"optional": true
"bundled": true
},
"core-util-is": {
"version": "1.0.2",
@ -3926,7 +3953,7 @@
"bundled": true,
"optional": true,
"requires": {
"minipass": "2.2.4"
"minipass": "^2.2.1"
}
},
"fs.realpath": {
@ -3939,14 +3966,14 @@
"bundled": true,
"optional": true,
"requires": {
"aproba": "1.2.0",
"console-control-strings": "1.1.0",
"has-unicode": "2.0.1",
"object-assign": "4.1.1",
"signal-exit": "3.0.2",
"string-width": "1.0.2",
"strip-ansi": "3.0.1",
"wide-align": "1.1.2"
"aproba": "^1.0.3",
"console-control-strings": "^1.0.0",
"has-unicode": "^2.0.0",
"object-assign": "^4.1.0",
"signal-exit": "^3.0.0",
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1",
"wide-align": "^1.1.0"
}
},
"glob": {
@ -3954,12 +3981,12 @@
"bundled": true,
"optional": true,
"requires": {
"fs.realpath": "1.0.0",
"inflight": "1.0.6",
"inherits": "2.0.3",
"minimatch": "3.0.4",
"once": "1.4.0",
"path-is-absolute": "1.0.1"
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
},
"has-unicode": {
@ -3972,7 +3999,7 @@
"bundled": true,
"optional": true,
"requires": {
"safer-buffer": "2.1.2"
"safer-buffer": "^2.1.0"
}
},
"ignore-walk": {
@ -3980,7 +4007,7 @@
"bundled": true,
"optional": true,
"requires": {
"minimatch": "3.0.4"
"minimatch": "^3.0.4"
}
},
"inflight": {
@ -3988,14 +4015,13 @@
"bundled": true,
"optional": true,
"requires": {
"once": "1.4.0",
"wrappy": "1.0.2"
"once": "^1.3.0",
"wrappy": "1"
}
},
"inherits": {
"version": "2.0.3",
"bundled": true,
"optional": true
"bundled": true
},
"ini": {
"version": "1.3.5",
@ -4005,9 +4031,8 @@
"is-fullwidth-code-point": {
"version": "1.0.0",
"bundled": true,
"optional": true,
"requires": {
"number-is-nan": "1.0.1"
"number-is-nan": "^1.0.0"
}
},
"isarray": {
@ -4018,23 +4043,20 @@
"minimatch": {
"version": "3.0.4",
"bundled": true,
"optional": true,
"requires": {
"brace-expansion": "1.1.11"
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
"bundled": true,
"optional": true
"bundled": true
},
"minipass": {
"version": "2.2.4",
"bundled": true,
"optional": true,
"requires": {
"safe-buffer": "5.1.1",
"yallist": "3.0.2"
"safe-buffer": "^5.1.1",
"yallist": "^3.0.0"
}
},
"minizlib": {
@ -4042,13 +4064,12 @@
"bundled": true,
"optional": true,
"requires": {
"minipass": "2.2.4"
"minipass": "^2.2.1"
}
},
"mkdirp": {
"version": "0.5.1",
"bundled": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
}
@ -4063,9 +4084,9 @@
"bundled": true,
"optional": true,
"requires": {
"debug": "2.6.9",
"iconv-lite": "0.4.21",
"sax": "1.2.4"
"debug": "^2.1.2",
"iconv-lite": "^0.4.4",
"sax": "^1.2.4"
}
},
"node-pre-gyp": {
@ -4073,16 +4094,16 @@
"bundled": true,
"optional": true,
"requires": {
"detect-libc": "1.0.3",
"mkdirp": "0.5.1",
"needle": "2.2.0",
"nopt": "4.0.1",
"npm-packlist": "1.1.10",
"npmlog": "4.1.2",
"rc": "1.2.7",
"rimraf": "2.6.2",
"semver": "5.5.0",
"tar": "4.4.1"
"detect-libc": "^1.0.2",
"mkdirp": "^0.5.1",
"needle": "^2.2.0",
"nopt": "^4.0.1",
"npm-packlist": "^1.1.6",
"npmlog": "^4.0.2",
"rc": "^1.1.7",
"rimraf": "^2.6.1",
"semver": "^5.3.0",
"tar": "^4"
}
},
"nopt": {
@ -4090,8 +4111,8 @@
"bundled": true,
"optional": true,
"requires": {
"abbrev": "1.1.1",
"osenv": "0.1.5"
"abbrev": "1",
"osenv": "^0.1.4"
}
},
"npm-bundled": {
@ -4104,8 +4125,8 @@
"bundled": true,
"optional": true,
"requires": {
"ignore-walk": "3.0.1",
"npm-bundled": "1.0.3"
"ignore-walk": "^3.0.1",
"npm-bundled": "^1.0.1"
}
},
"npmlog": {
@ -4113,16 +4134,15 @@
"bundled": true,
"optional": true,
"requires": {
"are-we-there-yet": "1.1.4",
"console-control-strings": "1.1.0",
"gauge": "2.7.4",
"set-blocking": "2.0.0"
"are-we-there-yet": "~1.1.2",
"console-control-strings": "~1.1.0",
"gauge": "~2.7.3",
"set-blocking": "~2.0.0"
}
},
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
"optional": true
"bundled": true
},
"object-assign": {
"version": "4.1.1",
@ -4132,9 +4152,8 @@
"once": {
"version": "1.4.0",
"bundled": true,
"optional": true,
"requires": {
"wrappy": "1.0.2"
"wrappy": "1"
}
},
"os-homedir": {
@ -4152,8 +4171,8 @@
"bundled": true,
"optional": true,
"requires": {
"os-homedir": "1.0.2",
"os-tmpdir": "1.0.2"
"os-homedir": "^1.0.0",
"os-tmpdir": "^1.0.0"
}
},
"path-is-absolute": {
@ -4171,10 +4190,10 @@
"bundled": true,
"optional": true,
"requires": {
"deep-extend": "0.5.1",
"ini": "1.3.5",
"minimist": "1.2.0",
"strip-json-comments": "2.0.1"
"deep-extend": "^0.5.1",
"ini": "~1.3.0",
"minimist": "^1.2.0",
"strip-json-comments": "~2.0.1"
},
"dependencies": {
"minimist": {
@ -4189,13 +4208,13 @@
"bundled": true,
"optional": true,
"requires": {
"core-util-is": "1.0.2",
"inherits": "2.0.3",
"isarray": "1.0.0",
"process-nextick-args": "2.0.0",
"safe-buffer": "5.1.1",
"string_decoder": "1.1.1",
"util-deprecate": "1.0.2"
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"rimraf": {
@ -4203,7 +4222,7 @@
"bundled": true,
"optional": true,
"requires": {
"glob": "7.1.2"
"glob": "^7.0.5"
}
},
"safe-buffer": {
@ -4238,11 +4257,10 @@
"string-width": {
"version": "1.0.2",
"bundled": true,
"optional": true,
"requires": {
"code-point-at": "1.1.0",
"is-fullwidth-code-point": "1.0.0",
"strip-ansi": "3.0.1"
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
"strip-ansi": "^3.0.0"
}
},
"string_decoder": {
@ -4250,14 +4268,14 @@
"bundled": true,
"optional": true,
"requires": {
"safe-buffer": "5.1.1"
"safe-buffer": "~5.1.0"
}
},
"strip-ansi": {
"version": "3.0.1",
"bundled": true,
"requires": {
"ansi-regex": "2.1.1"
"ansi-regex": "^2.0.0"
}
},
"strip-json-comments": {
@ -4270,13 +4288,13 @@
"bundled": true,
"optional": true,
"requires": {
"chownr": "1.0.1",
"fs-minipass": "1.2.5",
"minipass": "2.2.4",
"minizlib": "1.1.0",
"mkdirp": "0.5.1",
"safe-buffer": "5.1.1",
"yallist": "3.0.2"
"chownr": "^1.0.1",
"fs-minipass": "^1.2.5",
"minipass": "^2.2.4",
"minizlib": "^1.1.0",
"mkdirp": "^0.5.0",
"safe-buffer": "^5.1.1",
"yallist": "^3.0.2"
}
},
"util-deprecate": {
@ -4289,7 +4307,7 @@
"bundled": true,
"optional": true,
"requires": {
"string-width": "1.0.2"
"string-width": "^1.0.2"
}
},
"wrappy": {
@ -5851,21 +5869,6 @@
"depd": "~1.1.1",
"on-finished": "~2.3.0",
"on-headers": "~1.0.1"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
},
"move-concurrently": {
@ -8219,15 +8222,6 @@
"upath": "^1.0.5"
}
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"expand-brackets": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
@ -8496,12 +8490,6 @@
"snapdragon": "^0.8.1",
"to-regex": "^3.0.2"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
}
}
},
@ -8515,9 +8503,9 @@
}
},
"webpack": {
"version": "4.16.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.16.0.tgz",
"integrity": "sha512-oNx9djAd6uAcccyfqN3hyXLNMjZHiRySZmBQ4c8FNmf1SNJGhx7n9TSvHNyXxgToRdH65g/Q97s94Ip9N6F7xg==",
"version": "4.16.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.16.1.tgz",
"integrity": "sha512-6jpzObU18y7lXDJz7XCLvzgrqcJ0rZ2jhKvnTivza9gM2GvPW93xxtmEll2GgmdC0zVQAtbHrH/9BtyMjSDZfA==",
"dev": true,
"requires": {
"@webassemblyjs/ast": "1.5.13",
@ -8531,7 +8519,7 @@
"ajv-keywords": "^3.1.0",
"chrome-trace-event": "^1.0.0",
"enhanced-resolve": "^4.1.0",
"eslint-scope": "^3.7.1",
"eslint-scope": "^4.0.0",
"json-parse-better-errors": "^1.0.2",
"loader-runner": "^2.3.0",
"loader-utils": "^1.1.0",
@ -8588,15 +8576,6 @@
}
}
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"expand-brackets": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
@ -8829,12 +8808,6 @@
"snapdragon": "^0.8.1",
"to-regex": "^3.0.2"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
}
}
},

View file

@ -8,9 +8,8 @@
"test": "echo \"Error: no test specified\" && exit 1",
"nodebuild": "babel src -d dist/node",
"browserbuild": "npx webpack-cli --config webpack.config.js",
"watch": "babel-watch src/index.js",
"run": "nodemon node dist/node/index.js",
"watch": "npx webpack-cli --config webpack.config.js --watch",
"run": "nodemon node dist/node/index.js",
"dev": "webpack-dev-server --open",
"rdev": "webpack-dev-server --disable-host-check --public joost.freesewing.org:8080"
},
@ -25,7 +24,8 @@
},
"homepage": "https://github.com/joostdecock/brian#readme",
"dependencies": {
"freesewing": "^0.3.0"
"@freesewing/theme-default": "0.0.2",
"freesewing": "^0.3.1"
},
"devDependencies": {
"@babel/core": "7.0.0-beta.53",
@ -35,7 +35,7 @@
"babel-loader": "8.0.0-beta.4",
"babel-preset-env": "1.7.0",
"babel-watch": "2.0.7",
"webpack": "4.16.0",
"webpack": "^4.16.1",
"webpack-cli": "3.0.8",
"webpack-dev-server": "3.1.4"
}

View file

@ -28,19 +28,31 @@ var backBlock = {
// Shoulder line
points.neck = new F.point(measurements.neckCircumference / options.collarFactor, 0);
points.shoulder = new F.point(measurements.shoulderToShoulder / 2 + options.shoulderEase / 2, points.cbShoulder.y);
points.shoulderCp2 = points.shoulder.shiftTowards(points.neck, 10).rotate(points.shoulder, 90);
// Armhhole
points.armholePitch = new F.point(measurements.shoulderToShoulder * options.acrossBackFactor / 2, points.armhole.y / 2 - points.shoulder.y / 2);
points._tmp1 = new F.point(points.armholePitch.x, points.armhole.y);
points._tmp2 = points._tmp1.shift(45, 10);
points._tmp3 = F.utils.beamsCross(points._tmp1, points._tmp2, points.armhole, points.armholePitch);
points.armholeHollow = points._tmp1.shiftFractionTowards(points._tmp3, 0.5);
points.armholeCp1 = points.armhole.shift(180, points._tmp1.dx(points.armhole)/4);
points.armholeCp2 = points.armholeHollow.shift(-45, points.armholeHollow.dy(points.armhole)/2);
points.armholeHollowCp1 = points.armholeHollow.shift(135, points.armholePitch.dx(points.armholeHollow));
points.armholeHollowCp2 = points.armholePitch.shift(-90, points.armholePitch.dy(points.armholeHollow)/2);
points.armholePitchCp1 = points.armholePitch.shift(90, points.shoulder.dy(points.armholePitch)/2);
points.armholePitchCp2 = points.shoulder.shiftTowards(points.neck, 10);
// Dafuq rotate?
console.log(points.shoulder.shiftTowards(points.neck, 10));
console.log(points.shoulder.shiftTowards(points.neck, 10).rotate(points.shoulder, 90));
paths.seam = new F.path()
.move(points.cbShoulder)
.line(points.cbHips)
.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)
.curve(points.neck, points.shoulder, points.armholePitch)
.close()
;