2022-09-03 15:41:48 +02:00
|
|
|
import { constructMainDart, shapeSideSeam, dartPath } from './shared.mjs'
|
|
|
|
import { front as brianFront } from '@freesewing/brian'
|
|
|
|
import {
|
|
|
|
frontOverlap,
|
|
|
|
necklineDrop,
|
|
|
|
frontStyle,
|
|
|
|
frontInset,
|
|
|
|
shoulderInset,
|
|
|
|
neckInset,
|
|
|
|
hemStyle,
|
|
|
|
hemRadius,
|
|
|
|
pocketWidth,
|
|
|
|
pocketAngle,
|
|
|
|
pocketLocation,
|
|
|
|
frontScyeDart,
|
|
|
|
buttons,
|
|
|
|
waistEase,
|
|
|
|
hipsEase,
|
|
|
|
} from './options.mjs'
|
|
|
|
|
2022-09-11 08:14:04 -07:00
|
|
|
function wahidFront({
|
|
|
|
points,
|
|
|
|
Point,
|
|
|
|
paths,
|
|
|
|
Path,
|
|
|
|
measurements,
|
|
|
|
options,
|
|
|
|
utils,
|
|
|
|
macro,
|
|
|
|
snippets,
|
|
|
|
Snippet,
|
|
|
|
complete,
|
|
|
|
sa,
|
|
|
|
paperless,
|
|
|
|
store,
|
|
|
|
part,
|
|
|
|
}) {
|
2019-02-17 17:21:39 +01:00
|
|
|
// Cleanup from Brian
|
2019-08-03 15:03:33 +02:00
|
|
|
for (let i of Object.keys(paths)) delete paths[i]
|
|
|
|
delete snippets.armholePitchNotch
|
2019-02-17 17:21:39 +01:00
|
|
|
// Neck cutout
|
|
|
|
points.closureTop = new Point(
|
2020-06-28 12:26:05 +02:00
|
|
|
measurements.chest * options.frontOverlap * -1,
|
2019-02-17 20:42:05 +01:00
|
|
|
points.waist.y * options.necklineDrop
|
2019-08-03 15:03:33 +02:00
|
|
|
)
|
|
|
|
if (options.frontStyle === 'classic')
|
|
|
|
points.closureTopCp1 = new Point(points.neck.x, (points.waist.y * options.necklineDrop) / 2)
|
2019-02-17 20:42:05 +01:00
|
|
|
else {
|
2019-08-03 15:03:33 +02:00
|
|
|
points.closureTopCp1 = new Point(points.neck.x, points.closureTop.y)
|
2019-02-17 20:42:05 +01:00
|
|
|
}
|
2019-02-17 17:21:39 +01:00
|
|
|
// Front inset
|
2019-08-03 15:03:33 +02:00
|
|
|
let shoulderLen = points.shoulder.dist(points.neck)
|
|
|
|
let frontInset = shoulderLen * options.frontInset
|
|
|
|
points.armholePitch = points.armholePitch.shift(180, frontInset)
|
|
|
|
points.armholePitchCp1 = points.armholePitchCp1.shift(180, frontInset)
|
|
|
|
points.armholePitchCp2 = points.armholePitchCp2.shift(180, frontInset)
|
|
|
|
points.armholeHollow = points.armholeHollow.shift(180, frontInset / 2)
|
|
|
|
points.armholeHollowCp2 = points.armholeHollowCp2.shift(180, frontInset / 2)
|
|
|
|
points.armholeHollowCp1 = points.armholeHollowCp1.shift(180, frontInset / 2)
|
2019-02-17 17:21:39 +01:00
|
|
|
// Shoulder inset
|
2019-08-03 15:03:33 +02:00
|
|
|
points.shoulder = points.shoulder.shiftTowards(points.neck, shoulderLen * options.shoulderInset)
|
2019-02-17 17:21:39 +01:00
|
|
|
points.shoulderCp1 = points.shoulderCp1.shift(
|
|
|
|
points.shoulder.angle(points.neck),
|
|
|
|
shoulderLen * options.shoulderInset
|
2019-08-03 15:03:33 +02:00
|
|
|
)
|
2019-02-17 17:21:39 +01:00
|
|
|
// Neck inset
|
2019-08-03 15:03:33 +02:00
|
|
|
points.neck = points.neck.shiftTowards(points.shoulder, shoulderLen * options.neckInset)
|
|
|
|
points.neckCp2 = points.neck.shift(points.shoulder.angle(points.neck) + 90, shoulderLen * 0.2)
|
2019-02-17 17:21:39 +01:00
|
|
|
// Construct main dart
|
2019-08-03 15:03:33 +02:00
|
|
|
constructMainDart(part)
|
2019-02-17 17:21:39 +01:00
|
|
|
// Shape side seam
|
2019-08-03 15:03:33 +02:00
|
|
|
shapeSideSeam(part)
|
2019-02-17 17:21:39 +01:00
|
|
|
// Hem
|
2019-08-03 15:03:33 +02:00
|
|
|
if (options.hemStyle === 'classic') {
|
2019-02-17 17:21:39 +01:00
|
|
|
// Construct cutaway
|
2019-08-03 15:03:33 +02:00
|
|
|
let cutaway = points.closureTop.dx(points.hem) / 4
|
|
|
|
points.closureBottom = new Point(points.closureTop.x, points.hem.y - cutaway / 2)
|
|
|
|
points.hemTip = new Point(points.closureBottom.x + cutaway, points.closureBottom.y + cutaway)
|
2019-02-17 17:21:39 +01:00
|
|
|
// Shifting hem point to have a continious hem curve to work from
|
2019-08-03 15:03:33 +02:00
|
|
|
let shift = points.dartHemLeft.dx(points.dartHemRight)
|
|
|
|
points.splitHem = points.hem.shift(180, shift)
|
2019-02-17 17:21:39 +01:00
|
|
|
// Split hem curve on left side of dart
|
|
|
|
points.hemSplit = utils.curveIntersectsX(
|
|
|
|
points.hemTip,
|
|
|
|
points.hemTip,
|
|
|
|
points.dartHemLeft,
|
|
|
|
points.splitHem,
|
|
|
|
points.dartHemLeft.x
|
2019-08-03 15:03:33 +02:00
|
|
|
)
|
2019-02-17 17:21:39 +01:00
|
|
|
// Split the hem curve
|
|
|
|
let [c1, c2] = utils.splitCurve(
|
|
|
|
points.hemTip,
|
|
|
|
points.hemTip,
|
|
|
|
points.dartHemLeft,
|
|
|
|
points.splitHem,
|
|
|
|
points.hemSplit
|
2019-08-03 15:03:33 +02:00
|
|
|
)
|
|
|
|
points.splitDartHemLeftCp1 = c1.cp2
|
|
|
|
points.splitDartHemRightCp2 = c2.cp1.shift(0, shift)
|
|
|
|
points.splitHemCp1 = c2.cp2.shift(0, shift)
|
2019-02-17 17:21:39 +01:00
|
|
|
points.splitDartHemLeft = utils.curveIntersectsX(
|
|
|
|
points.hemTip,
|
|
|
|
points.hemTip,
|
|
|
|
points.dartHemLeft,
|
|
|
|
points.splitHem,
|
|
|
|
points.dartHemLeft.x
|
2019-08-03 15:03:33 +02:00
|
|
|
)
|
|
|
|
points.splitDartHemRight = points.splitDartHemLeft.shift(0, shift)
|
|
|
|
points.lastButton = new Point(0, points.closureBottom.y)
|
2020-07-23 12:30:26 +02:00
|
|
|
} else if (options.hemStyle === 'rounded') {
|
2019-08-03 15:03:33 +02:00
|
|
|
points.closureBottom = new Point(points.closureTop.x, points.hem.y)
|
2019-02-17 17:21:39 +01:00
|
|
|
// Draw rounded hem
|
2020-06-28 12:26:05 +02:00
|
|
|
let radius = measurements.hips * options.hemRadius
|
2019-02-17 17:21:39 +01:00
|
|
|
// Avoid radius extending beyond the dart
|
|
|
|
if (radius > points.closureTop.dx(points.dartHemLeft))
|
2019-08-03 15:03:33 +02:00
|
|
|
radius = points.closureTop.dx(points.dartHemLeft)
|
|
|
|
macro('round', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.closureTop,
|
|
|
|
to: points.hem,
|
|
|
|
via: points.closureBottom,
|
|
|
|
radius,
|
2021-04-24 10:16:31 +02:00
|
|
|
prefix: 'round',
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
points.lastButton = new Point(0, points.roundStart.y)
|
2020-07-23 12:30:26 +02:00
|
|
|
} else {
|
|
|
|
points.closureBottom = new Point(points.closureTop.x, points.hem.y)
|
|
|
|
points.lastButton = new Point(0, points.hem.y)
|
2019-02-17 17:21:39 +01:00
|
|
|
}
|
2021-02-07 10:12:44 +01:00
|
|
|
// We use the roundEnd and roundStart points later on
|
|
|
|
// let's make sure they exist even if the hem is not rounded
|
|
|
|
// (essentially a rounded hem with radius zero
|
|
|
|
if (!points.roundStart) points.roundStart = points.closureBottom.clone()
|
|
|
|
if (!points.roundEnd) points.roundEnd = points.closureBottom.clone()
|
2019-02-17 20:42:05 +01:00
|
|
|
// Add dart start and end point regardless of style or front or back
|
2019-08-03 15:03:33 +02:00
|
|
|
points.dartStart = options.hemStyle === 'classic' ? points.splitDartHemLeft : points.dartHemLeft
|
|
|
|
points.dartEnd = options.hemStyle === 'classic' ? points.splitDartHemRight : points.dartHemRight
|
2019-02-17 17:21:39 +01:00
|
|
|
// Pockets
|
2020-06-28 12:26:05 +02:00
|
|
|
let pw = measurements.hips * options.pocketWidth // Pocket width
|
2019-08-03 15:03:33 +02:00
|
|
|
let pwh = pw * options.weltHeight // Pocket welt height
|
|
|
|
let pwvh = pwh / Math.cos(utils.deg2rad(options.pocketAngle)) // Pocket welt vertical height
|
2019-02-17 17:21:39 +01:00
|
|
|
points.pocketTopMid = points.dartWaistCenter.shiftFractionTowards(
|
|
|
|
points.dartHipCenter,
|
|
|
|
options.pocketLocation
|
2019-08-03 15:03:33 +02:00
|
|
|
)
|
2019-02-17 17:21:39 +01:00
|
|
|
points.pocketTopMidLeft = utils.curveIntersectsY(
|
|
|
|
points.dartWaistLeft,
|
|
|
|
points.dartWaistLeftCpBottom,
|
|
|
|
points.dartHipLeftCpTop,
|
|
|
|
points.dartHipLeft,
|
|
|
|
points.pocketTopMid.y
|
2019-08-03 15:03:33 +02:00
|
|
|
)
|
2019-02-17 17:21:39 +01:00
|
|
|
points.pocketBottomMidLeft = utils.curveIntersectsY(
|
|
|
|
points.dartWaistLeft,
|
|
|
|
points.dartWaistLeftCpBottom,
|
|
|
|
points.dartHipLeftCpTop,
|
|
|
|
points.dartHipLeft,
|
|
|
|
points.pocketTopMid.y + pwvh
|
2019-08-03 15:03:33 +02:00
|
|
|
)
|
|
|
|
points.pocketTopLeft = points.pocketTopMidLeft.shift(180 + options.pocketAngle, pw / 2)
|
|
|
|
points.pocketBottomLeft = points.pocketTopLeft.shift(options.pocketAngle - 90, pwh)
|
|
|
|
points.pocketTopMidRight = points.pocketTopMidLeft.flipX(points.pocketTopMid)
|
|
|
|
points.pocketBottomMidRight = points.pocketBottomMidLeft.flipX(points.pocketTopMid)
|
|
|
|
points.pocketTopRight = points.pocketTopMidRight.shift(options.pocketAngle, pw / 2)
|
|
|
|
points.pocketBottomRight = points.pocketTopRight.shift(options.pocketAngle - 90, pwh)
|
2019-02-18 17:52:34 +01:00
|
|
|
// Store pocket bag length
|
2019-08-03 15:03:33 +02:00
|
|
|
store.set('pocketBagLength', points.pocketTopMid.dy(points.cfHem) * 0.75)
|
2020-03-16 11:08:28 +01:00
|
|
|
if (options.frontScyeDart) {
|
|
|
|
// Front scye dart
|
|
|
|
points._dartWidth = points.dartTop.shiftFractionTowards(
|
|
|
|
points.armholeHollow.rotate(options.frontScyeDart, points.dartTop),
|
|
|
|
1.5
|
|
|
|
)
|
|
|
|
points.armholeHollowTop = new Path()
|
|
|
|
.move(points.armholeHollow)
|
|
|
|
.curve(points.armholeHollowCp2, points.armholePitchCp1, points.armholePitch)
|
|
|
|
.intersects(new Path().move(points.dartTop).line(points._dartWidth))
|
|
|
|
.pop()
|
|
|
|
// Adjust control point
|
|
|
|
points.armholeHollowCp2 = points.armholeHollowCp2.shift(
|
|
|
|
points.armholeHollow.angle(points.armholeHollowTop),
|
|
|
|
points.armholeHollow.dist(points.armholeHollowTop)
|
|
|
|
)
|
|
|
|
// Rotate front scye dart into front dart
|
|
|
|
let toRotate = [
|
|
|
|
'dartWaistRightCpTop',
|
|
|
|
'dartWaistRight',
|
|
|
|
'dartWaistRightCpBottom',
|
|
|
|
'dartHipRightCpTop',
|
|
|
|
'dartHipRight',
|
|
|
|
'dartHemRight',
|
|
|
|
'splitDartHemRight',
|
|
|
|
'splitDartHemRightCp2',
|
|
|
|
'splitHemCp1',
|
|
|
|
'hem',
|
|
|
|
'hips',
|
|
|
|
'hipsCp2',
|
|
|
|
'waistCp1',
|
|
|
|
'waist',
|
|
|
|
'waistCp2',
|
|
|
|
'armhole',
|
|
|
|
'armholeCp2',
|
|
|
|
'armholeHollow',
|
|
|
|
'pocketTopMidRight',
|
|
|
|
'pocketBottomMidRight',
|
|
|
|
'pocketTopRight',
|
|
|
|
'pocketBottomRight',
|
2021-04-24 10:16:31 +02:00
|
|
|
'dartEnd',
|
2020-03-16 11:08:28 +01:00
|
|
|
]
|
|
|
|
for (let p of toRotate) {
|
|
|
|
if (typeof points[p] !== 'undefined')
|
|
|
|
points[p] = points[p].rotate(options.frontScyeDart, points.dartTop)
|
|
|
|
}
|
|
|
|
points.armholeHollowCp1 = points.armholeHollowCp2.rotate(180, points.armholeHollow)
|
2019-02-17 17:21:39 +01:00
|
|
|
}
|
2020-04-18 17:35:25 +02:00
|
|
|
// Facing/Lining boundary (flb)
|
|
|
|
points.flbTop = points.neck.shiftFractionTowards(points.shoulder, 0.5)
|
2022-07-09 16:49:30 +02:00
|
|
|
points.flbCp = points.dartTop.shift(-90, points.armholePitch.dy(points.flbTop) / 2)
|
2022-08-13 21:09:23 +00:00
|
|
|
points.flbCpTop = points.flbTop
|
|
|
|
.shiftTowards(points.neck, points.flbTop.dy(points.armholePitch))
|
|
|
|
.rotate(90, points.flbTop)
|
2019-02-17 17:21:39 +01:00
|
|
|
// Seam line
|
2019-08-03 15:03:33 +02:00
|
|
|
delete paths.cutonfold
|
|
|
|
delete paths.saBase
|
|
|
|
delete paths.sa
|
2019-02-17 20:42:05 +01:00
|
|
|
paths.saBase = new Path()
|
|
|
|
.move(points.hem)
|
2019-02-17 17:21:39 +01:00
|
|
|
.line(points.hips)
|
|
|
|
.curve(points.hipsCp2, points.waistCp1, points.waist)
|
|
|
|
.curve_(points.waistCp2, points.armhole)
|
|
|
|
.curve(points.armholeCp2, points.armholeHollowCp1, points.armholeHollow)
|
|
|
|
.curve(points.armholeHollowCp2, points.armholePitchCp1, points.armholePitch)
|
|
|
|
.curve(points.armholePitchCp2, points.shoulderCp1, points.shoulder)
|
|
|
|
.line(points.neck)
|
2019-08-03 15:03:33 +02:00
|
|
|
.curve(points.neckCp2, points.closureTopCp1, points.closureTop)
|
|
|
|
if (options.hemStyle === 'classic') {
|
2019-02-17 17:21:39 +01:00
|
|
|
paths.saBase
|
|
|
|
.line(points.closureBottom)
|
|
|
|
.line(points.hemTip)
|
2019-08-03 15:03:33 +02:00
|
|
|
._curve(points.splitDartHemLeftCp1, points.splitDartHemLeft)
|
2019-02-17 20:42:05 +01:00
|
|
|
paths.hemBase = new Path()
|
|
|
|
.move(points.dartEnd)
|
2019-08-03 15:03:33 +02:00
|
|
|
.curve(points.splitDartHemRightCp2, points.splitHemCp1, points.hem)
|
2020-07-23 12:30:26 +02:00
|
|
|
} else if (options.hemStyle === 'rounded') {
|
2019-02-17 17:21:39 +01:00
|
|
|
paths.saBase
|
|
|
|
.line(points.roundStart)
|
|
|
|
.curve(points.roundCp1, points.roundCp2, points.roundEnd)
|
2019-08-03 15:03:33 +02:00
|
|
|
.line(points.dartHemLeft)
|
|
|
|
paths.hemBase = new Path().move(points.dartEnd).line(points.hem)
|
2020-07-23 12:30:26 +02:00
|
|
|
} else {
|
|
|
|
paths.saBase.line(points.closureBottom).line(points.dartHemLeft)
|
|
|
|
paths.hemBase = new Path().move(points.dartEnd).line(points.hem)
|
2019-02-17 17:21:39 +01:00
|
|
|
}
|
2019-08-03 15:03:33 +02:00
|
|
|
paths.dart = dartPath(part)
|
2020-04-18 17:35:25 +02:00
|
|
|
paths.seam = paths.saBase.join(paths.dart).join(paths.hemBase).close().attr('class', 'fabric')
|
2019-08-03 15:03:33 +02:00
|
|
|
paths.saBase.render = false
|
|
|
|
paths.hemBase.render = false
|
|
|
|
paths.dart.render = false
|
2019-02-17 17:21:39 +01:00
|
|
|
if (complete) {
|
2020-04-18 16:18:11 +02:00
|
|
|
// Pocket path
|
|
|
|
paths.pocket = new Path()
|
|
|
|
.move(points.pocketTopMidLeft)
|
|
|
|
.line(points.pocketTopLeft)
|
|
|
|
.line(points.pocketBottomLeft)
|
|
|
|
.line(points.pocketBottomMidLeft)
|
|
|
|
.move(points.pocketBottomMidRight)
|
|
|
|
.line(points.pocketBottomRight)
|
|
|
|
.line(points.pocketTopRight)
|
|
|
|
.line(points.pocketTopMidRight)
|
|
|
|
.attr('class', 'fabric dashed')
|
2019-02-17 17:21:39 +01:00
|
|
|
// Buttons
|
2019-08-03 15:03:33 +02:00
|
|
|
points.button1 = new Point(0, points.closureTop.y + 10)
|
|
|
|
let delta = points.button1.dist(points.lastButton) / (options.buttons - 1)
|
2019-02-17 17:21:39 +01:00
|
|
|
for (let i = 1; i <= options.buttons; i++) {
|
2019-08-03 15:03:33 +02:00
|
|
|
points['button' + i] = points.button1.shift(-90, delta * (i - 1))
|
|
|
|
snippets['button' + i] = new Snippet('button', points['button' + i])
|
|
|
|
snippets['buttonhole' + i] = new Snippet('buttonhole', points['button' + i]).attr(
|
|
|
|
'data-rotate',
|
|
|
|
90
|
|
|
|
)
|
2019-02-17 17:21:39 +01:00
|
|
|
}
|
|
|
|
// Facing/Lining boundary (flb)
|
|
|
|
paths.flbFacing = new Path()
|
|
|
|
.move(points.dartTop)
|
2022-07-09 16:49:30 +02:00
|
|
|
.curve(points.flbCp, points.flbCpTop, points.flbTop)
|
2019-08-03 15:03:33 +02:00
|
|
|
.attr('class', 'fabric')
|
|
|
|
paths.flbLining = paths.flbFacing.clone().attr('class', 'lining dashed')
|
2022-08-13 21:09:23 +00:00
|
|
|
|
2022-08-16 16:11:47 +00:00
|
|
|
//Grainline
|
|
|
|
|
2022-08-13 21:09:23 +00:00
|
|
|
macro('grainline', {
|
2022-08-16 16:11:47 +00:00
|
|
|
to: points.neck,
|
|
|
|
from: new Point(points.neck.x, points.cfHem.y),
|
2022-08-13 21:09:23 +00:00
|
|
|
})
|
2019-02-17 20:42:05 +01:00
|
|
|
if (sa) {
|
|
|
|
paths.sa = paths.saBase
|
|
|
|
.offset(sa)
|
2022-06-25 14:12:48 -04:00
|
|
|
.join(paths.hemBase.offset(sa))
|
2019-08-03 15:03:33 +02:00
|
|
|
.close()
|
2022-08-14 08:44:50 +00:00
|
|
|
.attr('class', 'fabric sa')
|
2019-02-17 20:42:05 +01:00
|
|
|
}
|
2019-02-17 17:21:39 +01:00
|
|
|
if (paperless) {
|
2019-08-03 15:03:33 +02:00
|
|
|
macro('hd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.closureTop,
|
|
|
|
to: points.neck,
|
2021-04-24 10:16:31 +02:00
|
|
|
y: points.neck.y - 15 - sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('hd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.closureTop,
|
|
|
|
to: points.shoulder,
|
2021-04-24 10:16:31 +02:00
|
|
|
y: points.neck.y - 30 - sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('hd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.closureTop,
|
|
|
|
to: points.armhole,
|
2021-04-24 10:16:31 +02:00
|
|
|
y: points.neck.y - 45 - sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('ld', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.neck,
|
|
|
|
to: points.shoulder,
|
2021-04-24 10:16:31 +02:00
|
|
|
d: 15 + sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('ld', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.neck,
|
|
|
|
to: points.flbTop,
|
2021-04-24 10:16:31 +02:00
|
|
|
d: -15,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.armhole,
|
|
|
|
to: points.shoulder,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: points.armhole.x + 15 + sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.armhole,
|
|
|
|
to: points.neck,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: points.armhole.x + 30 + sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.hem,
|
|
|
|
to: points.armhole,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: (points.armhole.x > points.hem.x ? points.armhole.x : points.hem.x) + 15 + sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
|
|
|
from: options.hemStyle === 'classic' ? points.splitDartHemRight : points.dartHemRight,
|
2019-02-17 17:21:39 +01:00
|
|
|
to: points.armhole,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: (points.armhole.x > points.hem.x ? points.armhole.x : points.hem.x) + 30 + sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
|
|
|
from: options.hemStyle === 'classic' ? points.splitDartHemLeft : points.dartHemLeft,
|
2019-02-17 17:21:39 +01:00
|
|
|
to: points.armhole,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: (points.armhole.x > points.hem.x ? points.armhole.x : points.hem.x) + 45 + sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('ld', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.dartHemRight,
|
|
|
|
to: points.hem,
|
2021-04-24 10:16:31 +02:00
|
|
|
d: 15,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
if (options.hemStyle === 'classic') {
|
|
|
|
macro('hd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.closureBottom,
|
|
|
|
to: points.hemTip,
|
2021-04-24 10:16:31 +02:00
|
|
|
y: points.hemTip.y + 15 + sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('hd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.closureBottom,
|
|
|
|
to: points.splitDartHemLeft,
|
2021-04-24 10:16:31 +02:00
|
|
|
y: points.hemTip.y + 30 + sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('hd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.closureBottom,
|
|
|
|
to: points.splitDartHemRight,
|
2021-04-24 10:16:31 +02:00
|
|
|
y: points.hemTip.y + 45 + sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('hd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.closureBottom,
|
|
|
|
to: points.hem,
|
2021-04-24 10:16:31 +02:00
|
|
|
y: points.hemTip.y + 60 + sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.hemTip,
|
|
|
|
to: points.closureBottom,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: points.closureBottom.x - 15 - sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.hemTip,
|
|
|
|
to: points.pocketTopMidLeft,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: points.closureBottom.x - 30 - sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.hemTip,
|
|
|
|
to: points.dartWaistLeft,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: points.closureBottom.x - 45 - sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.hemTip,
|
|
|
|
to: points.closureTop,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: points.closureBottom.x - 60 - sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
2019-02-17 17:21:39 +01:00
|
|
|
} else {
|
2019-08-03 15:03:33 +02:00
|
|
|
macro('hd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.roundStart,
|
|
|
|
to: points.roundEnd,
|
2021-04-24 10:16:31 +02:00
|
|
|
y: points.roundEnd.y + 15 + sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('hd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.roundStart,
|
|
|
|
to: points.dartHemLeft,
|
2021-04-24 10:16:31 +02:00
|
|
|
y: points.roundEnd.y + 30 + sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('hd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.roundStart,
|
|
|
|
to: points.dartHemRight,
|
2021-04-24 10:16:31 +02:00
|
|
|
y: points.roundEnd.y + 45 + sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('hd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.roundStart,
|
|
|
|
to: points.hem,
|
2021-04-24 10:16:31 +02:00
|
|
|
y: points.roundEnd.y + 60 + sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.roundEnd,
|
|
|
|
to: points.roundStart,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: points.roundStart.x - 15 - sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.roundEnd,
|
|
|
|
to: points.pocketTopMidLeft,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: points.roundStart.x - 30 - sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.roundEnd,
|
|
|
|
to: points.dartWaistLeft,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: points.roundStart.x - 45 - sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.roundEnd,
|
|
|
|
to: points.closureTop,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: points.roundStart.x - 60 - sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
2019-02-17 17:21:39 +01:00
|
|
|
}
|
2019-08-03 15:03:33 +02:00
|
|
|
macro('vd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.closureTop,
|
|
|
|
to: points.neck,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: points.closureTop.x - 15 - sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.button2,
|
|
|
|
to: points.button1,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: points.button1.x + 15,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('hd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.closureTop,
|
|
|
|
to: points.button2,
|
2021-04-24 10:16:31 +02:00
|
|
|
y: points.button2.y + 15,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('ld', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.dartWaistLeft,
|
2021-04-24 10:16:31 +02:00
|
|
|
to: points.dartWaistRight,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('ld', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.dartHipLeft,
|
2021-04-24 10:16:31 +02:00
|
|
|
to: points.dartHipRight,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('ld', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.pocketTopLeft,
|
|
|
|
to: points.pocketTopMidLeft,
|
2021-04-24 10:16:31 +02:00
|
|
|
d: 15,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('ld', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.pocketTopMidRight,
|
|
|
|
to: points.pocketTopRight,
|
2021-04-24 10:16:31 +02:00
|
|
|
d: 15,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('ld', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.pocketBottomRight,
|
|
|
|
to: points.pocketTopRight,
|
2021-04-24 10:16:31 +02:00
|
|
|
d: -15,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
|
|
|
macro('vd', {
|
2019-02-17 17:21:39 +01:00
|
|
|
from: points.pocketTopMidLeft,
|
|
|
|
to: points.dartTop,
|
2021-04-24 10:16:31 +02:00
|
|
|
x: points.closureTop.x - 30 - sa,
|
2019-08-03 15:03:33 +02:00
|
|
|
})
|
2019-02-17 17:21:39 +01:00
|
|
|
}
|
|
|
|
}
|
2019-08-03 15:03:33 +02:00
|
|
|
return part
|
|
|
|
}
|
2022-09-03 15:41:48 +02:00
|
|
|
|
|
|
|
export const front = {
|
|
|
|
name: 'wahid.front',
|
|
|
|
from: brianFront,
|
2022-09-05 21:58:44 -07:00
|
|
|
hideDependencies: true,
|
2022-09-03 15:41:48 +02:00
|
|
|
measurements: ['hips', 'waist'],
|
|
|
|
options: {
|
|
|
|
frontOverlap,
|
|
|
|
necklineDrop,
|
|
|
|
frontStyle,
|
|
|
|
frontInset,
|
|
|
|
shoulderInset,
|
|
|
|
neckInset,
|
|
|
|
hemStyle,
|
|
|
|
hemRadius,
|
|
|
|
pocketWidth,
|
|
|
|
pocketAngle,
|
|
|
|
pocketLocation,
|
|
|
|
frontScyeDart,
|
|
|
|
buttons,
|
|
|
|
waistEase,
|
|
|
|
hipsEase,
|
|
|
|
},
|
|
|
|
draft: wahidFront,
|
|
|
|
}
|