sparkles: Updates for freesewing v0.23
This commit is contained in:
parent
0e726bd55b
commit
8f5747e078
14 changed files with 1949 additions and 2058 deletions
|
@ -13,6 +13,29 @@ export default {
|
||||||
"wristCircumference",
|
"wristCircumference",
|
||||||
"headCircumference",
|
"headCircumference",
|
||||||
],
|
],
|
||||||
|
parts: [ "waistband", "cuff" ],
|
||||||
|
dependencies: {
|
||||||
|
frontBase: "base",
|
||||||
|
front: "frontBase",
|
||||||
|
backBase: "base",
|
||||||
|
back: "backBase",
|
||||||
|
sleeveBase: "sleevecap",
|
||||||
|
sleeve: "sleeveBase",
|
||||||
|
pocket: "front",
|
||||||
|
pocketFacing: "pocket",
|
||||||
|
hoodCenter: "hoodSide",
|
||||||
|
},
|
||||||
|
inject: {
|
||||||
|
frontBase: "base",
|
||||||
|
front: "frontBase",
|
||||||
|
backBase: "base",
|
||||||
|
back: "backBase",
|
||||||
|
sleeveBase: "sleevecap",
|
||||||
|
sleeve: "sleeveBase",
|
||||||
|
pocket: "front",
|
||||||
|
pocketFacing: "pocket"
|
||||||
|
},
|
||||||
|
hide: [ "base", "frontBase", "backBase", "sleeveBase" ],
|
||||||
options: {
|
options: {
|
||||||
// Constants
|
// Constants
|
||||||
brianFitSleeve: false,
|
brianFitSleeve: false,
|
||||||
|
|
|
@ -18,7 +18,8 @@
|
||||||
<script type="text/javascript" src="node_modules/@freesewing/models/dist/browser.js"></script>
|
<script type="text/javascript" src="node_modules/@freesewing/models/dist/browser.js"></script>
|
||||||
<script type="text/javascript" src="node_modules/@freesewing/antman/dist/browser.js"></script>
|
<script type="text/javascript" src="node_modules/@freesewing/antman/dist/browser.js"></script>
|
||||||
<script>
|
<script>
|
||||||
var pattern = freesewing.patterns.hugo
|
var pattern = new freesewing.patterns.hugo;
|
||||||
|
pattern
|
||||||
.with(freesewing.plugins.debug)
|
.with(freesewing.plugins.debug)
|
||||||
.with(freesewing.plugins.theme)
|
.with(freesewing.plugins.theme)
|
||||||
.with(freesewing.plugins.designer)
|
.with(freesewing.plugins.designer)
|
||||||
|
|
1900
packages/hugo/package-lock.json
generated
1900
packages/hugo/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -47,9 +47,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@freesewing/brian": "^0.11",
|
"freesewing": "^0.23.2",
|
||||||
"@freesewing/plugin-bundle": "^0.3",
|
"@freesewing/brian": "^0.19",
|
||||||
"freesewing": "^0.17"
|
"@freesewing/plugin-bundle": "^0.5.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "7.0.0-beta.56",
|
"@babel/core": "7.0.0-beta.56",
|
||||||
|
@ -61,11 +61,11 @@
|
||||||
"babel-plugin-transform-object-rest-spread": "^6.26.0",
|
"babel-plugin-transform-object-rest-spread": "^6.26.0",
|
||||||
"@freesewing/antman": "0.2.0",
|
"@freesewing/antman": "0.2.0",
|
||||||
"@freesewing/models": "0.6.0",
|
"@freesewing/models": "0.6.0",
|
||||||
"@freesewing/plugin-debug": "0.1.0",
|
"@freesewing/plugin-debug": "0.5.2",
|
||||||
"@freesewing/plugin-designer": "0.7.3",
|
"@freesewing/plugin-designer": "0.10.0",
|
||||||
"@freesewing/plugin-theme": "0.13.2",
|
"@freesewing/plugin-theme": "0.18.3",
|
||||||
"@freesewing/plugin-validate": "0.2.0",
|
"@freesewing/plugin-validate": "0.4.1",
|
||||||
"@freesewing/plugin-i18n": "0.0.1",
|
"@freesewing/plugin-i18n": "0.1.2",
|
||||||
"eslint": "5.3.0",
|
"eslint": "5.3.0",
|
||||||
"eslint-config-prettier": "^2.9.0",
|
"eslint-config-prettier": "^2.9.0",
|
||||||
"eslint-plugin-prettier": "^2.6.2",
|
"eslint-plugin-prettier": "^2.6.2",
|
||||||
|
|
|
@ -1,116 +1,112 @@
|
||||||
var back = {
|
export default function(part) {
|
||||||
draft: function(part) {
|
// Remove clutter
|
||||||
// Remove clutter
|
let seam = part.paths.seam;
|
||||||
let seam = part.paths.seam;
|
part.paths = {};
|
||||||
part.paths = {};
|
part.paths.seam = seam;
|
||||||
part.paths.seam = seam;
|
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
||||||
|
|
||||||
// Hem is more descripting than hips in this case
|
// Hem is more descripting than hips in this case
|
||||||
points.cbHem = points.cbHips;
|
points.cbHem = points.cbHips;
|
||||||
points.hem = points.hips;
|
points.hem = points.hips;
|
||||||
|
|
||||||
// Ribbing
|
// Ribbing
|
||||||
points.cbRibbing = points.cbHem.shift(90, store.get("ribbing"));
|
points.cbRibbing = points.cbHem.shift(90, store.get("ribbing"));
|
||||||
points.ribbing = points.hem.shift(90, store.get("ribbing"));
|
points.ribbing = points.hem.shift(90, store.get("ribbing"));
|
||||||
|
|
||||||
// Raglan tip
|
// Raglan tip
|
||||||
let neckOpening = new Path()
|
let neckOpening = new Path()
|
||||||
.move(points.cbNeck)
|
.move(points.cbNeck)
|
||||||
.curve(points.cbNeck, points.neckCp2, points.neck);
|
.curve(points.cbNeck, points.neckCp2, points.neck);
|
||||||
points.raglanTipBack = neckOpening.shiftFractionAlong(0.7);
|
points.raglanTipBack = neckOpening.shiftFractionAlong(0.7);
|
||||||
let neckOpeningParts = neckOpening.split(points.raglanTipBack);
|
let neckOpeningParts = neckOpening.split(points.raglanTipBack);
|
||||||
// Paths
|
// Paths
|
||||||
paths.saBase = new Path()
|
paths.saBase = new Path()
|
||||||
.move(points.cbRibbing)
|
.move(points.cbRibbing)
|
||||||
.line(points.ribbing)
|
.line(points.ribbing)
|
||||||
.line(points.armhole)
|
.line(points.armhole)
|
||||||
.curve(points.armholeCp2, points.armholeHollowCp1, points.armholeHollow)
|
.curve(points.armholeCp2, points.armholeHollowCp1, points.armholeHollow)
|
||||||
.line(points.raglanTipBack)
|
.line(points.raglanTipBack)
|
||||||
.join(neckOpeningParts[0].reverse());
|
.join(neckOpeningParts[0].reverse());
|
||||||
paths.seam = paths.saBase
|
paths.seam = paths.saBase
|
||||||
.clone()
|
.clone()
|
||||||
.close()
|
.close()
|
||||||
.attr("class", "fabric");
|
.attr("class", "fabric");
|
||||||
paths.saBase.render = false;
|
paths.saBase.render = false;
|
||||||
|
|
||||||
// Store neck opening path
|
// Store neck opening path
|
||||||
store.set("neckOpeningPartBack", neckOpeningParts[1]);
|
store.set("neckOpeningPartBack", neckOpeningParts[1]);
|
||||||
store.set("neckOpeningAnchorBack", points.neck);
|
store.set("neckOpeningAnchorBack", points.neck);
|
||||||
store.set("neckOpeningLenBack", neckOpening.length());
|
store.set("neckOpeningLenBack", neckOpening.length());
|
||||||
store.set("neckCutoutBack", points.cbNeck.y);
|
store.set("neckCutoutBack", points.cbNeck.y);
|
||||||
|
|
||||||
// Complete pattern?
|
// Complete pattern?
|
||||||
if (complete) {
|
if (complete) {
|
||||||
macro("cutonfold", {
|
macro("cutonfold", {
|
||||||
from: points.cbNeck,
|
from: points.cbNeck,
|
||||||
to: points.cbRibbing,
|
to: points.cbRibbing,
|
||||||
grainline: true
|
grainline: true
|
||||||
});
|
});
|
||||||
points.title = new Point(points.armhole.x / 2, points.armhole.y);
|
points.title = new Point(points.armhole.x / 2, points.armhole.y);
|
||||||
macro("title", { at: points.title, nr: 2, title: "back" });
|
macro("title", { at: points.title, nr: 2, title: "back" });
|
||||||
store.set(
|
store.set(
|
||||||
"notchBack",
|
"notchBack",
|
||||||
points.raglanTipBack.dist(points.armholeHollow) / 2
|
points.raglanTipBack.dist(points.armholeHollow) / 2
|
||||||
);
|
);
|
||||||
points.sleeveNotch = points.raglanTipBack.shiftTowards(
|
points.sleeveNotch = points.raglanTipBack.shiftTowards(
|
||||||
points.armholeHollow,
|
points.armholeHollow,
|
||||||
store.get("notchBack")
|
store.get("notchBack")
|
||||||
);
|
);
|
||||||
snippets.sleeveNotch = new Snippet("bnotch", points.sleeveNotch);
|
snippets.sleeveNotch = new Snippet("bnotch", points.sleeveNotch);
|
||||||
store.set(
|
store.set(
|
||||||
"backRaglanTipToNotch",
|
"backRaglanTipToNotch",
|
||||||
points.raglanTipBack.dist(points.sleeveNotch)
|
points.raglanTipBack.dist(points.sleeveNotch)
|
||||||
);
|
);
|
||||||
points.logo = points.title.shift(-90, 70);
|
points.logo = points.title.shift(-90, 70);
|
||||||
snippets.logo = new Snippet("logo", points.logo);
|
snippets.logo = new Snippet("logo", points.logo);
|
||||||
if (sa) {
|
if (sa) {
|
||||||
paths.sa = paths.saBase
|
paths.sa = paths.saBase
|
||||||
.offset(sa)
|
.offset(sa)
|
||||||
.line(points.cbNeck)
|
.line(points.cbNeck)
|
||||||
.attr("class", "fabric sa");
|
.attr("class", "fabric sa");
|
||||||
paths.sa.move(points.cbRibbing).line(paths.sa.start());
|
paths.sa.move(points.cbRibbing).line(paths.sa.start());
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Paperless?
|
|
||||||
if (paperless) {
|
|
||||||
macro("vd", {
|
|
||||||
from: points.cbRibbing,
|
|
||||||
to: points.cbNeck,
|
|
||||||
x: points.cbNeck.x - 15
|
|
||||||
});
|
|
||||||
macro("vd", {
|
|
||||||
from: points.cbRibbing,
|
|
||||||
to: points.raglanTipBack,
|
|
||||||
x: points.cbNeck.x - 30
|
|
||||||
});
|
|
||||||
macro("vd", {
|
|
||||||
from: points.ribbing,
|
|
||||||
to: points.armhole,
|
|
||||||
x: points.ribbing.x + 15 + sa
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.cbNeck,
|
|
||||||
to: points.raglanTipBack,
|
|
||||||
y: points.raglanTipBack.y - 15 - sa
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.raglanTipBack,
|
|
||||||
to: points.armhole,
|
|
||||||
y: points.raglanTipBack.y - 15 - sa
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.cbRibbing,
|
|
||||||
to: points.ribbing,
|
|
||||||
y: points.cbRibbing.y + 15 + sa
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return part;
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
export default back;
|
// Paperless?
|
||||||
|
if (paperless) {
|
||||||
|
macro("vd", {
|
||||||
|
from: points.cbRibbing,
|
||||||
|
to: points.cbNeck,
|
||||||
|
x: points.cbNeck.x - 15
|
||||||
|
});
|
||||||
|
macro("vd", {
|
||||||
|
from: points.cbRibbing,
|
||||||
|
to: points.raglanTipBack,
|
||||||
|
x: points.cbNeck.x - 30
|
||||||
|
});
|
||||||
|
macro("vd", {
|
||||||
|
from: points.ribbing,
|
||||||
|
to: points.armhole,
|
||||||
|
x: points.ribbing.x + 15 + sa
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.cbNeck,
|
||||||
|
to: points.raglanTipBack,
|
||||||
|
y: points.raglanTipBack.y - 15 - sa
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.raglanTipBack,
|
||||||
|
to: points.armhole,
|
||||||
|
y: points.raglanTipBack.y - 15 - sa
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.cbRibbing,
|
||||||
|
to: points.ribbing,
|
||||||
|
y: points.cbRibbing.y + 15 + sa
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return part;
|
||||||
|
};
|
||||||
|
|
|
@ -1,63 +1,59 @@
|
||||||
var cuff = {
|
export default function(part) {
|
||||||
draft: function(part) {
|
// prettier-ignore
|
||||||
// prettier-ignore
|
let {measurements, options, sa, Point, points, Path, paths, complete, paperless, macro, units} = part.shorthand();
|
||||||
let {measurements, options, sa, Point, points, Path, paths, complete, paperless, macro, units} = part.shorthand();
|
|
||||||
|
|
||||||
let width =
|
let width =
|
||||||
(measurements.centerBackNeckToWaist + measurements.naturalWaistToHip) *
|
(measurements.centerBackNeckToWaist + measurements.naturalWaistToHip) *
|
||||||
options.ribbingWidth *
|
options.ribbingWidth *
|
||||||
2;
|
2;
|
||||||
let length =
|
let length =
|
||||||
measurements.wristCircumference *
|
measurements.wristCircumference *
|
||||||
(1 + options.cuffEase) *
|
(1 + options.cuffEase) *
|
||||||
(1 - options.ribbingStretchFactor);
|
(1 - options.ribbingStretchFactor);
|
||||||
|
|
||||||
points.topLeft = new Point(0, 0);
|
points.topLeft = new Point(0, 0);
|
||||||
points.bottomLeft = new Point(0, width);
|
points.bottomLeft = new Point(0, width);
|
||||||
points.topRight = new Point(length, 0);
|
points.topRight = new Point(length, 0);
|
||||||
points.bottomRight = new Point(length, width);
|
points.bottomRight = new Point(length, width);
|
||||||
|
|
||||||
paths.seam = new Path()
|
paths.seam = new Path()
|
||||||
.move(points.topLeft)
|
.move(points.topLeft)
|
||||||
.line(points.bottomLeft)
|
.line(points.bottomLeft)
|
||||||
.line(points.bottomRight)
|
.line(points.bottomRight)
|
||||||
.line(points.topRight)
|
.line(points.topRight)
|
||||||
.line(points.topLeft)
|
.line(points.topLeft)
|
||||||
.close()
|
.close()
|
||||||
.attr("class", "fabric");
|
.attr("class", "fabric");
|
||||||
|
|
||||||
// Complete pattern?
|
// Complete pattern?
|
||||||
if (complete) {
|
if (complete) {
|
||||||
if (sa) {
|
if (sa) {
|
||||||
paths.sa = paths.seam.offset(sa);
|
paths.sa = paths.seam.offset(sa);
|
||||||
}
|
|
||||||
points.title = points.bottomLeft.shiftFractionTowards(
|
|
||||||
points.topRight,
|
|
||||||
0.5
|
|
||||||
);
|
|
||||||
macro("title", { at: points.title, nr: 9, title: "cuff" });
|
|
||||||
macro("grainline", {
|
|
||||||
from: points.bottomLeft.shift(0, 20),
|
|
||||||
to: points.topLeft.shift(0, 20)
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
points.title = points.bottomLeft.shiftFractionTowards(
|
||||||
// Paperless?
|
points.topRight,
|
||||||
if (paperless) {
|
0.5
|
||||||
macro("vd", {
|
);
|
||||||
from: points.bottomRight,
|
macro("title", { at: points.title, nr: 9, title: "cuff" });
|
||||||
to: points.topRight,
|
macro("grainline", {
|
||||||
x: points.topRight.x + sa + 15
|
from: points.bottomLeft.shift(0, 20),
|
||||||
});
|
to: points.topLeft.shift(0, 20)
|
||||||
macro("hd", {
|
});
|
||||||
from: points.bottomLeft,
|
|
||||||
to: points.bottomRight,
|
|
||||||
y: points.bottomRight.y + sa + 15
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return part;
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
export default cuff;
|
// Paperless?
|
||||||
|
if (paperless) {
|
||||||
|
macro("vd", {
|
||||||
|
from: points.bottomRight,
|
||||||
|
to: points.topRight,
|
||||||
|
x: points.topRight.x + sa + 15
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.bottomLeft,
|
||||||
|
to: points.bottomRight,
|
||||||
|
y: points.bottomRight.y + sa + 15
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return part;
|
||||||
|
};
|
||||||
|
|
|
@ -1,173 +1,169 @@
|
||||||
var front = {
|
export default function(part) {
|
||||||
draft: function(part) {
|
// Remove clutter
|
||||||
// Remove clutter
|
let seam = part.paths.seam;
|
||||||
let seam = part.paths.seam;
|
part.paths = {};
|
||||||
part.paths = {};
|
part.paths.seam = seam;
|
||||||
part.paths.seam = seam;
|
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
||||||
|
|
||||||
// Absolute values for percentages
|
// Absolute values for percentages
|
||||||
|
store.set(
|
||||||
|
"lengthBonus",
|
||||||
|
options.lengthBonus *
|
||||||
|
(measurements.centerBackNeckToWaist + measurements.naturalWaistToHip)
|
||||||
|
);
|
||||||
|
store.set(
|
||||||
|
"ribbing",
|
||||||
|
(measurements.centerBackNeckToWaist + measurements.naturalWaistToHip) *
|
||||||
|
options.ribbingWidth
|
||||||
|
);
|
||||||
|
|
||||||
|
// Hem is more descripting than hips in this case
|
||||||
|
points.cfHem = points.cfHips;
|
||||||
|
points.hem = points.hips;
|
||||||
|
|
||||||
|
// Ribbing
|
||||||
|
points.cfRibbing = points.cfHem.shift(90, store.get("ribbing"));
|
||||||
|
points.ribbing = points.hem.shift(90, store.get("ribbing"));
|
||||||
|
|
||||||
|
// Raglan tip
|
||||||
|
let neckOpening = new Path()
|
||||||
|
.move(points.cfNeck)
|
||||||
|
.curve(points.cfNeck, points.neckCp2, points.neck);
|
||||||
|
points.raglanTipFront = neckOpening.shiftFractionAlong(0.8);
|
||||||
|
let neckOpeningParts = neckOpening.split(points.raglanTipFront);
|
||||||
|
|
||||||
|
// Pocket
|
||||||
|
points.pocketHem = points.cfRibbing.shiftFractionTowards(
|
||||||
|
points.ribbing,
|
||||||
|
0.6
|
||||||
|
);
|
||||||
|
points.pocketCf = points.cfWaist.shift(90, store.get("ribbing"));
|
||||||
|
points.pocketTop = new Point(points.pocketHem.x, points.pocketCf.y);
|
||||||
|
points.pocketTip = points.pocketHem
|
||||||
|
.shift(90, points.pocketHem.x / 3)
|
||||||
|
.rotate(-30, points.pocketHem);
|
||||||
|
points.pocketTopCp = points.pocketTop.shift(-90, points.pocketHem.x / 2);
|
||||||
|
|
||||||
|
// Paths
|
||||||
|
paths.saBase = new Path()
|
||||||
|
.move(points.cfRibbing)
|
||||||
|
.line(points.ribbing)
|
||||||
|
.line(points.armhole)
|
||||||
|
.curve(points.armholeCp2, points.armholeHollowCp1, points.armholeHollow)
|
||||||
|
.line(points.raglanTipFront)
|
||||||
|
.join(neckOpeningParts[0].reverse());
|
||||||
|
paths.seam = paths.saBase
|
||||||
|
.clone()
|
||||||
|
.close()
|
||||||
|
.attr("class", "fabric");
|
||||||
|
paths.saBase.render = false;
|
||||||
|
|
||||||
|
paths.pocket = new Path()
|
||||||
|
.move(points.pocketHem)
|
||||||
|
.line(points.pocketTip)
|
||||||
|
.curve(points.pocketTip, points.pocketTopCp, points.pocketTop)
|
||||||
|
.line(points.pocketCf)
|
||||||
|
.attr("class", "fabric help");
|
||||||
|
|
||||||
|
// Store shoulder seam length, neck opening path, shoulder slope and raglan length
|
||||||
|
store.set("shoulderLength", points.neck.dist(points.shoulder));
|
||||||
|
store.set("neckOpeningPartFront", neckOpeningParts[1]);
|
||||||
|
store.set("neckOpeningAnchorFront", points.neck);
|
||||||
|
store.set("shoulderSlopeDeltaY", points.neck.dy(points.shoulder));
|
||||||
|
store.set(
|
||||||
|
"raglen",
|
||||||
|
new Path()
|
||||||
|
.move(points.raglanTipFront)
|
||||||
|
.line(points.armholeHollow)
|
||||||
|
.curve(points.armholeHollowCp1, points.armholeCp2, points.armhole)
|
||||||
|
.length()
|
||||||
|
);
|
||||||
|
store.set("neckOpeningLenFront", neckOpening.length());
|
||||||
|
store.set("neckCutoutFront", points.cfNeck.y);
|
||||||
|
|
||||||
|
// Complete pattern?
|
||||||
|
if (complete) {
|
||||||
|
macro("cutonfold", {
|
||||||
|
from: points.cfNeck,
|
||||||
|
to: points.cfRibbing,
|
||||||
|
grainline: true
|
||||||
|
});
|
||||||
|
points.title = new Point(points.armhole.x / 2, points.armhole.y);
|
||||||
|
macro("title", { at: points.title, nr: 1, title: "front" });
|
||||||
store.set(
|
store.set(
|
||||||
"lengthBonus",
|
"notchFront",
|
||||||
options.lengthBonus *
|
points.raglanTipFront.dist(points.armholeHollow) / 2
|
||||||
(measurements.centerBackNeckToWaist + measurements.naturalWaistToHip)
|
|
||||||
);
|
);
|
||||||
|
points.sleeveNotch = points.raglanTipFront.shiftTowards(
|
||||||
|
points.armholeHollow,
|
||||||
|
store.get("notchFront")
|
||||||
|
);
|
||||||
|
snippets.sleeveNotch = new Snippet("notch", points.sleeveNotch);
|
||||||
store.set(
|
store.set(
|
||||||
"ribbing",
|
"frontRaglanTipToNotch",
|
||||||
(measurements.centerBackNeckToWaist + measurements.naturalWaistToHip) *
|
points.raglanTipFront.dist(points.sleeveNotch)
|
||||||
options.ribbingWidth
|
|
||||||
);
|
);
|
||||||
|
points.logo = points.title.shift(-90, 70);
|
||||||
// Hem is more descripting than hips in this case
|
snippets.logo = new Snippet("logo", points.logo);
|
||||||
points.cfHem = points.cfHips;
|
if (sa) {
|
||||||
points.hem = points.hips;
|
paths.sa = paths.saBase
|
||||||
|
.offset(sa)
|
||||||
// Ribbing
|
.line(points.cfNeck)
|
||||||
points.cfRibbing = points.cfHem.shift(90, store.get("ribbing"));
|
.attr("class", "fabric sa");
|
||||||
points.ribbing = points.hem.shift(90, store.get("ribbing"));
|
paths.sa.move(points.cfRibbing).line(paths.sa.start());
|
||||||
|
|
||||||
// Raglan tip
|
|
||||||
let neckOpening = new Path()
|
|
||||||
.move(points.cfNeck)
|
|
||||||
.curve(points.cfNeck, points.neckCp2, points.neck);
|
|
||||||
points.raglanTipFront = neckOpening.shiftFractionAlong(0.8);
|
|
||||||
let neckOpeningParts = neckOpening.split(points.raglanTipFront);
|
|
||||||
|
|
||||||
// Pocket
|
|
||||||
points.pocketHem = points.cfRibbing.shiftFractionTowards(
|
|
||||||
points.ribbing,
|
|
||||||
0.6
|
|
||||||
);
|
|
||||||
points.pocketCf = points.cfWaist.shift(90, store.get("ribbing"));
|
|
||||||
points.pocketTop = new Point(points.pocketHem.x, points.pocketCf.y);
|
|
||||||
points.pocketTip = points.pocketHem
|
|
||||||
.shift(90, points.pocketHem.x / 3)
|
|
||||||
.rotate(-30, points.pocketHem);
|
|
||||||
points.pocketTopCp = points.pocketTop.shift(-90, points.pocketHem.x / 2);
|
|
||||||
|
|
||||||
// Paths
|
|
||||||
paths.saBase = new Path()
|
|
||||||
.move(points.cfRibbing)
|
|
||||||
.line(points.ribbing)
|
|
||||||
.line(points.armhole)
|
|
||||||
.curve(points.armholeCp2, points.armholeHollowCp1, points.armholeHollow)
|
|
||||||
.line(points.raglanTipFront)
|
|
||||||
.join(neckOpeningParts[0].reverse());
|
|
||||||
paths.seam = paths.saBase
|
|
||||||
.clone()
|
|
||||||
.close()
|
|
||||||
.attr("class", "fabric");
|
|
||||||
paths.saBase.render = false;
|
|
||||||
|
|
||||||
paths.pocket = new Path()
|
|
||||||
.move(points.pocketHem)
|
|
||||||
.line(points.pocketTip)
|
|
||||||
.curve(points.pocketTip, points.pocketTopCp, points.pocketTop)
|
|
||||||
.line(points.pocketCf)
|
|
||||||
.attr("class", "fabric help");
|
|
||||||
|
|
||||||
// Store shoulder seam length, neck opening path, shoulder slope and raglan length
|
|
||||||
store.set("shoulderLength", points.neck.dist(points.shoulder));
|
|
||||||
store.set("neckOpeningPartFront", neckOpeningParts[1]);
|
|
||||||
store.set("neckOpeningAnchorFront", points.neck);
|
|
||||||
store.set("shoulderSlopeDeltaY", points.neck.dy(points.shoulder));
|
|
||||||
store.set(
|
|
||||||
"raglen",
|
|
||||||
new Path()
|
|
||||||
.move(points.raglanTipFront)
|
|
||||||
.line(points.armholeHollow)
|
|
||||||
.curve(points.armholeHollowCp1, points.armholeCp2, points.armhole)
|
|
||||||
.length()
|
|
||||||
);
|
|
||||||
store.set("neckOpeningLenFront", neckOpening.length());
|
|
||||||
store.set("neckCutoutFront", points.cfNeck.y);
|
|
||||||
|
|
||||||
// Complete pattern?
|
|
||||||
if (complete) {
|
|
||||||
macro("cutonfold", {
|
|
||||||
from: points.cfNeck,
|
|
||||||
to: points.cfRibbing,
|
|
||||||
grainline: true
|
|
||||||
});
|
|
||||||
points.title = new Point(points.armhole.x / 2, points.armhole.y);
|
|
||||||
macro("title", { at: points.title, nr: 1, title: "front" });
|
|
||||||
store.set(
|
|
||||||
"notchFront",
|
|
||||||
points.raglanTipFront.dist(points.armholeHollow) / 2
|
|
||||||
);
|
|
||||||
points.sleeveNotch = points.raglanTipFront.shiftTowards(
|
|
||||||
points.armholeHollow,
|
|
||||||
store.get("notchFront")
|
|
||||||
);
|
|
||||||
snippets.sleeveNotch = new Snippet("notch", points.sleeveNotch);
|
|
||||||
store.set(
|
|
||||||
"frontRaglanTipToNotch",
|
|
||||||
points.raglanTipFront.dist(points.sleeveNotch)
|
|
||||||
);
|
|
||||||
points.logo = points.title.shift(-90, 70);
|
|
||||||
snippets.logo = new Snippet("logo", points.logo);
|
|
||||||
if (sa) {
|
|
||||||
paths.sa = paths.saBase
|
|
||||||
.offset(sa)
|
|
||||||
.line(points.cfNeck)
|
|
||||||
.attr("class", "fabric sa");
|
|
||||||
paths.sa.move(points.cfRibbing).line(paths.sa.start());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Paperless?
|
|
||||||
if (paperless) {
|
|
||||||
macro("vd", {
|
|
||||||
from: points.cfRibbing,
|
|
||||||
to: points.cfNeck,
|
|
||||||
x: points.cfNeck.x - 15
|
|
||||||
});
|
|
||||||
macro("vd", {
|
|
||||||
from: points.cfRibbing,
|
|
||||||
to: points.raglanTipFront,
|
|
||||||
x: points.cfNeck.x - 30
|
|
||||||
});
|
|
||||||
macro("vd", {
|
|
||||||
from: points.ribbing,
|
|
||||||
to: points.armhole,
|
|
||||||
x: points.ribbing.x + 15 + sa
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.cfNeck,
|
|
||||||
to: points.raglanTipFront,
|
|
||||||
y: points.raglanTipFront.y - 15 - sa
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.raglanTipFront,
|
|
||||||
to: points.armhole,
|
|
||||||
y: points.raglanTipFront.y - 15 - sa
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.cfRibbing,
|
|
||||||
to: points.pocketTop,
|
|
||||||
y: points.cfRibbing.y + 15 + sa
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.cfRibbing,
|
|
||||||
to: points.pocketTip,
|
|
||||||
y: points.cfRibbing.y + 30 + sa
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.cfRibbing,
|
|
||||||
to: points.ribbing,
|
|
||||||
y: points.cfRibbing.y + 45 + sa
|
|
||||||
});
|
|
||||||
macro("vd", {
|
|
||||||
from: points.pocketHem,
|
|
||||||
to: points.pocketTop,
|
|
||||||
x: points.pocketTip.x + 15
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return part;
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
export default front;
|
// Paperless?
|
||||||
|
if (paperless) {
|
||||||
|
macro("vd", {
|
||||||
|
from: points.cfRibbing,
|
||||||
|
to: points.cfNeck,
|
||||||
|
x: points.cfNeck.x - 15
|
||||||
|
});
|
||||||
|
macro("vd", {
|
||||||
|
from: points.cfRibbing,
|
||||||
|
to: points.raglanTipFront,
|
||||||
|
x: points.cfNeck.x - 30
|
||||||
|
});
|
||||||
|
macro("vd", {
|
||||||
|
from: points.ribbing,
|
||||||
|
to: points.armhole,
|
||||||
|
x: points.ribbing.x + 15 + sa
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.cfNeck,
|
||||||
|
to: points.raglanTipFront,
|
||||||
|
y: points.raglanTipFront.y - 15 - sa
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.raglanTipFront,
|
||||||
|
to: points.armhole,
|
||||||
|
y: points.raglanTipFront.y - 15 - sa
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.cfRibbing,
|
||||||
|
to: points.pocketTop,
|
||||||
|
y: points.cfRibbing.y + 15 + sa
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.cfRibbing,
|
||||||
|
to: points.pocketTip,
|
||||||
|
y: points.cfRibbing.y + 30 + sa
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.cfRibbing,
|
||||||
|
to: points.ribbing,
|
||||||
|
y: points.cfRibbing.y + 45 + sa
|
||||||
|
});
|
||||||
|
macro("vd", {
|
||||||
|
from: points.pocketHem,
|
||||||
|
to: points.pocketTop,
|
||||||
|
x: points.pocketTip.x + 15
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return part;
|
||||||
|
};
|
||||||
|
|
|
@ -1,68 +1,64 @@
|
||||||
var hoodCenter = {
|
export default function(part) {
|
||||||
draft: function(part) {
|
// prettier-ignore
|
||||||
// prettier-ignore
|
let {store, sa, Point, points, Path, paths, complete, paperless, macro, units} = part.shorthand();
|
||||||
let {store, sa, Point, points, Path, paths, complete, paperless, macro, units} = part.shorthand();
|
|
||||||
|
|
||||||
let width = store.get("hoodCenterWidth");
|
let width = store.get("hoodCenterWidth");
|
||||||
points.topLeft = new Point(0, 0);
|
points.topLeft = new Point(0, 0);
|
||||||
points.bottomLeft = new Point(0, width);
|
points.bottomLeft = new Point(0, width);
|
||||||
points.topMidLeft = new Point(width, 0);
|
points.topMidLeft = new Point(width, 0);
|
||||||
points.bottomMidLeft = new Point(width, width);
|
points.bottomMidLeft = new Point(width, width);
|
||||||
points.topMidRight = new Point(width * 1.5, 0);
|
points.topMidRight = new Point(width * 1.5, 0);
|
||||||
points.bottomMidRight = new Point(width * 1.5, width);
|
points.bottomMidRight = new Point(width * 1.5, width);
|
||||||
points.topRight = new Point(width * 2.5, 0);
|
points.topRight = new Point(width * 2.5, 0);
|
||||||
points.bottomRight = new Point(width * 2.5, width);
|
points.bottomRight = new Point(width * 2.5, width);
|
||||||
|
|
||||||
paths.seam = new Path()
|
paths.seam = new Path()
|
||||||
.move(points.topMidLeft)
|
.move(points.topMidLeft)
|
||||||
.line(points.topLeft)
|
.line(points.topLeft)
|
||||||
.line(points.bottomLeft)
|
.line(points.bottomLeft)
|
||||||
.line(points.bottomMidLeft)
|
.line(points.bottomMidLeft)
|
||||||
.move(points.bottomMidRight)
|
.move(points.bottomMidRight)
|
||||||
.line(points.bottomRight)
|
.line(points.bottomRight)
|
||||||
.line(points.topRight)
|
.line(points.topRight)
|
||||||
.line(points.topMidRight)
|
.line(points.topMidRight)
|
||||||
.attr("class", "fabric");
|
.attr("class", "fabric");
|
||||||
paths.hint = new Path()
|
paths.hint = new Path()
|
||||||
.move(points.topMidLeft)
|
.move(points.topMidLeft)
|
||||||
.line(points.topMidRight)
|
.line(points.topMidRight)
|
||||||
.move(points.bottomMidLeft)
|
.move(points.bottomMidLeft)
|
||||||
.line(points.bottomMidRight)
|
.line(points.bottomMidRight)
|
||||||
.attr("class", "fabric dashed");
|
.attr("class", "fabric dashed");
|
||||||
|
|
||||||
// Complete pattern?
|
// Complete pattern?
|
||||||
if (complete) {
|
if (complete) {
|
||||||
if (sa) {
|
if (sa) {
|
||||||
paths.sa = paths.seam.offset(sa);
|
paths.sa = paths.seam.offset(sa);
|
||||||
}
|
|
||||||
points.title = points.bottomLeft.shiftFractionTowards(
|
|
||||||
points.topRight,
|
|
||||||
0.5
|
|
||||||
);
|
|
||||||
macro("title", { at: points.title, nr: 7, title: "hoodCenter" });
|
|
||||||
macro("grainline", {
|
|
||||||
from: points.topLeft.shift(-90, width / 2),
|
|
||||||
to: points.topRight.shift(-90, width / 2)
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
points.title = points.bottomLeft.shiftFractionTowards(
|
||||||
// Paperless?
|
points.topRight,
|
||||||
if (paperless) {
|
0.5
|
||||||
macro("vd", {
|
);
|
||||||
from: points.bottomRight,
|
macro("title", { at: points.title, nr: 7, title: "hoodCenter" });
|
||||||
to: points.topRight,
|
macro("grainline", {
|
||||||
x: points.topRight.x + sa + 15
|
from: points.topLeft.shift(-90, width / 2),
|
||||||
});
|
to: points.topRight.shift(-90, width / 2)
|
||||||
macro("hd", {
|
});
|
||||||
from: points.bottomLeft,
|
|
||||||
to: points.bottomRight,
|
|
||||||
y: points.bottomRight.y + sa + 15,
|
|
||||||
text: units(store.get("hoodCenterLength"))
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return part;
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
export default hoodCenter;
|
// Paperless?
|
||||||
|
if (paperless) {
|
||||||
|
macro("vd", {
|
||||||
|
from: points.bottomRight,
|
||||||
|
to: points.topRight,
|
||||||
|
x: points.topRight.x + sa + 15
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.bottomLeft,
|
||||||
|
to: points.bottomRight,
|
||||||
|
y: points.bottomRight.y + sa + 15,
|
||||||
|
text: units(store.get("hoodCenterLength"))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return part;
|
||||||
|
};
|
||||||
|
|
|
@ -1,152 +1,148 @@
|
||||||
var hoodSide = {
|
export default function(part) {
|
||||||
draft: function(part) {
|
// prettier-ignore
|
||||||
// prettier-ignore
|
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
||||||
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
|
||||||
|
|
||||||
let neckOpening =
|
let neckOpening =
|
||||||
store.get("neckOpeningLenFront") + store.get("neckOpeningLenBack");
|
store.get("neckOpeningLenFront") + store.get("neckOpeningLenBack");
|
||||||
let hoodOpening = measurements.headCircumference;
|
let hoodOpening = measurements.headCircumference;
|
||||||
let neckCutoutDelta =
|
let neckCutoutDelta =
|
||||||
store.get("neckCutoutFront") - store.get("neckCutoutBack");
|
store.get("neckCutoutFront") - store.get("neckCutoutBack");
|
||||||
store.set("hoodCenterWidth", measurements.headCircumference / 10);
|
store.set("hoodCenterWidth", measurements.headCircumference / 10);
|
||||||
let halfCenterPanel = store.get("hoodCenterWidth") / 2;
|
let halfCenterPanel = store.get("hoodCenterWidth") / 2;
|
||||||
points.topLeft = new Point(0, 0);
|
points.topLeft = new Point(0, 0);
|
||||||
points.topRight = new Point(neckOpening, 0);
|
points.topRight = new Point(neckOpening, 0);
|
||||||
points.neckRight = new Point(
|
points.neckRight = new Point(
|
||||||
neckOpening,
|
neckOpening,
|
||||||
(hoodOpening - halfCenterPanel) / 2
|
(hoodOpening - halfCenterPanel) / 2
|
||||||
);
|
);
|
||||||
points.neckLeft = new Point(0, points.neckRight.y);
|
points.neckLeft = new Point(0, points.neckRight.y);
|
||||||
points.frontLeft = points.neckLeft.shift(-90, neckCutoutDelta);
|
points.frontLeft = points.neckLeft.shift(-90, neckCutoutDelta);
|
||||||
points.frontEdge = points.neckRight.shift(-90, neckCutoutDelta);
|
points.frontEdge = points.neckRight.shift(-90, neckCutoutDelta);
|
||||||
points.neckEdge = points.neckLeft.shift(0, halfCenterPanel);
|
points.neckEdge = points.neckLeft.shift(0, halfCenterPanel);
|
||||||
points.neckEdgeCp2 = new Point(points.neckRight.x / 2, points.neckEdge.y);
|
points.neckEdgeCp2 = new Point(points.neckRight.x / 2, points.neckEdge.y);
|
||||||
points.frontEdgeCp1 = new Point(points.neckEdgeCp2.x, points.frontEdge.y);
|
points.frontEdgeCp1 = new Point(points.neckEdgeCp2.x, points.frontEdge.y);
|
||||||
points.shoulderNotch = new Path()
|
points.shoulderNotch = new Path()
|
||||||
.move(points.neckEdge)
|
.move(points.neckEdge)
|
||||||
.curve(points.neckEdgeCp2, points.frontEdgeCp1, points.frontEdge)
|
.curve(points.neckEdgeCp2, points.frontEdgeCp1, points.frontEdge)
|
||||||
.shiftAlong(store.get("neckOpeningLenBack") - halfCenterPanel);
|
.shiftAlong(store.get("neckOpeningLenBack") - halfCenterPanel);
|
||||||
points.hoodTop = new Point(points.shoulderNotch.x, points.topLeft.y);
|
points.hoodTop = new Point(points.shoulderNotch.x, points.topLeft.y);
|
||||||
points.hoodTopCp2 = points.hoodTop.shift(180, points.neckEdge.y * 0.7);
|
points.hoodTopCp2 = points.hoodTop.shift(180, points.neckEdge.y * 0.7);
|
||||||
points.hoodRim = new Point(points.frontEdge.x, points.neckRight.y * 0.2);
|
points.hoodRim = new Point(points.frontEdge.x, points.neckRight.y * 0.2);
|
||||||
points.hoodTopCp1 = points.hoodTop.shift(
|
points.hoodTopCp1 = points.hoodTop.shift(
|
||||||
0,
|
0,
|
||||||
points.hoodTop.dx(points.hoodRim) / 2
|
points.hoodTop.dx(points.hoodRim) / 2
|
||||||
);
|
);
|
||||||
points.frontEdgeCp2 = points.frontEdge.shift(90, halfCenterPanel);
|
points.frontEdgeCp2 = points.frontEdge.shift(90, halfCenterPanel);
|
||||||
points._tmp1 = new Path()
|
points._tmp1 = new Path()
|
||||||
|
.move(points.hoodRim)
|
||||||
|
.curve(points.hoodRim, points.hoodTopCp1, points.hoodTop)
|
||||||
|
.shiftAlong(2)
|
||||||
|
.rotate(90, points.hoodRim);
|
||||||
|
points.hoodRimCp = points.hoodRim.shiftTowards(
|
||||||
|
points._tmp1,
|
||||||
|
points.neckRight.y / 3
|
||||||
|
);
|
||||||
|
points.neckRoll = points.neckRight.shift(180, halfCenterPanel);
|
||||||
|
points._tmp2 = new Path()
|
||||||
|
.move(points.neckRoll)
|
||||||
|
.curve(points.neckRoll, points.hoodRimCp, points.hoodRim)
|
||||||
|
.shiftAlong(2);
|
||||||
|
points.neckRollCp2 = points.neckRoll.shiftTowards(
|
||||||
|
points._tmp2,
|
||||||
|
halfCenterPanel
|
||||||
|
);
|
||||||
|
points.neckRollCp1 = points.neckRollCp2.rotate(180, points.neckRoll);
|
||||||
|
|
||||||
|
paths.seam = new Path()
|
||||||
|
.move(points.frontEdge)
|
||||||
|
.curve(points.frontEdgeCp2, points.neckRollCp1, points.neckRoll)
|
||||||
|
.curve(points.neckRollCp2, points.hoodRimCp, points.hoodRim)
|
||||||
|
.curve(points.hoodRim, points.hoodTopCp1, points.hoodTop)
|
||||||
|
.curve(points.hoodTopCp2, points.neckEdge, points.neckEdge)
|
||||||
|
.curve(points.neckEdgeCp2, points.frontEdgeCp1, points.frontEdge)
|
||||||
|
.close()
|
||||||
|
.attr("class", "fabric");
|
||||||
|
|
||||||
|
// Store length of center seam
|
||||||
|
store.set(
|
||||||
|
"hoodCenterLength",
|
||||||
|
new Path()
|
||||||
.move(points.hoodRim)
|
.move(points.hoodRim)
|
||||||
.curve(points.hoodRim, points.hoodTopCp1, points.hoodTop)
|
.curve(points.hoodRim, points.hoodTopCp1, points.hoodTop)
|
||||||
.shiftAlong(2)
|
.curve(points.hoodTopCp2, points.neckEdge, points.neckEdge)
|
||||||
.rotate(90, points.hoodRim);
|
.length()
|
||||||
points.hoodRimCp = points.hoodRim.shiftTowards(
|
);
|
||||||
points._tmp1,
|
|
||||||
points.neckRight.y / 3
|
|
||||||
);
|
|
||||||
points.neckRoll = points.neckRight.shift(180, halfCenterPanel);
|
|
||||||
points._tmp2 = new Path()
|
|
||||||
.move(points.neckRoll)
|
|
||||||
.curve(points.neckRoll, points.hoodRimCp, points.hoodRim)
|
|
||||||
.shiftAlong(2);
|
|
||||||
points.neckRollCp2 = points.neckRoll.shiftTowards(
|
|
||||||
points._tmp2,
|
|
||||||
halfCenterPanel
|
|
||||||
);
|
|
||||||
points.neckRollCp1 = points.neckRollCp2.rotate(180, points.neckRoll);
|
|
||||||
|
|
||||||
paths.seam = new Path()
|
// Complete pattern?
|
||||||
.move(points.frontEdge)
|
if (complete) {
|
||||||
.curve(points.frontEdgeCp2, points.neckRollCp1, points.neckRoll)
|
if (sa) {
|
||||||
.curve(points.neckRollCp2, points.hoodRimCp, points.hoodRim)
|
// Reversing this curve sidesteps a bezierjs edge case
|
||||||
|
paths.sa = paths.seam.reverse().offset(sa * -1);
|
||||||
|
}
|
||||||
|
points.title = points.hoodTop.shift(-90, 50);
|
||||||
|
macro("title", { at: points.title, nr: 6, title: "hoodSide" });
|
||||||
|
points.logo = points.title.shift(-90, 60);
|
||||||
|
snippets.logo = new Snippet("logo", points.logo);
|
||||||
|
macro("grainline", {
|
||||||
|
from: points.shoulderNotch,
|
||||||
|
to: points.hoodTop
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Paperless?
|
||||||
|
if (paperless) {
|
||||||
|
let neckSeam = new Path()
|
||||||
|
.move(points.neckEdge)
|
||||||
|
.curve(points.neckEdgeCp2, points.frontEdgeCp1, points.frontEdge)
|
||||||
|
.split(points.shoulderNotch);
|
||||||
|
let centralSeam = new Path()
|
||||||
|
.move(points.hoodRim)
|
||||||
.curve(points.hoodRim, points.hoodTopCp1, points.hoodTop)
|
.curve(points.hoodRim, points.hoodTopCp1, points.hoodTop)
|
||||||
.curve(points.hoodTopCp2, points.neckEdge, points.neckEdge)
|
.curve(points.hoodTopCp2, points.neckEdge, points.neckEdge)
|
||||||
.curve(points.neckEdgeCp2, points.frontEdgeCp1, points.frontEdge)
|
.reverse();
|
||||||
.close()
|
let openingSeam = new Path()
|
||||||
.attr("class", "fabric");
|
.move(points.neckRoll)
|
||||||
|
.curve(points.neckRollCp2, points.hoodRimCp, points.hoodRim);
|
||||||
|
|
||||||
// Store length of center seam
|
macro("pd", {
|
||||||
store.set(
|
path: neckSeam[0],
|
||||||
"hoodCenterLength",
|
d: sa + 15
|
||||||
new Path()
|
});
|
||||||
.move(points.hoodRim)
|
macro("pd", {
|
||||||
.curve(points.hoodRim, points.hoodTopCp1, points.hoodTop)
|
path: neckSeam[1],
|
||||||
.curve(points.hoodTopCp2, points.neckEdge, points.neckEdge)
|
d: sa + 15
|
||||||
.length()
|
});
|
||||||
);
|
macro("pd", {
|
||||||
|
path: centralSeam,
|
||||||
// Complete pattern?
|
d: sa * -1 - 15
|
||||||
if (complete) {
|
});
|
||||||
if (sa) {
|
macro("hd", {
|
||||||
// Reversing this curve sidesteps a bezierjs edge case
|
from: points.neckEdge,
|
||||||
paths.sa = paths.seam.reverse().offset(sa * -1);
|
to: points.frontEdge,
|
||||||
}
|
y: points.frontEdge.y + sa + 30
|
||||||
points.title = points.hoodTop.shift(-90, 50);
|
});
|
||||||
macro("title", { at: points.title, nr: 6, title: "hoodSide" });
|
macro("hd", {
|
||||||
points.logo = points.title.shift(-90, 60);
|
from: centralSeam.edge("left"),
|
||||||
snippets.logo = new Snippet("logo", points.logo);
|
to: points.frontEdge,
|
||||||
macro("grainline", {
|
y: points.frontEdge.y + sa + 45
|
||||||
from: points.shoulderNotch,
|
});
|
||||||
to: points.hoodTop
|
let openingEdge = openingSeam.edge("left");
|
||||||
});
|
macro("hd", {
|
||||||
}
|
from: openingEdge,
|
||||||
|
to: points.frontEdge,
|
||||||
// Paperless?
|
y: openingEdge.y
|
||||||
if (paperless) {
|
});
|
||||||
let neckSeam = new Path()
|
macro("vd", {
|
||||||
.move(points.neckEdge)
|
from: points.frontEdge,
|
||||||
.curve(points.neckEdgeCp2, points.frontEdgeCp1, points.frontEdge)
|
to: points.hoodRim,
|
||||||
.split(points.shoulderNotch);
|
x: points.hoodRim.x + sa + 15
|
||||||
let centralSeam = new Path()
|
});
|
||||||
.move(points.hoodRim)
|
macro("vd", {
|
||||||
.curve(points.hoodRim, points.hoodTopCp1, points.hoodTop)
|
from: points.frontEdge,
|
||||||
.curve(points.hoodTopCp2, points.neckEdge, points.neckEdge)
|
to: points.hoodTop,
|
||||||
.reverse();
|
x: points.hoodRim.x + sa + 30
|
||||||
let openingSeam = new Path()
|
});
|
||||||
.move(points.neckRoll)
|
|
||||||
.curve(points.neckRollCp2, points.hoodRimCp, points.hoodRim);
|
|
||||||
|
|
||||||
macro("pd", {
|
|
||||||
path: neckSeam[0],
|
|
||||||
d: sa + 15
|
|
||||||
});
|
|
||||||
macro("pd", {
|
|
||||||
path: neckSeam[1],
|
|
||||||
d: sa + 15
|
|
||||||
});
|
|
||||||
macro("pd", {
|
|
||||||
path: centralSeam,
|
|
||||||
d: sa * -1 - 15
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.neckEdge,
|
|
||||||
to: points.frontEdge,
|
|
||||||
y: points.frontEdge.y + sa + 30
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: centralSeam.edge("left"),
|
|
||||||
to: points.frontEdge,
|
|
||||||
y: points.frontEdge.y + sa + 45
|
|
||||||
});
|
|
||||||
let openingEdge = openingSeam.edge("left");
|
|
||||||
macro("hd", {
|
|
||||||
from: openingEdge,
|
|
||||||
to: points.frontEdge,
|
|
||||||
y: openingEdge.y
|
|
||||||
});
|
|
||||||
macro("vd", {
|
|
||||||
from: points.frontEdge,
|
|
||||||
to: points.hoodRim,
|
|
||||||
x: points.hoodRim.x + sa + 15
|
|
||||||
});
|
|
||||||
macro("vd", {
|
|
||||||
from: points.frontEdge,
|
|
||||||
to: points.hoodTop,
|
|
||||||
x: points.hoodRim.x + sa + 30
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return part;
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
export default hoodSide;
|
return part;
|
||||||
|
};
|
||||||
|
|
|
@ -1,147 +1,56 @@
|
||||||
import freesewing from "freesewing";
|
import freesewing from "freesewing";
|
||||||
import brian from "@freesewing/brian";
|
import Brian from "@freesewing/brian";
|
||||||
import pluginBundle from "@freesewing/plugin-bundle";
|
import pluginBundle from "@freesewing/plugin-bundle";
|
||||||
|
|
||||||
import config from "../config/config";
|
import config from "../config/config";
|
||||||
import { version } from "../package.json";
|
import { version } from "../package.json";
|
||||||
|
// Parts
|
||||||
|
import draftBack from "./back";
|
||||||
|
import draftFront from "./front";
|
||||||
|
import draftSleeve from "./sleeve";
|
||||||
|
import draftPocket from "./pocket";
|
||||||
|
import draftPocketFacing from "./pocketfacing";
|
||||||
|
import draftHoodSide from "./hoodside";
|
||||||
|
import draftHoodCenter from "./hoodcenter";
|
||||||
|
import draftWaistband from "./waistband";
|
||||||
|
import draftCuff from "./cuff";
|
||||||
|
|
||||||
import back from "./back";
|
// Constructor boilerplate
|
||||||
import front from "./front";
|
const Hugo = function(settings = false) {
|
||||||
import sleeve from "./sleeve";
|
freesewing.Pattern.call(this, { version: version, ...config });
|
||||||
import pocket from "./pocket";
|
this.with(pluginBundle);
|
||||||
import pocketFacing from "./pocketfacing";
|
if (settings !== false) this.mergeSettings(settings);
|
||||||
import hoodSide from "./hoodside";
|
|
||||||
import hoodCenter from "./hoodcenter";
|
|
||||||
import waistband from "./waistband";
|
|
||||||
import cuff from "./cuff";
|
|
||||||
|
|
||||||
var pattern = new freesewing.Pattern({ version: version, ...config }).with(
|
return this;
|
||||||
pluginBundle
|
|
||||||
);
|
|
||||||
|
|
||||||
pattern.draft = function() {
|
|
||||||
// base from Brian
|
|
||||||
this.parts.base = this.draftBase(new pattern.Part());
|
|
||||||
if (this.needs(["front", "sleeve", "pocket", "pocketFacing"])) {
|
|
||||||
this.parts.frontBase = this.draftFrontBase(
|
|
||||||
new pattern.Part().copy(this.parts.base)
|
|
||||||
);
|
|
||||||
this.parts.front = this.draftFront(
|
|
||||||
new pattern.Part().copy(this.parts.frontBase)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (this.needs(["back", "sleeve"])) {
|
|
||||||
this.parts.backBase = this.draftBackBase(
|
|
||||||
new pattern.Part().copy(this.parts.base)
|
|
||||||
);
|
|
||||||
this.parts.back = this.draftBack(
|
|
||||||
new pattern.Part().copy(this.parts.backBase)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (this.needs(["sleeve"])) {
|
|
||||||
let sleevecap = freesewing.patterns.brian.draftSleevecap(
|
|
||||||
new pattern.Part()
|
|
||||||
);
|
|
||||||
this.parts.sleeveBase = this.draftSleeveBase(
|
|
||||||
new pattern.Part().copy(sleevecap)
|
|
||||||
);
|
|
||||||
this.parts.sleeve = this.draftSleeve(
|
|
||||||
new pattern.Part().copy(this.parts.sleeveBase)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.needs(["pocket"])) {
|
|
||||||
this.parts.pocket = this.draftPocket(
|
|
||||||
new pattern.Part().copy(this.parts.front)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (this.needs(["pocketFacing"])) {
|
|
||||||
this.parts.pocketFacing = this.draftPocketFacing(
|
|
||||||
new pattern.Part().copy(this.parts.pocket)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.needs(["hoodSide", "hoodCenter"])) {
|
|
||||||
this.parts.hoodSide = this.draftHoodSide(new pattern.Part());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.needs(["hoodCenter"])) {
|
|
||||||
this.parts.hoodCenter = this.draftHoodCenter(new pattern.Part());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.needs(["waistband"])) {
|
|
||||||
this.parts.waistband = this.draftWaistband(new pattern.Part());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.needs(["cuff"])) {
|
|
||||||
this.parts.cuff = this.draftCuff(new pattern.Part());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't render these unless specifically requested
|
|
||||||
if (!this.needs("base", true)) this.parts.base.render = false;
|
|
||||||
if (!this.needs("frontBase", true)) this.parts.frontBase.render = false;
|
|
||||||
if (!this.needs("backBase", true)) this.parts.backBase.render = false;
|
|
||||||
if (!this.needs("sleeveBase", true)) this.parts.sleeveBase.render = false;
|
|
||||||
|
|
||||||
return pattern;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
pattern.draftBase = function(part) {
|
// Inheritance boilerplate
|
||||||
let complete = this.settings.complete;
|
Hugo.prototype = Object.create(freesewing.Pattern.prototype);
|
||||||
let paperless = this.settings.paperless;
|
Hugo.prototype.constructor = Hugo;
|
||||||
this.settings.complete = false;
|
|
||||||
this.settings.paperless = false;
|
|
||||||
let brianBase = freesewing.patterns.brian.draftBase(part);
|
|
||||||
this.settings.complete = complete;
|
|
||||||
this.settings.paperless = paperless;
|
|
||||||
|
|
||||||
return brianBase;
|
// Attach per-part draft methods to prototype
|
||||||
};
|
Hugo.prototype.draftBase = function (part) {
|
||||||
|
return new Brian(this.settings).draftBase(part);
|
||||||
|
}
|
||||||
|
Hugo.prototype.draftFrontBase = function (part) {
|
||||||
|
return new Brian(this.settings).draftFront(part);
|
||||||
|
}
|
||||||
|
Hugo.prototype.draftBackBase = function (part) {
|
||||||
|
return new Brian(this.settings).draftBack(part);
|
||||||
|
}
|
||||||
|
Hugo.prototype.draftSleeveBase = function (part) {
|
||||||
|
return new Brian(this.settings).draftSleeve(part);
|
||||||
|
}
|
||||||
|
Hugo.prototype.draftSleevecap = function (part) {
|
||||||
|
return new Brian(this.settings).draftSleevecap(part);
|
||||||
|
}
|
||||||
|
Hugo.prototype.draftBack = draftBack;
|
||||||
|
Hugo.prototype.draftFront = draftFront;
|
||||||
|
Hugo.prototype.draftSleeve = draftSleeve;
|
||||||
|
Hugo.prototype.draftPocket = draftPocket;
|
||||||
|
Hugo.prototype.draftPocketFacing = draftPocketFacing;
|
||||||
|
Hugo.prototype.draftHoodSide = draftHoodSide;
|
||||||
|
Hugo.prototype.draftHoodCenter = draftHoodCenter;
|
||||||
|
Hugo.prototype.draftWaistband = draftWaistband;
|
||||||
|
Hugo.prototype.draftCuff = draftCuff;
|
||||||
|
|
||||||
pattern.draftFrontBase = function(part) {
|
export default Hugo;
|
||||||
let complete = this.settings.complete;
|
|
||||||
let paperless = this.settings.paperless;
|
|
||||||
this.settings.complete = false;
|
|
||||||
this.settings.paperless = false;
|
|
||||||
let brianFront = freesewing.patterns.brian.draftFront(part);
|
|
||||||
this.settings.complete = complete;
|
|
||||||
this.settings.paperless = paperless;
|
|
||||||
|
|
||||||
return brianFront;
|
|
||||||
};
|
|
||||||
|
|
||||||
pattern.draftBackBase = function(part) {
|
|
||||||
let complete = this.settings.complete;
|
|
||||||
let paperless = this.settings.paperless;
|
|
||||||
this.settings.complete = false;
|
|
||||||
this.settings.paperless = false;
|
|
||||||
let brianBack = freesewing.patterns.brian.draftBack(part);
|
|
||||||
this.settings.complete = complete;
|
|
||||||
this.settings.paperless = paperless;
|
|
||||||
|
|
||||||
return brianBack;
|
|
||||||
};
|
|
||||||
|
|
||||||
pattern.draftSleeveBase = function(part) {
|
|
||||||
let complete = this.settings.complete;
|
|
||||||
let paperless = this.settings.paperless;
|
|
||||||
this.settings.complete = false;
|
|
||||||
this.settings.paperless = false;
|
|
||||||
let brianSleeve = freesewing.patterns.brian.draftSleeve(part);
|
|
||||||
this.settings.complete = complete;
|
|
||||||
this.settings.paperless = paperless;
|
|
||||||
|
|
||||||
return brianSleeve;
|
|
||||||
};
|
|
||||||
|
|
||||||
pattern.draftFront = part => front.draft(part);
|
|
||||||
pattern.draftBack = part => back.draft(part);
|
|
||||||
pattern.draftSleeve = part => sleeve.draft(part);
|
|
||||||
pattern.draftPocket = part => pocket.draft(part);
|
|
||||||
pattern.draftPocketFacing = part => pocketFacing.draft(part);
|
|
||||||
pattern.draftHoodSide = part => hoodSide.draft(part);
|
|
||||||
pattern.draftHoodCenter = part => hoodCenter.draft(part);
|
|
||||||
pattern.draftWaistband = part => waistband.draft(part);
|
|
||||||
pattern.draftCuff = part => cuff.draft(part);
|
|
||||||
|
|
||||||
export default pattern;
|
|
||||||
|
|
|
@ -1,80 +1,76 @@
|
||||||
var pocket = {
|
export default function(part) {
|
||||||
draft: function(part) {
|
// Remove clutter
|
||||||
// Remove clutter
|
let pocket = part.paths.pocket;
|
||||||
let pocket = part.paths.pocket;
|
part.paths = {};
|
||||||
part.paths = {};
|
part.snippets = {};
|
||||||
part.snippets = {};
|
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
||||||
|
|
||||||
paths.seam = pocket
|
paths.seam = pocket
|
||||||
.line(points.cfRibbing)
|
.line(points.cfRibbing)
|
||||||
.line(points.pocketHem)
|
.line(points.pocketHem)
|
||||||
.attr("class", "fabric", true);
|
.attr("class", "fabric", true);
|
||||||
|
|
||||||
store.set("facingWidth", points.pocketHem.dist(points.pocketTip) / 2);
|
store.set("facingWidth", points.pocketHem.dist(points.pocketTip) / 2);
|
||||||
|
|
||||||
let facing = new Path()
|
let facing = new Path()
|
||||||
.move(points.pocketTip)
|
.move(points.pocketTip)
|
||||||
.curve(points.pocketTip, points.pocketTopCp, points.pocketTop)
|
.curve(points.pocketTip, points.pocketTopCp, points.pocketTop)
|
||||||
.offset(store.get("facingWidth") * -1);
|
.offset(store.get("facingWidth") * -1);
|
||||||
|
|
||||||
points._tmp = facing.shiftAlong(2);
|
points._tmp = facing.shiftAlong(2);
|
||||||
points.facingEnd = utils.beamsIntersect(
|
points.facingEnd = utils.beamsIntersect(
|
||||||
points._tmp,
|
points._tmp,
|
||||||
facing.start(),
|
facing.start(),
|
||||||
points.pocketHem,
|
points.pocketHem,
|
||||||
points.pocketTip
|
points.pocketTip
|
||||||
|
);
|
||||||
|
paths.facing = new Path()
|
||||||
|
.move(points.facingEnd)
|
||||||
|
.line(facing.start())
|
||||||
|
.join(facing)
|
||||||
|
.attr("class", " fabric help");
|
||||||
|
|
||||||
|
// Complete pattern?
|
||||||
|
if (complete) {
|
||||||
|
macro("grainline", {
|
||||||
|
from: points.cfRibbing.shift(0, 15),
|
||||||
|
to: points.pocketCf.shift(0, 15)
|
||||||
|
});
|
||||||
|
points.title = points.cfRibbing.shiftFractionTowards(
|
||||||
|
points.pocketTop,
|
||||||
|
0.5
|
||||||
);
|
);
|
||||||
paths.facing = new Path()
|
macro("title", { at: points.title, nr: 4, title: "pocket" });
|
||||||
.move(points.facingEnd)
|
if (sa) {
|
||||||
.line(facing.start())
|
paths.sa = paths.seam.offset(sa).attr("class", "fabric sa");
|
||||||
.join(facing)
|
|
||||||
.attr("class", " fabric help");
|
|
||||||
|
|
||||||
// Complete pattern?
|
|
||||||
if (complete) {
|
|
||||||
macro("grainline", {
|
|
||||||
from: points.cfRibbing.shift(0, 15),
|
|
||||||
to: points.pocketCf.shift(0, 15)
|
|
||||||
});
|
|
||||||
points.title = points.cfRibbing.shiftFractionTowards(
|
|
||||||
points.pocketTop,
|
|
||||||
0.5
|
|
||||||
);
|
|
||||||
macro("title", { at: points.title, nr: 4, title: "pocket" });
|
|
||||||
if (sa) {
|
|
||||||
paths.sa = paths.seam.offset(sa).attr("class", "fabric sa");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Paperless?
|
|
||||||
if (paperless) {
|
|
||||||
macro("hd", {
|
|
||||||
from: points.cfRibbing,
|
|
||||||
to: points.pocketTop,
|
|
||||||
y: points.cfRibbing.y + 15 + sa
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.cfRibbing,
|
|
||||||
to: points.pocketTip,
|
|
||||||
y: points.cfRibbing.y + 30 + sa
|
|
||||||
});
|
|
||||||
macro("vd", {
|
|
||||||
from: points.pocketHem,
|
|
||||||
to: points.pocketTip,
|
|
||||||
x: points.pocketTip.x + 15 + sa
|
|
||||||
});
|
|
||||||
macro("vd", {
|
|
||||||
from: points.pocketHem,
|
|
||||||
to: points.pocketTop,
|
|
||||||
x: points.cfRibbing.x - 15 - sa
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return part;
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
export default pocket;
|
// Paperless?
|
||||||
|
if (paperless) {
|
||||||
|
macro("hd", {
|
||||||
|
from: points.cfRibbing,
|
||||||
|
to: points.pocketTop,
|
||||||
|
y: points.cfRibbing.y + 15 + sa
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.cfRibbing,
|
||||||
|
to: points.pocketTip,
|
||||||
|
y: points.cfRibbing.y + 30 + sa
|
||||||
|
});
|
||||||
|
macro("vd", {
|
||||||
|
from: points.pocketHem,
|
||||||
|
to: points.pocketTip,
|
||||||
|
x: points.pocketTip.x + 15 + sa
|
||||||
|
});
|
||||||
|
macro("vd", {
|
||||||
|
from: points.pocketHem,
|
||||||
|
to: points.pocketTop,
|
||||||
|
x: points.cfRibbing.x - 15 - sa
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return part;
|
||||||
|
};
|
||||||
|
|
|
@ -1,51 +1,47 @@
|
||||||
var pocketFacing = {
|
export default function(part) {
|
||||||
draft: function(part) {
|
// Remove clutter
|
||||||
// Remove clutter
|
let facing = part.paths.facing;
|
||||||
let facing = part.paths.facing;
|
part.paths = {};
|
||||||
part.paths = {};
|
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
let {sa, Point, points, Path, paths, Snippet, snippets, complete, paperless, macro, utils, store} = part.shorthand();
|
let {sa, Point, points, Path, paths, Snippet, snippets, complete, paperless, macro, utils, store} = part.shorthand();
|
||||||
|
|
||||||
paths.seam = facing
|
paths.seam = facing
|
||||||
.line(points.pocketTop)
|
.line(points.pocketTop)
|
||||||
.curve(points.pocketTopCp, points.pocketTip, points.pocketTip)
|
.curve(points.pocketTopCp, points.pocketTip, points.pocketTip)
|
||||||
.line(points.facingEnd)
|
.line(points.facingEnd)
|
||||||
.close()
|
.close()
|
||||||
.attr("class", "fabric", true);
|
.attr("class", "fabric", true);
|
||||||
|
|
||||||
points.saStart = points.pocketTop.shift(180, store.get("facingWidth"));
|
points.saStart = points.pocketTop.shift(180, store.get("facingWidth"));
|
||||||
|
|
||||||
// Complete pattern?
|
// Complete pattern?
|
||||||
if (complete) {
|
if (complete) {
|
||||||
points.title = points.pocketTopCp.clone();
|
points.title = points.pocketTopCp.clone();
|
||||||
macro("title", { at: points.title, nr: 5, title: "pocketFacing" });
|
macro("title", { at: points.title, nr: 5, title: "pocketFacing" });
|
||||||
if (sa) {
|
if (sa) {
|
||||||
paths.sa = new Path()
|
paths.sa = new Path()
|
||||||
.move(points.saStart)
|
.move(points.saStart)
|
||||||
.line(points.pocketTop)
|
.line(points.pocketTop)
|
||||||
.curve(points.pocketTopCp, points.pocketTip, points.pocketTip)
|
.curve(points.pocketTopCp, points.pocketTip, points.pocketTip)
|
||||||
.line(points.facingEnd)
|
.line(points.facingEnd)
|
||||||
.offset(sa * -1)
|
.offset(sa * -1)
|
||||||
.attr("class", "fabric sa");
|
.attr("class", "fabric sa");
|
||||||
paths.sa
|
paths.sa
|
||||||
.line(points.facingEnd)
|
.line(points.facingEnd)
|
||||||
.move(points.saStart)
|
.move(points.saStart)
|
||||||
.line(paths.sa.start());
|
.line(paths.sa.start());
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Paperless?
|
|
||||||
if (paperless) {
|
|
||||||
macro("hd", {
|
|
||||||
from: points.saStart,
|
|
||||||
to: points.pocketTop,
|
|
||||||
y: points.saStart.y - 15 - sa
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return part;
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
export default pocketFacing;
|
// Paperless?
|
||||||
|
if (paperless) {
|
||||||
|
macro("hd", {
|
||||||
|
from: points.saStart,
|
||||||
|
to: points.pocketTop,
|
||||||
|
y: points.saStart.y - 15 - sa
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return part;
|
||||||
|
};
|
||||||
|
|
|
@ -1,159 +1,124 @@
|
||||||
var sleeve = {
|
export default function(part) {
|
||||||
draft: function(part) {
|
// prettier-ignore
|
||||||
// prettier-ignore
|
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
||||||
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
|
||||||
|
|
||||||
// Top of raglan sleeve
|
// Top of raglan sleeve
|
||||||
points.raglanTop = new Point(
|
points.raglanTop = new Point(
|
||||||
0,
|
0,
|
||||||
points.sleeveTip.y - store.get("shoulderLength")
|
points.sleeveTip.y - store.get("shoulderLength")
|
||||||
|
);
|
||||||
|
|
||||||
|
// Move and rotate front neck opening part
|
||||||
|
let anchor = store.get("neckOpeningAnchorFront");
|
||||||
|
let neckOpeningFront = store.get("neckOpeningPartFront");
|
||||||
|
neckOpeningFront = neckOpeningFront.translate(
|
||||||
|
anchor.dx(points.raglanTop),
|
||||||
|
anchor.dy(points.raglanTop)
|
||||||
|
);
|
||||||
|
let cp2 = neckOpeningFront.ops[1].cp1;
|
||||||
|
let cp1 = neckOpeningFront.ops[1].cp2;
|
||||||
|
let to = neckOpeningFront.ops[0].to;
|
||||||
|
let angle = points.raglanTop.angle(cp1);
|
||||||
|
points.raglanTopCp2 = cp1.rotate(180 - angle, points.raglanTop);
|
||||||
|
points.raglanTipFrontCp1 = cp2.rotate(180 - angle, points.raglanTop);
|
||||||
|
points.raglanTipFront = to.rotate(180 - angle, points.raglanTop);
|
||||||
|
|
||||||
|
// Move and rotate back neck opening part
|
||||||
|
anchor = store.get("neckOpeningAnchorBack");
|
||||||
|
let neckOpeningBack = store.get("neckOpeningPartBack");
|
||||||
|
neckOpeningBack = neckOpeningBack.translate(
|
||||||
|
anchor.dx(points.raglanTop),
|
||||||
|
anchor.dy(points.raglanTop)
|
||||||
|
);
|
||||||
|
cp2 = neckOpeningBack.ops[1].cp1;
|
||||||
|
cp1 = neckOpeningBack.ops[1].cp2;
|
||||||
|
to = neckOpeningBack.ops[0].to;
|
||||||
|
points.raglanTopCp1 = cp1.flipX(); //rotate(180 - angle, points.raglanTop);
|
||||||
|
points.raglanTipBackCp2 = cp2.flipX(); //rotate(180 - angle, points.raglanTop);
|
||||||
|
points.raglanTipBack = to.flipX(); //rotate(180 - angle, points.raglanTop);
|
||||||
|
angle = points.raglanTop.angle(points.raglanTopCp1);
|
||||||
|
points.raglanTopCp1 = points.raglanTopCp1.rotate(
|
||||||
|
360 - angle,
|
||||||
|
points.raglanTop
|
||||||
|
);
|
||||||
|
points.raglanTipBackCp2 = points.raglanTipBackCp2.rotate(
|
||||||
|
360 - angle,
|
||||||
|
points.raglanTop
|
||||||
|
);
|
||||||
|
points.raglanTipBack = points.raglanTipBack.rotate(
|
||||||
|
360 - angle,
|
||||||
|
points.raglanTop
|
||||||
|
);
|
||||||
|
|
||||||
|
let ragDiff = 0;
|
||||||
|
let runs = 0;
|
||||||
|
do {
|
||||||
|
// Curve raglan seam to accomodate shoulder slope
|
||||||
|
points.raglanMidFront = points.raglanTipFront.shiftFractionTowards(
|
||||||
|
points.capQ4Base,
|
||||||
|
0.5
|
||||||
|
);
|
||||||
|
points.raglanMidBack = utils.beamsIntersect(
|
||||||
|
points.raglanTipBack,
|
||||||
|
points.capQ1Base,
|
||||||
|
points.raglanMidFront,
|
||||||
|
points.raglanMidFront.shift(0, 100)
|
||||||
|
);
|
||||||
|
points.raglanFrontCp1 = points.raglanTipFront.shiftFractionTowards(
|
||||||
|
points.capQ4Base,
|
||||||
|
0.25
|
||||||
|
);
|
||||||
|
points.raglanFrontCp2 = points.raglanTipFront.shiftFractionTowards(
|
||||||
|
points.capQ4Base,
|
||||||
|
0.75
|
||||||
|
);
|
||||||
|
points.raglanBackCp1 = points.raglanTipBack.shiftFractionTowards(
|
||||||
|
points.capQ1Base,
|
||||||
|
0.8
|
||||||
|
);
|
||||||
|
points.raglanBackCp2 = points.raglanTipBack.shiftFractionTowards(
|
||||||
|
points.capQ1Base,
|
||||||
|
0.3
|
||||||
|
);
|
||||||
|
let slope = store.get("shoulderSlopeDeltaY");
|
||||||
|
let angleFront = points.raglanTipFront.angle(points.capQ4Base);
|
||||||
|
let angleBack = points.raglanTipBack.angle(points.capQ1Base);
|
||||||
|
points.slopeFront = points.raglanMidFront.shift(
|
||||||
|
angleFront + 90,
|
||||||
|
slope / 2
|
||||||
|
);
|
||||||
|
points.slopeBack = points.raglanMidBack.shift(angleBack - 90, slope / 2);
|
||||||
|
points.slopeFrontCp1 = points.raglanFrontCp1.shift(
|
||||||
|
angleFront + 90,
|
||||||
|
slope / 2
|
||||||
|
);
|
||||||
|
points.slopeFrontCp2 = points.raglanFrontCp2.shift(
|
||||||
|
angleFront + 90,
|
||||||
|
slope / 2
|
||||||
|
);
|
||||||
|
points.slopeBackCp1 = points.raglanBackCp1.shift(
|
||||||
|
angleBack - 90,
|
||||||
|
slope / 2
|
||||||
|
);
|
||||||
|
points.slopeBackCp2 = points.raglanBackCp2.shift(
|
||||||
|
angleBack - 90,
|
||||||
|
slope / 2
|
||||||
|
);
|
||||||
|
points.capQ4BaseCp = utils.beamsIntersect(
|
||||||
|
points.slopeFrontCp2,
|
||||||
|
points.capQ4Base,
|
||||||
|
points.bicepsLeft,
|
||||||
|
points.capQ4Cp2
|
||||||
|
);
|
||||||
|
points.capQ1BaseCp = utils.beamsIntersect(
|
||||||
|
points.slopeBackCp1,
|
||||||
|
points.capQ1Base,
|
||||||
|
points.bicepsRight,
|
||||||
|
points.capQ1Cp2
|
||||||
);
|
);
|
||||||
|
|
||||||
// Move and rotate front neck opening part
|
// Now make sure the length matches the front raglan seam
|
||||||
let anchor = store.get("neckOpeningAnchorFront");
|
let raglen = new Path()
|
||||||
let neckOpeningFront = store.get("neckOpeningPartFront");
|
|
||||||
neckOpeningFront = neckOpeningFront.translate(
|
|
||||||
anchor.dx(points.raglanTop),
|
|
||||||
anchor.dy(points.raglanTop)
|
|
||||||
);
|
|
||||||
let cp2 = neckOpeningFront.ops[1].cp1;
|
|
||||||
let cp1 = neckOpeningFront.ops[1].cp2;
|
|
||||||
let to = neckOpeningFront.ops[0].to;
|
|
||||||
let angle = points.raglanTop.angle(cp1);
|
|
||||||
points.raglanTopCp2 = cp1.rotate(180 - angle, points.raglanTop);
|
|
||||||
points.raglanTipFrontCp1 = cp2.rotate(180 - angle, points.raglanTop);
|
|
||||||
points.raglanTipFront = to.rotate(180 - angle, points.raglanTop);
|
|
||||||
|
|
||||||
// Move and rotate back neck opening part
|
|
||||||
anchor = store.get("neckOpeningAnchorBack");
|
|
||||||
let neckOpeningBack = store.get("neckOpeningPartBack");
|
|
||||||
neckOpeningBack = neckOpeningBack.translate(
|
|
||||||
anchor.dx(points.raglanTop),
|
|
||||||
anchor.dy(points.raglanTop)
|
|
||||||
);
|
|
||||||
cp2 = neckOpeningBack.ops[1].cp1;
|
|
||||||
cp1 = neckOpeningBack.ops[1].cp2;
|
|
||||||
to = neckOpeningBack.ops[0].to;
|
|
||||||
points.raglanTopCp1 = cp1.flipX(); //rotate(180 - angle, points.raglanTop);
|
|
||||||
points.raglanTipBackCp2 = cp2.flipX(); //rotate(180 - angle, points.raglanTop);
|
|
||||||
points.raglanTipBack = to.flipX(); //rotate(180 - angle, points.raglanTop);
|
|
||||||
angle = points.raglanTop.angle(points.raglanTopCp1);
|
|
||||||
points.raglanTopCp1 = points.raglanTopCp1.rotate(
|
|
||||||
360 - angle,
|
|
||||||
points.raglanTop
|
|
||||||
);
|
|
||||||
points.raglanTipBackCp2 = points.raglanTipBackCp2.rotate(
|
|
||||||
360 - angle,
|
|
||||||
points.raglanTop
|
|
||||||
);
|
|
||||||
points.raglanTipBack = points.raglanTipBack.rotate(
|
|
||||||
360 - angle,
|
|
||||||
points.raglanTop
|
|
||||||
);
|
|
||||||
|
|
||||||
let ragDiff = 0;
|
|
||||||
let runs = 0;
|
|
||||||
do {
|
|
||||||
// Curve raglan seam to accomodate shoulder slope
|
|
||||||
points.raglanMidFront = points.raglanTipFront.shiftFractionTowards(
|
|
||||||
points.capQ4Base,
|
|
||||||
0.5
|
|
||||||
);
|
|
||||||
points.raglanMidBack = utils.beamsIntersect(
|
|
||||||
points.raglanTipBack,
|
|
||||||
points.capQ1Base,
|
|
||||||
points.raglanMidFront,
|
|
||||||
points.raglanMidFront.shift(0, 100)
|
|
||||||
);
|
|
||||||
points.raglanFrontCp1 = points.raglanTipFront.shiftFractionTowards(
|
|
||||||
points.capQ4Base,
|
|
||||||
0.25
|
|
||||||
);
|
|
||||||
points.raglanFrontCp2 = points.raglanTipFront.shiftFractionTowards(
|
|
||||||
points.capQ4Base,
|
|
||||||
0.75
|
|
||||||
);
|
|
||||||
points.raglanBackCp1 = points.raglanTipBack.shiftFractionTowards(
|
|
||||||
points.capQ1Base,
|
|
||||||
0.8
|
|
||||||
);
|
|
||||||
points.raglanBackCp2 = points.raglanTipBack.shiftFractionTowards(
|
|
||||||
points.capQ1Base,
|
|
||||||
0.3
|
|
||||||
);
|
|
||||||
let slope = store.get("shoulderSlopeDeltaY");
|
|
||||||
let angleFront = points.raglanTipFront.angle(points.capQ4Base);
|
|
||||||
let angleBack = points.raglanTipBack.angle(points.capQ1Base);
|
|
||||||
points.slopeFront = points.raglanMidFront.shift(
|
|
||||||
angleFront + 90,
|
|
||||||
slope / 2
|
|
||||||
);
|
|
||||||
points.slopeBack = points.raglanMidBack.shift(angleBack - 90, slope / 2);
|
|
||||||
points.slopeFrontCp1 = points.raglanFrontCp1.shift(
|
|
||||||
angleFront + 90,
|
|
||||||
slope / 2
|
|
||||||
);
|
|
||||||
points.slopeFrontCp2 = points.raglanFrontCp2.shift(
|
|
||||||
angleFront + 90,
|
|
||||||
slope / 2
|
|
||||||
);
|
|
||||||
points.slopeBackCp1 = points.raglanBackCp1.shift(
|
|
||||||
angleBack - 90,
|
|
||||||
slope / 2
|
|
||||||
);
|
|
||||||
points.slopeBackCp2 = points.raglanBackCp2.shift(
|
|
||||||
angleBack - 90,
|
|
||||||
slope / 2
|
|
||||||
);
|
|
||||||
points.capQ4BaseCp = utils.beamsIntersect(
|
|
||||||
points.slopeFrontCp2,
|
|
||||||
points.capQ4Base,
|
|
||||||
points.bicepsLeft,
|
|
||||||
points.capQ4Cp2
|
|
||||||
);
|
|
||||||
points.capQ1BaseCp = utils.beamsIntersect(
|
|
||||||
points.slopeBackCp1,
|
|
||||||
points.capQ1Base,
|
|
||||||
points.bicepsRight,
|
|
||||||
points.capQ1Cp2
|
|
||||||
);
|
|
||||||
|
|
||||||
// Now make sure the length matches the front raglan seam
|
|
||||||
let raglen = new Path()
|
|
||||||
.move(points.raglanTipBack)
|
|
||||||
.curve(points.raglanTipBackCp2, points.raglanTopCp1, points.raglanTop)
|
|
||||||
.curve(
|
|
||||||
points.raglanTopCp2,
|
|
||||||
points.raglanTipFrontCp1,
|
|
||||||
points.raglanTipFront
|
|
||||||
)
|
|
||||||
.curve(points.raglanTipFront, points.slopeFrontCp1, points.slopeFront)
|
|
||||||
.curve(points.slopeFrontCp2, points.capQ4Base, points.capQ4Base)
|
|
||||||
.length();
|
|
||||||
ragDiff = store.get("raglen") - raglen;
|
|
||||||
let tipPoints = [
|
|
||||||
"raglanTipFront",
|
|
||||||
"raglanTipFrontCp1",
|
|
||||||
"raglanTopCp2",
|
|
||||||
"raglanTop",
|
|
||||||
"raglanTopCp1",
|
|
||||||
"raglanTipBackCp2",
|
|
||||||
"raglanTipBack"
|
|
||||||
];
|
|
||||||
for (let pid of tipPoints) points[pid] = points[pid].shift(90, ragDiff);
|
|
||||||
// Fix sleeve length
|
|
||||||
let lenTotal =
|
|
||||||
store.get("shoulderLength") +
|
|
||||||
measurements.shoulderToWrist * (1 + options.sleeveLengthBonus) -
|
|
||||||
options.ribbingWidth;
|
|
||||||
let lenDelta = points.raglanTop.dist(points.centerWrist) - lenTotal;
|
|
||||||
let wristPoints = ["wristLeft", "centerWrist", "wristRight"];
|
|
||||||
for (let pid of wristPoints)
|
|
||||||
points[pid] = points[pid].shift(90, lenDelta);
|
|
||||||
runs++;
|
|
||||||
} while (Math.abs(ragDiff) > 5 && runs < 10);
|
|
||||||
|
|
||||||
paths.seam = new Path()
|
|
||||||
.move(points.raglanTipBack)
|
.move(points.raglanTipBack)
|
||||||
.curve(points.raglanTipBackCp2, points.raglanTopCp1, points.raglanTop)
|
.curve(points.raglanTipBackCp2, points.raglanTopCp1, points.raglanTop)
|
||||||
.curve(
|
.curve(
|
||||||
|
@ -162,97 +127,128 @@ var sleeve = {
|
||||||
points.raglanTipFront
|
points.raglanTipFront
|
||||||
)
|
)
|
||||||
.curve(points.raglanTipFront, points.slopeFrontCp1, points.slopeFront)
|
.curve(points.raglanTipFront, points.slopeFrontCp1, points.slopeFront)
|
||||||
|
.curve(points.slopeFrontCp2, points.capQ4Base, points.capQ4Base)
|
||||||
|
.length();
|
||||||
|
ragDiff = store.get("raglen") - raglen;
|
||||||
|
let tipPoints = [
|
||||||
|
"raglanTipFront",
|
||||||
|
"raglanTipFrontCp1",
|
||||||
|
"raglanTopCp2",
|
||||||
|
"raglanTop",
|
||||||
|
"raglanTopCp1",
|
||||||
|
"raglanTipBackCp2",
|
||||||
|
"raglanTipBack"
|
||||||
|
];
|
||||||
|
for (let pid of tipPoints) points[pid] = points[pid].shift(90, ragDiff);
|
||||||
|
// Fix sleeve length
|
||||||
|
let lenTotal =
|
||||||
|
store.get("shoulderLength") +
|
||||||
|
measurements.shoulderToWrist * (1 + options.sleeveLengthBonus) -
|
||||||
|
options.ribbingWidth;
|
||||||
|
let lenDelta = points.raglanTop.dist(points.centerWrist) - lenTotal;
|
||||||
|
let wristPoints = ["wristLeft", "centerWrist", "wristRight"];
|
||||||
|
for (let pid of wristPoints)
|
||||||
|
points[pid] = points[pid].shift(90, lenDelta);
|
||||||
|
runs++;
|
||||||
|
} while (Math.abs(ragDiff) > 5 && runs < 10);
|
||||||
|
|
||||||
|
paths.seam = new Path()
|
||||||
|
.move(points.raglanTipBack)
|
||||||
|
.curve(points.raglanTipBackCp2, points.raglanTopCp1, points.raglanTop)
|
||||||
|
.curve(
|
||||||
|
points.raglanTopCp2,
|
||||||
|
points.raglanTipFrontCp1,
|
||||||
|
points.raglanTipFront
|
||||||
|
)
|
||||||
|
.curve(points.raglanTipFront, points.slopeFrontCp1, points.slopeFront)
|
||||||
|
.curve(points.slopeFrontCp2, points.capQ4Cp2, points.bicepsLeft)
|
||||||
|
.line(points.wristLeft)
|
||||||
|
.line(points.wristRight)
|
||||||
|
.line(points.bicepsRight)
|
||||||
|
.curve(points.capQ1Cp1, points.slopeBackCp1, points.slopeBack)
|
||||||
|
.curve(points.slopeBackCp2, points.raglanTipBack, points.raglanTipBack)
|
||||||
|
.close()
|
||||||
|
.attr("class", "fabric");
|
||||||
|
|
||||||
|
// Complete pattern?
|
||||||
|
if (complete) {
|
||||||
|
macro("grainline", {
|
||||||
|
from: points.centerWrist,
|
||||||
|
to: points.raglanTop
|
||||||
|
});
|
||||||
|
//points.title = new Point(points.armhole.x/2, points.armhole.y);
|
||||||
|
macro("title", { at: points.gridAnchor, nr: 3, title: "sleeve" });
|
||||||
|
//points.sleeveNotch = points.raglanTipFront.shiftFractionTowards(points.armholeHollow, 0.5);
|
||||||
|
//snippets.sleeveNotch = new Snippet("notch", points.sleeveNotch);
|
||||||
|
//store.set('frontRaglanTipToNotch', points.raglanTipFront.dist(points.sleeveNotch));
|
||||||
|
points.logo = points.gridAnchor.shift(-90, 70);
|
||||||
|
snippets.logo = new Snippet("logo", points.logo);
|
||||||
|
points.scalebox = points.logo.shift(-90, 70);
|
||||||
|
macro("scalebox", { at: points.scalebox });
|
||||||
|
points.frontNotch = new Path()
|
||||||
|
.move(points.raglanTipFront)
|
||||||
|
.curve(points.raglanTipFront, points.slopeFrontCp1, points.slopeFront)
|
||||||
.curve(points.slopeFrontCp2, points.capQ4Cp2, points.bicepsLeft)
|
.curve(points.slopeFrontCp2, points.capQ4Cp2, points.bicepsLeft)
|
||||||
.line(points.wristLeft)
|
.shiftAlong(store.get("notchFront"));
|
||||||
.line(points.wristRight)
|
snippets.frontNotch = new Snippet("notch", points.frontNotch);
|
||||||
.line(points.bicepsRight)
|
points.backNotch = new Path()
|
||||||
.curve(points.capQ1Cp1, points.slopeBackCp1, points.slopeBack)
|
.move(points.raglanTipBack)
|
||||||
.curve(points.slopeBackCp2, points.raglanTipBack, points.raglanTipBack)
|
.curve(points.raglanTipBack, points.slopeBackCp2, points.slopeBack)
|
||||||
.close()
|
.curve(points.slopeBackCp1, points.capQ1Cp1, points.bicepsRight)
|
||||||
.attr("class", "fabric");
|
.shiftAlong(store.get("notchBack"));
|
||||||
|
snippets.backNotch = new Snippet("bnotch", points.backNotch);
|
||||||
// Complete pattern?
|
if (sa) {
|
||||||
if (complete) {
|
paths.sa = paths.seam.offset(sa).attr("class", "fabric sa");
|
||||||
macro("grainline", {
|
|
||||||
from: points.centerWrist,
|
|
||||||
to: points.raglanTop
|
|
||||||
});
|
|
||||||
//points.title = new Point(points.armhole.x/2, points.armhole.y);
|
|
||||||
macro("title", { at: points.gridAnchor, nr: 3, title: "sleeve" });
|
|
||||||
//points.sleeveNotch = points.raglanTipFront.shiftFractionTowards(points.armholeHollow, 0.5);
|
|
||||||
//snippets.sleeveNotch = new Snippet("notch", points.sleeveNotch);
|
|
||||||
//store.set('frontRaglanTipToNotch', points.raglanTipFront.dist(points.sleeveNotch));
|
|
||||||
points.logo = points.gridAnchor.shift(-90, 70);
|
|
||||||
snippets.logo = new Snippet("logo", points.logo);
|
|
||||||
points.scalebox = points.logo.shift(-90, 70);
|
|
||||||
macro("scalebox", { at: points.scalebox });
|
|
||||||
points.frontNotch = new Path()
|
|
||||||
.move(points.raglanTipFront)
|
|
||||||
.curve(points.raglanTipFront, points.slopeFrontCp1, points.slopeFront)
|
|
||||||
.curve(points.slopeFrontCp2, points.capQ4Cp2, points.bicepsLeft)
|
|
||||||
.shiftAlong(store.get("notchFront"));
|
|
||||||
snippets.frontNotch = new Snippet("notch", points.frontNotch);
|
|
||||||
points.backNotch = new Path()
|
|
||||||
.move(points.raglanTipBack)
|
|
||||||
.curve(points.raglanTipBack, points.slopeBackCp2, points.slopeBack)
|
|
||||||
.curve(points.slopeBackCp1, points.capQ1Cp1, points.bicepsRight)
|
|
||||||
.shiftAlong(store.get("notchBack"));
|
|
||||||
snippets.backNotch = new Snippet("bnotch", points.backNotch);
|
|
||||||
if (sa) {
|
|
||||||
paths.sa = paths.seam.offset(sa).attr("class", "fabric sa");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Paperless?
|
|
||||||
if (paperless) {
|
|
||||||
macro("vd", {
|
|
||||||
from: points.wristLeft,
|
|
||||||
to: points.bicepsLeft,
|
|
||||||
x: points.bicepsLeft.x - 15 - sa
|
|
||||||
});
|
|
||||||
macro("vd", {
|
|
||||||
from: points.bicepsLeft,
|
|
||||||
to: points.raglanTipFront,
|
|
||||||
x: points.bicepsLeft.x - 15 - sa
|
|
||||||
});
|
|
||||||
macro("vd", {
|
|
||||||
from: points.bicepsRight,
|
|
||||||
to: points.raglanTop,
|
|
||||||
x: points.bicepsRight.x + 15 + sa
|
|
||||||
});
|
|
||||||
macro("vd", {
|
|
||||||
from: points.bicepsRight,
|
|
||||||
to: points.raglanTipBack,
|
|
||||||
x: points.bicepsRight.x + 30 + sa
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.raglanTipFront,
|
|
||||||
to: points.raglanTop,
|
|
||||||
y: points.raglanTipBack.y - 15 - sa
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.raglanTop,
|
|
||||||
to: points.raglanTipBack,
|
|
||||||
y: points.raglanTipBack.y - 15 - sa
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.bicepsLeft,
|
|
||||||
to: points.raglanTop,
|
|
||||||
y: points.raglanTipBack.y - 30 - sa
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.bicepsLeft,
|
|
||||||
to: points.bicepsRight,
|
|
||||||
y: points.raglanTipBack.y - 45 - sa
|
|
||||||
});
|
|
||||||
macro("hd", {
|
|
||||||
from: points.wristLeft,
|
|
||||||
to: points.wristRight,
|
|
||||||
y: points.wristLeft.y + 15 + sa
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return part;
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
export default sleeve;
|
// Paperless?
|
||||||
|
if (paperless) {
|
||||||
|
macro("vd", {
|
||||||
|
from: points.wristLeft,
|
||||||
|
to: points.bicepsLeft,
|
||||||
|
x: points.bicepsLeft.x - 15 - sa
|
||||||
|
});
|
||||||
|
macro("vd", {
|
||||||
|
from: points.bicepsLeft,
|
||||||
|
to: points.raglanTipFront,
|
||||||
|
x: points.bicepsLeft.x - 15 - sa
|
||||||
|
});
|
||||||
|
macro("vd", {
|
||||||
|
from: points.bicepsRight,
|
||||||
|
to: points.raglanTop,
|
||||||
|
x: points.bicepsRight.x + 15 + sa
|
||||||
|
});
|
||||||
|
macro("vd", {
|
||||||
|
from: points.bicepsRight,
|
||||||
|
to: points.raglanTipBack,
|
||||||
|
x: points.bicepsRight.x + 30 + sa
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.raglanTipFront,
|
||||||
|
to: points.raglanTop,
|
||||||
|
y: points.raglanTipBack.y - 15 - sa
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.raglanTop,
|
||||||
|
to: points.raglanTipBack,
|
||||||
|
y: points.raglanTipBack.y - 15 - sa
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.bicepsLeft,
|
||||||
|
to: points.raglanTop,
|
||||||
|
y: points.raglanTipBack.y - 30 - sa
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.bicepsLeft,
|
||||||
|
to: points.bicepsRight,
|
||||||
|
y: points.raglanTipBack.y - 45 - sa
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.wristLeft,
|
||||||
|
to: points.wristRight,
|
||||||
|
y: points.wristLeft.y + 15 + sa
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return part;
|
||||||
|
};
|
||||||
|
|
|
@ -1,76 +1,72 @@
|
||||||
var waistband = {
|
export default function(part) {
|
||||||
draft: function(part) {
|
// prettier-ignore
|
||||||
// prettier-ignore
|
let {measurements, options, sa, Point, points, Path, paths, complete, paperless, macro, units} = part.shorthand();
|
||||||
let {measurements, options, sa, Point, points, Path, paths, complete, paperless, macro, units} = part.shorthand();
|
|
||||||
|
|
||||||
let width =
|
let width =
|
||||||
(measurements.centerBackNeckToWaist + measurements.naturalWaistToHip) *
|
(measurements.centerBackNeckToWaist + measurements.naturalWaistToHip) *
|
||||||
options.ribbingWidth *
|
options.ribbingWidth *
|
||||||
2;
|
2;
|
||||||
|
|
||||||
points.topLeft = new Point(0, 0);
|
points.topLeft = new Point(0, 0);
|
||||||
points.bottomLeft = new Point(0, width);
|
points.bottomLeft = new Point(0, width);
|
||||||
points.topMidLeft = new Point(width, 0);
|
points.topMidLeft = new Point(width, 0);
|
||||||
points.bottomMidLeft = new Point(width, width);
|
points.bottomMidLeft = new Point(width, width);
|
||||||
points.topMidRight = new Point(width * 1.5, 0);
|
points.topMidRight = new Point(width * 1.5, 0);
|
||||||
points.bottomMidRight = new Point(width * 1.5, width);
|
points.bottomMidRight = new Point(width * 1.5, width);
|
||||||
points.topRight = new Point(width * 2.5, 0);
|
points.topRight = new Point(width * 2.5, 0);
|
||||||
points.bottomRight = new Point(width * 2.5, width);
|
points.bottomRight = new Point(width * 2.5, width);
|
||||||
|
|
||||||
paths.seam = new Path()
|
paths.seam = new Path()
|
||||||
.move(points.topMidLeft)
|
.move(points.topMidLeft)
|
||||||
.line(points.topLeft)
|
.line(points.topLeft)
|
||||||
.line(points.bottomLeft)
|
.line(points.bottomLeft)
|
||||||
.line(points.bottomMidLeft)
|
.line(points.bottomMidLeft)
|
||||||
.move(points.bottomMidRight)
|
.move(points.bottomMidRight)
|
||||||
.line(points.bottomRight)
|
.line(points.bottomRight)
|
||||||
.line(points.topRight)
|
.line(points.topRight)
|
||||||
.line(points.topMidRight)
|
.line(points.topMidRight)
|
||||||
.attr("class", "fabric");
|
.attr("class", "fabric");
|
||||||
paths.hint = new Path()
|
paths.hint = new Path()
|
||||||
.move(points.topMidLeft)
|
.move(points.topMidLeft)
|
||||||
.line(points.topMidRight)
|
.line(points.topMidRight)
|
||||||
.move(points.bottomMidLeft)
|
.move(points.bottomMidLeft)
|
||||||
.line(points.bottomMidRight)
|
.line(points.bottomMidRight)
|
||||||
.attr("class", "fabric dashed");
|
.attr("class", "fabric dashed");
|
||||||
|
|
||||||
// Complete pattern?
|
// Complete pattern?
|
||||||
if (complete) {
|
if (complete) {
|
||||||
if (sa) {
|
if (sa) {
|
||||||
paths.sa = paths.seam.offset(sa);
|
paths.sa = paths.seam.offset(sa);
|
||||||
}
|
|
||||||
points.title = points.bottomLeft.shiftFractionTowards(
|
|
||||||
points.topRight,
|
|
||||||
0.5
|
|
||||||
);
|
|
||||||
macro("title", { at: points.title, nr: 8, title: "waistband" });
|
|
||||||
macro("grainline", {
|
|
||||||
from: points.bottomMidLeft,
|
|
||||||
to: points.topMidLeft
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
points.title = points.bottomLeft.shiftFractionTowards(
|
||||||
// Paperless?
|
points.topRight,
|
||||||
if (paperless) {
|
0.5
|
||||||
macro("vd", {
|
);
|
||||||
from: points.bottomRight,
|
macro("title", { at: points.title, nr: 8, title: "waistband" });
|
||||||
to: points.topRight,
|
macro("grainline", {
|
||||||
x: points.topRight.x + sa + 15
|
from: points.bottomMidLeft,
|
||||||
});
|
to: points.topMidLeft
|
||||||
macro("hd", {
|
});
|
||||||
from: points.bottomLeft,
|
|
||||||
to: points.bottomRight,
|
|
||||||
y: points.bottomRight.y + sa + 15,
|
|
||||||
text: units(
|
|
||||||
measurements.chestCircumference *
|
|
||||||
(1 + options.chestEase) *
|
|
||||||
(1 - options.ribbingStretchFactor)
|
|
||||||
)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return part;
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
export default waistband;
|
// Paperless?
|
||||||
|
if (paperless) {
|
||||||
|
macro("vd", {
|
||||||
|
from: points.bottomRight,
|
||||||
|
to: points.topRight,
|
||||||
|
x: points.topRight.x + sa + 15
|
||||||
|
});
|
||||||
|
macro("hd", {
|
||||||
|
from: points.bottomLeft,
|
||||||
|
to: points.bottomRight,
|
||||||
|
y: points.bottomRight.y + sa + 15,
|
||||||
|
text: units(
|
||||||
|
measurements.chestCircumference *
|
||||||
|
(1 + options.chestEase) *
|
||||||
|
(1 - options.ribbingStretchFactor)
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return part;
|
||||||
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue