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",
|
||||
"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: {
|
||||
// Constants
|
||||
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/antman/dist/browser.js"></script>
|
||||
<script>
|
||||
var pattern = freesewing.patterns.hugo
|
||||
var pattern = new freesewing.patterns.hugo;
|
||||
pattern
|
||||
.with(freesewing.plugins.debug)
|
||||
.with(freesewing.plugins.theme)
|
||||
.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": {
|
||||
"@freesewing/brian": "^0.11",
|
||||
"@freesewing/plugin-bundle": "^0.3",
|
||||
"freesewing": "^0.17"
|
||||
"freesewing": "^0.23.2",
|
||||
"@freesewing/brian": "^0.19",
|
||||
"@freesewing/plugin-bundle": "^0.5.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "7.0.0-beta.56",
|
||||
|
@ -61,11 +61,11 @@
|
|||
"babel-plugin-transform-object-rest-spread": "^6.26.0",
|
||||
"@freesewing/antman": "0.2.0",
|
||||
"@freesewing/models": "0.6.0",
|
||||
"@freesewing/plugin-debug": "0.1.0",
|
||||
"@freesewing/plugin-designer": "0.7.3",
|
||||
"@freesewing/plugin-theme": "0.13.2",
|
||||
"@freesewing/plugin-validate": "0.2.0",
|
||||
"@freesewing/plugin-i18n": "0.0.1",
|
||||
"@freesewing/plugin-debug": "0.5.2",
|
||||
"@freesewing/plugin-designer": "0.10.0",
|
||||
"@freesewing/plugin-theme": "0.18.3",
|
||||
"@freesewing/plugin-validate": "0.4.1",
|
||||
"@freesewing/plugin-i18n": "0.1.2",
|
||||
"eslint": "5.3.0",
|
||||
"eslint-config-prettier": "^2.9.0",
|
||||
"eslint-plugin-prettier": "^2.6.2",
|
||||
|
|
|
@ -1,116 +1,112 @@
|
|||
var back = {
|
||||
draft: function(part) {
|
||||
// Remove clutter
|
||||
let seam = part.paths.seam;
|
||||
part.paths = {};
|
||||
part.paths.seam = seam;
|
||||
export default function(part) {
|
||||
// Remove clutter
|
||||
let seam = part.paths.seam;
|
||||
part.paths = {};
|
||||
part.paths.seam = seam;
|
||||
|
||||
// prettier-ignore
|
||||
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
||||
// prettier-ignore
|
||||
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
|
||||
points.cbHem = points.cbHips;
|
||||
points.hem = points.hips;
|
||||
// Hem is more descripting than hips in this case
|
||||
points.cbHem = points.cbHips;
|
||||
points.hem = points.hips;
|
||||
|
||||
// Ribbing
|
||||
points.cbRibbing = points.cbHem.shift(90, store.get("ribbing"));
|
||||
points.ribbing = points.hem.shift(90, store.get("ribbing"));
|
||||
// Ribbing
|
||||
points.cbRibbing = points.cbHem.shift(90, store.get("ribbing"));
|
||||
points.ribbing = points.hem.shift(90, store.get("ribbing"));
|
||||
|
||||
// Raglan tip
|
||||
let neckOpening = new Path()
|
||||
.move(points.cbNeck)
|
||||
.curve(points.cbNeck, points.neckCp2, points.neck);
|
||||
points.raglanTipBack = neckOpening.shiftFractionAlong(0.7);
|
||||
let neckOpeningParts = neckOpening.split(points.raglanTipBack);
|
||||
// Paths
|
||||
paths.saBase = new Path()
|
||||
.move(points.cbRibbing)
|
||||
.line(points.ribbing)
|
||||
.line(points.armhole)
|
||||
.curve(points.armholeCp2, points.armholeHollowCp1, points.armholeHollow)
|
||||
.line(points.raglanTipBack)
|
||||
.join(neckOpeningParts[0].reverse());
|
||||
paths.seam = paths.saBase
|
||||
.clone()
|
||||
.close()
|
||||
.attr("class", "fabric");
|
||||
paths.saBase.render = false;
|
||||
// Raglan tip
|
||||
let neckOpening = new Path()
|
||||
.move(points.cbNeck)
|
||||
.curve(points.cbNeck, points.neckCp2, points.neck);
|
||||
points.raglanTipBack = neckOpening.shiftFractionAlong(0.7);
|
||||
let neckOpeningParts = neckOpening.split(points.raglanTipBack);
|
||||
// Paths
|
||||
paths.saBase = new Path()
|
||||
.move(points.cbRibbing)
|
||||
.line(points.ribbing)
|
||||
.line(points.armhole)
|
||||
.curve(points.armholeCp2, points.armholeHollowCp1, points.armholeHollow)
|
||||
.line(points.raglanTipBack)
|
||||
.join(neckOpeningParts[0].reverse());
|
||||
paths.seam = paths.saBase
|
||||
.clone()
|
||||
.close()
|
||||
.attr("class", "fabric");
|
||||
paths.saBase.render = false;
|
||||
|
||||
// Store neck opening path
|
||||
store.set("neckOpeningPartBack", neckOpeningParts[1]);
|
||||
store.set("neckOpeningAnchorBack", points.neck);
|
||||
store.set("neckOpeningLenBack", neckOpening.length());
|
||||
store.set("neckCutoutBack", points.cbNeck.y);
|
||||
// Store neck opening path
|
||||
store.set("neckOpeningPartBack", neckOpeningParts[1]);
|
||||
store.set("neckOpeningAnchorBack", points.neck);
|
||||
store.set("neckOpeningLenBack", neckOpening.length());
|
||||
store.set("neckCutoutBack", points.cbNeck.y);
|
||||
|
||||
// Complete pattern?
|
||||
if (complete) {
|
||||
macro("cutonfold", {
|
||||
from: points.cbNeck,
|
||||
to: points.cbRibbing,
|
||||
grainline: true
|
||||
});
|
||||
points.title = new Point(points.armhole.x / 2, points.armhole.y);
|
||||
macro("title", { at: points.title, nr: 2, title: "back" });
|
||||
store.set(
|
||||
"notchBack",
|
||||
points.raglanTipBack.dist(points.armholeHollow) / 2
|
||||
);
|
||||
points.sleeveNotch = points.raglanTipBack.shiftTowards(
|
||||
points.armholeHollow,
|
||||
store.get("notchBack")
|
||||
);
|
||||
snippets.sleeveNotch = new Snippet("bnotch", points.sleeveNotch);
|
||||
store.set(
|
||||
"backRaglanTipToNotch",
|
||||
points.raglanTipBack.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.cbNeck)
|
||||
.attr("class", "fabric sa");
|
||||
paths.sa.move(points.cbRibbing).line(paths.sa.start());
|
||||
}
|
||||
// Complete pattern?
|
||||
if (complete) {
|
||||
macro("cutonfold", {
|
||||
from: points.cbNeck,
|
||||
to: points.cbRibbing,
|
||||
grainline: true
|
||||
});
|
||||
points.title = new Point(points.armhole.x / 2, points.armhole.y);
|
||||
macro("title", { at: points.title, nr: 2, title: "back" });
|
||||
store.set(
|
||||
"notchBack",
|
||||
points.raglanTipBack.dist(points.armholeHollow) / 2
|
||||
);
|
||||
points.sleeveNotch = points.raglanTipBack.shiftTowards(
|
||||
points.armholeHollow,
|
||||
store.get("notchBack")
|
||||
);
|
||||
snippets.sleeveNotch = new Snippet("bnotch", points.sleeveNotch);
|
||||
store.set(
|
||||
"backRaglanTipToNotch",
|
||||
points.raglanTipBack.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.cbNeck)
|
||||
.attr("class", "fabric sa");
|
||||
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 = {
|
||||
draft: function(part) {
|
||||
// prettier-ignore
|
||||
let {measurements, options, sa, Point, points, Path, paths, complete, paperless, macro, units} = part.shorthand();
|
||||
export default function(part) {
|
||||
// prettier-ignore
|
||||
let {measurements, options, sa, Point, points, Path, paths, complete, paperless, macro, units} = part.shorthand();
|
||||
|
||||
let width =
|
||||
(measurements.centerBackNeckToWaist + measurements.naturalWaistToHip) *
|
||||
options.ribbingWidth *
|
||||
2;
|
||||
let length =
|
||||
measurements.wristCircumference *
|
||||
(1 + options.cuffEase) *
|
||||
(1 - options.ribbingStretchFactor);
|
||||
let width =
|
||||
(measurements.centerBackNeckToWaist + measurements.naturalWaistToHip) *
|
||||
options.ribbingWidth *
|
||||
2;
|
||||
let length =
|
||||
measurements.wristCircumference *
|
||||
(1 + options.cuffEase) *
|
||||
(1 - options.ribbingStretchFactor);
|
||||
|
||||
points.topLeft = new Point(0, 0);
|
||||
points.bottomLeft = new Point(0, width);
|
||||
points.topRight = new Point(length, 0);
|
||||
points.bottomRight = new Point(length, width);
|
||||
points.topLeft = new Point(0, 0);
|
||||
points.bottomLeft = new Point(0, width);
|
||||
points.topRight = new Point(length, 0);
|
||||
points.bottomRight = new Point(length, width);
|
||||
|
||||
paths.seam = new Path()
|
||||
.move(points.topLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomRight)
|
||||
.line(points.topRight)
|
||||
.line(points.topLeft)
|
||||
.close()
|
||||
.attr("class", "fabric");
|
||||
paths.seam = new Path()
|
||||
.move(points.topLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomRight)
|
||||
.line(points.topRight)
|
||||
.line(points.topLeft)
|
||||
.close()
|
||||
.attr("class", "fabric");
|
||||
|
||||
// Complete pattern?
|
||||
if (complete) {
|
||||
if (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)
|
||||
});
|
||||
// Complete pattern?
|
||||
if (complete) {
|
||||
if (sa) {
|
||||
paths.sa = paths.seam.offset(sa);
|
||||
}
|
||||
|
||||
// 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;
|
||||
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)
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
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 = {
|
||||
draft: function(part) {
|
||||
// Remove clutter
|
||||
let seam = part.paths.seam;
|
||||
part.paths = {};
|
||||
part.paths.seam = seam;
|
||||
export default function(part) {
|
||||
// Remove clutter
|
||||
let seam = part.paths.seam;
|
||||
part.paths = {};
|
||||
part.paths.seam = seam;
|
||||
|
||||
// prettier-ignore
|
||||
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
||||
// prettier-ignore
|
||||
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(
|
||||
"lengthBonus",
|
||||
options.lengthBonus *
|
||||
(measurements.centerBackNeckToWaist + measurements.naturalWaistToHip)
|
||||
"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(
|
||||
"ribbing",
|
||||
(measurements.centerBackNeckToWaist + measurements.naturalWaistToHip) *
|
||||
options.ribbingWidth
|
||||
"frontRaglanTipToNotch",
|
||||
points.raglanTipFront.dist(points.sleeveNotch)
|
||||
);
|
||||
|
||||
// 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(
|
||||
"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());
|
||||
}
|
||||
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 = {
|
||||
draft: function(part) {
|
||||
// prettier-ignore
|
||||
let {store, sa, Point, points, Path, paths, complete, paperless, macro, units} = part.shorthand();
|
||||
export default function(part) {
|
||||
// prettier-ignore
|
||||
let {store, sa, Point, points, Path, paths, complete, paperless, macro, units} = part.shorthand();
|
||||
|
||||
let width = store.get("hoodCenterWidth");
|
||||
points.topLeft = new Point(0, 0);
|
||||
points.bottomLeft = new Point(0, width);
|
||||
points.topMidLeft = new Point(width, 0);
|
||||
points.bottomMidLeft = new Point(width, width);
|
||||
points.topMidRight = new Point(width * 1.5, 0);
|
||||
points.bottomMidRight = new Point(width * 1.5, width);
|
||||
points.topRight = new Point(width * 2.5, 0);
|
||||
points.bottomRight = new Point(width * 2.5, width);
|
||||
let width = store.get("hoodCenterWidth");
|
||||
points.topLeft = new Point(0, 0);
|
||||
points.bottomLeft = new Point(0, width);
|
||||
points.topMidLeft = new Point(width, 0);
|
||||
points.bottomMidLeft = new Point(width, width);
|
||||
points.topMidRight = new Point(width * 1.5, 0);
|
||||
points.bottomMidRight = new Point(width * 1.5, width);
|
||||
points.topRight = new Point(width * 2.5, 0);
|
||||
points.bottomRight = new Point(width * 2.5, width);
|
||||
|
||||
paths.seam = new Path()
|
||||
.move(points.topMidLeft)
|
||||
.line(points.topLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomMidLeft)
|
||||
.move(points.bottomMidRight)
|
||||
.line(points.bottomRight)
|
||||
.line(points.topRight)
|
||||
.line(points.topMidRight)
|
||||
.attr("class", "fabric");
|
||||
paths.hint = new Path()
|
||||
.move(points.topMidLeft)
|
||||
.line(points.topMidRight)
|
||||
.move(points.bottomMidLeft)
|
||||
.line(points.bottomMidRight)
|
||||
.attr("class", "fabric dashed");
|
||||
paths.seam = new Path()
|
||||
.move(points.topMidLeft)
|
||||
.line(points.topLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomMidLeft)
|
||||
.move(points.bottomMidRight)
|
||||
.line(points.bottomRight)
|
||||
.line(points.topRight)
|
||||
.line(points.topMidRight)
|
||||
.attr("class", "fabric");
|
||||
paths.hint = new Path()
|
||||
.move(points.topMidLeft)
|
||||
.line(points.topMidRight)
|
||||
.move(points.bottomMidLeft)
|
||||
.line(points.bottomMidRight)
|
||||
.attr("class", "fabric dashed");
|
||||
|
||||
// Complete pattern?
|
||||
if (complete) {
|
||||
if (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)
|
||||
});
|
||||
// Complete pattern?
|
||||
if (complete) {
|
||||
if (sa) {
|
||||
paths.sa = paths.seam.offset(sa);
|
||||
}
|
||||
|
||||
// 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;
|
||||
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)
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
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 = {
|
||||
draft: function(part) {
|
||||
// prettier-ignore
|
||||
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
||||
export default function(part) {
|
||||
// prettier-ignore
|
||||
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
||||
|
||||
let neckOpening =
|
||||
store.get("neckOpeningLenFront") + store.get("neckOpeningLenBack");
|
||||
let hoodOpening = measurements.headCircumference;
|
||||
let neckCutoutDelta =
|
||||
store.get("neckCutoutFront") - store.get("neckCutoutBack");
|
||||
store.set("hoodCenterWidth", measurements.headCircumference / 10);
|
||||
let halfCenterPanel = store.get("hoodCenterWidth") / 2;
|
||||
points.topLeft = new Point(0, 0);
|
||||
points.topRight = new Point(neckOpening, 0);
|
||||
points.neckRight = new Point(
|
||||
neckOpening,
|
||||
(hoodOpening - halfCenterPanel) / 2
|
||||
);
|
||||
points.neckLeft = new Point(0, points.neckRight.y);
|
||||
points.frontLeft = points.neckLeft.shift(-90, neckCutoutDelta);
|
||||
points.frontEdge = points.neckRight.shift(-90, neckCutoutDelta);
|
||||
points.neckEdge = points.neckLeft.shift(0, halfCenterPanel);
|
||||
points.neckEdgeCp2 = new Point(points.neckRight.x / 2, points.neckEdge.y);
|
||||
points.frontEdgeCp1 = new Point(points.neckEdgeCp2.x, points.frontEdge.y);
|
||||
points.shoulderNotch = new Path()
|
||||
.move(points.neckEdge)
|
||||
.curve(points.neckEdgeCp2, points.frontEdgeCp1, points.frontEdge)
|
||||
.shiftAlong(store.get("neckOpeningLenBack") - halfCenterPanel);
|
||||
points.hoodTop = new Point(points.shoulderNotch.x, points.topLeft.y);
|
||||
points.hoodTopCp2 = points.hoodTop.shift(180, points.neckEdge.y * 0.7);
|
||||
points.hoodRim = new Point(points.frontEdge.x, points.neckRight.y * 0.2);
|
||||
points.hoodTopCp1 = points.hoodTop.shift(
|
||||
0,
|
||||
points.hoodTop.dx(points.hoodRim) / 2
|
||||
);
|
||||
points.frontEdgeCp2 = points.frontEdge.shift(90, halfCenterPanel);
|
||||
points._tmp1 = new Path()
|
||||
let neckOpening =
|
||||
store.get("neckOpeningLenFront") + store.get("neckOpeningLenBack");
|
||||
let hoodOpening = measurements.headCircumference;
|
||||
let neckCutoutDelta =
|
||||
store.get("neckCutoutFront") - store.get("neckCutoutBack");
|
||||
store.set("hoodCenterWidth", measurements.headCircumference / 10);
|
||||
let halfCenterPanel = store.get("hoodCenterWidth") / 2;
|
||||
points.topLeft = new Point(0, 0);
|
||||
points.topRight = new Point(neckOpening, 0);
|
||||
points.neckRight = new Point(
|
||||
neckOpening,
|
||||
(hoodOpening - halfCenterPanel) / 2
|
||||
);
|
||||
points.neckLeft = new Point(0, points.neckRight.y);
|
||||
points.frontLeft = points.neckLeft.shift(-90, neckCutoutDelta);
|
||||
points.frontEdge = points.neckRight.shift(-90, neckCutoutDelta);
|
||||
points.neckEdge = points.neckLeft.shift(0, halfCenterPanel);
|
||||
points.neckEdgeCp2 = new Point(points.neckRight.x / 2, points.neckEdge.y);
|
||||
points.frontEdgeCp1 = new Point(points.neckEdgeCp2.x, points.frontEdge.y);
|
||||
points.shoulderNotch = new Path()
|
||||
.move(points.neckEdge)
|
||||
.curve(points.neckEdgeCp2, points.frontEdgeCp1, points.frontEdge)
|
||||
.shiftAlong(store.get("neckOpeningLenBack") - halfCenterPanel);
|
||||
points.hoodTop = new Point(points.shoulderNotch.x, points.topLeft.y);
|
||||
points.hoodTopCp2 = points.hoodTop.shift(180, points.neckEdge.y * 0.7);
|
||||
points.hoodRim = new Point(points.frontEdge.x, points.neckRight.y * 0.2);
|
||||
points.hoodTopCp1 = points.hoodTop.shift(
|
||||
0,
|
||||
points.hoodTop.dx(points.hoodRim) / 2
|
||||
);
|
||||
points.frontEdgeCp2 = points.frontEdge.shift(90, halfCenterPanel);
|
||||
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)
|
||||
.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);
|
||||
.curve(points.hoodTopCp2, points.neckEdge, points.neckEdge)
|
||||
.length()
|
||||
);
|
||||
|
||||
paths.seam = new Path()
|
||||
.move(points.frontEdge)
|
||||
.curve(points.frontEdgeCp2, points.neckRollCp1, points.neckRoll)
|
||||
.curve(points.neckRollCp2, points.hoodRimCp, points.hoodRim)
|
||||
// Complete pattern?
|
||||
if (complete) {
|
||||
if (sa) {
|
||||
// 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.hoodTopCp2, points.neckEdge, points.neckEdge)
|
||||
.curve(points.neckEdgeCp2, points.frontEdgeCp1, points.frontEdge)
|
||||
.close()
|
||||
.attr("class", "fabric");
|
||||
.reverse();
|
||||
let openingSeam = new Path()
|
||||
.move(points.neckRoll)
|
||||
.curve(points.neckRollCp2, points.hoodRimCp, points.hoodRim);
|
||||
|
||||
// Store length of center seam
|
||||
store.set(
|
||||
"hoodCenterLength",
|
||||
new Path()
|
||||
.move(points.hoodRim)
|
||||
.curve(points.hoodRim, points.hoodTopCp1, points.hoodTop)
|
||||
.curve(points.hoodTopCp2, points.neckEdge, points.neckEdge)
|
||||
.length()
|
||||
);
|
||||
|
||||
// Complete pattern?
|
||||
if (complete) {
|
||||
if (sa) {
|
||||
// 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.hoodTopCp2, points.neckEdge, points.neckEdge)
|
||||
.reverse();
|
||||
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;
|
||||
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
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export default hoodSide;
|
||||
return part;
|
||||
};
|
||||
|
|
|
@ -1,147 +1,56 @@
|
|||
import freesewing from "freesewing";
|
||||
import brian from "@freesewing/brian";
|
||||
import Brian from "@freesewing/brian";
|
||||
import pluginBundle from "@freesewing/plugin-bundle";
|
||||
|
||||
import config from "../config/config";
|
||||
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";
|
||||
import front from "./front";
|
||||
import sleeve from "./sleeve";
|
||||
import pocket from "./pocket";
|
||||
import pocketFacing from "./pocketfacing";
|
||||
import hoodSide from "./hoodside";
|
||||
import hoodCenter from "./hoodcenter";
|
||||
import waistband from "./waistband";
|
||||
import cuff from "./cuff";
|
||||
// Constructor boilerplate
|
||||
const Hugo = function(settings = false) {
|
||||
freesewing.Pattern.call(this, { version: version, ...config });
|
||||
this.with(pluginBundle);
|
||||
if (settings !== false) this.mergeSettings(settings);
|
||||
|
||||
var pattern = new freesewing.Pattern({ version: version, ...config }).with(
|
||||
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;
|
||||
return this;
|
||||
};
|
||||
|
||||
pattern.draftBase = function(part) {
|
||||
let complete = this.settings.complete;
|
||||
let paperless = this.settings.paperless;
|
||||
this.settings.complete = false;
|
||||
this.settings.paperless = false;
|
||||
let brianBase = freesewing.patterns.brian.draftBase(part);
|
||||
this.settings.complete = complete;
|
||||
this.settings.paperless = paperless;
|
||||
// Inheritance boilerplate
|
||||
Hugo.prototype = Object.create(freesewing.Pattern.prototype);
|
||||
Hugo.prototype.constructor = Hugo;
|
||||
|
||||
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) {
|
||||
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;
|
||||
export default Hugo;
|
||||
|
|
|
@ -1,80 +1,76 @@
|
|||
var pocket = {
|
||||
draft: function(part) {
|
||||
// Remove clutter
|
||||
let pocket = part.paths.pocket;
|
||||
part.paths = {};
|
||||
part.snippets = {};
|
||||
export default function(part) {
|
||||
// Remove clutter
|
||||
let pocket = part.paths.pocket;
|
||||
part.paths = {};
|
||||
part.snippets = {};
|
||||
|
||||
// prettier-ignore
|
||||
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
||||
// prettier-ignore
|
||||
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
||||
|
||||
paths.seam = pocket
|
||||
.line(points.cfRibbing)
|
||||
.line(points.pocketHem)
|
||||
.attr("class", "fabric", true);
|
||||
paths.seam = pocket
|
||||
.line(points.cfRibbing)
|
||||
.line(points.pocketHem)
|
||||
.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()
|
||||
.move(points.pocketTip)
|
||||
.curve(points.pocketTip, points.pocketTopCp, points.pocketTop)
|
||||
.offset(store.get("facingWidth") * -1);
|
||||
let facing = new Path()
|
||||
.move(points.pocketTip)
|
||||
.curve(points.pocketTip, points.pocketTopCp, points.pocketTop)
|
||||
.offset(store.get("facingWidth") * -1);
|
||||
|
||||
points._tmp = facing.shiftAlong(2);
|
||||
points.facingEnd = utils.beamsIntersect(
|
||||
points._tmp,
|
||||
facing.start(),
|
||||
points.pocketHem,
|
||||
points.pocketTip
|
||||
points._tmp = facing.shiftAlong(2);
|
||||
points.facingEnd = utils.beamsIntersect(
|
||||
points._tmp,
|
||||
facing.start(),
|
||||
points.pocketHem,
|
||||
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()
|
||||
.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
|
||||
);
|
||||
macro("title", { at: points.title, nr: 4, title: "pocket" });
|
||||
if (sa) {
|
||||
paths.sa = paths.seam.offset(sa).attr("class", "fabric sa");
|
||||
}
|
||||
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 = {
|
||||
draft: function(part) {
|
||||
// Remove clutter
|
||||
let facing = part.paths.facing;
|
||||
part.paths = {};
|
||||
export default function(part) {
|
||||
// Remove clutter
|
||||
let facing = part.paths.facing;
|
||||
part.paths = {};
|
||||
|
||||
// prettier-ignore
|
||||
let {sa, Point, points, Path, paths, Snippet, snippets, complete, paperless, macro, utils, store} = part.shorthand();
|
||||
// prettier-ignore
|
||||
let {sa, Point, points, Path, paths, Snippet, snippets, complete, paperless, macro, utils, store} = part.shorthand();
|
||||
|
||||
paths.seam = facing
|
||||
.line(points.pocketTop)
|
||||
.curve(points.pocketTopCp, points.pocketTip, points.pocketTip)
|
||||
.line(points.facingEnd)
|
||||
.close()
|
||||
.attr("class", "fabric", true);
|
||||
paths.seam = facing
|
||||
.line(points.pocketTop)
|
||||
.curve(points.pocketTopCp, points.pocketTip, points.pocketTip)
|
||||
.line(points.facingEnd)
|
||||
.close()
|
||||
.attr("class", "fabric", true);
|
||||
|
||||
points.saStart = points.pocketTop.shift(180, store.get("facingWidth"));
|
||||
points.saStart = points.pocketTop.shift(180, store.get("facingWidth"));
|
||||
|
||||
// Complete pattern?
|
||||
if (complete) {
|
||||
points.title = points.pocketTopCp.clone();
|
||||
macro("title", { at: points.title, nr: 5, title: "pocketFacing" });
|
||||
if (sa) {
|
||||
paths.sa = new Path()
|
||||
.move(points.saStart)
|
||||
.line(points.pocketTop)
|
||||
.curve(points.pocketTopCp, points.pocketTip, points.pocketTip)
|
||||
.line(points.facingEnd)
|
||||
.offset(sa * -1)
|
||||
.attr("class", "fabric sa");
|
||||
paths.sa
|
||||
.line(points.facingEnd)
|
||||
.move(points.saStart)
|
||||
.line(paths.sa.start());
|
||||
}
|
||||
// Complete pattern?
|
||||
if (complete) {
|
||||
points.title = points.pocketTopCp.clone();
|
||||
macro("title", { at: points.title, nr: 5, title: "pocketFacing" });
|
||||
if (sa) {
|
||||
paths.sa = new Path()
|
||||
.move(points.saStart)
|
||||
.line(points.pocketTop)
|
||||
.curve(points.pocketTopCp, points.pocketTip, points.pocketTip)
|
||||
.line(points.facingEnd)
|
||||
.offset(sa * -1)
|
||||
.attr("class", "fabric sa");
|
||||
paths.sa
|
||||
.line(points.facingEnd)
|
||||
.move(points.saStart)
|
||||
.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 = {
|
||||
draft: function(part) {
|
||||
// prettier-ignore
|
||||
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
||||
export default function(part) {
|
||||
// prettier-ignore
|
||||
let {utils, store, sa, Point, points, Path, paths, Snippet, snippets, options, measurements, complete, paperless, macro, debug} = part.shorthand();
|
||||
|
||||
// Top of raglan sleeve
|
||||
points.raglanTop = new Point(
|
||||
0,
|
||||
points.sleeveTip.y - store.get("shoulderLength")
|
||||
// Top of raglan sleeve
|
||||
points.raglanTop = new Point(
|
||||
0,
|
||||
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
|
||||
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
|
||||
);
|
||||
|
||||
// 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()
|
||||
// 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(
|
||||
|
@ -162,97 +127,128 @@ var sleeve = {
|
|||
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)
|
||||
.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)
|
||||
.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)
|
||||
.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");
|
||||
}
|
||||
.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 = {
|
||||
draft: function(part) {
|
||||
// prettier-ignore
|
||||
let {measurements, options, sa, Point, points, Path, paths, complete, paperless, macro, units} = part.shorthand();
|
||||
export default function(part) {
|
||||
// prettier-ignore
|
||||
let {measurements, options, sa, Point, points, Path, paths, complete, paperless, macro, units} = part.shorthand();
|
||||
|
||||
let width =
|
||||
(measurements.centerBackNeckToWaist + measurements.naturalWaistToHip) *
|
||||
options.ribbingWidth *
|
||||
2;
|
||||
let width =
|
||||
(measurements.centerBackNeckToWaist + measurements.naturalWaistToHip) *
|
||||
options.ribbingWidth *
|
||||
2;
|
||||
|
||||
points.topLeft = new Point(0, 0);
|
||||
points.bottomLeft = new Point(0, width);
|
||||
points.topMidLeft = new Point(width, 0);
|
||||
points.bottomMidLeft = new Point(width, width);
|
||||
points.topMidRight = new Point(width * 1.5, 0);
|
||||
points.bottomMidRight = new Point(width * 1.5, width);
|
||||
points.topRight = new Point(width * 2.5, 0);
|
||||
points.bottomRight = new Point(width * 2.5, width);
|
||||
points.topLeft = new Point(0, 0);
|
||||
points.bottomLeft = new Point(0, width);
|
||||
points.topMidLeft = new Point(width, 0);
|
||||
points.bottomMidLeft = new Point(width, width);
|
||||
points.topMidRight = new Point(width * 1.5, 0);
|
||||
points.bottomMidRight = new Point(width * 1.5, width);
|
||||
points.topRight = new Point(width * 2.5, 0);
|
||||
points.bottomRight = new Point(width * 2.5, width);
|
||||
|
||||
paths.seam = new Path()
|
||||
.move(points.topMidLeft)
|
||||
.line(points.topLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomMidLeft)
|
||||
.move(points.bottomMidRight)
|
||||
.line(points.bottomRight)
|
||||
.line(points.topRight)
|
||||
.line(points.topMidRight)
|
||||
.attr("class", "fabric");
|
||||
paths.hint = new Path()
|
||||
.move(points.topMidLeft)
|
||||
.line(points.topMidRight)
|
||||
.move(points.bottomMidLeft)
|
||||
.line(points.bottomMidRight)
|
||||
.attr("class", "fabric dashed");
|
||||
paths.seam = new Path()
|
||||
.move(points.topMidLeft)
|
||||
.line(points.topLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomMidLeft)
|
||||
.move(points.bottomMidRight)
|
||||
.line(points.bottomRight)
|
||||
.line(points.topRight)
|
||||
.line(points.topMidRight)
|
||||
.attr("class", "fabric");
|
||||
paths.hint = new Path()
|
||||
.move(points.topMidLeft)
|
||||
.line(points.topMidRight)
|
||||
.move(points.bottomMidLeft)
|
||||
.line(points.bottomMidRight)
|
||||
.attr("class", "fabric dashed");
|
||||
|
||||
// Complete pattern?
|
||||
if (complete) {
|
||||
if (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
|
||||
});
|
||||
// Complete pattern?
|
||||
if (complete) {
|
||||
if (sa) {
|
||||
paths.sa = paths.seam.offset(sa);
|
||||
}
|
||||
|
||||
// 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;
|
||||
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
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
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