cleanup 1
This commit is contained in:
parent
d9158efb29
commit
ad37fed4fe
8 changed files with 66 additions and 1177 deletions
|
@ -4,9 +4,7 @@ import { Design } from '@freesewing/core'
|
|||
import { i18n } from '../i18n/index.mjs'
|
||||
import { data } from '../data.mjs'
|
||||
// Parts
|
||||
import { points } from './points.mjs'
|
||||
import { ipoints } from './ipoints.mjs'
|
||||
import { zpoints } from './zpoints.mjs'
|
||||
import { shape } from './shape.mjs'
|
||||
import { panel } from './panel.mjs'
|
||||
import { leg } from './leg.mjs'
|
||||
import { pocket } from './pocket.mjs'
|
||||
|
@ -15,11 +13,11 @@ import { waistband } from './waistband.mjs'
|
|||
// Create new design
|
||||
const Lumina = new Design({
|
||||
data,
|
||||
parts: [/*zpoints, ipoints,*/ points, panel, leg, waistband, pocket],
|
||||
parts: [shape, panel, leg, waistband, pocket],
|
||||
})
|
||||
|
||||
// Named exports
|
||||
export { i18n, Lumina, /*zpoints, ipoints,*/ points, panel, leg, waistband, pocket }
|
||||
export { i18n, Lumina, shape, panel, leg, waistband, pocket }
|
||||
|
||||
// const classes = ['lining','canvas','mark','contrast','note','interfacing','various']
|
||||
|
||||
|
|
|
@ -1,495 +0,0 @@
|
|||
export const ipoints = {
|
||||
name: 'lumina.ipoints',
|
||||
measurements: [
|
||||
'waist',
|
||||
'waistBack',
|
||||
'hips',
|
||||
'seat',
|
||||
'seatBack',
|
||||
'inseam',
|
||||
'waistToSeat',
|
||||
'waistToUpperLeg',
|
||||
'waistToKnee',
|
||||
'waistToHips',
|
||||
'waistToFloor',
|
||||
'knee',
|
||||
'ankle',
|
||||
'crossSeam',
|
||||
'crossSeamFront',
|
||||
'heel',
|
||||
'upperLeg',
|
||||
],
|
||||
options: {
|
||||
ease: { pct: -20, min: -35, max: 10, menu: 'fit' },
|
||||
crossSeamAngle: 35,
|
||||
crotchToKnee: 0.4,
|
||||
waistToKneeCP: 0.4,
|
||||
kneeToWaistLength: 400,
|
||||
crotchPointsCP: 2,
|
||||
},
|
||||
draft: ({
|
||||
measurements,
|
||||
options,
|
||||
Point,
|
||||
Path,
|
||||
points,
|
||||
paths,
|
||||
Snippet,
|
||||
snippets,
|
||||
utils,
|
||||
log,
|
||||
complete,
|
||||
sa,
|
||||
paperless,
|
||||
macro,
|
||||
part,
|
||||
}) => {
|
||||
return part.hide()
|
||||
|
||||
const ControlPoints = (p1, p2, p3, t) => {
|
||||
let a = Math.abs(p2.angle(p1) - p2.angle(p3)) / 2
|
||||
console.log({ t: t, ap2_1: p2.angle(p1), ap2_3: p2.angle(p3), a: a })
|
||||
const t1 = p2.shift(p2.angle(p1) + a - 90, p2.dist(p1) / 3)
|
||||
const t3 = p2.shift(p2.angle(p3) - a + 90, p2.dist(p3) / 3)
|
||||
console.log({ t: t, ap2_t1: p2.angle(t1), ap2_t3: p2.angle(t3), a: a })
|
||||
return {
|
||||
cp1: p2.shift(p2.angle(p1) + a - 90, p2.dist(p1) / 3),
|
||||
cp3: p2.shift(p2.angle(p3) - a + 90, p2.dist(p3) / 3),
|
||||
}
|
||||
}
|
||||
const CreateControlPoints = (names) => {
|
||||
for (var i = 1; i < names.length - 1; i++) {
|
||||
var cp = ControlPoints(points[names[i - 1]], points[names[i]], points[names[i + 1]])
|
||||
points[names[i] + 'Cp1'] = cp.cp1
|
||||
points[names[i] + 'Cp2'] = cp.cp3
|
||||
}
|
||||
}
|
||||
const CreatePath = (pathName, names) => {
|
||||
console.log({ i: 1, n: names[1], p2: points[names[1] + 'Cp2'], p3: points[names[1]] })
|
||||
paths[pathName] = new Path()
|
||||
.move(points[names[0]])
|
||||
._curve(points[names[1] + 'Cp1'], points[names[1]])
|
||||
console.log({ s: 0, l: paths[pathName].length() })
|
||||
for (var i = 2; i < names.length - 1; i++) {
|
||||
console.log({
|
||||
i: i,
|
||||
n: names[i],
|
||||
p1: points[names[i - 1] + 'Cp1'],
|
||||
p2: points[names[i] + 'Cp2'],
|
||||
p3: points[names[i]],
|
||||
})
|
||||
paths[pathName].curve(
|
||||
points[names[i - 1] + 'Cp2'],
|
||||
points[names[i] + 'Cp1'],
|
||||
points[names[i]]
|
||||
)
|
||||
console.log({
|
||||
s: i - 1,
|
||||
l: new Path()
|
||||
.move(points[names[i - 1]])
|
||||
.curve(points[names[i - 1] + 'Cp2'], points[names[i] + 'Cp1'], points[names[i]])
|
||||
.length(),
|
||||
})
|
||||
}
|
||||
console.log({ i: i, n: names[i], p2: points[names[i] + 'Cp2'], p3: points[names[i]] })
|
||||
paths[pathName].curve_(points[names[i - 1] + 'Cp2'], points[names[i]])
|
||||
}
|
||||
|
||||
const CreateWaistPoint = (m, options, points, utils, front) => {
|
||||
const kneeTemp = points.upperleg.shiftFractionTowards(points.knee, options.crotchToKnee)
|
||||
const angle =
|
||||
90 +
|
||||
(front
|
||||
? options.crossSeamAngle * (m.waistBack / m.waist)
|
||||
: -1 * options.crossSeamAngle * (1 - m.waistBack / m.waist))
|
||||
const crossSeam = front ? m.crossSeamFront : m.crossSeam - m.crossSeamFront
|
||||
var kneeToWaist = m.waistToKnee
|
||||
var ratio = 1
|
||||
var waist = kneeTemp.shift(angle, kneeToWaist * ratio)
|
||||
const crossSeamCp = points.upperleg.shiftFractionTowards(
|
||||
utils.beamIntersectsY(kneeTemp, waist, 0),
|
||||
options.crotchPointsCP
|
||||
)
|
||||
|
||||
console.log({ f: front, a: angle })
|
||||
var waistCp
|
||||
var diff,
|
||||
iter = 0
|
||||
do {
|
||||
waist = kneeTemp.shift(angle, kneeToWaist * ratio * (ratio < 1 ? 1.05 : 0.95))
|
||||
// waistCp = waist.shiftFractionTowards(kneeTemp, options.waistToKneeCP)
|
||||
waistCp = waist.shiftFractionTowards(points.knee, options.waistToKneeCP)
|
||||
|
||||
const crossSeamPath = new Path().move(points.upperleg).curve(crossSeamCp, waistCp, waist)
|
||||
|
||||
diff = crossSeam - crossSeamPath.length()
|
||||
ratio = crossSeam / crossSeamPath.length()
|
||||
// console.log({ i: iter, d: diff, r: ratio })
|
||||
} while (++iter < 100 && (diff > 1 || diff < -1))
|
||||
if (iter >= 100) {
|
||||
console.log('Too many iterations trying to make it fit!')
|
||||
// log.error('Too many iterations trying to make it fit!')
|
||||
}
|
||||
|
||||
if (front) {
|
||||
points.waistFront = waist.clone()
|
||||
points.waistFrontCp = waistCp.clone()
|
||||
points.crossSeamFrontCp = crossSeamCp.clone()
|
||||
} else {
|
||||
points.waistBack = waist.clone()
|
||||
points.waistBackCp = waistCp.clone()
|
||||
points.crossSeamBackCp = crossSeamCp.clone()
|
||||
}
|
||||
}
|
||||
|
||||
const m = measurements
|
||||
const crotchOffset = m.waistToFloor - m.inseam
|
||||
|
||||
const waistFrontBackRatio = m.waistBack / m.waist
|
||||
const sideRatio = 3 / 5
|
||||
const ease = options.ease + 1
|
||||
|
||||
m['waistToAnkle'] = m.waistToFloor - m.heel / Math.PI
|
||||
|
||||
console.log({ m: JSON.parse(JSON.stringify(m)) })
|
||||
console.log({ wfr: waistFrontBackRatio })
|
||||
// points.origin = new Point(0, 0)
|
||||
// points.knee = points.origin.shift(270, m.inseam - (m.waistToFloor - m.waistToKnee))
|
||||
// points.ankle = points.origin.shift(270, m.inseam - (m.ankle / Math.PI))
|
||||
// points.waist = points.origin.shift(90, m.waistToFloor - m.inseam)
|
||||
|
||||
points.upperlegFront = points.upperlegBack = points.upperleg = new Point(0, 0)
|
||||
points.kneeFront =
|
||||
points.kneeBack =
|
||||
points.knee =
|
||||
points.upperleg.shift(270, m.waistToKnee - crotchOffset)
|
||||
points.ankleFront =
|
||||
points.ankleBack =
|
||||
points.ankle =
|
||||
points.upperleg.shift(270, m.inseam - m.heel / Math.PI)
|
||||
points.floorFront = points.floorBack = points.floor = points.upperleg.shift(270, m.inseam)
|
||||
|
||||
// points.waistTemp = points.upperleg.shiftFractionTowards(points.knee,options.crotchToKnee).shift(90 + options.crossSeamAngle*(m.waistBack/m.waist), options.kneeToWaistLength)
|
||||
// paths.waistTemp = new Path()
|
||||
// .move(points.upperleg.shiftFractionTowards(points.knee,options.crotchToKnee))
|
||||
// .line(points.waistTemp)
|
||||
// points.upperlegFrontCp = utils.beamIntersectsY(points.kneeTemp,points.waistTempFront,0)
|
||||
// points.upperlegBackCp = utils.beamIntersectsY(points.kneeTemp,points.waistTempBack,0)
|
||||
|
||||
CreateWaistPoint(m, options, points, utils, true)
|
||||
CreateWaistPoint(m, options, points, utils, false)
|
||||
|
||||
// paths.waistTempCp = new Path()
|
||||
// .move(points.upperleg)
|
||||
// .line(points.crossSeamFrontCp)
|
||||
|
||||
console.log({ pionts: JSON.parse(JSON.stringify(points)) })
|
||||
|
||||
paths.middle = new Path().move(points.upperleg).line(points.floor)
|
||||
|
||||
paths.crossSeamFront = new Path()
|
||||
.move(points.upperleg)
|
||||
.curve(points.crossSeamFrontCp, points.waistFrontCp, points.waistFront)
|
||||
paths.crossSeamBack = new Path()
|
||||
.move(points.upperleg)
|
||||
.curve(points.crossSeamBackCp, points.waistBackCp, points.waistBack)
|
||||
|
||||
let csFront = paths.crossSeamFront.length()
|
||||
let csBack = paths.crossSeamBack.length()
|
||||
|
||||
console.log({ csf: m.crossSeamFront, csFront: csFront })
|
||||
|
||||
const waistAngle = utils.rad2deg(
|
||||
Math.asin((points.waistBack.y - points.waistFront.y) / (m.waist / 2))
|
||||
)
|
||||
|
||||
console.log({
|
||||
r: m.crossSeamFront / m.waistToUpperLeg,
|
||||
S: m.waistToSeat * (m.crossSeamFront / m.waistToUpperLeg),
|
||||
H: m.waistToHips * (m.crossSeamFront / m.waistToUpperLeg),
|
||||
})
|
||||
points.seatFront = paths.crossSeamFront
|
||||
.reverse()
|
||||
.shiftAlong(m.waistToSeat /* * (m.crossSeamFront / m.waistToUpperLeg) */)
|
||||
.addCircle(6)
|
||||
points.hipsFront = paths.crossSeamFront
|
||||
.reverse()
|
||||
.shiftAlong(m.waistToHips /* * (m.crossSeamFront / m.waistToUpperLeg) */)
|
||||
.addCircle(10)
|
||||
points.seatBack = paths.crossSeamBack
|
||||
.reverse()
|
||||
.shiftAlong(m.waistToSeat /* * (m.waistToSeat / m.waistToUpperLeg) */)
|
||||
.addCircle(6)
|
||||
points.hipsBack = paths.crossSeamBack
|
||||
.reverse()
|
||||
.shiftAlong(m.waistToHips /* * (m.waistToSeat / m.waistToUpperLeg) */)
|
||||
.addCircle(10)
|
||||
|
||||
points.waistFrontSeam = points.waistFront.shift(
|
||||
180 + waistAngle,
|
||||
((m.waist - m.waistBack) * ease) / 2
|
||||
)
|
||||
points.waistBackSeam = points.waistBack.shift(waistAngle, (m.waistBack * ease) / 2)
|
||||
points.seatFrontSeam = points.seatFront.shift(
|
||||
180 + waistAngle,
|
||||
((m.seat - m.seatBack) * ease) / 2
|
||||
)
|
||||
points.seatBackSeam = points.seatBack.shift(waistAngle, (m.seatBack * ease) / 2)
|
||||
points.upperlegFrontSeam = points.upperleg.shift(180 + waistAngle, (m.upperLeg * ease) / 2)
|
||||
points.upperlegBackSeam = points.upperleg.shift(waistAngle, (m.upperLeg * ease) / 2)
|
||||
points.kneeFrontSeam = points.knee.shift(180, (m.knee * ease) / 2)
|
||||
points.kneeBackSeam = points.knee.shift(0, (m.knee * ease) / 2)
|
||||
points.ankleFrontSeam = points.ankle.shift(180, (m.ankle * ease) / 2)
|
||||
points.ankleBackSeam = points.ankle.shift(0, (m.ankle * ease) / 2)
|
||||
|
||||
const sideFixed = points.waistFrontSeam.dist(
|
||||
points.waistFront.shiftFractionTowards(points.waistFrontSeam, sideRatio)
|
||||
)
|
||||
|
||||
paths.front = new Path()
|
||||
.move(points.ankleFrontSeam)
|
||||
.line(points.kneeFrontSeam)
|
||||
.line(points.upperlegFrontSeam)
|
||||
.line(points.seatFrontSeam)
|
||||
.line(points.waistFrontSeam)
|
||||
paths.back = new Path()
|
||||
.move(points.ankleBackSeam)
|
||||
.line(points.kneeBackSeam)
|
||||
.line(points.upperlegBackSeam)
|
||||
.line(points.seatBackSeam)
|
||||
.line(points.waistBackSeam)
|
||||
|
||||
const ShiftPathPoints = (path, ratio, names) => {
|
||||
if (names.length < 2) return
|
||||
for (var i = names.length - 2; i >= 0; i--) {
|
||||
console.log({ n1: names[i].toLowerCase() + path, n2: names[i + 1].toLowerCase() + path })
|
||||
console.log({
|
||||
p1: points[names[i].toLowerCase() + path],
|
||||
p2: points[names[i + 1].toLowerCase() + path],
|
||||
})
|
||||
console.log({
|
||||
lb: points[names[i].toLowerCase() + path].dist(points[names[i + 1].toLowerCase() + path]),
|
||||
})
|
||||
points[names[i].toLowerCase() + path] = points[
|
||||
names[i].toLowerCase() + path
|
||||
].shiftFractionTowards(points[names[i + 1].toLowerCase() + path], ratio)
|
||||
console.log({
|
||||
la: points[names[i].toLowerCase() + path].dist(points[names[i + 1].toLowerCase() + path]),
|
||||
})
|
||||
}
|
||||
}
|
||||
const shiftRatio =
|
||||
1 - (m.waistToFloor - points.floorFront.dist(points.ankleFront)) / paths.front.length()
|
||||
console.log({ shiftRatio: shiftRatio })
|
||||
ShiftPathPoints('FrontSeam', shiftRatio, [
|
||||
'Waist',
|
||||
/*'Hips',*/ 'Seat',
|
||||
'UpperLeg',
|
||||
'Knee',
|
||||
'Ankle',
|
||||
])
|
||||
|
||||
// points.waistFrontSplit = points.waistFront.shiftFractionTowards(points.waistFrontSeam, sideRatio)
|
||||
points.waistFrontSplit = points.waistFrontSeam.shiftTowards(points.waistFront, sideFixed)
|
||||
// points.waistBackSplit = points.waistBack.shiftFractionTowards(points.waistBackSeam, sideRatio)
|
||||
points.waistBackSplit = points.waistBackSeam.shiftTowards(points.waistBack, sideFixed)
|
||||
points.seatFrontSplit = points.seatFrontSeam.shiftTowards(points.seatFront, sideFixed)
|
||||
points.seatBackSplit = points.seatBackSeam.shiftTowards(points.seatBack, sideFixed)
|
||||
// points.upperlegFrontSplit = points.upperleg.shiftFractionTowards(points.upperlegFront, sideRatio)
|
||||
points.upperlegFrontSplit = points.upperlegFrontSeam.shiftTowards(points.upperleg, sideFixed)
|
||||
// points.upperlegBackSplit = points.upperleg.shiftFractionTowards(points.upperlegBack, sideRatio)
|
||||
points.upperlegBackSplit = points.upperlegBackSeam.shiftTowards(points.upperleg, sideFixed)
|
||||
points.kneeFrontSplit = points.knee.shiftFractionTowards(points.kneeFrontSeam, sideRatio)
|
||||
// points.kneeFrontSplit = points.kneeFront.shiftTowards(points.knee, sideFixed)
|
||||
points.kneeBackSplit = points.knee.shiftFractionTowards(points.kneeBackSeam, sideRatio)
|
||||
// points.kneeBackSplit = points.kneeBack.shiftTowards(points.knee, sideFixed)
|
||||
points.ankleFrontSplit = points.ankle.shiftFractionTowards(points.ankleFrontSeam, sideRatio)
|
||||
// points.ankleFrontSplit = points.ankleFront.shiftTowards(points.ankle, sideFixed)
|
||||
points.ankleBackSplit = points.ankle.shiftFractionTowards(points.ankleBackSeam, sideRatio)
|
||||
// points.ankleBackSplit = points.ankleBack.shiftTowards(points.ankle, sideFixed)
|
||||
|
||||
points.seatFrontSplit = utils
|
||||
.beamsIntersect(
|
||||
points.seatFront,
|
||||
points.seatFrontSeam,
|
||||
points.waistFrontSplit,
|
||||
points.upperlegFrontSplit
|
||||
)
|
||||
.addCircle(8)
|
||||
|
||||
CreateControlPoints([
|
||||
'waistFrontSplit',
|
||||
'seatFrontSplit',
|
||||
'upperlegFrontSplit',
|
||||
'kneeFrontSplit',
|
||||
'ankleFrontSplit',
|
||||
])
|
||||
|
||||
CreatePath('frontSplit', [
|
||||
'waistFrontSplit',
|
||||
'seatFrontSplit',
|
||||
'upperlegFrontSplit',
|
||||
'kneeFrontSplit',
|
||||
'ankleFrontSplit',
|
||||
])
|
||||
|
||||
CreateControlPoints([
|
||||
'waistBackSplit',
|
||||
// 'seatBackSplit',
|
||||
'upperlegBackSplit',
|
||||
'kneeBackSplit',
|
||||
'ankleBackSplit',
|
||||
])
|
||||
|
||||
CreatePath('BackSplit', [
|
||||
'waistBackSplit',
|
||||
// 'seatBackSplit',
|
||||
'upperlegBackSplit',
|
||||
'kneeBackSplit',
|
||||
'ankleBackSplit',
|
||||
])
|
||||
|
||||
points.seatBackSplit = utils
|
||||
.beamIntersectsCurve(
|
||||
points.seatBack,
|
||||
points.seatBackSeam,
|
||||
points.waistBackSplit,
|
||||
points.waistBackSplit,
|
||||
points.upperlegBackSplitCp1,
|
||||
points.upperlegBackSplit
|
||||
)
|
||||
.addCircle(8)
|
||||
|
||||
var cp = ControlPoints(points.waistFrontSplit, points.upperlegFrontSplit, points.kneeFrontSplit)
|
||||
points.upperlegFrontCp1 = cp.cp1
|
||||
points.upperlegFrontCp2 = cp.cp3
|
||||
cp = ControlPoints(points.waistBackSplit, points.upperlegBackSplit, points.kneeBackSplit)
|
||||
points.upperlegBackCp1 = cp.cp1
|
||||
points.upperlegBackCp2 = cp.cp3
|
||||
cp = ControlPoints(points.upperlegFrontSplit, points.kneeFrontSplit, points.ankleFrontSplit)
|
||||
points.kneeFrontCp1 = cp.cp1
|
||||
points.kneeFrontCp2 = cp.cp3
|
||||
cp = ControlPoints(points.upperlegBackSplit, points.kneeBackSplit, points.ankleBackSplit)
|
||||
points.kneeBackCp1 = cp.cp1
|
||||
points.kneeBackCp2 = cp.cp3
|
||||
|
||||
console.log({ pins: JSON.parse(JSON.stringify(points)) })
|
||||
|
||||
paths.frontZ = paths.front.reverse()
|
||||
points.seatZ = paths.frontZ.shiftAlong(m.waistToSeat).addCircle(4)
|
||||
points.hipsZ = paths.frontZ.shiftAlong(m.waistToHips).addCircle(4)
|
||||
points.upperlegZ = paths.frontZ.shiftAlong(m.waistToUpperLeg).addCircle(4)
|
||||
points.kneeZ = paths.frontZ.shiftAlong(m.waistToKnee).addCircle(4)
|
||||
points.ankleZ = paths.frontZ
|
||||
.shiftAlong(m.waistToFloor - points.floor.dist(points.ankle))
|
||||
.addCircle(4)
|
||||
|
||||
paths.backZ = paths.back.reverse()
|
||||
points.seatZback = paths.backZ.shiftAlong(m.waistToSeat).addCircle(4)
|
||||
points.hipsZback = paths.backZ.shiftAlong(m.waistToHips).addCircle(4)
|
||||
points.upperlegZback = paths.backZ.shiftAlong(m.waistToUpperLeg).addCircle(4)
|
||||
points.kneeZback = paths.backZ.shiftAlong(m.waistToKnee).addCircle(4)
|
||||
points.ankleZback = paths.backZ
|
||||
.shiftAlong(m.waistToFloor - points.floor.dist(points.ankle))
|
||||
.addCircle(4)
|
||||
|
||||
console.log({
|
||||
pf: paths.frontZ.length(),
|
||||
pb: paths.backZ.length(),
|
||||
m: m.waistToFloor - points.floor.dist(points.ankle),
|
||||
})
|
||||
|
||||
console.log({ pahts: JSON.parse(JSON.stringify(paths)) })
|
||||
points.kneeFrontSplit.addCircle(2).addCircle(4).addCircle(6).addCircle(8)
|
||||
// console.log({kfs:paths.frontSplit.split(points.seatFrontSplit)})
|
||||
// console.log({kfs:paths.frontSplit.split(points.upperlegFrontSplit)})
|
||||
console.log('--------------------------------')
|
||||
console.log({ kfs: paths.frontSplit.split(points.kneeFrontSplit) })
|
||||
// console.log({kfs:paths.frontSplit.split(points.upperlegFrontSplit)})
|
||||
|
||||
points.sideWaist = new Point(200, 0)
|
||||
console.log({ p: points.sideWaist })
|
||||
points.sideWaistFront = points.sideWaist
|
||||
.shift(180 - waistAngle, points.waistFrontSplit.dist(points.waistFrontSeam))
|
||||
.addCircle(10)
|
||||
points.sideWaistBack = points.sideWaist.shift(
|
||||
-1 * waistAngle,
|
||||
points.waistBackSplit.dist(points.waistBackSeam)
|
||||
)
|
||||
const mp = ['Waist', /*'Hips',*/ 'Seat', 'UpperLeg', 'Knee', 'Ankle']
|
||||
// var pathLength = [0]
|
||||
for (var i = 1; i < mp.length; i++) {
|
||||
// console.log({ n: 'waistTo' + mp[i], m: m['waistTo' + mp[i]], pl: pathLength[i-1] })
|
||||
// console.log({T:paths.frontSplit.split(points[mp[i].toLowerCase() + 'FrontSplit'])[0].length()})
|
||||
points['side' + mp[i]] = points.sideWaist.shift(270, m['waistTo' + mp[i]]).addCircle(3)
|
||||
console.log({
|
||||
n1: 'side' + mp[i],
|
||||
n2: mp[i].toLowerCase() + 'FrontSplit',
|
||||
n3: mp[i].toLowerCase() + 'FrontSeam',
|
||||
n4: mp[i - 1].toLowerCase() + 'Front',
|
||||
n5: 'side' + mp[i - 1] + 'Front',
|
||||
})
|
||||
console.log({
|
||||
p1: points['side' + mp[i]],
|
||||
p2: points[mp[i].toLowerCase() + 'FrontSplit'],
|
||||
p3: points[mp[i].toLowerCase() + 'FrontSeam'],
|
||||
p4: points[mp[i - 1].toLowerCase() + 'Front'],
|
||||
p5: points['side' + mp[i - 1] + 'Front'],
|
||||
})
|
||||
// console.log({split:paths.frontSplit.split(points[mp[i].toLowerCase() + 'FrontSplit'])})
|
||||
// pathLength.push(paths.frontSplit.split(points[mp[i].toLowerCase() + 'FrontSplit'])[0].length())
|
||||
points['side' + mp[i]].addCircle(
|
||||
points[mp[i].toLowerCase() + 'FrontSplit'].dist(points[mp[i].toLowerCase() + 'FrontSeam'])
|
||||
)
|
||||
points['side' + mp[i]].addCircle(10)
|
||||
points['side' + mp[i]].addCircle(12)
|
||||
points['side' + mp[i]].addCircle(14)
|
||||
points['side' + mp[i - 1] + 'Front'].addCircle(
|
||||
points[mp[i].toLowerCase() + 'FrontSplit'].dist(
|
||||
points[mp[i - 1].toLowerCase() + 'FrontSplit']
|
||||
)
|
||||
)
|
||||
points['side' + mp[i - 1] + 'Front'].addCircle(2)
|
||||
points['side' + mp[i - 1] + 'Front'].addCircle(4)
|
||||
points['side' + mp[i - 1] + 'Front'].addCircle(6)
|
||||
points['side' + mp[i - 1] + 'Front'].addCircle(8)
|
||||
// console.log({l1:points[mp[i].toLowerCase() + 'FrontSplit'].dist(points[mp[i].toLowerCase() + 'FrontSeam']),l2:pathLength[i]-pathLength[i-1],pl:pathLength})
|
||||
var ci = utils.circlesIntersect(
|
||||
points['side' + mp[i]],
|
||||
points[mp[i].toLowerCase() + 'FrontSplit'].dist(points[mp[i].toLowerCase() + 'FrontSeam']),
|
||||
points['side' + mp[i - 1] + 'Front'],
|
||||
points[mp[i].toLowerCase() + 'FrontSplit'].dist(
|
||||
points[mp[i - 1].toLowerCase() + 'FrontSplit']
|
||||
)
|
||||
// pathLength[i]-pathLength[i-1]
|
||||
)
|
||||
console.log({ ci: ci })
|
||||
if (false !== ci) {
|
||||
points['side' + mp[i] + 'Front'] = ci[0].addCircle(7)
|
||||
// points['ci' +mp[i] + '1' ] = ci[1].addCircle(7)
|
||||
// points['side' + mp[i] +'Front'].addCircle(pathLength)
|
||||
}
|
||||
}
|
||||
|
||||
paths.splitFront = new Path()
|
||||
.move(points.waistFrontSplit)
|
||||
._curve(points.upperlegFrontCp1, points.upperlegFrontSplit)
|
||||
.curve(points.upperlegFrontCp2, points.kneeFrontCp1, points.kneeFrontSplit)
|
||||
.curve_(points.kneeFrontCp2, points.ankleFrontSplit)
|
||||
|
||||
paths.splitBack = new Path()
|
||||
.move(points.waistBackSplit)
|
||||
._curve(points.upperlegBackCp1, points.upperlegBackSplit)
|
||||
.curve(points.upperlegBackCp2, points.kneeBackCp1, points.kneeBackSplit)
|
||||
.curve_(points.kneeBackCp2, points.ankleBackSplit)
|
||||
|
||||
console.log({ pahts: JSON.parse(JSON.stringify(paths)) })
|
||||
console.log({ pins: JSON.parse(JSON.stringify(points)) })
|
||||
|
||||
console.log({
|
||||
Split: paths.frontSplit.length(),
|
||||
M: m.waistToFloor - points.floorFront.dist(points.ankleFront),
|
||||
})
|
||||
return part
|
||||
},
|
||||
}
|
|
@ -1,8 +1,8 @@
|
|||
import { points } from './points.mjs'
|
||||
import { shape } from './shape.mjs'
|
||||
|
||||
export const leg = {
|
||||
name: 'lumina.leg',
|
||||
from: points,
|
||||
from: shape,
|
||||
draft: ({ sa, Point, points, Path, paths, Snippet, snippets, options, macro, store, part }) => {
|
||||
paths.front = paths.front.reverse().unhide().addText('front', 'note center').setClass('hidden')
|
||||
paths.frontSplit.unhide().addText('front', 'note center').setClass('hidden')
|
||||
|
@ -23,10 +23,6 @@ export const leg = {
|
|||
.join(paths.frontSplit)
|
||||
.close()
|
||||
|
||||
// paths.backSplit.addClass('lining').unhide()
|
||||
// paths.back.addClass('note').unhide()
|
||||
// paths.front.addClass('mark').unhide()
|
||||
// paths.frontSplit.addClass('contrast').unhide()
|
||||
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
|
||||
|
||||
snippets.middle = new Snippet('notch', points.frontUpperLeg)
|
||||
|
@ -36,10 +32,9 @@ export const leg = {
|
|||
snippets.front3 = new Snippet('notch', paths.frontSplit.shiftFractionAlong(0.6))
|
||||
snippets.front4 = new Snippet('notch', paths.frontSplit.shiftFractionAlong(0.8))
|
||||
snippets.back0 = new Snippet('notch', paths.back.shiftFractionAlong(0.5))
|
||||
snippets.back1 = new Snippet('notch', paths.backSplit.shiftFractionAlong(0.2))
|
||||
snippets.back2 = new Snippet('notch', paths.backSplit.shiftFractionAlong(0.4))
|
||||
snippets.back3 = new Snippet('notch', paths.backSplit.shiftFractionAlong(0.6))
|
||||
snippets.back4 = new Snippet('notch', paths.backSplit.shiftFractionAlong(0.8))
|
||||
snippets.back1 = new Snippet('notch', paths.backSplit.shiftFractionAlong(0.25))
|
||||
snippets.back2 = new Snippet('notch', paths.backSplit.shiftFractionAlong(0.5))
|
||||
snippets.back3 = new Snippet('notch', paths.backSplit.shiftFractionAlong(0.75))
|
||||
|
||||
return part
|
||||
},
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import { points } from './points.mjs'
|
||||
import { shape } from './shape.mjs'
|
||||
|
||||
export const panel = {
|
||||
name: 'lumina.panel',
|
||||
from: points,
|
||||
from: shape,
|
||||
draft: ({ sa, Point, points, Path, paths, Snippet, snippets, options, macro, store, part }) => {
|
||||
paths.panelWaistband = new Path()
|
||||
.move(points.backPanelWaistband)
|
||||
|
@ -35,15 +35,9 @@ export const panel = {
|
|||
snippets.front2 = new Snippet('notch', paths.frontPanel.shiftFractionAlong(0.4))
|
||||
snippets.front3 = new Snippet('notch', paths.frontPanel.shiftFractionAlong(0.6))
|
||||
snippets.front4 = new Snippet('notch', paths.frontPanel.shiftFractionAlong(0.8))
|
||||
snippets.back1 = new Snippet('notch', paths.backPanel.shiftFractionAlong(0.2))
|
||||
snippets.back2 = new Snippet('notch', paths.backPanel.shiftFractionAlong(0.4))
|
||||
snippets.back3 = new Snippet('notch', paths.backPanel.shiftFractionAlong(0.6))
|
||||
snippets.back4 = new Snippet('notch', paths.backPanel.shiftFractionAlong(0.8))
|
||||
|
||||
store.set('pocket', {
|
||||
paths: paths,
|
||||
points: points,
|
||||
})
|
||||
snippets.back1 = new Snippet('notch', paths.backPanel.shiftFractionAlong(0.25))
|
||||
snippets.back2 = new Snippet('notch', paths.backPanel.shiftFractionAlong(0.5))
|
||||
snippets.back3 = new Snippet('notch', paths.backPanel.shiftFractionAlong(0.75))
|
||||
|
||||
return part
|
||||
},
|
||||
|
|
|
@ -1,19 +1,17 @@
|
|||
import { pctBasedOn } from '@freesewing/core'
|
||||
import { panel } from './panel.mjs'
|
||||
import { points } from './points.mjs'
|
||||
import { shape } from './shape.mjs'
|
||||
|
||||
export const pocket = {
|
||||
name: 'lumina.pocket',
|
||||
// from: panel,
|
||||
// after: panel,
|
||||
// hide: hidePresets.HIDE_TREE,
|
||||
from: points,
|
||||
after: panel,
|
||||
from: shape,
|
||||
options: {
|
||||
pocket: { bool: true, menu: 'style' },
|
||||
pocketdepth: {
|
||||
pct: 80,
|
||||
min: 0,
|
||||
max: 100,
|
||||
pct: 90,
|
||||
min: 20,
|
||||
max: 120,
|
||||
...pctBasedOn('waistToSeat'),
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
menu: (settings, mergedOptions) => (mergedOptions?.pocket ? 'style' : false),
|
||||
|
@ -41,12 +39,6 @@ export const pocket = {
|
|||
return part.hide()
|
||||
}
|
||||
|
||||
console.log({ s: JSON.parse(JSON.stringify(store)) })
|
||||
console.log({
|
||||
points: JSON.parse(JSON.stringify(points)),
|
||||
paths: JSON.parse(JSON.stringify(paths)),
|
||||
})
|
||||
|
||||
const pocketDepth = measurements.waistToSeat * options.pocketdepth
|
||||
|
||||
paths.pocketWaistband = new Path()
|
||||
|
@ -61,17 +53,27 @@ export const pocket = {
|
|||
.line(points.backPocketHem)
|
||||
.addText('bottom', 'note center')
|
||||
.setClass('hidden')
|
||||
paths.frontPocket = paths.frontPanel
|
||||
.split(points.frontPocketHem)[0]
|
||||
.unhide()
|
||||
.addText('front', 'note center')
|
||||
.setClass('hidden')
|
||||
paths.backPocket = paths.backPanel
|
||||
.split(points.backPocketHem)[0]
|
||||
.unhide()
|
||||
.reverse()
|
||||
.addText('back', 'note center')
|
||||
.setClass('hidden')
|
||||
const frontPocketSplit = paths.frontPanel.split(points.frontPocketHem)
|
||||
if (frontPocketSplit) {
|
||||
paths.frontPocket = frontPocketSplit[0]
|
||||
.unhide()
|
||||
.addText('front', 'note center')
|
||||
.setClass('hidden')
|
||||
} else {
|
||||
log.info('lumina:couldNotCreatePocket')
|
||||
return part.hide()
|
||||
}
|
||||
const backPocketSplit = paths.backPanel.split(points.backPocketHem)
|
||||
if (backPocketSplit) {
|
||||
paths.backPocket = backPocketSplit[0]
|
||||
.unhide()
|
||||
.reverse()
|
||||
.addText('back', 'note center')
|
||||
.setClass('hidden')
|
||||
} else {
|
||||
log.info('lumina:couldNotCreatePocket')
|
||||
return part.hide()
|
||||
}
|
||||
|
||||
paths.seam = new Path()
|
||||
.move(points.frontPocketHem)
|
||||
|
@ -83,6 +85,16 @@ export const pocket = {
|
|||
|
||||
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
|
||||
|
||||
for (var i = 1; i < 4; i++) {
|
||||
if (paths.frontPanel.length() * (0.2 * i) < pocketDepth) {
|
||||
snippets['front' + i] = new Snippet('notch', paths.frontPanel.shiftFractionAlong(0.2 * i))
|
||||
}
|
||||
|
||||
if (paths.backPanel.length() * (0.25 * i) < pocketDepth) {
|
||||
snippets['back' + i] = new Snippet('notch', paths.backPanel.shiftFractionAlong(0.25 * i))
|
||||
}
|
||||
}
|
||||
|
||||
return part
|
||||
},
|
||||
}
|
||||
|
|
|
@ -153,9 +153,6 @@ const createSidePoints = ({
|
|||
? measurement - fixedSidePanel
|
||||
: width
|
||||
: width
|
||||
// const reduction = ratio == 0 ? measurement : width
|
||||
console.log({ i: i, p: prefix + postfix + names[i], f: fixedSidePanel })
|
||||
console.log({ m: measurement, w: width, mw: measurement - width, rf: ratioFixed })
|
||||
if (i == 0) {
|
||||
points[prefix + postfix + names[i]] = points[prefix + names[i]].shift(
|
||||
prefix == 'front' ? 180 : 0,
|
||||
|
@ -205,8 +202,8 @@ const smoothPoints = (points, prefix, postfix, names, smoothness) => {
|
|||
}
|
||||
}
|
||||
|
||||
export const points = {
|
||||
name: 'lumina.points',
|
||||
export const shape = {
|
||||
name: 'lumina.shape',
|
||||
measurements: [
|
||||
'waist',
|
||||
'waistBack',
|
||||
|
@ -413,35 +410,17 @@ export const points = {
|
|||
.move(points.backWaist)
|
||||
.curve(points.backWaistCp, points.backHipsCp2, points.backHips)
|
||||
.curve(points.backHipsCp1, points.backCrossSeamCp, points.middleCrossSeam)
|
||||
|
||||
smoothPoints(
|
||||
points,
|
||||
'front',
|
||||
'Side',
|
||||
['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'],
|
||||
options.smoothing
|
||||
)
|
||||
smoothPoints(
|
||||
points,
|
||||
'front',
|
||||
'Split',
|
||||
['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'],
|
||||
options.smoothing
|
||||
)
|
||||
smoothPoints(
|
||||
points,
|
||||
'back',
|
||||
'Side',
|
||||
['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'],
|
||||
options.smoothing
|
||||
)
|
||||
smoothPoints(
|
||||
points,
|
||||
'back',
|
||||
'Split',
|
||||
['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'],
|
||||
options.smoothing
|
||||
)
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
;['Side', 'Split'].forEach((type) => {
|
||||
smoothPoints(
|
||||
points,
|
||||
prefix,
|
||||
type,
|
||||
['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'],
|
||||
options.smoothing
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
paths.middle = new Path().move(points.middleWaist).line(points.middleFloor).setHidden()
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
|
@ -466,9 +445,6 @@ export const points = {
|
|||
])
|
||||
})
|
||||
})
|
||||
|
||||
// store.set('frontSplitLength',paths.frontSplit.length())
|
||||
// store.set('backSplitLength',paths.backSplit.length())
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
;['Waist', 'Waistband', 'Seat', 'UpperLeg', 'Knee', 'Ankle'].forEach((name) => {
|
||||
points[prefix + 'Panel' + name] = points['middle' + name].shift(
|
||||
|
@ -497,6 +473,7 @@ export const points = {
|
|||
})
|
||||
|
||||
const frontSplitlength = paths.frontSplit.length()
|
||||
|
||||
while (Math.abs(frontSplitlength - paths.frontPanel.length()) > 1) {
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
const diff = paths[prefix + 'Split'].length() / paths[prefix + 'Panel'].length()
|
||||
|
@ -542,11 +519,6 @@ export const points = {
|
|||
})
|
||||
})
|
||||
}
|
||||
// ;['back'].forEach((prefix) => {
|
||||
// ;['Waist', 'Seat', 'UpperLeg', 'Knee', 'Ankle'].forEach((name) => {
|
||||
// points[prefix + 'Split' + name]
|
||||
// })
|
||||
// })
|
||||
|
||||
lowerWaist(paths, Path, points, waistLowering, 'middle', 'Waist')
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
|
@ -561,24 +533,6 @@ export const points = {
|
|||
})
|
||||
lowerWaist(paths, Path, points, waistbandSize, prefix, 'Waistband')
|
||||
})
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
;['Side', 'Split', 'Panel'].forEach((type) => {
|
||||
;['Waist', 'Seat', 'UpperLeg', 'Knee', 'Ankle'].forEach((name) => {
|
||||
points[prefix + type + name]
|
||||
})
|
||||
points[prefix + type + 'Waistband']
|
||||
})
|
||||
points[prefix + 'Waist']
|
||||
points[prefix + 'Waistband']
|
||||
})
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
;['Side', 'Split', 'Panel'].forEach((type) => {
|
||||
;['Seat', 'UpperLeg', 'Knee'].forEach((name) => {
|
||||
points[prefix + type + name + 'Cp1']
|
||||
points[prefix + type + name + 'Cp2']
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
store.set(
|
||||
'waistLength',
|
||||
|
@ -631,5 +585,3 @@ export const points = {
|
|||
return part.hide()
|
||||
},
|
||||
}
|
||||
|
||||
//http://localhost:8000/new/luminous#view=%22inspect%22&settings=%7B%22measurements%22%3A%7B%22waist%22%3A960%2C%22waistBack%22%3A440%2C%22hips%22%3A884%2C%22seat%22%3A980%2C%22seatBack%22%3A490%2C%22inseam%22%3A790%2C%22waistToSeat%22%3A230%2C%22waistToUpperLeg%22%3A280%2C%22waistToKnee%22%3A610%2C%22waistToHips%22%3A120%2C%22waistToFloor%22%3A1090%2C%22knee%22%3A415%2C%22ankle%22%3A230%2C%22crossSeam%22%3A800%2C%22crossSeamFront%22%3A380%2C%22heel%22%3A300%2C%22upperLeg%22%3A640%7D%7D
|
|
@ -1,9 +1,8 @@
|
|||
import { cbqc } from '@freesewing/core'
|
||||
import { points } from './points.mjs'
|
||||
import { shape } from './shape.mjs'
|
||||
|
||||
export const waistband = {
|
||||
name: 'lumina.waistband',
|
||||
after: points,
|
||||
after: shape,
|
||||
draft: ({
|
||||
store,
|
||||
sa,
|
||||
|
@ -110,7 +109,6 @@ export const waistband = {
|
|||
.join(paths.waist.reverse())
|
||||
.line(points.waistbandBack)
|
||||
.join(paths.waistband)
|
||||
.reverse()
|
||||
.hide()
|
||||
|
||||
paths.seam = new Path().move(points.waistbandFront).line(points.waistFront).join(paths.seamSA)
|
||||
|
|
|
@ -1,565 +0,0 @@
|
|||
export const zpoints = {
|
||||
name: 'lumina.zpoints',
|
||||
measurements: [
|
||||
'waist',
|
||||
'waistBack',
|
||||
'hips',
|
||||
'seat',
|
||||
'seatBack',
|
||||
'inseam',
|
||||
'waistToSeat',
|
||||
'waistToUpperLeg',
|
||||
'waistToKnee',
|
||||
'waistToHips',
|
||||
'waistToFloor',
|
||||
'knee',
|
||||
'ankle',
|
||||
'crossSeam',
|
||||
'crossSeamFront',
|
||||
'heel',
|
||||
'upperLeg',
|
||||
],
|
||||
options: {
|
||||
ease: { pct: -20, min: -35, max: 10, menu: 'fit' },
|
||||
length: { pct: 100, min: 10, max: 100, menu: 'fit' },
|
||||
crossSeamAngle: 35,
|
||||
crotchToKnee: 0.4,
|
||||
waistToKneeCP: 0.4,
|
||||
kneeToWaistLength: 400,
|
||||
crotchPointsCP: 2,
|
||||
},
|
||||
draft: ({
|
||||
measurements,
|
||||
options,
|
||||
Point,
|
||||
Path,
|
||||
points,
|
||||
paths,
|
||||
Snippet,
|
||||
snippets,
|
||||
utils,
|
||||
log,
|
||||
complete,
|
||||
sa,
|
||||
paperless,
|
||||
macro,
|
||||
part,
|
||||
}) => {
|
||||
const ControlPoints = (p1, p2, p3, t) => {
|
||||
let a = Math.abs(p2.angle(p1) - p2.angle(p3)) / 2
|
||||
const t1 = p2.shift(p2.angle(p1) + a - 90, p2.dist(p1) / 3)
|
||||
const t3 = p2.shift(p2.angle(p3) - a + 90, p2.dist(p3) / 3)
|
||||
return {
|
||||
cp1: p2.shift(p2.angle(p1) + a - 90, p2.dist(p1) / 3),
|
||||
cp3: p2.shift(p2.angle(p3) - a + 90, p2.dist(p3) / 3),
|
||||
}
|
||||
}
|
||||
const CreateControlPoints = (names) => {
|
||||
for (var i = 1; i < names.length - 1; i++) {
|
||||
var cp = ControlPoints(points[names[i - 1]], points[names[i]], points[names[i + 1]])
|
||||
points[names[i] + 'Cp1'] = cp.cp1
|
||||
points[names[i] + 'Cp2'] = cp.cp3
|
||||
}
|
||||
}
|
||||
const CreatePath = (pathName, names) => {
|
||||
paths[pathName] = new Path()
|
||||
.move(points[names[0]])
|
||||
._curve(points[names[1] + 'Cp1'], points[names[1]])
|
||||
for (var i = 2; i < names.length - 1; i++) {
|
||||
paths[pathName].curve(
|
||||
points[names[i - 1] + 'Cp2'],
|
||||
points[names[i] + 'Cp1'],
|
||||
points[names[i]]
|
||||
)
|
||||
}
|
||||
paths[pathName].curve_(points[names[i - 1] + 'Cp2'], points[names[i]])
|
||||
|
||||
return paths[pathName]
|
||||
}
|
||||
|
||||
const CreateWaistPoint = (front) => {
|
||||
// console.log({
|
||||
// crossSeamAngle: options.crossSeamAngle,
|
||||
// crotchPointsCP: options.crotchPointsCP,
|
||||
// })
|
||||
const kneeTemp = points.insideCrossSeam.shiftFractionTowards(
|
||||
points.insideKnee,
|
||||
options.crotchToKnee
|
||||
)
|
||||
const angle =
|
||||
90 +
|
||||
(front
|
||||
? options.crossSeamAngle * (m.waistBack / m.waist)
|
||||
: -1 * options.crossSeamAngle * (1 - m.waistBack / m.waist))
|
||||
const crossSeam = front ? m.crossSeamFront : m.crossSeam - m.crossSeamFront
|
||||
var kneeToWaist = m.waistToKnee
|
||||
var ratio = 1
|
||||
var waist = kneeTemp.shift(angle, kneeToWaist * ratio)
|
||||
const crossSeamCp = points.insideCrossSeam.shiftFractionTowards(
|
||||
utils.beamIntersectsY(kneeTemp, waist, points.insideCrossSeam.y),
|
||||
options.crotchPointsCP
|
||||
)
|
||||
|
||||
// console.log({ f: front, a: angle })
|
||||
var waistCp
|
||||
var diff,
|
||||
iter = 0
|
||||
do {
|
||||
waist = kneeTemp.shift(angle, kneeToWaist * ratio * (ratio < 1 ? 1.05 : 0.95))
|
||||
// waistCp = waist.shiftFractionTowards(kneeTemp, options.waistToKneeCP)
|
||||
waistCp = waist.shiftFractionTowards(points.insideKnee, options.waistToKneeCP)
|
||||
|
||||
const crossSeamPath = new Path()
|
||||
.move(points.insideCrossSeam)
|
||||
.curve(crossSeamCp, waistCp, waist)
|
||||
|
||||
diff = crossSeam - crossSeamPath.length()
|
||||
ratio = crossSeam / crossSeamPath.length()
|
||||
// console.log({ i: iter, d: diff, r: ratio })
|
||||
} while (++iter < 100 && (diff > 1 || diff < -1))
|
||||
if (iter >= 100) {
|
||||
console.log('Too many iterations trying to make it fit!')
|
||||
// log.error('Too many iterations trying to make it fit!')
|
||||
}
|
||||
|
||||
if (front) {
|
||||
points.frontWaist = waist.clone()
|
||||
points.frontWaistCp = waistCp.clone()
|
||||
points.frontCrossSeamCp = crossSeamCp.clone()
|
||||
} else {
|
||||
points.backWaist = waist.clone()
|
||||
points.backWaistCp = waistCp.clone()
|
||||
points.backCrossSeamCp = crossSeamCp.clone()
|
||||
}
|
||||
}
|
||||
|
||||
const CreateSidePoints = (
|
||||
prefix,
|
||||
postfix,
|
||||
names,
|
||||
ratio,
|
||||
ratioFixed,
|
||||
ease,
|
||||
distanceCompentation
|
||||
) => {
|
||||
// console.log('-----' + prefix + postfix + '----')
|
||||
var measurement,
|
||||
width,
|
||||
lastGood = 0
|
||||
for (var i = 0; i < names.length; i++) {
|
||||
var distance =
|
||||
m['waistTo' + names[i - 1]] -
|
||||
(m['waistTo' + names[i]] === undefined ? 0 : m['waistTo' + names[i]])
|
||||
switch (names[i]) {
|
||||
case 'UpperLeg':
|
||||
measurement = m['upperLeg']
|
||||
const intersect = utils.beamIntersectsCurve(
|
||||
points[prefix + names[i]],
|
||||
points[prefix + names[i]].shift(prefix == 'front' ? 180 : 0, ratioFixed * 3),
|
||||
points.insideCrossSeam,
|
||||
points[prefix + 'CrossSeamCp'],
|
||||
points[prefix + 'WaistCp'],
|
||||
points[prefix + 'Waist']
|
||||
)
|
||||
// console.log({ intersect: intersect })
|
||||
measurement += intersect.dist(points[prefix + names[i]])
|
||||
break
|
||||
case 'Waist':
|
||||
measurement = prefix == 'front' ? m.waist - m.waistBack : m.waistBack
|
||||
case 'Seat':
|
||||
measurement = prefix == 'front' ? m.seat - m.seatBack : m.seatBack
|
||||
distance *= distanceCompentation
|
||||
break
|
||||
default:
|
||||
measurement = m[names[i].toLowerCase()]
|
||||
}
|
||||
measurement /= 2
|
||||
measurement *= ease
|
||||
|
||||
width = measurement * ratio
|
||||
|
||||
if (i == 0) {
|
||||
points[prefix + postfix + names[i]] = points[prefix + names[i]].shift(
|
||||
prefix == 'front' ? 180 : 0,
|
||||
measurement - width < ratioFixed ? width : measurement - ratioFixed
|
||||
) //.addCircle(3).addCircle(6).addCircle(9)
|
||||
points[prefix + names[i]] //.addCircle(width < ratioFixed ? width : ratioFixed)
|
||||
} else {
|
||||
var ci = utils.circlesIntersect(
|
||||
points[prefix + names[i]],
|
||||
measurement - width < ratioFixed ? width : measurement - ratioFixed,
|
||||
points[prefix + postfix + names[lastGood]],
|
||||
distance
|
||||
)
|
||||
|
||||
if (false !== ci) {
|
||||
points[prefix + postfix + names[i]] = ci[prefix == 'front' ? 0 : 1] //.addCircle(2).addCircle(4).addCircle(6)
|
||||
lastGood = i
|
||||
} else {
|
||||
// break
|
||||
points[prefix + postfix + names[i]] = points[prefix + postfix + names[lastGood]].clone()
|
||||
|
||||
points[prefix + postfix + names[lastGood]] //.addCircle(distance)
|
||||
// points[prefix +names[i]].addCircle(width < ratioFixed ? width : ratioFixed)
|
||||
points[prefix + names[i]] //.addCircle(measurement - width < ratioFixed ? width : measurement - ratioFixed)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const SmoothPoints = (prefix, postfix, names) => {
|
||||
var adjust
|
||||
for (var i = 0; i < names.length - 2; i++) {
|
||||
adjust = false
|
||||
if (prefix == 'front') {
|
||||
adjust =
|
||||
points[prefix + postfix + names[i]].angle(points[prefix + postfix + names[i + 1]]) >
|
||||
points[prefix + postfix + names[i]].angle(points[prefix + postfix + names[i + 2]])
|
||||
} else {
|
||||
adjust =
|
||||
points[prefix + postfix + names[i]].angle(points[prefix + postfix + names[i + 1]]) <
|
||||
points[prefix + postfix + names[i]].angle(points[prefix + postfix + names[i + 2]])
|
||||
}
|
||||
if (adjust) {
|
||||
points[prefix + postfix + names[i + 1]] = points[
|
||||
prefix + postfix + names[i]
|
||||
].shiftTowards(
|
||||
points[prefix + postfix + names[i + 2]],
|
||||
points[prefix + postfix + names[i]].dist(points[prefix + postfix + names[i + 1]])
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const m = measurements
|
||||
const crotchOffset = m.waistToFloor - m.inseam
|
||||
|
||||
const waistFrontBackRatio = m.waistBack / m.waist
|
||||
const sideRatio = 3 / 5
|
||||
const ease = options.ease + 1
|
||||
const waistToAnkle = m.waistToFloor - m.heel / Math.PI
|
||||
|
||||
m['waistToAnkle'] = m.waistToFloor - m.heel / Math.PI
|
||||
const sideFixed = (((m.waist - m.waistBack) * ease) / 2) * sideRatio
|
||||
|
||||
points.insideWaist = new Point(0, 0)
|
||||
points.insideHips = points.insideWaist.shift(270, m.waistToHips)
|
||||
points.insideSeat = points.insideWaist.shift(270, m.waistToSeat)
|
||||
points.frontCrossSeam =
|
||||
points.backCrossSeam =
|
||||
points.insideCrossSeam =
|
||||
points.insideWaist.shift(270, crotchOffset)
|
||||
points.frontUpperLeg =
|
||||
points.backUpperLeg =
|
||||
points.insideUpperLeg =
|
||||
points.insideWaist.shift(270, m.waistToUpperLeg)
|
||||
points.frontKnee =
|
||||
points.backKnee =
|
||||
points.insideKnee =
|
||||
points.insideWaist.shift(270, m.waistToKnee)
|
||||
points.frontAnkle =
|
||||
points.backAnkle =
|
||||
points.insideAnkle =
|
||||
points.insideWaist.shift(270, waistToAnkle)
|
||||
points.frontFloor =
|
||||
points.backFloor =
|
||||
points.insideFloor =
|
||||
points.insideWaist.shift(270, m.waistToFloor)
|
||||
|
||||
CreateWaistPoint(true)
|
||||
CreateWaistPoint(false)
|
||||
|
||||
console.log({ pionts: JSON.parse(JSON.stringify(points)) })
|
||||
|
||||
const crossSeamFront = new Path()
|
||||
.move(points.frontWaist)
|
||||
.curve(points.frontWaistCp, points.frontCrossSeamCp, points.insideCrossSeam)
|
||||
const crossSeamBack = new Path()
|
||||
.move(points.backWaist)
|
||||
.curve(points.backWaistCp, points.backCrossSeamCp, points.insideCrossSeam)
|
||||
|
||||
points.frontSeat = crossSeamFront.shiftAlong(
|
||||
m.waistToSeat * (m.crossSeamFront / m.waistToUpperLeg) * 0.8
|
||||
)
|
||||
// .addCircle(6)
|
||||
points.frontHips = crossSeamFront.shiftAlong(
|
||||
m.waistToHips * (m.crossSeamFront / m.waistToUpperLeg)
|
||||
)
|
||||
// .addCircle(10)
|
||||
points.backSeat = crossSeamBack.shiftAlong(m.waistToSeat * (m.waistToSeat / m.waistToUpperLeg))
|
||||
// .addCircle(6)
|
||||
points.backHips = crossSeamBack.shiftAlong(m.waistToHips * (m.waistToSeat / m.waistToUpperLeg))
|
||||
// .addCircle(10)
|
||||
|
||||
CreateSidePoints(
|
||||
'front',
|
||||
'Side',
|
||||
['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'],
|
||||
0,
|
||||
0.1,
|
||||
ease,
|
||||
1
|
||||
)
|
||||
CreateSidePoints(
|
||||
'back',
|
||||
'Side',
|
||||
['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'],
|
||||
0,
|
||||
0.1,
|
||||
ease,
|
||||
1
|
||||
)
|
||||
|
||||
CreateSidePoints(
|
||||
'front',
|
||||
'Split',
|
||||
['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'],
|
||||
sideRatio,
|
||||
sideFixed,
|
||||
ease,
|
||||
(points.frontAnkle.dist(points.frontCrossSeam) + crossSeamFront.length()) /
|
||||
(m.waistToFloor - m.heel / Math.PI)
|
||||
)
|
||||
CreateSidePoints(
|
||||
'back',
|
||||
'Split',
|
||||
['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'],
|
||||
sideRatio,
|
||||
sideFixed,
|
||||
ease,
|
||||
(points.frontAnkle.dist(points.frontCrossSeam) + crossSeamFront.length()) /
|
||||
(m.waistToFloor - m.heel / Math.PI)
|
||||
)
|
||||
|
||||
points.backHipsCp1 = points.backWaistCp.clone()
|
||||
points.backWaistCp = points.backWaist.shift(
|
||||
points.backWaist.angle(points.backSplitWaist) - 90,
|
||||
points.backWaist.dist(points.backHips) / 3
|
||||
)
|
||||
points.backHipsCp2 = points.backSeat.shiftOutwards(
|
||||
points.backHips,
|
||||
points.backWaist.dist(points.backHips) / 4
|
||||
)
|
||||
points.frontHipsCp1 = points.frontWaistCp.clone()
|
||||
points.frontWaistCp = points.frontWaist.shift(
|
||||
points.frontWaist.angle(points.frontSplitWaist) + 90,
|
||||
points.frontWaist.dist(points.frontHips) / 3
|
||||
)
|
||||
points.frontHipsCp2 = points.frontSeat.shiftOutwards(
|
||||
points.frontHips,
|
||||
points.frontWaist.dist(points.frontHips) / 4
|
||||
)
|
||||
|
||||
paths.crossSeamFront = new Path()
|
||||
.move(points.insideCrossSeam)
|
||||
.curve(points.frontCrossSeamCp, points.frontHipsCp1, points.frontHips)
|
||||
.curve(points.frontHipsCp2, points.frontWaistCp, points.frontWaist)
|
||||
.hide()
|
||||
paths.crossSeamBack = new Path()
|
||||
.move(points.insideCrossSeam)
|
||||
.curve(points.backCrossSeamCp, points.backHipsCp1, points.backHips)
|
||||
.curve(points.backHipsCp2, points.backWaistCp, points.backWaist)
|
||||
.hide()
|
||||
|
||||
SmoothPoints('front', 'Side', ['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'])
|
||||
SmoothPoints('front', 'Split', ['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'])
|
||||
SmoothPoints('back', 'Side', ['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'])
|
||||
SmoothPoints('back', 'Split', ['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'])
|
||||
|
||||
console.log({ pins: JSON.parse(JSON.stringify(points)) })
|
||||
|
||||
paths.middle = new Path().move(points.insideUpperLeg).line(points.insideFloor).hide()
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
;['Side', 'Split'].forEach((type) => {
|
||||
CreateControlPoints([
|
||||
prefix + type + 'Waist',
|
||||
prefix + type + 'Seat',
|
||||
prefix + type + 'UpperLeg',
|
||||
prefix + type + 'Knee',
|
||||
prefix + type + 'Ankle',
|
||||
])
|
||||
})
|
||||
})
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
;['Side', 'Split'].forEach((type) => {
|
||||
CreatePath(prefix + type, [
|
||||
prefix + type + 'Waist',
|
||||
prefix + type + 'Seat',
|
||||
prefix + type + 'UpperLeg',
|
||||
prefix + type + 'Knee',
|
||||
prefix + type + 'Ankle',
|
||||
]).hide()
|
||||
})
|
||||
})
|
||||
|
||||
if (1 == 2) {
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
;['Waist', 'Seat', 'UpperLeg', 'Knee', 'Ankle'].forEach((name) => {
|
||||
var measurement
|
||||
switch (name) {
|
||||
case 'UpperLeg':
|
||||
measurement = m.upperLeg
|
||||
case 'Waist':
|
||||
measurement = prefix == 'front' ? m.waist - m.waistBack : m.waistBack
|
||||
break
|
||||
case 'Seat':
|
||||
measurement = prefix == 'front' ? m.seat - m.seatBack : m.seatBack
|
||||
break
|
||||
default:
|
||||
measurement = m[name.toLowerCase()]
|
||||
}
|
||||
|
||||
points[prefix + 'Panel' + name] = points['inside' + name].shift(
|
||||
prefix == 'front' ? 180 : 0,
|
||||
measurement / 2 - points[prefix + name].dist(points[prefix + 'Split' + name])
|
||||
) //.addCircle(4)
|
||||
})
|
||||
})
|
||||
|
||||
SmoothPoints('front', 'Panel', ['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'])
|
||||
SmoothPoints('back', 'Panel', ['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'])
|
||||
paths.frontPanel = new Path()
|
||||
.move(points.frontPanelAnkle)
|
||||
.line(points.frontPanelKnee)
|
||||
.line(points.frontPanelUpperLeg)
|
||||
.line(points.frontPanelSeat)
|
||||
.line(points.frontPanelWaist)
|
||||
paths.backPanel = new Path()
|
||||
.move(points.backPanelAnkle)
|
||||
.line(points.backPanelKnee)
|
||||
.line(points.backPanelUpperLeg)
|
||||
.line(points.backPanelSeat)
|
||||
.line(points.backPanelWaist)
|
||||
}
|
||||
if (1 == 1) {
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
;['Waist', 'Seat', 'UpperLeg', 'Knee', 'Ankle'].forEach((name) => {
|
||||
points[prefix + 'Panel' + name] = points['inside' + name].shift(
|
||||
prefix == 'front' ? 180 : 0,
|
||||
points[prefix + 'Side' + name].dist(points[prefix + 'Split' + name])
|
||||
) //.addCircle(4)
|
||||
})
|
||||
})
|
||||
|
||||
// SmoothPoints('front', 'Panel', ['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'])
|
||||
// SmoothPoints('back', 'Panel', ['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'])
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
CreateControlPoints([
|
||||
prefix + 'Panel' + 'Waist',
|
||||
prefix + 'Panel' + 'Seat',
|
||||
prefix + 'Panel' + 'UpperLeg',
|
||||
prefix + 'Panel' + 'Knee',
|
||||
prefix + 'Panel' + 'Ankle',
|
||||
])
|
||||
})
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
CreatePath(prefix + 'Panel', [
|
||||
prefix + 'Panel' + 'Waist',
|
||||
prefix + 'Panel' + 'Seat',
|
||||
prefix + 'Panel' + 'UpperLeg',
|
||||
prefix + 'Panel' + 'Knee',
|
||||
prefix + 'Panel' + 'Ankle',
|
||||
]).hide()
|
||||
})
|
||||
|
||||
console.log({
|
||||
fsl: paths.frontSplit.length(),
|
||||
fpl: paths.frontPanel.length(),
|
||||
bsl: paths.backSplit.length(),
|
||||
bpl: paths.backPanel.length(),
|
||||
})
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
const diff = paths[prefix + 'Split'].length() / paths[prefix + 'Panel'].length()
|
||||
const names = ['Waist', 'Seat', 'UpperLeg', 'Knee', 'Ankle']
|
||||
for (var i = 0; i < names.length - 1; i++) {
|
||||
points[prefix + 'Panel' + names[i]] = points[
|
||||
prefix + 'Panel' + names[i + 1]
|
||||
].shiftFractionTowards(points[prefix + 'Panel' + names[i]], diff)
|
||||
}
|
||||
})
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
CreateControlPoints([
|
||||
prefix + 'Panel' + 'Waist',
|
||||
prefix + 'Panel' + 'Seat',
|
||||
prefix + 'Panel' + 'UpperLeg',
|
||||
prefix + 'Panel' + 'Knee',
|
||||
prefix + 'Panel' + 'Ankle',
|
||||
])
|
||||
})
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
CreatePath(prefix + 'Panel', [
|
||||
prefix + 'Panel' + 'Waist',
|
||||
prefix + 'Panel' + 'Seat',
|
||||
prefix + 'Panel' + 'UpperLeg',
|
||||
prefix + 'Panel' + 'Knee',
|
||||
prefix + 'Panel' + 'Ankle',
|
||||
]).hide()
|
||||
})
|
||||
}
|
||||
|
||||
console.log({
|
||||
fsl: paths.frontSplit.length(),
|
||||
fpl: paths.frontPanel.length(),
|
||||
bsl: paths.backSplit.length(),
|
||||
bpl: paths.backPanel.length(),
|
||||
})
|
||||
|
||||
if (options.length < 1) {
|
||||
const length = (1 - options.length) * (m.inseam - (m.waistToFloor - waistToAnkle))
|
||||
console.log({ wtf: m.waistToFloor, i: m.inseam, l: length })
|
||||
// console.log({i:m.inseam,wa:waistToAnkle,iw:(m.inseam/waistToAnkle),r:lengthRatio})
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
;['Side', 'Split', 'Panel'].forEach((type) => {
|
||||
console.log({ n: prefix + type, l: paths[prefix + type].length() })
|
||||
points[prefix + type + 'Hem'] = paths[prefix + type].reverse().shiftAlong(length)
|
||||
paths[prefix + type] = paths[prefix + type].split(points[prefix + type + 'Hem'])[0] //.hide()
|
||||
})
|
||||
})
|
||||
} else {
|
||||
;['front', 'back'].forEach((prefix) => {
|
||||
;['Side', 'Split', 'Panel'].forEach((type) => {
|
||||
points[prefix + type + 'Hem'] = points[prefix + type + 'Ankle']
|
||||
})
|
||||
})
|
||||
}
|
||||
// ;['front', 'back'].forEach((prefix) => {
|
||||
// ;['Side'].forEach((type) => {
|
||||
// paths[prefix + type] = new Path()
|
||||
// .move(points[prefix + type + 'Ankle'])
|
||||
// .line(points[prefix + type + 'Knee'])
|
||||
// .line(points[prefix + type + 'UpperLeg'])
|
||||
// .line(points[prefix + type + 'Seat'])
|
||||
// .line(points[prefix + type + 'Waist'])
|
||||
// })
|
||||
// })
|
||||
// ;['front', 'back'].forEach((prefix) => {
|
||||
// ;['Split'].forEach((type) => {
|
||||
// paths[prefix + type +'2'] = new Path()
|
||||
// .move(points[prefix + type + 'Ankle'])
|
||||
// .line(points[prefix + type + 'Knee'])
|
||||
// .line(points[prefix + type + 'UpperLeg'])
|
||||
// .line(points[prefix + type + 'Waist'])
|
||||
// })
|
||||
// })
|
||||
|
||||
// paths.frontSplit.addClass('dotted note')
|
||||
// paths.backSplit.addClass('dotted note')
|
||||
// paths.frontSplit2.addClass('dashed lining')
|
||||
// paths.backSplit2.addClass('dashed lining')
|
||||
|
||||
// console.log({d1: points.frontKnee.dist(points.frontUpperLeg),d2: points.frontSplitKnee.dist(points.frontSplitUpperLeg)})
|
||||
|
||||
console.log({ pahts: JSON.parse(JSON.stringify(paths)) })
|
||||
console.log({ pihts: JSON.parse(JSON.stringify(points)) })
|
||||
|
||||
// paths.frontSide = new Path()
|
||||
// .move(points.frontSideAnkle)
|
||||
// .line(points.frontSideKnee)
|
||||
// .line(points.frontSideUpperLeg)
|
||||
// .line(points.frontSideSeat)
|
||||
// .line(points.frontSideWaist)
|
||||
return part //.hide()
|
||||
},
|
||||
}
|
||||
|
||||
//http://localhost:8000/new/luminous#view=%22inspect%22&settings=%7B%22measurements%22%3A%7B%22waist%22%3A960%2C%22waistBack%22%3A440%2C%22hips%22%3A884%2C%22seat%22%3A980%2C%22seatBack%22%3A490%2C%22inseam%22%3A790%2C%22waistToSeat%22%3A230%2C%22waistToUpperLeg%22%3A280%2C%22waistToKnee%22%3A610%2C%22waistToHips%22%3A120%2C%22waistToFloor%22%3A1090%2C%22knee%22%3A415%2C%22ankle%22%3A230%2C%22crossSeam%22%3A800%2C%22crossSeamFront%22%3A380%2C%22heel%22%3A300%2C%22upperLeg%22%3A640%7D%7D
|
Loading…
Add table
Add a link
Reference in a new issue