1
0
Fork 0

sparkles: Updates for freesewing v0.23

This commit is contained in:
Joost De Cock 2018-12-20 11:41:35 +01:00
parent 0e726bd55b
commit 8f5747e078
14 changed files with 1949 additions and 2058 deletions

View file

@ -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,

View file

@ -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)

File diff suppressed because it is too large Load diff

View file

@ -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",

View file

@ -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;
};

View file

@ -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;
};

View file

@ -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;
};

View file

@ -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;
};

View file

@ -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;
};

View file

@ -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;

View file

@ -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;
};

View file

@ -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;
};

View file

@ -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;
};

View file

@ -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;
};