1
0
Fork 0

construction: Fitted sleevecap

This commit is contained in:
Joost De Cock 2018-08-07 16:42:48 +02:00
parent 8379361e47
commit 69f724faea
4 changed files with 187 additions and 178 deletions

View file

@ -31,6 +31,7 @@ export default {
{ id: "chestEase", val: 8, type: "%", min: -4, max: 20 }, { id: "chestEase", val: 8, type: "%", min: -4, max: 20 },
{ id: "collarEase", val: 3.5, type: "%", min: 0, max: 10 }, { id: "collarEase", val: 3.5, type: "%", min: 0, max: 10 },
{ id: "bicepsEase", val: 15, type: "%", min: 0, max: 100 }, { id: "bicepsEase", val: 15, type: "%", min: 0, max: 100 },
{ id: "cuffEase", val: 20, type: "%", min: 0, max: 500 },
{ id: "backNeckCutout", val: 5, type: "%", min: 2, max: 8 }, { id: "backNeckCutout", val: 5, type: "%", min: 2, max: 8 },
{ id: "acrossBackFactor", val: 97, type: "%", min: 93, max: 100 }, { id: "acrossBackFactor", val: 97, type: "%", min: 93, max: 100 },
{ id: "armholeDepthFactor", val: 50, type: "%", min: 35, max: 65 }, { id: "armholeDepthFactor", val: 50, type: "%", min: 35, max: 65 },
@ -46,12 +47,10 @@ export default {
{ id: "sleevecapQ1Spread1", val: 6, type: "%", min: 0, max: 7 }, { id: "sleevecapQ1Spread1", val: 6, type: "%", min: 0, max: 7 },
{ id: "sleevecapQ1Spread2", val: 15, type: "%", min: 0, max: 7 }, { id: "sleevecapQ1Spread2", val: 15, type: "%", min: 0, max: 7 },
{ id: "sleevecapQ2Spread1", val: 15, type: "%", min: 0, max: 7 }, { id: "sleevecapQ2Spread1", val: 15, type: "%", min: 0, max: 7 },
{ id: "sleevecapQ2Spread2", val: 5, type: "%", min: 0, max: 7 }, { id: "sleevecapQ2Spread2", val: 10, type: "%", min: 0, max: 7 },
{ id: "sleevecapQ3Spread1", val: 5, type: "%", min: 0, max: 7 }, { id: "sleevecapQ3Spread1", val: 10, type: "%", min: 0, max: 7 },
{ id: "sleevecapQ3Spread2", val: 8, type: "%", min: 0, max: 7 }, { id: "sleevecapQ3Spread2", val: 8, type: "%", min: 0, max: 7 },
{ id: "sleevecapQ4Spread1", val: 7, type: "%", min: 0, max: 7 }, { id: "sleevecapQ4Spread1", val: 7, type: "%", min: 0, max: 7 },
{ id: "sleevecapQ4Spread2", val: 7, type: "%", min: 0, max: 7 }, { id: "sleevecapQ4Spread2", val: 7, type: "%", min: 0, max: 7 },
{ id: "sleevecapTopSpread1", val: 5, type: "%", min: 0, max: 7 },
{ id: "sleevecapTopSpread2", val: 5, type: "%", min: 0, max: 7 },
] ]
}; };

View file

@ -15,10 +15,20 @@
<script type="text/javascript" src="tmp/theme.js"></script> <script type="text/javascript" src="tmp/theme.js"></script>
<script type="text/javascript" src="tmp/designer.js"></script> <script type="text/javascript" src="tmp/designer.js"></script>
<script> <script>
var debug = {
name: 'debug',
hooks: {
debug: function debugPlugin(next, data) {
if(typeof data === 'string') console.log('%cDebug', 'color: #dd69dd', data);
else console.log(data);
next();
}
}
};
var pattern = freesewing.patterns.brian var pattern = freesewing.patterns.brian
.with(freesewing.plugins.theme) .with(debug)
.with(freesewing.plugins.designer); .with(freesewing.plugins.theme)
.with(freesewing.plugins.designer)
pattern.settings.measurements = { pattern.settings.measurements = {
bicepsCircumference: 335, bicepsCircumference: 335,
centerBackNeckToWaist: 480, centerBackNeckToWaist: 480,
@ -31,28 +41,14 @@
shoulderToWrist: 700, shoulderToWrist: 700,
wristCircumference: 190 wristCircumference: 190
}; };
//pattern.options.sleevecapQ1Offset = 0.05;
//pattern.options.sleevecapQ2Offset = 0.055;
//pattern.options.sleevecapQ3Offset = 0.045;
//pattern.options.sleevecapQ4Offset = 0.02;
//pattern.options.sleevecapQ1Spread1 = 0.06;
//pattern.options.sleevecapQ1Spread2 = 0.15;
//pattern.options.sleevecapQ2Spread1 = 0.15;
//pattern.options.sleevecapQ2Spread2 = 0.05;
//pattern.options.sleevecapQ3Spread1 = 0.05;
//pattern.options.sleevecapQ3Spread2 = 0.08;
//pattern.options.sleevecapQ4Spread1 = 0.07;
//pattern.options.sleevecapQ4Spread2 = 0.07;
//pattern.options.sleevecapTopSpread1 = 0.05;
//pattern.options.sleevecapTopSpread2 = 0.05;
pattern.settings.mode = 'draft'; pattern.settings.mode = 'draft';
pattern.settings.paperless = true; pattern.settings.paperless = true;
//pattern.settings.sa = 10; pattern.settings.sa = 10;
pattern.settings.units = 'metric'; pattern.settings.units = 'metric';
pattern.draft(); pattern.draft();
document.getElementById("svg").innerHTML = pattern.render(); document.getElementById("svg").innerHTML = pattern.render();
console.log('Freesewing object',freesewing);
function pointHover(evt) { function pointHover(evt) {
var point = evt.target; var point = evt.target;
var id = point.id; var id = point.id;

View file

@ -23,7 +23,6 @@ pattern.draft = function() {
pattern.parts.back = back.draft(pattern); pattern.parts.back = back.draft(pattern);
pattern.parts.front = front.draft(pattern); pattern.parts.front = front.draft(pattern);
pattern.parts.sleeve = sleeve.draft(pattern); pattern.parts.sleeve = sleeve.draft(pattern);
return pattern; return pattern;
}; };

View file

@ -1,172 +1,188 @@
import freesewing from "freesewing"; import freesewing from "freesewing";
function sleevecapDelta(store) {
// Positive values mean sleevecap is longer than armhole
return (
store.get("sleevecapLength") -
(store.get("frontArmholeLength") + store.get("backArmholeLength"))
);
}
function sleevecapAdjust(store) {
let delta = sleevecapDelta(store);
let factor = store.get("sleeveFactor");
if (delta > 50) factor = factor * 0.95;
else if (delta > 0) factor = factor * 0.995;
else if (delta < 50) factor = factor * 1.05;
else factor = factor * 1.005;
store.set("sleeveFactor", factor);
}
function draftSleevecap(part) {
// prettier-ignore
let {debug, store, measurements, options, Point, points, Path, paths} = freesewing.utils.shorthand(part);
// Sleeve center axis
points.centerCap = new Point(0, 0);
points.centerWrist = new Point(
0,
measurements.shoulderToWrist * (1 + options.sleeveLengthBonus)
);
points.centerBiceps = new Point(
0,
points.centerWrist.y -
(measurements.bicepsCircumference * (1 + options.sleevecapHeightFactor)) /
store.get("sleeveFactor")
);
// Left and right biceps points
points.leftBiceps = points.centerBiceps.shift(
180,
((measurements.bicepsCircumference * (1 + options.bicepsEase)) / 2) *
store.get("sleeveFactor")
);
// Make sure we draft a sleeve that fits the biceps
if (points.leftBiceps.x * -1 < measurements.bicepsCircumference / 1.95) {
points.leftBiceps.x = measurements.bicepsCircumference / 1.95;
part.debug("Warning: Forced sleeve to fit biceps");
}
points.rightBiceps = points.leftBiceps.flipX(points.centerBiceps);
// Pitch points
points.backPitch = new Point(
points.leftBiceps.x * options.sleevecapBackFactorX,
points.leftBiceps.y * options.sleevecapBackFactorY
);
points.frontPitch = new Point(
points.rightBiceps.x * options.sleevecapFrontFactorX,
points.rightBiceps.y * options.sleevecapFrontFactorY
);
// 4 sleevecap quadrants
// Base points
points.capQ1Base = points.frontPitch.shiftFractionTowards(
points.rightBiceps,
0.5
);
points.capQ2Base = points.frontPitch.shiftFractionTowards(
points.centerCap,
0.5
);
points.capQ3Base = points.backPitch.shiftFractionTowards(
points.centerCap,
0.5
);
points.capQ4Base = points.backPitch.shiftFractionTowards(
points.leftBiceps,
0.5
);
// Offset points
let baseOffset = measurements.bicepsCircumference * (1 + options.bicepsEase);
points.capQ1 = points.capQ1Base.shift(
points.rightBiceps.angle(points.frontPitch) + 90,
baseOffset * options.sleevecapQ1Offset
);
points.capQ2 = points.capQ2Base.shift(
points.centerCap.angle(points.frontPitch) + 90,
baseOffset * options.sleevecapQ2Offset
);
points.capQ3 = points.capQ3Base.shift(
points.centerCap.angle(points.backPitch) - 90,
baseOffset * options.sleevecapQ3Offset
);
points.capQ4 = points.capQ4Base.shift(
points.leftBiceps.angle(points.backPitch) - 90,
baseOffset * options.sleevecapQ4Offset
);
// Control points
points.capQ1Cp1 = points.capQ1.shift(
points.frontPitch.angle(points.rightBiceps),
baseOffset * options.sleevecapQ1Spread1
);
points.capQ1Cp2 = points.capQ1.shift(
points.frontPitch.angle(points.rightBiceps),
baseOffset * options.sleevecapQ1Spread2 * -1
);
points.capQ2Cp1 = points.capQ2.shift(
points.centerCap.angle(points.frontPitch),
baseOffset * options.sleevecapQ2Spread1
);
points.capQ2Cp2 = points.capQ2.shift(
points.centerCap.angle(points.frontPitch),
baseOffset * options.sleevecapQ2Spread2 * -1
);
points.capQ3Cp1 = points.capQ3.shift(
points.backPitch.angle(points.centerCap),
baseOffset * options.sleevecapQ3Spread1
);
points.capQ3Cp2 = points.capQ3.shift(
points.backPitch.angle(points.centerCap),
baseOffset * options.sleevecapQ3Spread2 * -1
);
points.capQ4Cp1 = points.capQ4.shift(
points.leftBiceps.angle(points.backPitch),
baseOffset * options.sleevecapQ4Spread1
);
points.capQ4Cp2 = points.capQ4.shift(
points.leftBiceps.angle(points.backPitch),
baseOffset * options.sleevecapQ4Spread2 * -1
);
// Wrist
points.wristRight = points.centerWrist.shift(
0,
(measurements.wristCircumference * (1 + options.cuffEase)) / 2
);
points.wristLeft = points.wristRight.rotate(180, points.centerWrist);
// Seamline
let sleevecap = new Path()
.move(points.rightBiceps)
.curve(points.rightBiceps, points.capQ1Cp1, points.capQ1)
.curve(points.capQ1Cp2, points.capQ2Cp1, points.capQ2)
.curve(points.capQ2Cp2, points.capQ3Cp1, points.capQ3)
.curve(points.capQ3Cp2, points.capQ4Cp1, points.capQ4)
.curve(points.capQ4Cp2, points.leftBiceps, points.leftBiceps);
paths.seam = new Path()
.move(points.leftBiceps)
.move(points.wristLeft)
.move(points.wristRight)
.line(points.rightBiceps)
.join(sleevecap, true);
// Store sleevecap length
store.set("sleevecapLength", sleevecap.length());
}
var sleeve = { var sleeve = {
draft: function(pattern) { draft: function(pattern) {
let part = new pattern.Part(); let part = new pattern.Part();
// prettier-ignore // prettier-ignore
let {store, sa, measurements, options, Point, points, Path, paths, Snippet, snippets, final, paperless, macro} = freesewing.utils.shorthand(part); let {debug, store, sa, measurements, options, Point, points, Path, paths, Snippet, snippets, final, paperless, macro} = freesewing.utils.shorthand(part);
store.set("sleeveFactor", 1); store.set("sleeveFactor", 1);
let run = 1;
// Sleeve center axis do {
points.centerCap = new Point(0, 0); draftSleevecap(part);
points.centerWrist = new Point( part.debug(
0, `Sleevecap draft ${run}, sleevecap delta is ${sleevecapDelta(store)}`
measurements.shoulderToWrist * (1 + options.sleeveLengthBonus) );
); sleevecapAdjust(store);
points.centerBiceps = new Point( run++;
0, } while (Math.abs(sleevecapDelta(store)) > 2 && run < 10);
points.centerWrist.y -
measurements.bicepsCircumference *
(1 + options.sleevecapHeightFactor) *
store.get("sleeveFactor")
);
// Sleeve half width, limit impact of sleeveTweakFactor to 25% to avoid a too narrow sleeve
let halfWidth =
(measurements.bicepsCircumference * (1 + options.bicepsEase)) / 2;
points.leftBiceps = points.centerBiceps.shift(
180,
halfWidth * 0.75 + halfWidth * 0.25 * store.get("sleeveFactor")
);
points.rightBiceps = points.leftBiceps.flipX(points.centerBiceps);
// Pitch points
points.backPitch = new Point(
points.leftBiceps.x * options.sleevecapBackFactorX,
points.leftBiceps.y * options.sleevecapBackFactorY
);
points.frontPitch = new Point(
points.rightBiceps.x * options.sleevecapFrontFactorX,
points.rightBiceps.y * options.sleevecapFrontFactorY
);
// 4 sleevecap quadrants
// Base points
points.capQ1Base = points.frontPitch.shiftFractionTowards(
points.rightBiceps,
0.5
);
points.capQ2Base = points.frontPitch.shiftFractionTowards(
points.centerCap,
0.5
);
points.capQ3Base = points.backPitch.shiftFractionTowards(
points.centerCap,
0.5
);
points.capQ4Base = points.backPitch.shiftFractionTowards(
points.leftBiceps,
0.5
);
// Offset points
let baseOffset =
measurements.bicepsCircumference * (1 + options.bicepsEase);
points.capQ1 = points.capQ1Base.shift(
points.rightBiceps.angle(points.frontPitch) + 90,
baseOffset * options.sleevecapQ1Offset
);
points.capQ2 = points.capQ2Base.shift(
points.centerCap.angle(points.frontPitch) + 90,
baseOffset * options.sleevecapQ2Offset
);
points.capQ3 = points.capQ3Base.shift(
points.centerCap.angle(points.backPitch) - 90,
baseOffset * options.sleevecapQ3Offset
);
points.capQ4 = points.capQ4Base.shift(
points.leftBiceps.angle(points.backPitch) - 90,
baseOffset * options.sleevecapQ4Offset
);
// Control points
points.capQ1Cp1 = points.capQ1.shift(
points.frontPitch.angle(points.rightBiceps),
baseOffset * options.sleevecapQ1Spread1
);
points.capQ1Cp2 = points.capQ1.shift(
points.frontPitch.angle(points.rightBiceps),
baseOffset * options.sleevecapQ1Spread2 * -1
);
points.capQ2Cp1 = points.capQ2.shift(
points.centerCap.angle(points.frontPitch),
baseOffset * options.sleevecapQ2Spread1
);
points.capQ2Cp2 = points.capQ2.shift(
points.centerCap.angle(points.frontPitch),
baseOffset * options.sleevecapQ2Spread2 * -1
);
points.capQ3Cp1 = points.capQ3.shift(
points.backPitch.angle(points.centerCap),
baseOffset * options.sleevecapQ3Spread1
);
points.capQ3Cp2 = points.capQ3.shift(
points.backPitch.angle(points.centerCap),
baseOffset * options.sleevecapQ3Spread2 * -1
);
points.capQ4Cp1 = points.capQ4.shift(
points.leftBiceps.angle(points.backPitch),
baseOffset * options.sleevecapQ4Spread1
);
points.capQ4Cp2 = points.capQ4.shift(
points.leftBiceps.angle(points.backPitch),
baseOffset * options.sleevecapQ4Spread2 * -1
);
// Center cap control points
points.centerCapCp1 = points.centerCap.shift(
points.capQ3.angle(points.capQ2),
baseOffset * options.sleevecapTopSpread1
);
points.centerCapCp2 = points.centerCap.shift(
points.capQ3.angle(points.capQ2),
baseOffset * options.sleevecapTopSpread2 * -1
);
paths.test = new Path()
.move(points.centerWrist)
.line(points.centerCap)
.move(points.leftBiceps)
.line(points.rightBiceps)
.curve(points.rightBiceps, points.capQ1Cp1, points.capQ1)
.curve(points.capQ1Cp2, points.capQ2Cp1, points.capQ2)
.curve(points.capQ2Cp2, points.centerCapCp1, points.centerCap)
.curve(points.centerCapCp2, points.capQ3Cp1, points.capQ3)
.curve(points.capQ3Cp2, points.capQ4Cp1, points.capQ4)
.curve(points.capQ4Cp2, points.leftBiceps, points.leftBiceps);
//// Wrist
//$wristWidth = $model->getMeasurement('wristCircumference') + $this->getOption('cuffEase');
//$p->newPoint(31, $wristWidth / -2, $p->y(3), 'Wrist point back');
//$p->newPoint(32, $wristWidth / 2, $p->y(3), 'Wrist point front');
//// Elbow location
//$p->newPoint(33, 0, $p->y(2) + $p->distance(2, 3) / 2 - 25, 'Elbow point');
//$p->addPoint('.help1', $p->shift(33, 0, 10));
//$p->addPoint(34, $p->beamsCross(-5, 31, 33, '.help1'), 'Elbow point back side');
//$p->addPoint(35, $p->beamsCross(5, 32, 33, 34), 'Elbow point front side');
//$path = 'M 31 L -5 C -5 20 16 C 21 10 10 C 10 22 17 C 23 28 30 C 29 25 18 C 24 11 11 C 11 27 19 C 26 5 5 L 32 z';
//$p->newPath('seamline', $path, ['class' => 'fabric']);
//// Mark path for sample service
//$p->paths['seamline']->setSample(true);
//
//// Store sleevehead length
//$this->setValue('sleeveheadLength',
// $p->curveLen(-5,-5,20,16) +
// $p->curveLen(16,21,10,10) +
// $p->curveLen(10,10,22,17) +
// $p->curveLen(17,23,28,30) +
// $p->curveLen(30,29,25,18) +
// $p->curveLen(18,24,11,11) +
// $p->curveLen(11,11,27,19) +
// $p->curveLen(19,26,5,5)
//);
// Anchor point for sampling // Anchor point for sampling
points.gridAnchor = points.origin; points.gridAnchor = points.origin;
points.test = new Point(10, 10); points.test = new Point(10, 10);
console.log(part);
// Final? // Final?
if (final) { if (final) {
//macro("title", { at: points.title, nr: 2, title: "back" }); points.title = points.centerBiceps.shiftFractionTowards(
points.centerWrist,
0.3
);
macro("title", { at: points.title, nr: 3, title: "sleeve" });
//snippets.armholePitchNotch = new Snippet("notch", points.armholePitch); //snippets.armholePitchNotch = new Snippet("notch", points.armholePitch);
//if (sa) paths.sa = paths.seam.offset(sa).attr("class", "fabric sa"); //if (sa) paths.sa = paths.seam.offset(sa).attr("class", "fabric sa");
} }
@ -175,7 +191,6 @@ var sleeve = {
if (paperless) { if (paperless) {
//shared.dimensions(macro, points, Path, sa); //shared.dimensions(macro, points, Path, sa);
} }
return part; return part;
} }
}; };