Merge pull request #5849 from freesewing/tristan
Add `tristan` to FreeSewing
|
@ -834,6 +834,21 @@
|
|||
"lining"
|
||||
]
|
||||
},
|
||||
"tristan": {
|
||||
"code": "Wouter van Wageningen",
|
||||
"description": "A FreeSewing pattern for a fitted top with prince(ss) seams",
|
||||
"design": "Natalia Sayang",
|
||||
"difficulty": 3,
|
||||
"lab": true,
|
||||
"org": true,
|
||||
"tags": [
|
||||
"tops"
|
||||
],
|
||||
"techniques": [
|
||||
"curvedSeam",
|
||||
"precision"
|
||||
]
|
||||
},
|
||||
"uma": {
|
||||
"code": "Joost De Cock",
|
||||
"description": "A FreeSewing pattern for a basic, highly-customizable underwear pattern",
|
||||
|
|
|
@ -37,6 +37,10 @@
|
|||
"t": "Bust span ease",
|
||||
"d": "Controls the amount of ease along the bust span"
|
||||
},
|
||||
"waistdartposition": {
|
||||
"t": "Waist dart position",
|
||||
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
|
||||
},
|
||||
"backDartHeight": {
|
||||
"t": "Controls the height of the back dart",
|
||||
"d": "Back dart height"
|
||||
|
|
|
@ -24,7 +24,6 @@ export const backPoints = {
|
|||
const aDown = points.dartBottomRight.angle(points.dartTip)
|
||||
const aDiff = Math.abs(aUp - aDown)
|
||||
|
||||
// let dartCpAdjustment = Math.abs( options.shoulderDartPosition -.5) +.05
|
||||
const dartCpAdjustment = aDiff / 50
|
||||
|
||||
points.shoulderDartCpUp = points.shoulderDart.shiftFractionTowards(
|
||||
|
@ -48,7 +47,7 @@ export const backPoints = {
|
|||
let diff = 0
|
||||
let angle = 0
|
||||
do {
|
||||
if (length.o) angle = diff * (length.o > length.i ? -0.1 : 0.1)
|
||||
if (length.o) angle = (diff / (length.i / 1300)) * (length.o > length.i ? -0.1 : 0.1)
|
||||
|
||||
points.dartBottomRight = points.dartBottomRight.rotate(angle, points.waistSide)
|
||||
|
||||
|
|
|
@ -1,15 +1,78 @@
|
|||
import { frontSideDart as bellaFront } from '@freesewing/bella'
|
||||
import { hidePresets } from '@freesewing/core'
|
||||
import { cbqc, hidePresets } from '@freesewing/core'
|
||||
import * as options from './options.mjs'
|
||||
|
||||
const createRightDartPoints = (points, Path, diff, utils) => {
|
||||
const radius = points.waistDartRight.dist(points.sideHemInitial)
|
||||
|
||||
points.waistDartRight = points.waistDartRight.rotate(
|
||||
utils.rad2deg(Math.atan(diff / radius)),
|
||||
points.sideHemInitial
|
||||
)
|
||||
|
||||
let outsideSeam = new Path()
|
||||
.move(points.waistDartRight)
|
||||
.curve(points.bustAcp, points.shoulderDartTipCpDownOutside, points.shoulderDartOutside)
|
||||
|
||||
points.waistUpDartRight = outsideSeam.shiftAlong(
|
||||
points.waistDartRight.dist(points.waistDartRightCp) * 0.5
|
||||
)
|
||||
points.waistUpDartRightCpDown = points.waistUpDartRight.shiftFractionTowards(
|
||||
points.waistDartRight,
|
||||
0.25
|
||||
)
|
||||
points.waistUpDartRightCpUp = points.waistUpDartRight.shiftFractionTowards(
|
||||
points.waistDartRight,
|
||||
-0.6
|
||||
)
|
||||
points.waistCpUp = points.waistDartRight
|
||||
.shiftTowards(points.sideHemInitial, points.waistDartRight.dist(points.waistUpDartRight) * 0.25)
|
||||
.rotate(90, points.waistDartRight)
|
||||
points.waistCircleInsideCp1 = points.armholeDartTip.shiftTowards(
|
||||
points.armholeDartTipCpDownInside,
|
||||
-0.5 * cbqc * points.armholeDartInside.dist(points.armholeDartTip)
|
||||
)
|
||||
|
||||
return new Path()
|
||||
.move(points.waistDartRight)
|
||||
.curve(points.waistCpUp, points.waistUpDartRightCpDown, points.waistUpDartRight)
|
||||
.curve(
|
||||
points.waistUpDartRightCpUp,
|
||||
points.shoulderDartTipCpDownOutside,
|
||||
points.shoulderDartOutside
|
||||
)
|
||||
.length()
|
||||
}
|
||||
|
||||
const createArmholeDartPoints = (points, paths, Path, direction) => {
|
||||
const dist = points.armholeDartTipInside.dist(points.armholeDartTipCpDownInside)
|
||||
points.waistCircleOutsideCp1 = points.waistCircleOutsideCp1.shiftTowards(
|
||||
points.waistUpDartRight,
|
||||
direction
|
||||
)
|
||||
points.armholeDartTipCpDownInside = points.waistCircleInsideCp1.shiftOutwards(
|
||||
points.armholeDartTipInside,
|
||||
dist
|
||||
)
|
||||
|
||||
paths.armholeTempCircleOutside = new Path()
|
||||
.move(points.armholeDartOutside)
|
||||
.curve(points.armholeCircleOutsideCp1, points.waistCircleOutsideCp1, points.waistUpDartRight)
|
||||
.curve(points.waistUpDartRightCpDown, points.waistCpUp, points.waistDartRight)
|
||||
.hide()
|
||||
paths.armholeTempCircleInside = new Path()
|
||||
.move(points.armholeDartInside)
|
||||
.curve(points.armholeCircleInsideCp1, points.waistCircleInsideCp1, points.armholeDartTipInside)
|
||||
.curve(points.armholeDartTipCpDownInside, points.waistDartLeftCp, points.waistDartLeft)
|
||||
.hide()
|
||||
}
|
||||
|
||||
export const frontPoints = {
|
||||
name: 'noble.frontPoints',
|
||||
from: bellaFront,
|
||||
hide: hidePresets.HIDE_ALL,
|
||||
options,
|
||||
draft: ({ log, points, Path, paths, snippets, options, macro, part }) => {
|
||||
const bCircle = 0.552284749831
|
||||
|
||||
draft: ({ log, points, Path, paths, snippets, options, macro, part, utils }) => {
|
||||
// Hide Bella paths
|
||||
for (const key of Object.keys(paths)) paths[key].hide()
|
||||
for (const i in snippets) delete snippets[i]
|
||||
|
@ -18,6 +81,13 @@ export const frontPoints = {
|
|||
macro('rmtitle')
|
||||
macro('rmscalebox')
|
||||
|
||||
const waistDartSize = points.waistDartLeft.dist(points.waistDartRight)
|
||||
const waistDartMove = (waistDartSize / 2) * options.waistdartposition
|
||||
|
||||
points.waistDartLeft = points.waistDartLeft.shiftTowards(points.cfHem, waistDartMove * -1)
|
||||
points.waistDartLeftCp = points.waistDartLeftCp.shift(0, waistDartMove)
|
||||
points.waistDartRight = points.waistDartRight.shiftTowards(points.sideHemInitial, waistDartMove)
|
||||
|
||||
points.shoulderDartInside = points.hps.shiftFractionTowards(
|
||||
points.shoulder,
|
||||
options.dartPosition == 'shoulder' ? options.shoulderDartPosition : 0.5
|
||||
|
@ -54,7 +124,7 @@ export const frontPoints = {
|
|||
|
||||
points.armholeCircleInsideCp1 = points.armholeDartInside.shift(
|
||||
armholeDartAngle,
|
||||
bCircle * points.armholeDartInside.dist(points.armholeDartTip)
|
||||
cbqc * points.armholeDartInside.dist(points.armholeDartTip)
|
||||
)
|
||||
points.armholeCircleOutsideCp1 = points.armholeCircleInsideCp1.clone()
|
||||
|
||||
|
@ -176,14 +246,12 @@ export const frontPoints = {
|
|||
points.bust,
|
||||
1 + (1 - options.upperDartLength) + (1 - options.waistDartLength) * dartRatio
|
||||
)
|
||||
// points.shoulderDartTipCpDownOutside = points.shoulderDartTipCpDownOutside.rotate( options.dartOutsideCP *10, points.shoulderDartOutside )
|
||||
|
||||
points.shoulderDartTipCpDownInside = points.shoulderDartInside.shiftFractionTowards(
|
||||
points.shoulderDartTip,
|
||||
1 + (1 - options.upperDartLength) + (1 - options.waistDartLength) * dartRatio
|
||||
)
|
||||
points.armholeDartTipCpDownInside = points.armholeDartTip.shiftFractionTowards(
|
||||
// points.waistDartHem,
|
||||
points.waistDartLeft,
|
||||
1 - options.upperDartLength + (1 - options.waistDartLength) * dartRatio
|
||||
)
|
||||
|
@ -219,7 +287,7 @@ export const frontPoints = {
|
|||
)
|
||||
points.waistCircleInsideCp1 = points.waistUpDartLeft.shiftTowards(
|
||||
points.waistDartLeft,
|
||||
-0.5 * bCircle * points.armholeDartOutside.dist(points.armholeDartTip)
|
||||
-0.5 * cbqc * points.armholeDartOutside.dist(points.armholeDartTip)
|
||||
)
|
||||
points.shoulderDartTipCpDownOutside = points.shoulderDartTipCpDownOutside
|
||||
.rotate(-2.5, points.shoulderDartOutside)
|
||||
|
@ -227,102 +295,37 @@ export const frontPoints = {
|
|||
|
||||
let iteration = 1
|
||||
let diff = 0
|
||||
|
||||
let rightDartLength = createRightDartPoints(points, Path, diff, utils)
|
||||
do {
|
||||
points.waistDartRight = points.waistDartRight.rotate(diff * 0.1, points.sideHemInitial)
|
||||
rightDartLength = createRightDartPoints(points, Path, diff, utils)
|
||||
|
||||
let outsideSeam = new Path()
|
||||
.move(points.waistDartRight)
|
||||
.curve(points.bustAcp, points.shoulderDartTipCpDownOutside, points.shoulderDartOutside)
|
||||
|
||||
points.waistUpDartRight = outsideSeam.shiftAlong(
|
||||
points.waistDartRight.dist(points.waistDartRightCp) * 0.5
|
||||
)
|
||||
points.waistUpDartRightCpDown = points.waistUpDartRight.shiftFractionTowards(
|
||||
points.waistDartRight,
|
||||
0.25
|
||||
)
|
||||
// points.waistUpDartRightCpUp = points.waistUpDartRight.shiftFractionTowards( points.waistDartRight, -.25 )
|
||||
points.waistUpDartRightCpUp = points.waistUpDartRight.shiftFractionTowards(
|
||||
points.waistDartRight,
|
||||
-0.6
|
||||
)
|
||||
points.waistCpUp = points.waistDartRight
|
||||
.shiftTowards(
|
||||
points.sideHemInitial,
|
||||
points.waistDartRight.dist(points.waistUpDartRight) * 0.25
|
||||
)
|
||||
.rotate(90, points.waistDartRight)
|
||||
points.waistCircleInsideCp1 = points.armholeDartTip.shiftTowards(
|
||||
points.armholeDartTipCpDownInside,
|
||||
-0.5 * bCircle * points.armholeDartInside.dist(points.armholeDartTip)
|
||||
)
|
||||
|
||||
outsideSeam = new Path()
|
||||
.move(points.waistDartRight)
|
||||
.curve(points.waistCpUp, points.waistUpDartRightCpDown, points.waistUpDartRight)
|
||||
.curve(
|
||||
points.waistUpDartRightCpUp,
|
||||
points.shoulderDartTipCpDownOutside,
|
||||
points.shoulderDartOutside
|
||||
)
|
||||
|
||||
diff = shoulderInsideSeam.length() - outsideSeam.length()
|
||||
diff = shoulderInsideSeam.length() - rightDartLength
|
||||
iteration++
|
||||
} while ((diff > 1 || diff < -1) && iteration < 200)
|
||||
if (iteration >= 200) {
|
||||
} while ((diff > 1 || diff < -1) && iteration < 100)
|
||||
|
||||
if (iteration >= 100) {
|
||||
log.error('Something is not quite right here!')
|
||||
}
|
||||
points.waistDartRightCp = points.bustAcp.clone()
|
||||
points.armholeDartTipInside = points.armholeDartTip.clone()
|
||||
points.waistCircleOutsideCp1 = points.waistUpDartRight.shiftTowards(
|
||||
points.waistDartRight,
|
||||
-1 * bCircle * points.armholeDartOutside.dist(points.armholeDartTip)
|
||||
-1 * cbqc * points.armholeDartOutside.dist(points.armholeDartTip)
|
||||
)
|
||||
|
||||
diff = 0
|
||||
createArmholeDartPoints(points, paths, Path, 0)
|
||||
diff = paths.armholeTempCircleOutside.length() - paths.armholeTempCircleInside.length()
|
||||
|
||||
iteration = 0
|
||||
do {
|
||||
const dist = points.armholeDartTipInside.dist(points.armholeDartTipCpDownInside)
|
||||
if (points.armholeDartTipInside.x > points.waistCircleOutsideCp1) {
|
||||
points.armholeDartTipInside.x = points.armholeDartTipInside.x - 0.5
|
||||
points.armholeDartTipInside.y = points.armholeDartTipInside.y + 0.5
|
||||
} else {
|
||||
points.waistCircleOutsideCp1 = points.waistCircleOutsideCp1.shiftTowards(
|
||||
points.waistUpDartRight,
|
||||
diff > 0 ? 1 : -1
|
||||
)
|
||||
}
|
||||
points.armholeDartTipCpDownInside = points.waistCircleInsideCp1.shiftOutwards(
|
||||
points.armholeDartTipInside,
|
||||
dist
|
||||
)
|
||||
|
||||
paths.armholeTempCircleOutside = new Path()
|
||||
.move(points.armholeDartOutside)
|
||||
.curve(
|
||||
points.armholeCircleOutsideCp1,
|
||||
points.waistCircleOutsideCp1,
|
||||
points.waistUpDartRight
|
||||
)
|
||||
.curve(points.waistUpDartRightCpDown, points.waistCpUp, points.waistDartRight)
|
||||
.hide()
|
||||
.attr('class', 'lining')
|
||||
paths.armholeTempCircleInside = new Path()
|
||||
.move(points.armholeDartInside)
|
||||
.curve(
|
||||
points.armholeCircleInsideCp1,
|
||||
points.waistCircleInsideCp1,
|
||||
points.armholeDartTipInside
|
||||
)
|
||||
.curve(points.armholeDartTipCpDownInside, points.waistDartLeftCp, points.waistDartLeft)
|
||||
.hide()
|
||||
.attr('class', 'lining')
|
||||
createArmholeDartPoints(points, paths, Path, diff)
|
||||
|
||||
diff = paths.armholeTempCircleOutside.length() - paths.armholeTempCircleInside.length()
|
||||
iteration++
|
||||
} while ((diff < -1 || diff > 1) && iteration < 200)
|
||||
if (iteration >= 200) {
|
||||
log.error('Something is not quite right here!')
|
||||
} while ((diff < -1 || diff > 1) && iteration < 100)
|
||||
if (iteration >= 100) {
|
||||
log.error('Something is not quite right here too!')
|
||||
}
|
||||
|
||||
return part
|
||||
|
|
|
@ -9,6 +9,7 @@ export const bustSpanEase = { pct: 0, min: -5, max: 20, ...pctBasedOn('bustSpan'
|
|||
export const backHemSlope = { deg: 2.5, min: 0, max: 5, menu: 'advanced' }
|
||||
export const upperDartLength = { pct: 90, min: 80, max: 95, menu: 'darts' }
|
||||
export const dartPosition = { dflt: 'shoulder', list: ['shoulder', 'armhole'], menu: 'darts' }
|
||||
export const waistdartposition = { pct: 0, min: -100, max: 100, menu: 'darts' }
|
||||
export const shoulderDartPosition = {
|
||||
pct: 50,
|
||||
min: 10,
|
||||
|
|
17
designs/tristan/CHANGELOG.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
# Change log for: @freesewing/tristan
|
||||
|
||||
|
||||
## 3.0.0 (2022-09-30)
|
||||
|
||||
### Changed
|
||||
|
||||
- All FreeSewing pacakges are now ESM only.
|
||||
- All FreeSewing pacakges now use named exports.
|
||||
- Dropped support for NodeJS 14. NodeJS 18 (LTS/hydrogen) or more recent is now required.
|
||||
|
||||
|
||||
This is the **initial release**, and the start of this change log.
|
||||
|
||||
> Prior to version 2, FreeSewing was not a JavaScript project.
|
||||
> As such, that history is out of scope for this change log.
|
||||
|
143
designs/tristan/README.md
Normal file
|
@ -0,0 +1,143 @@
|
|||

|
||||
<p align='center'><a
|
||||
href="https://www.npmjs.com/package/@freesewing/tristan"
|
||||
title="@freesewing/tristan on NPM"
|
||||
><img src="https://img.shields.io/npm/v/@freesewing/tristan.svg"
|
||||
alt="@freesewing/tristan on NPM"/>
|
||||
</a><a
|
||||
href="https://opensource.org/licenses/MIT"
|
||||
title="License: MIT"
|
||||
><img src="https://img.shields.io/npm/l/@freesewing/tristan.svg?label=License"
|
||||
alt="License: MIT"/>
|
||||
</a><a
|
||||
href="https://deepscan.io/dashboard#view=project&tid=2114&pid=2993&bid=23256"
|
||||
title="Code quality on DeepScan"
|
||||
><img src="https://deepscan.io/api/teams/2114/projects/2993/branches/23256/badge/grade.svg"
|
||||
alt="Code quality on DeepScan"/>
|
||||
</a><a
|
||||
href="https://github.com/freesewing/freesewing/issues?q=is%3Aissue+is%3Aopen+label%3Apkg%3Atristan"
|
||||
title="Open issues tagged pkg:tristan"
|
||||
><img src="https://img.shields.io/github/issues/freesewing/freesewing/pkg:tristan.svg?label=Issues"
|
||||
alt="Open issues tagged pkg:tristan"/>
|
||||
</a><a
|
||||
href="#contributors-"
|
||||
title="All Contributors"
|
||||
><img src="https://img.shields.io/badge/all_contributors-113-pink.svg"
|
||||
alt="All Contributors"/>
|
||||
</a></p><p align='center'><a
|
||||
href="https://twitter.com/freesewing_org"
|
||||
title="Follow @freesewing_org on Twitter"
|
||||
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Follow%20us-blue.svg?logo=twitter&logoColor=white&logoWidth=15"
|
||||
alt="Follow @freesewing_org on Twitter"/>
|
||||
</a><a
|
||||
href="https://chat.freesewing.org"
|
||||
title="Chat with us on Discord"
|
||||
><img src="https://img.shields.io/discord/698854858052075530?label=Chat%20on%20Discord"
|
||||
alt="Chat with us on Discord"/>
|
||||
</a><a
|
||||
href="https://freesewing.org/patrons/join"
|
||||
title="Become a FreeSewing Patron"
|
||||
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Support%20us-blueviolet.svg?logo=cash-app&logoColor=white&logoWidth=15"
|
||||
alt="Become a FreeSewing Patron"/>
|
||||
</a><a
|
||||
href="https://instagram.com/freesewing_org"
|
||||
title="Follow @freesewing_org on Twitter"
|
||||
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Follow%20us-E4405F.svg?logo=instagram&logoColor=white&logoWidth=15"
|
||||
alt="Follow @freesewing_org on Twitter"/>
|
||||
</a></p>
|
||||
|
||||
# @freesewing/tristan
|
||||
|
||||
A FreeSewing pattern for a fitted top
|
||||
|
||||
|
||||
|
||||
|
||||
## What am I looking at? 🤔
|
||||
|
||||
This repository is the FreeSewing *monorepo* holding all FreeSewing's websites, documentation, designs, plugins, and other NPM packages.
|
||||
|
||||
This folder holds: @freesewing/tristan
|
||||
|
||||
If you're not entirely sure what to do or how to start, type this command:
|
||||
|
||||
```
|
||||
npm run tips
|
||||
```
|
||||
|
||||
> If you don't want to set up a dev environment, you can run it in your browser:
|
||||
>
|
||||
> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
|
||||
>
|
||||
> We recommend that you fork our repository and then
|
||||
> put `gitpod.io/#<entire-url-of-your-fork` into a browser
|
||||
> to start up a browser-based dev environment of your own.
|
||||
|
||||
## About FreeSewing 💀
|
||||
|
||||
Where the world of makers and developers collide, that's where you'll find FreeSewing.
|
||||
|
||||
If you're a maker, checkout [freesewing.org](https://freesewing.org/) where you can generate
|
||||
sewing patterns adapted to your measurements.
|
||||
|
||||
If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
|
||||
The FreeSewing [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
|
||||
for parametric design of sewing patterns. But FreeSewing also provides a range
|
||||
of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
|
||||
functionality of the platform.
|
||||
|
||||
If you have NodeJS installed, you can try it right now by running:
|
||||
|
||||
```bash
|
||||
npx create-freesewing-pattern
|
||||
```
|
||||
|
||||
Getting started guides are available for:
|
||||
- [Linux](https://freesewing.dev/tutorials/getting-started-linux/)
|
||||
- [MacOS](https://freesewing.dev/tutorials/getting-started-mac/)
|
||||
- [Windows](https://freesewing.dev/tutorials/getting-started-windows/)
|
||||
|
||||
The [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) will
|
||||
show you how to create your first parametric design.
|
||||
|
||||
## Support FreeSewing: Become a patron 🥰
|
||||
|
||||
FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
|
||||
|
||||
If you feel FreeSewing is worthwhile, and you can spend a few coind without
|
||||
hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
|
||||
|
||||
## Links 👩💻
|
||||
|
||||
**Official channels**
|
||||
|
||||
- 💻 Makers website: [FreeSewing.org](https://freesewing.org)
|
||||
- 💻 Developers website: [FreeSewing.dev](https://freesewing.dev)
|
||||
- ✅ [Support](https://github.com/freesewing/freesewing/issues/new/choose),
|
||||
[Issues](https://github.com/freesewing/freesewing/issues) &
|
||||
[Discussions](https://github.com/freesewing/freesewing/discussions) on
|
||||
[GitHub](https://github.com/freesewing/freesewing)
|
||||
|
||||
**Social media**
|
||||
|
||||
- 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org)
|
||||
- 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
|
||||
|
||||
**Places the FreeSewing community hangs out**
|
||||
|
||||
- 💬 [Discord](https://discord.freesewing.org/)
|
||||
- 💬 [Facebook](https://www.facebook.com/groups/627769821272714/)
|
||||
- 💬 [Reddit](https://www.reddit.com/r/freesewing/)
|
||||
|
||||
## License: MIT 🤓
|
||||
|
||||
© [Joost De Cock](https://github.com/joostdecock).
|
||||
See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details.
|
||||
|
||||
## Where to get help 🤯
|
||||
|
||||
For [Support](https://github.com/freesewing/freesewing/issues/new/choose),
|
||||
please use the [Issues](https://github.com/freesewing/freesewing/issues) &
|
||||
[Discussions](https://github.com/freesewing/freesewing/discussions) on
|
||||
[GitHub](https://github.com/freesewing/freesewing).
|
||||
|
35
designs/tristan/build.mjs
Normal file
|
@ -0,0 +1,35 @@
|
|||
/* This script will build the package with esbuild */
|
||||
import esbuild from 'esbuild'
|
||||
import pkg from './package.json' assert { type: 'json' }
|
||||
|
||||
// Create banner based on package info
|
||||
const banner = `/**
|
||||
* ${pkg.name} | v${pkg.version}
|
||||
* ${pkg.description}
|
||||
* (c) ${new Date().getFullYear()} ${pkg.author}
|
||||
* @license ${pkg.license}
|
||||
*/`
|
||||
|
||||
// Shared esbuild options
|
||||
const options = {
|
||||
banner: { js: banner },
|
||||
bundle: true,
|
||||
entryPoints: ['src/index.mjs'],
|
||||
format: 'esm',
|
||||
outfile: 'dist/index.mjs',
|
||||
external: ['@freesewing'],
|
||||
metafile: process.env.VERBOSE ? true : false,
|
||||
minify: process.env.NO_MINIFY ? false : true,
|
||||
sourcemap: true,
|
||||
}
|
||||
|
||||
// Let esbuild generate the build
|
||||
const build = async () => {
|
||||
const result = await esbuild.build(options).catch(() => process.exit(1))
|
||||
|
||||
if (process.env.VERBOSE) {
|
||||
const info = await esbuild.analyzeMetafile(result.metafile)
|
||||
console.log(info)
|
||||
}
|
||||
}
|
||||
build()
|
4
designs/tristan/data.mjs
Normal file
|
@ -0,0 +1,4 @@
|
|||
// This file is auto-generated | All changes you make will be overwritten.
|
||||
export const name = '@freesewing/tristan'
|
||||
export const version = '3.0.0'
|
||||
export const data = { name, version }
|
178
designs/tristan/i18n/de.json
Normal file
|
@ -0,0 +1,178 @@
|
|||
{
|
||||
"t": "Tristan",
|
||||
"d": "Tristan is a fitted tank top with prince(ss) seams.",
|
||||
"p": {
|
||||
"backInside": "Back inside",
|
||||
"backOutside": "Back outside",
|
||||
"backPoints": "Back base",
|
||||
"frontInside": "Front inside",
|
||||
"frontOutside": "Front outside",
|
||||
"frontPoints": "Front base",
|
||||
"peplumFront": "Peplum front",
|
||||
"peplumBack": "Peplum back"
|
||||
},
|
||||
"s": {
|
||||
"strapWidthAdjusted.t": "The strap width has been adjusted",
|
||||
"strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
|
||||
"peplumWidth.t": "Peplum size",
|
||||
"peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
|
||||
"frontOutside": "Outside front",
|
||||
"frontInside": "Inside front",
|
||||
"backOutside": "Outside back",
|
||||
"backInside": "Inside back",
|
||||
"frontPeplum": "Peplum front",
|
||||
"backPeplum": "Peplum back",
|
||||
"hem": "Hem"
|
||||
},
|
||||
"o": {
|
||||
"bustSpanEase": {
|
||||
"t": "Bust span ease",
|
||||
"d": "Controls the amount of ease along the bust span"
|
||||
},
|
||||
"chestEase": {
|
||||
"t": "Chest ease",
|
||||
"d": "Controls the amount of ease at the chest"
|
||||
},
|
||||
"shoulderToShoulderEase": {
|
||||
"t": "Shoulder to shoulder ease",
|
||||
"d": "Controls the amount of ease along the shoulder to shoulder measurement"
|
||||
},
|
||||
"fullChestEaseReduction": {
|
||||
"t": "Full chest ease reduction",
|
||||
"d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
|
||||
},
|
||||
"waistEase": {
|
||||
"t": "Waist ease",
|
||||
"d": "Controls the amount of ease at the waist"
|
||||
},
|
||||
"waistdartposition": {
|
||||
"t": "Waist dart position",
|
||||
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
|
||||
},
|
||||
"frontShoulderWidth": {
|
||||
"t": "Front shoulder width",
|
||||
"d": "Controls how much width is added to the shoulder in the front"
|
||||
},
|
||||
"highBustWidth": {
|
||||
"t": "High bust width",
|
||||
"d": "Controls the width of the high bust"
|
||||
},
|
||||
"armholeDepth": {
|
||||
"t": "Depth of the Armhole",
|
||||
"d": "Controls how deep the armhole is"
|
||||
},
|
||||
"cutDepthBack": {
|
||||
"t": "Depth of the cut in the back",
|
||||
"d": "Controls the depth of the cut in the back"
|
||||
},
|
||||
"cutDepthFront": {
|
||||
"t": "Depth of the cut in the front",
|
||||
"d": "Controls the depth of the cut in the front"
|
||||
},
|
||||
"cutRoundnessBack": {
|
||||
"t": "Roundness of the cut in the back",
|
||||
"d": "Controls how 'round' the cut in the back is, from V to round to square"
|
||||
},
|
||||
"cutRoundnessFront": {
|
||||
"t": "Roundness of the cut in the front",
|
||||
"d": "Controls how 'round' the cut in the front is, from V to round to square"
|
||||
},
|
||||
"shoulderDartPosition": {
|
||||
"t": "Shoulder dart position",
|
||||
"d": "Controls the position of the shoulder dart"
|
||||
},
|
||||
"strapWidth": {
|
||||
"t": "Width of the straps",
|
||||
"d": "Controls the width of the straps"
|
||||
},
|
||||
"upperDartLength": {
|
||||
"t": "Upper dart length",
|
||||
"d": "Controls the length of the upper dart"
|
||||
},
|
||||
"waistDartLength": {
|
||||
"t": "Waist dart length",
|
||||
"d": "Controls the length of the waist dart"
|
||||
},
|
||||
"zipperLocation": {
|
||||
"t": "Zipper location",
|
||||
"d": "The location of the zipper: side, back, or front"
|
||||
},
|
||||
"zipperLocation.front": {
|
||||
"t": "Front zipper location",
|
||||
"d": "The location of the zipper will be in the front"
|
||||
},
|
||||
"zipperLocation.side": {
|
||||
"t": "Side zipper location",
|
||||
"d": "The location of the zipper will be on the side"
|
||||
},
|
||||
"zipperLocation.back": {
|
||||
"t": "Back zipper location",
|
||||
"d": "The location of the zipper will be in the back"
|
||||
},
|
||||
"hem": {
|
||||
"t": "Hem option",
|
||||
"d": "Add a hem."
|
||||
},
|
||||
"hemYes": {
|
||||
"t": "Add a hem",
|
||||
"d": "Add a hem at the waist"
|
||||
},
|
||||
"hemNo": {
|
||||
"t": "Do not add a hem",
|
||||
"d": "Do not add a hem at the waist"
|
||||
},
|
||||
"hemSize": {
|
||||
"t": "Size of the hem",
|
||||
"d": "Size of the hem, a percentage of the distance between the neckline and the waist"
|
||||
},
|
||||
"lacing": {
|
||||
"t": "Lacing option",
|
||||
"d": "This removes part of the seam to create an opening for lacing"
|
||||
},
|
||||
"lacingYes": {
|
||||
"t": "Add Lacing",
|
||||
"d": "Remove part of the seam to create an opening for lacing"
|
||||
},
|
||||
"lacingNo": {
|
||||
"t": "No lacing",
|
||||
"d": "Close the seams normally"
|
||||
},
|
||||
"lacingLocation": {
|
||||
"t": "Location of the lacing",
|
||||
"d": "Lacing in the front, or the back"
|
||||
},
|
||||
"lacingLocation.back": {
|
||||
"t": "Lacing in the back",
|
||||
"d": "The lacing will be in the back"
|
||||
},
|
||||
"lacingLocation.front": {
|
||||
"t": "Lacing in the front",
|
||||
"d": "The lacing will be in the front"
|
||||
},
|
||||
"lacingWidth": {
|
||||
"t": "Lacing width",
|
||||
"d": "Width of the lacing opening"
|
||||
},
|
||||
"peplum": {
|
||||
"t": "Peplum",
|
||||
"d": "Add a peplum"
|
||||
},
|
||||
"peplumYes": {
|
||||
"t": "Add a peplum",
|
||||
"d": "This will generate the peplum part."
|
||||
},
|
||||
"peplumNo": {
|
||||
"t": "No peplum",
|
||||
"d": "Pattern will be generated without a peplum"
|
||||
},
|
||||
"peplumSize": {
|
||||
"t": "Peplum size",
|
||||
"d": "Controls the size of the peplum"
|
||||
},
|
||||
"peplumFullness": {
|
||||
"t": "Peplum fullness",
|
||||
"d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
|
||||
}
|
||||
|
||||
}
|
||||
}
|
178
designs/tristan/i18n/en.json
Normal file
|
@ -0,0 +1,178 @@
|
|||
{
|
||||
"t": "Tristan",
|
||||
"d": "Tristan is a fitted tank top with prince(ss) seams.",
|
||||
"p": {
|
||||
"backInside": "Back inside",
|
||||
"backOutside": "Back outside",
|
||||
"backPoints": "Back base",
|
||||
"frontInside": "Front inside",
|
||||
"frontOutside": "Front outside",
|
||||
"frontPoints": "Front base",
|
||||
"peplumFront": "Peplum front",
|
||||
"peplumBack": "Peplum back"
|
||||
},
|
||||
"s": {
|
||||
"strapWidthAdjusted.t": "The strap width has been adjusted",
|
||||
"strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
|
||||
"peplumWidth.t": "Peplum size",
|
||||
"peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
|
||||
"frontOutside": "Outside front",
|
||||
"frontInside": "Inside front",
|
||||
"backOutside": "Outside back",
|
||||
"backInside": "Inside back",
|
||||
"frontPeplum": "Peplum front",
|
||||
"backPeplum": "Peplum back",
|
||||
"hem": "Hem"
|
||||
},
|
||||
"o": {
|
||||
"bustSpanEase": {
|
||||
"t": "Bust span ease",
|
||||
"d": "Controls the amount of ease along the bust span"
|
||||
},
|
||||
"chestEase": {
|
||||
"t": "Chest ease",
|
||||
"d": "Controls the amount of ease at the chest"
|
||||
},
|
||||
"shoulderToShoulderEase": {
|
||||
"t": "Shoulder to shoulder ease",
|
||||
"d": "Controls the amount of ease along the shoulder to shoulder measurement"
|
||||
},
|
||||
"fullChestEaseReduction": {
|
||||
"t": "Full chest ease reduction",
|
||||
"d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
|
||||
},
|
||||
"waistEase": {
|
||||
"t": "Waist ease",
|
||||
"d": "Controls the amount of ease at the waist"
|
||||
},
|
||||
"waistdartposition": {
|
||||
"t": "Waist dart position",
|
||||
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
|
||||
},
|
||||
"frontShoulderWidth": {
|
||||
"t": "Front shoulder width",
|
||||
"d": "Controls how much width is added to the shoulder in the front"
|
||||
},
|
||||
"highBustWidth": {
|
||||
"t": "High bust width",
|
||||
"d": "Controls the width of the high bust"
|
||||
},
|
||||
"armholeDepth": {
|
||||
"t": "Depth of the Armhole",
|
||||
"d": "Controls how deep the armhole is"
|
||||
},
|
||||
"cutDepthBack": {
|
||||
"t": "Depth of the cut in the back",
|
||||
"d": "Controls the depth of the cut in the back"
|
||||
},
|
||||
"cutDepthFront": {
|
||||
"t": "Depth of the cut in the front",
|
||||
"d": "Controls the depth of the cut in the front"
|
||||
},
|
||||
"cutRoundnessBack": {
|
||||
"t": "Roundness of the cut in the back",
|
||||
"d": "Controls how 'round' the cut in the back is, from V to round to square"
|
||||
},
|
||||
"cutRoundnessFront": {
|
||||
"t": "Roundness of the cut in the front",
|
||||
"d": "Controls how 'round' the cut in the front is, from V to round to square"
|
||||
},
|
||||
"shoulderDartPosition": {
|
||||
"t": "Shoulder dart position",
|
||||
"d": "Controls the position of the shoulder dart"
|
||||
},
|
||||
"strapWidth": {
|
||||
"t": "Width of the straps",
|
||||
"d": "Controls the width of the straps"
|
||||
},
|
||||
"upperDartLength": {
|
||||
"t": "Upper dart length",
|
||||
"d": "Controls the length of the upper dart"
|
||||
},
|
||||
"waistDartLength": {
|
||||
"t": "Waist dart length",
|
||||
"d": "Controls the length of the waist dart"
|
||||
},
|
||||
"zipperLocation": {
|
||||
"t": "Zipper location",
|
||||
"d": "The location of the zipper: side, back, or front"
|
||||
},
|
||||
"zipperLocation.front": {
|
||||
"t": "Front zipper location",
|
||||
"d": "The location of the zipper will be in the front"
|
||||
},
|
||||
"zipperLocation.side": {
|
||||
"t": "Side zipper location",
|
||||
"d": "The location of the zipper will be on the side"
|
||||
},
|
||||
"zipperLocation.back": {
|
||||
"t": "Back zipper location",
|
||||
"d": "The location of the zipper will be in the back"
|
||||
},
|
||||
"hem": {
|
||||
"t": "Hem option",
|
||||
"d": "Add a hem."
|
||||
},
|
||||
"hemYes": {
|
||||
"t": "Add a hem",
|
||||
"d": "Add a hem at the waist"
|
||||
},
|
||||
"hemNo": {
|
||||
"t": "Do not add a hem",
|
||||
"d": "Do not add a hem at the waist"
|
||||
},
|
||||
"hemSize": {
|
||||
"t": "Size of the hem",
|
||||
"d": "Size of the hem, a percentage of the distance between the neckline and the waist"
|
||||
},
|
||||
"lacing": {
|
||||
"t": "Lacing option",
|
||||
"d": "This removes part of the seam to create an opening for lacing"
|
||||
},
|
||||
"lacingYes": {
|
||||
"t": "Add Lacing",
|
||||
"d": "Remove part of the seam to create an opening for lacing"
|
||||
},
|
||||
"lacingNo": {
|
||||
"t": "No lacing",
|
||||
"d": "Close the seams normally"
|
||||
},
|
||||
"lacingLocation": {
|
||||
"t": "Location of the lacing",
|
||||
"d": "Lacing in the front, or the back"
|
||||
},
|
||||
"lacingLocation.back": {
|
||||
"t": "Lacing in the back",
|
||||
"d": "The lacing will be in the back"
|
||||
},
|
||||
"lacingLocation.front": {
|
||||
"t": "Lacing in the front",
|
||||
"d": "The lacing will be in the front"
|
||||
},
|
||||
"lacingWidth": {
|
||||
"t": "Lacing width",
|
||||
"d": "Width of the lacing opening"
|
||||
},
|
||||
"peplum": {
|
||||
"t": "Peplum",
|
||||
"d": "Add a peplum"
|
||||
},
|
||||
"peplumYes": {
|
||||
"t": "Add a peplum",
|
||||
"d": "This will generate the peplum part."
|
||||
},
|
||||
"peplumNo": {
|
||||
"t": "No peplum",
|
||||
"d": "Pattern will be generated without a peplum"
|
||||
},
|
||||
"peplumSize": {
|
||||
"t": "Peplum size",
|
||||
"d": "Controls the size of the peplum"
|
||||
},
|
||||
"peplumFullness": {
|
||||
"t": "Peplum fullness",
|
||||
"d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
|
||||
}
|
||||
|
||||
}
|
||||
}
|
178
designs/tristan/i18n/es.json
Normal file
|
@ -0,0 +1,178 @@
|
|||
{
|
||||
"t": "Tristan",
|
||||
"d": "Tristan is a fitted tank top with prince(ss) seams.",
|
||||
"p": {
|
||||
"backInside": "Back inside",
|
||||
"backOutside": "Back outside",
|
||||
"backPoints": "Back base",
|
||||
"frontInside": "Front inside",
|
||||
"frontOutside": "Front outside",
|
||||
"frontPoints": "Front base",
|
||||
"peplumFront": "Peplum front",
|
||||
"peplumBack": "Peplum back"
|
||||
},
|
||||
"s": {
|
||||
"strapWidthAdjusted.t": "The strap width has been adjusted",
|
||||
"strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
|
||||
"peplumWidth.t": "Peplum size",
|
||||
"peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
|
||||
"frontOutside": "Outside front",
|
||||
"frontInside": "Inside front",
|
||||
"backOutside": "Outside back",
|
||||
"backInside": "Inside back",
|
||||
"frontPeplum": "Peplum front",
|
||||
"backPeplum": "Peplum back",
|
||||
"hem": "Hem"
|
||||
},
|
||||
"o": {
|
||||
"bustSpanEase": {
|
||||
"t": "Bust span ease",
|
||||
"d": "Controls the amount of ease along the bust span"
|
||||
},
|
||||
"chestEase": {
|
||||
"t": "Chest ease",
|
||||
"d": "Controls the amount of ease at the chest"
|
||||
},
|
||||
"shoulderToShoulderEase": {
|
||||
"t": "Shoulder to shoulder ease",
|
||||
"d": "Controls the amount of ease along the shoulder to shoulder measurement"
|
||||
},
|
||||
"fullChestEaseReduction": {
|
||||
"t": "Full chest ease reduction",
|
||||
"d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
|
||||
},
|
||||
"waistEase": {
|
||||
"t": "Waist ease",
|
||||
"d": "Controls the amount of ease at the waist"
|
||||
},
|
||||
"waistdartposition": {
|
||||
"t": "Waist dart position",
|
||||
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
|
||||
},
|
||||
"frontShoulderWidth": {
|
||||
"t": "Front shoulder width",
|
||||
"d": "Controls how much width is added to the shoulder in the front"
|
||||
},
|
||||
"highBustWidth": {
|
||||
"t": "High bust width",
|
||||
"d": "Controls the width of the high bust"
|
||||
},
|
||||
"armholeDepth": {
|
||||
"t": "Depth of the Armhole",
|
||||
"d": "Controls how deep the armhole is"
|
||||
},
|
||||
"cutDepthBack": {
|
||||
"t": "Depth of the cut in the back",
|
||||
"d": "Controls the depth of the cut in the back"
|
||||
},
|
||||
"cutDepthFront": {
|
||||
"t": "Depth of the cut in the front",
|
||||
"d": "Controls the depth of the cut in the front"
|
||||
},
|
||||
"cutRoundnessBack": {
|
||||
"t": "Roundness of the cut in the back",
|
||||
"d": "Controls how 'round' the cut in the back is, from V to round to square"
|
||||
},
|
||||
"cutRoundnessFront": {
|
||||
"t": "Roundness of the cut in the front",
|
||||
"d": "Controls how 'round' the cut in the front is, from V to round to square"
|
||||
},
|
||||
"shoulderDartPosition": {
|
||||
"t": "Shoulder dart position",
|
||||
"d": "Controls the position of the shoulder dart"
|
||||
},
|
||||
"strapWidth": {
|
||||
"t": "Width of the straps",
|
||||
"d": "Controls the width of the straps"
|
||||
},
|
||||
"upperDartLength": {
|
||||
"t": "Upper dart length",
|
||||
"d": "Controls the length of the upper dart"
|
||||
},
|
||||
"waistDartLength": {
|
||||
"t": "Waist dart length",
|
||||
"d": "Controls the length of the waist dart"
|
||||
},
|
||||
"zipperLocation": {
|
||||
"t": "Zipper location",
|
||||
"d": "The location of the zipper: side, back, or front"
|
||||
},
|
||||
"zipperLocation.front": {
|
||||
"t": "Front zipper location",
|
||||
"d": "The location of the zipper will be in the front"
|
||||
},
|
||||
"zipperLocation.side": {
|
||||
"t": "Side zipper location",
|
||||
"d": "The location of the zipper will be on the side"
|
||||
},
|
||||
"zipperLocation.back": {
|
||||
"t": "Back zipper location",
|
||||
"d": "The location of the zipper will be in the back"
|
||||
},
|
||||
"hem": {
|
||||
"t": "Hem option",
|
||||
"d": "Add a hem."
|
||||
},
|
||||
"hemYes": {
|
||||
"t": "Add a hem",
|
||||
"d": "Add a hem at the waist"
|
||||
},
|
||||
"hemNo": {
|
||||
"t": "Do not add a hem",
|
||||
"d": "Do not add a hem at the waist"
|
||||
},
|
||||
"hemSize": {
|
||||
"t": "Size of the hem",
|
||||
"d": "Size of the hem, a percentage of the distance between the neckline and the waist"
|
||||
},
|
||||
"lacing": {
|
||||
"t": "Lacing option",
|
||||
"d": "This removes part of the seam to create an opening for lacing"
|
||||
},
|
||||
"lacingYes": {
|
||||
"t": "Add Lacing",
|
||||
"d": "Remove part of the seam to create an opening for lacing"
|
||||
},
|
||||
"lacingNo": {
|
||||
"t": "No lacing",
|
||||
"d": "Close the seams normally"
|
||||
},
|
||||
"lacingLocation": {
|
||||
"t": "Location of the lacing",
|
||||
"d": "Lacing in the front, or the back"
|
||||
},
|
||||
"lacingLocation.back": {
|
||||
"t": "Lacing in the back",
|
||||
"d": "The lacing will be in the back"
|
||||
},
|
||||
"lacingLocation.front": {
|
||||
"t": "Lacing in the front",
|
||||
"d": "The lacing will be in the front"
|
||||
},
|
||||
"lacingWidth": {
|
||||
"t": "Lacing width",
|
||||
"d": "Width of the lacing opening"
|
||||
},
|
||||
"peplum": {
|
||||
"t": "Peplum",
|
||||
"d": "Add a peplum"
|
||||
},
|
||||
"peplumYes": {
|
||||
"t": "Add a peplum",
|
||||
"d": "This will generate the peplum part."
|
||||
},
|
||||
"peplumNo": {
|
||||
"t": "No peplum",
|
||||
"d": "Pattern will be generated without a peplum"
|
||||
},
|
||||
"peplumSize": {
|
||||
"t": "Peplum size",
|
||||
"d": "Controls the size of the peplum"
|
||||
},
|
||||
"peplumFullness": {
|
||||
"t": "Peplum fullness",
|
||||
"d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
|
||||
}
|
||||
|
||||
}
|
||||
}
|
178
designs/tristan/i18n/fr.json
Normal file
|
@ -0,0 +1,178 @@
|
|||
{
|
||||
"t": "Tristan",
|
||||
"d": "Tristan is a fitted tank top with prince(ss) seams.",
|
||||
"p": {
|
||||
"backInside": "Back inside",
|
||||
"backOutside": "Back outside",
|
||||
"backPoints": "Back base",
|
||||
"frontInside": "Front inside",
|
||||
"frontOutside": "Front outside",
|
||||
"frontPoints": "Front base",
|
||||
"peplumFront": "Peplum front",
|
||||
"peplumBack": "Peplum back"
|
||||
},
|
||||
"s": {
|
||||
"strapWidthAdjusted.t": "The strap width has been adjusted",
|
||||
"strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
|
||||
"peplumWidth.t": "Peplum size",
|
||||
"peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
|
||||
"frontOutside": "Outside front",
|
||||
"frontInside": "Inside front",
|
||||
"backOutside": "Outside back",
|
||||
"backInside": "Inside back",
|
||||
"frontPeplum": "Peplum front",
|
||||
"backPeplum": "Peplum back",
|
||||
"hem": "Hem"
|
||||
},
|
||||
"o": {
|
||||
"bustSpanEase": {
|
||||
"t": "Bust span ease",
|
||||
"d": "Controls the amount of ease along the bust span"
|
||||
},
|
||||
"chestEase": {
|
||||
"t": "Chest ease",
|
||||
"d": "Controls the amount of ease at the chest"
|
||||
},
|
||||
"shoulderToShoulderEase": {
|
||||
"t": "Shoulder to shoulder ease",
|
||||
"d": "Controls the amount of ease along the shoulder to shoulder measurement"
|
||||
},
|
||||
"fullChestEaseReduction": {
|
||||
"t": "Full chest ease reduction",
|
||||
"d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
|
||||
},
|
||||
"waistEase": {
|
||||
"t": "Waist ease",
|
||||
"d": "Controls the amount of ease at the waist"
|
||||
},
|
||||
"waistdartposition": {
|
||||
"t": "Waist dart position",
|
||||
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
|
||||
},
|
||||
"frontShoulderWidth": {
|
||||
"t": "Front shoulder width",
|
||||
"d": "Controls how much width is added to the shoulder in the front"
|
||||
},
|
||||
"highBustWidth": {
|
||||
"t": "High bust width",
|
||||
"d": "Controls the width of the high bust"
|
||||
},
|
||||
"armholeDepth": {
|
||||
"t": "Depth of the Armhole",
|
||||
"d": "Controls how deep the armhole is"
|
||||
},
|
||||
"cutDepthBack": {
|
||||
"t": "Depth of the cut in the back",
|
||||
"d": "Controls the depth of the cut in the back"
|
||||
},
|
||||
"cutDepthFront": {
|
||||
"t": "Depth of the cut in the front",
|
||||
"d": "Controls the depth of the cut in the front"
|
||||
},
|
||||
"cutRoundnessBack": {
|
||||
"t": "Roundness of the cut in the back",
|
||||
"d": "Controls how 'round' the cut in the back is, from V to round to square"
|
||||
},
|
||||
"cutRoundnessFront": {
|
||||
"t": "Roundness of the cut in the front",
|
||||
"d": "Controls how 'round' the cut in the front is, from V to round to square"
|
||||
},
|
||||
"shoulderDartPosition": {
|
||||
"t": "Shoulder dart position",
|
||||
"d": "Controls the position of the shoulder dart"
|
||||
},
|
||||
"strapWidth": {
|
||||
"t": "Width of the straps",
|
||||
"d": "Controls the width of the straps"
|
||||
},
|
||||
"upperDartLength": {
|
||||
"t": "Upper dart length",
|
||||
"d": "Controls the length of the upper dart"
|
||||
},
|
||||
"waistDartLength": {
|
||||
"t": "Waist dart length",
|
||||
"d": "Controls the length of the waist dart"
|
||||
},
|
||||
"zipperLocation": {
|
||||
"t": "Zipper location",
|
||||
"d": "The location of the zipper: side, back, or front"
|
||||
},
|
||||
"zipperLocation.front": {
|
||||
"t": "Front zipper location",
|
||||
"d": "The location of the zipper will be in the front"
|
||||
},
|
||||
"zipperLocation.side": {
|
||||
"t": "Side zipper location",
|
||||
"d": "The location of the zipper will be on the side"
|
||||
},
|
||||
"zipperLocation.back": {
|
||||
"t": "Back zipper location",
|
||||
"d": "The location of the zipper will be in the back"
|
||||
},
|
||||
"hem": {
|
||||
"t": "Hem option",
|
||||
"d": "Add a hem."
|
||||
},
|
||||
"hemYes": {
|
||||
"t": "Add a hem",
|
||||
"d": "Add a hem at the waist"
|
||||
},
|
||||
"hemNo": {
|
||||
"t": "Do not add a hem",
|
||||
"d": "Do not add a hem at the waist"
|
||||
},
|
||||
"hemSize": {
|
||||
"t": "Size of the hem",
|
||||
"d": "Size of the hem, a percentage of the distance between the neckline and the waist"
|
||||
},
|
||||
"lacing": {
|
||||
"t": "Lacing option",
|
||||
"d": "This removes part of the seam to create an opening for lacing"
|
||||
},
|
||||
"lacingYes": {
|
||||
"t": "Add Lacing",
|
||||
"d": "Remove part of the seam to create an opening for lacing"
|
||||
},
|
||||
"lacingNo": {
|
||||
"t": "No lacing",
|
||||
"d": "Close the seams normally"
|
||||
},
|
||||
"lacingLocation": {
|
||||
"t": "Location of the lacing",
|
||||
"d": "Lacing in the front, or the back"
|
||||
},
|
||||
"lacingLocation.back": {
|
||||
"t": "Lacing in the back",
|
||||
"d": "The lacing will be in the back"
|
||||
},
|
||||
"lacingLocation.front": {
|
||||
"t": "Lacing in the front",
|
||||
"d": "The lacing will be in the front"
|
||||
},
|
||||
"lacingWidth": {
|
||||
"t": "Lacing width",
|
||||
"d": "Width of the lacing opening"
|
||||
},
|
||||
"peplum": {
|
||||
"t": "Peplum",
|
||||
"d": "Add a peplum"
|
||||
},
|
||||
"peplumYes": {
|
||||
"t": "Add a peplum",
|
||||
"d": "This will generate the peplum part."
|
||||
},
|
||||
"peplumNo": {
|
||||
"t": "No peplum",
|
||||
"d": "Pattern will be generated without a peplum"
|
||||
},
|
||||
"peplumSize": {
|
||||
"t": "Peplum size",
|
||||
"d": "Controls the size of the peplum"
|
||||
},
|
||||
"peplumFullness": {
|
||||
"t": "Peplum fullness",
|
||||
"d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
|
||||
}
|
||||
|
||||
}
|
||||
}
|
8
designs/tristan/i18n/index.mjs
Normal file
|
@ -0,0 +1,8 @@
|
|||
import en from './en.json' assert { type: 'json' }
|
||||
import de from './de.json' assert { type: 'json' }
|
||||
import es from './es.json' assert { type: 'json' }
|
||||
import fr from './fr.json' assert { type: 'json' }
|
||||
import nl from './nl.json' assert { type: 'json' }
|
||||
import uk from './uk.json' assert { type: 'json' }
|
||||
|
||||
export const i18n = { en, de, es, fr, nl, uk }
|
178
designs/tristan/i18n/nl.json
Normal file
|
@ -0,0 +1,178 @@
|
|||
{
|
||||
"t": "Tristan",
|
||||
"d": "Tristan is a fitted tank top with prince(ss) seams.",
|
||||
"p": {
|
||||
"backInside": "Back inside",
|
||||
"backOutside": "Back outside",
|
||||
"backPoints": "Back base",
|
||||
"frontInside": "Front inside",
|
||||
"frontOutside": "Front outside",
|
||||
"frontPoints": "Front base",
|
||||
"peplumFront": "Peplum front",
|
||||
"peplumBack": "Peplum back"
|
||||
},
|
||||
"s": {
|
||||
"strapWidthAdjusted.t": "The strap width has been adjusted",
|
||||
"strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
|
||||
"peplumWidth.t": "Peplum size",
|
||||
"peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
|
||||
"frontOutside": "Outside front",
|
||||
"frontInside": "Inside front",
|
||||
"backOutside": "Outside back",
|
||||
"backInside": "Inside back",
|
||||
"frontPeplum": "Peplum front",
|
||||
"backPeplum": "Peplum back",
|
||||
"hem": "Hem"
|
||||
},
|
||||
"o": {
|
||||
"bustSpanEase": {
|
||||
"t": "Bust span ease",
|
||||
"d": "Controls the amount of ease along the bust span"
|
||||
},
|
||||
"chestEase": {
|
||||
"t": "Chest ease",
|
||||
"d": "Controls the amount of ease at the chest"
|
||||
},
|
||||
"shoulderToShoulderEase": {
|
||||
"t": "Shoulder to shoulder ease",
|
||||
"d": "Controls the amount of ease along the shoulder to shoulder measurement"
|
||||
},
|
||||
"fullChestEaseReduction": {
|
||||
"t": "Full chest ease reduction",
|
||||
"d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
|
||||
},
|
||||
"waistEase": {
|
||||
"t": "Waist ease",
|
||||
"d": "Controls the amount of ease at the waist"
|
||||
},
|
||||
"waistdartposition": {
|
||||
"t": "Waist dart position",
|
||||
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
|
||||
},
|
||||
"frontShoulderWidth": {
|
||||
"t": "Front shoulder width",
|
||||
"d": "Controls how much width is added to the shoulder in the front"
|
||||
},
|
||||
"highBustWidth": {
|
||||
"t": "High bust width",
|
||||
"d": "Controls the width of the high bust"
|
||||
},
|
||||
"armholeDepth": {
|
||||
"t": "Depth of the Armhole",
|
||||
"d": "Controls how deep the armhole is"
|
||||
},
|
||||
"cutDepthBack": {
|
||||
"t": "Depth of the cut in the back",
|
||||
"d": "Controls the depth of the cut in the back"
|
||||
},
|
||||
"cutDepthFront": {
|
||||
"t": "Depth of the cut in the front",
|
||||
"d": "Controls the depth of the cut in the front"
|
||||
},
|
||||
"cutRoundnessBack": {
|
||||
"t": "Roundness of the cut in the back",
|
||||
"d": "Controls how 'round' the cut in the back is, from V to round to square"
|
||||
},
|
||||
"cutRoundnessFront": {
|
||||
"t": "Roundness of the cut in the front",
|
||||
"d": "Controls how 'round' the cut in the front is, from V to round to square"
|
||||
},
|
||||
"shoulderDartPosition": {
|
||||
"t": "Shoulder dart position",
|
||||
"d": "Controls the position of the shoulder dart"
|
||||
},
|
||||
"strapWidth": {
|
||||
"t": "Width of the straps",
|
||||
"d": "Controls the width of the straps"
|
||||
},
|
||||
"upperDartLength": {
|
||||
"t": "Upper dart length",
|
||||
"d": "Controls the length of the upper dart"
|
||||
},
|
||||
"waistDartLength": {
|
||||
"t": "Waist dart length",
|
||||
"d": "Controls the length of the waist dart"
|
||||
},
|
||||
"zipperLocation": {
|
||||
"t": "Zipper location",
|
||||
"d": "The location of the zipper: side, back, or front"
|
||||
},
|
||||
"zipperLocation.front": {
|
||||
"t": "Front zipper location",
|
||||
"d": "The location of the zipper will be in the front"
|
||||
},
|
||||
"zipperLocation.side": {
|
||||
"t": "Side zipper location",
|
||||
"d": "The location of the zipper will be on the side"
|
||||
},
|
||||
"zipperLocation.back": {
|
||||
"t": "Back zipper location",
|
||||
"d": "The location of the zipper will be in the back"
|
||||
},
|
||||
"hem": {
|
||||
"t": "Hem option",
|
||||
"d": "Add a hem."
|
||||
},
|
||||
"hemYes": {
|
||||
"t": "Add a hem",
|
||||
"d": "Add a hem at the waist"
|
||||
},
|
||||
"hemNo": {
|
||||
"t": "Do not add a hem",
|
||||
"d": "Do not add a hem at the waist"
|
||||
},
|
||||
"hemSize": {
|
||||
"t": "Size of the hem",
|
||||
"d": "Size of the hem, a percentage of the distance between the neckline and the waist"
|
||||
},
|
||||
"lacing": {
|
||||
"t": "Lacing option",
|
||||
"d": "This removes part of the seam to create an opening for lacing"
|
||||
},
|
||||
"lacingYes": {
|
||||
"t": "Add Lacing",
|
||||
"d": "Remove part of the seam to create an opening for lacing"
|
||||
},
|
||||
"lacingNo": {
|
||||
"t": "No lacing",
|
||||
"d": "Close the seams normally"
|
||||
},
|
||||
"lacingLocation": {
|
||||
"t": "Location of the lacing",
|
||||
"d": "Lacing in the front, or the back"
|
||||
},
|
||||
"lacingLocation.back": {
|
||||
"t": "Lacing in the back",
|
||||
"d": "The lacing will be in the back"
|
||||
},
|
||||
"lacingLocation.front": {
|
||||
"t": "Lacing in the front",
|
||||
"d": "The lacing will be in the front"
|
||||
},
|
||||
"lacingWidth": {
|
||||
"t": "Lacing width",
|
||||
"d": "Width of the lacing opening"
|
||||
},
|
||||
"peplum": {
|
||||
"t": "Peplum",
|
||||
"d": "Add a peplum"
|
||||
},
|
||||
"peplumYes": {
|
||||
"t": "Add a peplum",
|
||||
"d": "This will generate the peplum part."
|
||||
},
|
||||
"peplumNo": {
|
||||
"t": "No peplum",
|
||||
"d": "Pattern will be generated without a peplum"
|
||||
},
|
||||
"peplumSize": {
|
||||
"t": "Peplum size",
|
||||
"d": "Controls the size of the peplum"
|
||||
},
|
||||
"peplumFullness": {
|
||||
"t": "Peplum fullness",
|
||||
"d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
|
||||
}
|
||||
|
||||
}
|
||||
}
|
178
designs/tristan/i18n/uk.json
Normal file
|
@ -0,0 +1,178 @@
|
|||
{
|
||||
"t": "Tristan",
|
||||
"d": "Tristan is a fitted tank top with prince(ss) seams.",
|
||||
"p": {
|
||||
"backInside": "Back inside",
|
||||
"backOutside": "Back outside",
|
||||
"backPoints": "Back base",
|
||||
"frontInside": "Front inside",
|
||||
"frontOutside": "Front outside",
|
||||
"frontPoints": "Front base",
|
||||
"peplumFront": "Peplum front",
|
||||
"peplumBack": "Peplum back"
|
||||
},
|
||||
"s": {
|
||||
"strapWidthAdjusted.t": "The strap width has been adjusted",
|
||||
"strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
|
||||
"peplumWidth.t": "Peplum size",
|
||||
"peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
|
||||
"frontOutside": "Outside front",
|
||||
"frontInside": "Inside front",
|
||||
"backOutside": "Outside back",
|
||||
"backInside": "Inside back",
|
||||
"frontPeplum": "Peplum front",
|
||||
"backPeplum": "Peplum back",
|
||||
"hem": "Hem"
|
||||
},
|
||||
"o": {
|
||||
"bustSpanEase": {
|
||||
"t": "Bust span ease",
|
||||
"d": "Controls the amount of ease along the bust span"
|
||||
},
|
||||
"chestEase": {
|
||||
"t": "Chest ease",
|
||||
"d": "Controls the amount of ease at the chest"
|
||||
},
|
||||
"shoulderToShoulderEase": {
|
||||
"t": "Shoulder to shoulder ease",
|
||||
"d": "Controls the amount of ease along the shoulder to shoulder measurement"
|
||||
},
|
||||
"fullChestEaseReduction": {
|
||||
"t": "Full chest ease reduction",
|
||||
"d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
|
||||
},
|
||||
"waistEase": {
|
||||
"t": "Waist ease",
|
||||
"d": "Controls the amount of ease at the waist"
|
||||
},
|
||||
"waistdartposition": {
|
||||
"t": "Waist dart position",
|
||||
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
|
||||
},
|
||||
"frontShoulderWidth": {
|
||||
"t": "Front shoulder width",
|
||||
"d": "Controls how much width is added to the shoulder in the front"
|
||||
},
|
||||
"highBustWidth": {
|
||||
"t": "High bust width",
|
||||
"d": "Controls the width of the high bust"
|
||||
},
|
||||
"armholeDepth": {
|
||||
"t": "Depth of the Armhole",
|
||||
"d": "Controls how deep the armhole is"
|
||||
},
|
||||
"cutDepthBack": {
|
||||
"t": "Depth of the cut in the back",
|
||||
"d": "Controls the depth of the cut in the back"
|
||||
},
|
||||
"cutDepthFront": {
|
||||
"t": "Depth of the cut in the front",
|
||||
"d": "Controls the depth of the cut in the front"
|
||||
},
|
||||
"cutRoundnessBack": {
|
||||
"t": "Roundness of the cut in the back",
|
||||
"d": "Controls how 'round' the cut in the back is, from V to round to square"
|
||||
},
|
||||
"cutRoundnessFront": {
|
||||
"t": "Roundness of the cut in the front",
|
||||
"d": "Controls how 'round' the cut in the front is, from V to round to square"
|
||||
},
|
||||
"shoulderDartPosition": {
|
||||
"t": "Shoulder dart position",
|
||||
"d": "Controls the position of the shoulder dart"
|
||||
},
|
||||
"strapWidth": {
|
||||
"t": "Width of the straps",
|
||||
"d": "Controls the width of the straps"
|
||||
},
|
||||
"upperDartLength": {
|
||||
"t": "Upper dart length",
|
||||
"d": "Controls the length of the upper dart"
|
||||
},
|
||||
"waistDartLength": {
|
||||
"t": "Waist dart length",
|
||||
"d": "Controls the length of the waist dart"
|
||||
},
|
||||
"zipperLocation": {
|
||||
"t": "Zipper location",
|
||||
"d": "The location of the zipper: side, back, or front"
|
||||
},
|
||||
"zipperLocation.front": {
|
||||
"t": "Front zipper location",
|
||||
"d": "The location of the zipper will be in the front"
|
||||
},
|
||||
"zipperLocation.side": {
|
||||
"t": "Side zipper location",
|
||||
"d": "The location of the zipper will be on the side"
|
||||
},
|
||||
"zipperLocation.back": {
|
||||
"t": "Back zipper location",
|
||||
"d": "The location of the zipper will be in the back"
|
||||
},
|
||||
"hem": {
|
||||
"t": "Hem option",
|
||||
"d": "Add a hem."
|
||||
},
|
||||
"hemYes": {
|
||||
"t": "Add a hem",
|
||||
"d": "Add a hem at the waist"
|
||||
},
|
||||
"hemNo": {
|
||||
"t": "Do not add a hem",
|
||||
"d": "Do not add a hem at the waist"
|
||||
},
|
||||
"hemSize": {
|
||||
"t": "Size of the hem",
|
||||
"d": "Size of the hem, a percentage of the distance between the neckline and the waist"
|
||||
},
|
||||
"lacing": {
|
||||
"t": "Lacing option",
|
||||
"d": "This removes part of the seam to create an opening for lacing"
|
||||
},
|
||||
"lacingYes": {
|
||||
"t": "Add Lacing",
|
||||
"d": "Remove part of the seam to create an opening for lacing"
|
||||
},
|
||||
"lacingNo": {
|
||||
"t": "No lacing",
|
||||
"d": "Close the seams normally"
|
||||
},
|
||||
"lacingLocation": {
|
||||
"t": "Location of the lacing",
|
||||
"d": "Lacing in the front, or the back"
|
||||
},
|
||||
"lacingLocation.back": {
|
||||
"t": "Lacing in the back",
|
||||
"d": "The lacing will be in the back"
|
||||
},
|
||||
"lacingLocation.front": {
|
||||
"t": "Lacing in the front",
|
||||
"d": "The lacing will be in the front"
|
||||
},
|
||||
"lacingWidth": {
|
||||
"t": "Lacing width",
|
||||
"d": "Width of the lacing opening"
|
||||
},
|
||||
"peplum": {
|
||||
"t": "Peplum",
|
||||
"d": "Add a peplum"
|
||||
},
|
||||
"peplumYes": {
|
||||
"t": "Add a peplum",
|
||||
"d": "This will generate the peplum part."
|
||||
},
|
||||
"peplumNo": {
|
||||
"t": "No peplum",
|
||||
"d": "Pattern will be generated without a peplum"
|
||||
},
|
||||
"peplumSize": {
|
||||
"t": "Peplum size",
|
||||
"d": "Controls the size of the peplum"
|
||||
},
|
||||
"peplumFullness": {
|
||||
"t": "Peplum fullness",
|
||||
"d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
|
||||
}
|
||||
|
||||
}
|
||||
}
|
73
designs/tristan/package.json
Normal file
|
@ -0,0 +1,73 @@
|
|||
{
|
||||
"name": "@freesewing/tristan",
|
||||
"version": "3.0.0",
|
||||
"description": "A FreeSewing pattern for a fitted top",
|
||||
"author": "Joost De Cock <joost@joost.at> (https://github.com/joostdecock)",
|
||||
"homepage": "https://freesewing.org/",
|
||||
"repository": "github:freesewing/freesewing",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/freesewing/freesewing/issues"
|
||||
},
|
||||
"funding": {
|
||||
"type": "individual",
|
||||
"url": "https://freesewing.org/patrons/join"
|
||||
},
|
||||
"keywords": [
|
||||
"freesewing",
|
||||
"design",
|
||||
"diy",
|
||||
"fashion",
|
||||
"made to measure",
|
||||
"parametric design",
|
||||
"pattern",
|
||||
"sewing",
|
||||
"sewing pattern"
|
||||
],
|
||||
"type": "module",
|
||||
"module": "dist/index.mjs",
|
||||
"exports": {
|
||||
".": {
|
||||
"internal": "./src/index.mjs",
|
||||
"default": "./dist/index.mjs"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"build": "node build.mjs",
|
||||
"build:all": "yarn build",
|
||||
"clean": "rimraf dist",
|
||||
"mbuild": "NO_MINIFY=1 node build.mjs",
|
||||
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
|
||||
"test": "npx mocha tests/*.test.mjs",
|
||||
"vbuild": "VERBOSE=1 node build.mjs",
|
||||
"lab": "cd ../../sites/lab && yarn start",
|
||||
"tips": "node ../../scripts/help.mjs",
|
||||
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
|
||||
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
|
||||
"testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
|
||||
"wbuild": "node build.mjs",
|
||||
"wbuild:all": "yarn wbuild"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@freesewing/core": "3.0.0"
|
||||
},
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"mocha": "10.2.0",
|
||||
"chai": "4.3.10",
|
||||
"@freesewing/models": "3.0.0",
|
||||
"@freesewing/plugin-timing": "3.0.0"
|
||||
},
|
||||
"files": [
|
||||
"dist/*",
|
||||
"README.md"
|
||||
],
|
||||
"publishConfig": {
|
||||
"access": "public",
|
||||
"tag": "latest"
|
||||
},
|
||||
"engines": {
|
||||
"node": "18",
|
||||
"npm": "9"
|
||||
}
|
||||
}
|
158
designs/tristan/src/backinside.mjs
Normal file
|
@ -0,0 +1,158 @@
|
|||
import { backPoints } from './backpoints.mjs'
|
||||
|
||||
export const backInside = {
|
||||
name: 'tristan.backInside',
|
||||
from: backPoints,
|
||||
draft: ({ sa, Point, points, Path, paths, Snippet, snippets, options, store, macro, part }) => {
|
||||
const lacing = true == options.lacing && 'back' == options.lacingLocation
|
||||
|
||||
macro('rmtitle')
|
||||
store.cutlist.removeCut()
|
||||
|
||||
paths.cut = new Path()
|
||||
.move(points.strapInside)
|
||||
.curve(points.strapInsideCp, points.cbCutCp, lacing ? points.lacingCut : points.cbCut)
|
||||
|
||||
if (lacing) {
|
||||
paths.cut.line(points.lacingWaist)
|
||||
paths.originalSide = new Path()
|
||||
.move(points.lacingCut)
|
||||
.line(points.cbCut)
|
||||
.curve_(points.cbCutCp2, points.waistCenter)
|
||||
.line(points.lacingWaist)
|
||||
.setClass('note dashed')
|
||||
|
||||
const lacingDistance = points.lacingWaist.y - points.lacingCut.y
|
||||
if (lacingDistance > 15 * 5) {
|
||||
const numberOfEyelets = Math.floor(lacingDistance / 15)
|
||||
const eyeletDistance = lacingDistance / (numberOfEyelets + 1)
|
||||
const pEyelets = new Path().move(points.lacingCut).line(points.lacingWaist).offset(-10)
|
||||
|
||||
for (let i = 1; i <= numberOfEyelets; i++) {
|
||||
points['eyelet' + i] = pEyelets.shiftAlong(i * eyeletDistance)
|
||||
snippets['eyelet' + i] = new Snippet('eyelet', points['eyelet' + i])
|
||||
}
|
||||
}
|
||||
} else {
|
||||
paths.cut.curve_(points.cbCutCp2, points.waistCenter)
|
||||
}
|
||||
|
||||
if (options.hem && !options.peplum) {
|
||||
paths.hem = new Path()
|
||||
.move(lacing ? points.lacingWaist : points.waistCenter)
|
||||
.line(points.waistCenterHem)
|
||||
.line(points.dartBottomLeftHem)
|
||||
.line(points.dartBottomLeft)
|
||||
.hide()
|
||||
paths.hemFold = new Path()
|
||||
.move(points.waistCenter)
|
||||
.line(points.dartBottomLeft)
|
||||
.addClass('note dashed')
|
||||
.addText('hem', 'center note')
|
||||
} else {
|
||||
paths.hem = new Path()
|
||||
.move(lacing ? points.lacingWaist : points.waistCenter)
|
||||
.line(points.dartBottomLeft)
|
||||
.hide()
|
||||
}
|
||||
|
||||
paths.seamSA = new Path()
|
||||
.move(points.dartBottomLeft)
|
||||
.curve(points.dartLeftCp, points.shoulderDartCpDown, points.dartTip)
|
||||
.curve(points.shoulderDartCpUp, points.shoulderDart, points.shoulderDart)
|
||||
.line(points.strapInside)
|
||||
.join(paths.cut)
|
||||
|
||||
paths.seam = paths.seamSA.clone().join(paths.hem).close().attr('class', 'fabric')
|
||||
|
||||
points.grainlineFrom = new Point(points.dartBottomLeft.x - 10, points.cbCut.y)
|
||||
points.grainlineTo = new Point(points.dartBottomLeft.x - 10, points.waistSide.y)
|
||||
macro('grainline', {
|
||||
from: points.grainlineFrom,
|
||||
to: points.grainlineTo,
|
||||
})
|
||||
|
||||
store.cutlist.addCut({ cut: 2, from: 'fabric' })
|
||||
|
||||
points.titleAnchor = points.dartBottomLeft.shiftFractionTowards(
|
||||
lacing ? points.lacingCut : points.cbCut,
|
||||
0.75
|
||||
)
|
||||
macro('title', {
|
||||
at: points.titleAnchor,
|
||||
nr: 3,
|
||||
title: 'tristan:backInside',
|
||||
})
|
||||
|
||||
if (sa) {
|
||||
if (options.hem && !options.peplum) {
|
||||
paths.sa = new Path()
|
||||
.move(points.dartBottomLeftHem)
|
||||
.join(
|
||||
new Path()
|
||||
.move(points.dartBottomLeftHem)
|
||||
.line(points.dartBottomLeft)
|
||||
.join(paths.seamSA)
|
||||
.line(points.waistCenterHem)
|
||||
.offset(sa)
|
||||
)
|
||||
.line(points.waistCenterHem)
|
||||
.attr('class', 'fabric sa')
|
||||
} else {
|
||||
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
|
||||
}
|
||||
}
|
||||
|
||||
macro('hd', {
|
||||
from: points.cbCut,
|
||||
to: points.strapInside,
|
||||
y: points.strapInside.y - sa - 15,
|
||||
id: 'cutWidth',
|
||||
})
|
||||
macro('hd', {
|
||||
from: points.cbCut,
|
||||
to: points.shoulderDart,
|
||||
y: points.strapInside.y - sa - 25,
|
||||
id: 'cutToDart',
|
||||
})
|
||||
macro('hd', {
|
||||
from: lacing ? points.lacingWaist : points.waistCenter,
|
||||
to: points.dartBottomLeft,
|
||||
y: points.waistCenter.y + sa + 15,
|
||||
id: 'waistCenterToSide',
|
||||
})
|
||||
macro('hd', {
|
||||
from: points.cbCut,
|
||||
to: points.dartBottomLeft,
|
||||
y: points.waistCenter.y + sa + 25,
|
||||
id: 'waistCutToSide',
|
||||
})
|
||||
|
||||
macro('vd', {
|
||||
from: lacing ? points.lacingWaist : points.waistCenter,
|
||||
to: points.cbCut,
|
||||
x: points.cbCut.x - sa - 15,
|
||||
id: 'waistToCut',
|
||||
})
|
||||
macro('vd', {
|
||||
from: lacing ? points.lacingWaist : points.waistCenter,
|
||||
to: points.strapInside,
|
||||
x: points.cbCut.x - sa - 25,
|
||||
id: 'waistToStrap',
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.dartBottomLeft,
|
||||
to: points.shoulderDart,
|
||||
x: points.shoulderDart.x + sa + 15,
|
||||
id: 'dartToDart',
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.dartBottomLeft,
|
||||
to: points.strapInside,
|
||||
x: points.shoulderDart.x + sa + 25,
|
||||
id: 'dartToStrap',
|
||||
})
|
||||
|
||||
return part
|
||||
},
|
||||
}
|
146
designs/tristan/src/backoutside.mjs
Normal file
|
@ -0,0 +1,146 @@
|
|||
import { backPoints } from './backpoints.mjs'
|
||||
|
||||
export const backOutside = {
|
||||
name: 'tristan.backOutside',
|
||||
from: backPoints,
|
||||
draft: ({ sa, Point, points, Path, paths, options, store, macro, part }) => {
|
||||
store.cutlist.removeCut()
|
||||
|
||||
paths.cut = new Path()
|
||||
.move(points.armhole)
|
||||
.curve(points.armholeCutCp, points.strapOutsideCp, points.strapOutside)
|
||||
.hide()
|
||||
|
||||
paths.dart = new Path()
|
||||
.move(points.shoulderDart)
|
||||
.curve(points.shoulderDart, points.shoulderDartCpUp, points.dartTip)
|
||||
.curve(points.shoulderDartCpDown, points.dartRightCp, points.dartBottomRight)
|
||||
.hide()
|
||||
|
||||
if (options.hem && !options.peplum) {
|
||||
paths.hem = new Path()
|
||||
.move(points.dartBottomRight)
|
||||
.line(points.dartBottomRightHem)
|
||||
.line(points.waistSideHem)
|
||||
.line(points.waistSide)
|
||||
.hide()
|
||||
paths.hemFold = new Path()
|
||||
.move(points.dartBottomRight)
|
||||
.line(points.waistSide)
|
||||
.addClass('note dashed')
|
||||
.addText('hem', 'center note')
|
||||
} else {
|
||||
paths.hem = new Path().move(points.dartBottomRight).line(points.waistSide).hide()
|
||||
}
|
||||
paths.seamSA = new Path()
|
||||
.move(points.waistSide)
|
||||
.curve_(points.waistSideCp2, points.armhole)
|
||||
.join(paths.cut)
|
||||
.join(paths.dart)
|
||||
|
||||
paths.seam = paths.seamSA.clone().join(paths.hem).close().attr('class', 'fabric')
|
||||
|
||||
points.grainlineTo = new Point(points.dartBottomRight.x * 1.1, points.dartBottomRight.y * 0.95)
|
||||
points.grainlineFrom = new Point(points.grainlineTo.x, points.dartTip.y)
|
||||
|
||||
macro('grainline', {
|
||||
from: points.grainlineFrom,
|
||||
to: points.grainlineTo,
|
||||
})
|
||||
|
||||
store.cutlist.removeCut('fabric')
|
||||
store.cutlist.addCut({ cut: 2, from: 'fabric' })
|
||||
|
||||
points.titleAnchor = points.dartBottomRight.shiftFractionTowards(points.armholeCpTarget, 0.5)
|
||||
macro('title', {
|
||||
at: points.titleAnchor,
|
||||
nr: 4,
|
||||
title: 'tristan:backOutside',
|
||||
})
|
||||
|
||||
if (sa) {
|
||||
if (options.hem && !options.peplum) {
|
||||
paths.sa = new Path()
|
||||
.move(points.waistSideHem)
|
||||
.join(
|
||||
new Path()
|
||||
.move(points.waistSideHem)
|
||||
.line(points.waistSide)
|
||||
.join(paths.seamSA)
|
||||
.line(points.dartBottomRightHem)
|
||||
.offset(sa)
|
||||
)
|
||||
.line(points.dartBottomRightHem)
|
||||
.attr('class', 'fabric sa')
|
||||
} else {
|
||||
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
|
||||
}
|
||||
}
|
||||
|
||||
const pLeft = paths.dart.edge('left')
|
||||
|
||||
macro('hd', {
|
||||
from: pLeft,
|
||||
to: points.shoulderDart,
|
||||
y: points.shoulderDart.y - sa - 15,
|
||||
id: 'leftToDart',
|
||||
})
|
||||
macro('hd', {
|
||||
from: pLeft,
|
||||
to: points.strapOutside,
|
||||
y: points.shoulderDart.y - sa - 25,
|
||||
id: 'leftToStrap',
|
||||
})
|
||||
macro('hd', {
|
||||
from: pLeft,
|
||||
to: points.armhole,
|
||||
y: points.shoulderDart.y - sa - 35,
|
||||
id: 'leftToArmhole',
|
||||
})
|
||||
macro('hd', {
|
||||
from: pLeft,
|
||||
to: points.waistSide,
|
||||
y: points.dartBottomRight.y + sa + 25,
|
||||
id: 'leftToWaistSide',
|
||||
})
|
||||
macro('hd', {
|
||||
from: points.dartBottomRight,
|
||||
to: points.waistSide,
|
||||
y: points.dartBottomRight.y + sa + 15,
|
||||
id: 'dartToWaistSide',
|
||||
})
|
||||
|
||||
macro('vd', {
|
||||
from: points.dartBottomRight,
|
||||
to: pLeft,
|
||||
x: pLeft.x - sa - 15,
|
||||
id: 'leftToDart',
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.dartBottomRight,
|
||||
to: points.shoulderDart,
|
||||
x: pLeft.x - sa - 25,
|
||||
id: 'dartToDart',
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.dartBottomRight,
|
||||
to: points.strapOutside,
|
||||
x: points.armhole.x + sa + 35,
|
||||
id: 'dartToStrap',
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.waistSide,
|
||||
to: points.strapOutside,
|
||||
x: points.armhole.x + sa + 25,
|
||||
id: 'sideToStrap',
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.waistSide,
|
||||
to: points.armhole,
|
||||
x: points.armhole.x + sa + 15,
|
||||
id: 'sideToArmhole',
|
||||
})
|
||||
|
||||
return part
|
||||
},
|
||||
}
|
162
designs/tristan/src/backpoints.mjs
Normal file
|
@ -0,0 +1,162 @@
|
|||
import { backPoints as nobleBackPoints } from '@freesewing/noble'
|
||||
import { hidePresets } from '@freesewing/core'
|
||||
import { frontPoints } from './frontpoints.mjs'
|
||||
|
||||
export const backPoints = {
|
||||
name: 'tristan.backPoints',
|
||||
from: nobleBackPoints,
|
||||
after: frontPoints,
|
||||
hide: hidePresets.HIDE_ALL,
|
||||
draft: ({ points, Path, paths, options, snippets, macro, utils, store, part }) => {
|
||||
const lacing = true == options.lacing && 'back' == options.lacingLocation
|
||||
|
||||
// Hide Noble paths
|
||||
for (const key of Object.keys(paths)) paths[key].hide()
|
||||
for (const i in snippets) delete snippets[i]
|
||||
|
||||
delete points.bustDartLeft
|
||||
delete points.bustDartLeftCp
|
||||
|
||||
const strapWidth = store.get('strapWidth')
|
||||
|
||||
points.strapInside = points.shoulderDart.shiftTowards(points.hps, strapWidth / 2)
|
||||
points.strapOutside = points.shoulderDart.shiftTowards(points.shoulder, strapWidth / 2)
|
||||
|
||||
points.cbCut = new Path()
|
||||
.move(points.cbNeck)
|
||||
.curve_(points.cbNeckCp2, points.waistCenter)
|
||||
.shiftFractionAlong(options.cutDepthBack)
|
||||
|
||||
points.cbCutCp2 = new Path()
|
||||
.move(points.cbNeck)
|
||||
.curve_(points.cbNeckCp2, points.waistCenter)
|
||||
.split(points.cbCut)[1].ops[1].cp1
|
||||
|
||||
points.cutSeamInside = new Path()
|
||||
.move(points.dartBottomLeft)
|
||||
.curve(points.dartLeftCp, points.shoulderDartCpDown, points.dartTip)
|
||||
.curve(points.shoulderDartCpUp, points.shoulderDart, points.shoulderDart)
|
||||
.intersectsY(points.cbCut.y)[0]
|
||||
|
||||
points.cutSeamOutside = new Path()
|
||||
.move(points.shoulderDart)
|
||||
.curve(points.shoulderDart, points.shoulderDartCpUp, points.dartTip)
|
||||
.curve(points.shoulderDartCpDown, points.dartRightCp, points.dartBottomRight)
|
||||
.intersectsY(points.cbCut.y)[0]
|
||||
|
||||
points.cbCutCp = points.cbCut.shiftFractionTowards(
|
||||
points.cutSeamInside,
|
||||
1 - options.cutRoundnessBack
|
||||
)
|
||||
|
||||
points.strapInsideCp = points.strapInside.shiftFractionTowards(
|
||||
points.cutSeamInside.shift(
|
||||
points.cutSeamInside.angle(points.shoulderDart) + 90,
|
||||
strapWidth / 2
|
||||
),
|
||||
1 - options.cutRoundnessBack
|
||||
)
|
||||
|
||||
points.armholeCutCp = points.armhole.shift(
|
||||
180,
|
||||
options.armholeBackIn * points.armhole.dist(points.dartTip)
|
||||
)
|
||||
|
||||
points.strapOutsideCp = points.strapOutside.shiftFractionTowards(
|
||||
points.dartTip.shift(points.dartTip.angle(points.shoulderDart) - 90, strapWidth / 2),
|
||||
options.armholeFrontDepth
|
||||
)
|
||||
|
||||
if (lacing) {
|
||||
let lacingWidth = (points.strapInsideCp.x - points.cbCut.x) * options.lacingWidth
|
||||
if (points.waistCenter.dist(points.dartBottomLeft) < lacingWidth) {
|
||||
lacingWidth = points.waistCenter.dist(points.dartBottomLeft) * 0.95
|
||||
}
|
||||
points.lacingCut = points.cbCut.shift(0, lacingWidth)
|
||||
points.lacingWaist = points.waistCenter.shiftTowards(points.dartBottomLeft, lacingWidth)
|
||||
}
|
||||
|
||||
if (points.cbCutCp.x < (lacing ? points.lacingCut : points.cbCut).x) {
|
||||
points.cbCutCp.x = (lacing ? points.lacingCut : points.cbCut).x
|
||||
}
|
||||
|
||||
if (options.hem && !options.peplum) {
|
||||
const hemSize = store.get('hemSize')
|
||||
|
||||
const waistCenterHemTemp1 = (lacing ? points.lacingWaist : points.waistCenter).shiftTowards(
|
||||
lacing ? points.lacingCut : points.cbCut,
|
||||
hemSize
|
||||
)
|
||||
const dartBottomLeftHemTemp = waistCenterHemTemp1.shift(
|
||||
(lacing ? points.lacingWaist : points.cbWaist).angle(points.dartBottomLeft),
|
||||
(lacing ? points.lacingWaist : points.cbWaist).dist(points.dartBottomLeft) * 1.5
|
||||
)
|
||||
const waistCenterHemTemp2 = dartBottomLeftHemTemp.shiftOutwards(waistCenterHemTemp1, 100)
|
||||
|
||||
if (lacing) {
|
||||
points.waistCenterHem = utils.beamsIntersect(
|
||||
waistCenterHemTemp2,
|
||||
dartBottomLeftHemTemp,
|
||||
points.lacingWaist,
|
||||
points.cbCut
|
||||
)
|
||||
} else {
|
||||
points.waistCenterHem = utils.beamIntersectsCurve(
|
||||
waistCenterHemTemp2,
|
||||
dartBottomLeftHemTemp,
|
||||
points.waistCenter,
|
||||
points.waistCenter,
|
||||
points.cbCutCp2,
|
||||
lacing ? points.lacingCut : points.cbCut
|
||||
)
|
||||
}
|
||||
points.dartBottomLeftHem = utils.beamIntersectsCurve(
|
||||
waistCenterHemTemp2,
|
||||
dartBottomLeftHemTemp,
|
||||
points.dartBottomLeft,
|
||||
points.dartLeftCp,
|
||||
points.shoulderDartCpDown,
|
||||
points.dartTip
|
||||
)
|
||||
macro('mirror', {
|
||||
clone: false,
|
||||
mirror: [lacing ? points.lacingWaist : points.waistCenter, points.dartBottomLeft],
|
||||
points: ['waistCenterHem', 'dartBottomLeftHem'],
|
||||
})
|
||||
|
||||
const waistSideHemTemp1 = points.waistSide.shiftTowards(points.armhole, hemSize)
|
||||
const waistDartRightHemTemp = waistSideHemTemp1.shift(
|
||||
points.waistSide.angle(points.dartBottomRight),
|
||||
points.waistSide.dist(points.dartBottomRight) * 1.5
|
||||
)
|
||||
const waistSideHemTemp2 = waistDartRightHemTemp.shiftOutwards(waistSideHemTemp1, 100)
|
||||
|
||||
points.waistSideHem = utils.beamIntersectsCurve(
|
||||
waistSideHemTemp2,
|
||||
waistDartRightHemTemp,
|
||||
points.waistSide,
|
||||
points.waistSideCp2,
|
||||
points.armhole,
|
||||
points.armhole
|
||||
)
|
||||
points.dartBottomRightHem = utils.beamIntersectsCurve(
|
||||
waistSideHemTemp2,
|
||||
waistDartRightHemTemp,
|
||||
points.dartTip,
|
||||
points.shoulderDartCpDown,
|
||||
points.dartRightCp,
|
||||
points.dartBottomRight
|
||||
)
|
||||
macro('mirror', {
|
||||
clone: false,
|
||||
mirror: [points.dartBottomRight, points.waistSide],
|
||||
points: ['waistSideHem', 'dartBottomRightHem'],
|
||||
})
|
||||
}
|
||||
|
||||
store.set('backOutsideWaistLength', points.dartBottomRight.dist(points.waistSide))
|
||||
store.set('backInsideWaistLength', points.dartBottomLeft.dist(points.waistCenter))
|
||||
|
||||
return part
|
||||
},
|
||||
}
|
209
designs/tristan/src/frontinside.mjs
Normal file
|
@ -0,0 +1,209 @@
|
|||
import { frontPoints } from './frontpoints.mjs'
|
||||
|
||||
export const frontInside = {
|
||||
name: 'tristan.frontInside',
|
||||
from: frontPoints,
|
||||
draft: ({ store, sa, Point, points, Path, paths, Snippet, snippets, options, macro, part }) => {
|
||||
delete points.waistDartHem
|
||||
delete points.waistDartRight
|
||||
delete points.waistDartRightCp
|
||||
delete points.waistDartCpBottom
|
||||
delete points.bustDartBottom
|
||||
delete points.bustDartCpBottom
|
||||
delete points.bustDartTip
|
||||
delete points.bustDartTop
|
||||
delete points.shoulderDartTipCpDownOutside
|
||||
delete points.ex
|
||||
delete points.bustB
|
||||
delete points.shoulder
|
||||
delete points.shoulderDartShoulder
|
||||
delete points.shoulderDartOutside
|
||||
delete points.pitchMax
|
||||
delete points.armholeCpTarget
|
||||
delete points.armholePitch
|
||||
delete points.armholePitchCp1
|
||||
delete points.armholePitchCp2
|
||||
delete points.armhole
|
||||
delete points.armholeCp2
|
||||
delete points.bustDartCpTop
|
||||
delete points.bustSide
|
||||
delete points.bustDartMiddle
|
||||
delete points.bustDartEdge
|
||||
|
||||
const lacing = true == options.lacing && 'front' == options.lacingLocation
|
||||
|
||||
paths.cut = new Path()
|
||||
.move(points.strapInside)
|
||||
.curve(points.strapInsideCp, points.cfCutCp, lacing ? points.lacingCut : points.cfCut)
|
||||
|
||||
paths.insideSeamTemp = new Path()
|
||||
.move(points.waistDartLeft)
|
||||
.curve(points.waistDartLeftCp, points.shoulderDartTipCpDownInside, points.shoulderDartTip)
|
||||
.line(points.shoulderDartInside)
|
||||
.join(paths.cut)
|
||||
.hide()
|
||||
|
||||
if (options.hem && !options.peplum) {
|
||||
paths.insideSeam = new Path()
|
||||
.move(points.waistDartLeftHem)
|
||||
.line(points.waistDartLeft)
|
||||
.join(paths.insideSeamTemp)
|
||||
paths.hemFold = new Path()
|
||||
.move(lacing ? points.lacingWaist : points.cfWaist)
|
||||
.line(points.waistDartLeft)
|
||||
.addClass('note dashed')
|
||||
.addText('hem', 'center note')
|
||||
} else {
|
||||
paths.insideSeam = new Path()
|
||||
.move(lacing ? points.lacingWaist : points.cfWaist)
|
||||
.line(points.waistDartLeft)
|
||||
.join(paths.insideSeamTemp)
|
||||
}
|
||||
|
||||
const lacingPath = lacing
|
||||
? new Path().move(points.lacingCut).line(points.lacingWaist)
|
||||
: new Path().move(points.cfCut).line(points.cfWaist)
|
||||
if (options.hem && !options.peplum) {
|
||||
lacingPath.line(points.cfHem)
|
||||
}
|
||||
|
||||
paths.seam = paths.insideSeam.clone().join(lacingPath).close().attr('class', 'fabric')
|
||||
|
||||
store.set(
|
||||
'shoulderDartTipNotch',
|
||||
new Path()
|
||||
.move(points.waistDartLeft)
|
||||
.curve(points.waistDartLeftCp, points.shoulderDartTipCpDownInside, points.shoulderDartTip)
|
||||
.length()
|
||||
)
|
||||
|
||||
if (lacing) {
|
||||
store.cutlist.addCut({ cut: 2, from: 'fabric' })
|
||||
paths.originalSide = new Path()
|
||||
.move(points.lacingCut)
|
||||
.line(points.cfCut)
|
||||
.line(points.cfWaist)
|
||||
.line(points.lacingWaist)
|
||||
.setClass('note dashed')
|
||||
const pGrainLineTo = points.waistDartLeft.shift(135, 10)
|
||||
macro('grainline', {
|
||||
from: new Point(pGrainLineTo.x, points.cfCut.y),
|
||||
to: pGrainLineTo,
|
||||
grainline: true,
|
||||
})
|
||||
const lacingDistance = points.lacingWaist.y - points.lacingCut.y
|
||||
if (lacingDistance > 15 * 5) {
|
||||
const numberOfEyelets = Math.floor(lacingDistance / 15)
|
||||
const eyeletDistance = lacingDistance / (numberOfEyelets + 1)
|
||||
for (let i = 0; i < numberOfEyelets; i++) {
|
||||
points['eyelet' + i] = new Point(
|
||||
points.lacingCut.x + 10,
|
||||
points.lacingCut.y + i * eyeletDistance + eyeletDistance
|
||||
)
|
||||
snippets['eyelet' + i] = new Snippet('eyelet', points['eyelet' + i])
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ('front' == options.zipperLocation) {
|
||||
store.cutlist.addCut({ cut: 2, from: 'fabric' })
|
||||
macro('grainline', {
|
||||
from: points.cfCut.shift(315, 10),
|
||||
to: points.cfWaist.shift(45, 10),
|
||||
grainline: true,
|
||||
})
|
||||
} else {
|
||||
macro('cutonfold', {
|
||||
from: points.cfCut,
|
||||
to: points.cfWaist,
|
||||
grainline: true,
|
||||
})
|
||||
store.cutlist.addCut({ cut: 1, from: 'fabric' })
|
||||
}
|
||||
}
|
||||
|
||||
snippets.shoulderDartTip = new Snippet('notch', points.shoulderDartTip)
|
||||
|
||||
points.titleAnchor = points.waistDartLeft.shiftFractionTowards(
|
||||
lacing ? points.lacingCut : points.cfCut,
|
||||
0.75
|
||||
)
|
||||
macro('title', {
|
||||
at: points.titleAnchor,
|
||||
nr: 1,
|
||||
title: 'tristan:frontInside',
|
||||
})
|
||||
points.gridAnchor = points.hps.clone()
|
||||
|
||||
if (sa) {
|
||||
if ('front' == options.zipperLocation) {
|
||||
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
|
||||
} else {
|
||||
if (options.hem && !options.peplum) {
|
||||
paths.sa = new Path()
|
||||
.move(points.waistDartLeftHem)
|
||||
.join(paths.insideSeam.offset(sa))
|
||||
.line(lacing ? points.lacingCut : points.cfCut)
|
||||
.attr('class', 'fabric sa')
|
||||
} else {
|
||||
paths.sa = new Path()
|
||||
.move(lacing ? points.lacingWaist : points.cfWaist)
|
||||
.join(paths.insideSeam.offset(sa))
|
||||
.line(lacing ? points.lacingCut : points.cfCut)
|
||||
.attr('class', 'fabric sa')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
macro('hd', {
|
||||
from: lacing ? points.lacingWaist : points.cfWaist,
|
||||
to: points.shoulderDartInside,
|
||||
y: points.hps.y - 25,
|
||||
id: 'hpsToDart',
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.cfWaist,
|
||||
to: points.shoulderDartInside,
|
||||
x: 0 - 30,
|
||||
id: 'waistToDart',
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.cfWaist,
|
||||
to: points.shoulderDartTip,
|
||||
x: 0 - 10,
|
||||
id: 'waistToDartTip',
|
||||
})
|
||||
macro('hd', {
|
||||
from: lacing ? points.lacingWaist : points.cfWaist,
|
||||
to: points.shoulderDartTip,
|
||||
y: points.cfWaist.y + sa + 25,
|
||||
id: 'middleToDartTip',
|
||||
})
|
||||
|
||||
macro('vd', {
|
||||
from: points.cfWaist,
|
||||
to: lacing ? points.lacingCut : points.cfCut,
|
||||
x: 0 - 20,
|
||||
id: 'waistToNeck',
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.cfWaist,
|
||||
to: points.strapInside,
|
||||
x: 0 - 40,
|
||||
id: 'waistToHps',
|
||||
})
|
||||
macro('hd', {
|
||||
from: lacing ? points.lacingWaist : points.cfWaist,
|
||||
to: points.waistDartLeft,
|
||||
y: points.cfWaist.y + sa + 15,
|
||||
id: 'middleToDart',
|
||||
})
|
||||
macro('hd', {
|
||||
from: lacing ? points.lacingCut : points.cfCut,
|
||||
to: points.strapInside,
|
||||
y: points.strapInside.y - sa - 15,
|
||||
id: 'middleToHps',
|
||||
})
|
||||
|
||||
return part
|
||||
},
|
||||
}
|
188
designs/tristan/src/frontoutside.mjs
Normal file
|
@ -0,0 +1,188 @@
|
|||
import { frontPoints } from './frontpoints.mjs'
|
||||
import { frontInside } from './frontinside.mjs'
|
||||
|
||||
export const frontOutside = {
|
||||
name: 'tristan.frontOutside',
|
||||
from: frontPoints,
|
||||
after: frontInside,
|
||||
draft: ({ store, sa, points, Path, paths, Snippet, snippets, options, macro, part }) => {
|
||||
delete points.bustDartTop
|
||||
delete points.bustSide
|
||||
delete points.bustDartMiddle
|
||||
delete points.bustDartBottom
|
||||
delete points.bustDartCpBottom
|
||||
delete points.bustB
|
||||
delete points.bustDartEdge
|
||||
|
||||
paths.cut = new Path()
|
||||
.move(points.armhole)
|
||||
.curve(points.armholeCutCp, points.strapOutsideCp, points.strapOutside)
|
||||
.hide()
|
||||
|
||||
paths.princessSeam = new Path()
|
||||
.move(points.shoulderDartOutside)
|
||||
.curve(
|
||||
points.shoulderDartTipCpDownOutside,
|
||||
points.waistUpDartRightCpUp,
|
||||
points.waistUpDartRight
|
||||
)
|
||||
.curve(points.waistUpDartRightCpDown, points.waistCpUp, points.waistDartRight)
|
||||
.hide()
|
||||
|
||||
paths.armhole = new Path()
|
||||
.move(points.armhole)
|
||||
.curve(points.armholeCp2, points.armholePitchCp1, points.armholePitch)
|
||||
.curve_(points.armholePitchCp2, points.shoulder)
|
||||
.hide()
|
||||
|
||||
if (options.hem && !options.peplum) {
|
||||
paths.hem = new Path()
|
||||
.move(points.waistDartRight)
|
||||
.line(points.waistDartRightHem)
|
||||
.line(points.sideWaistHem)
|
||||
.line(points.sideWaist)
|
||||
.hide()
|
||||
paths.hemFold = new Path()
|
||||
.move(points.waistDartRight)
|
||||
.line(points.sideWaist)
|
||||
.addClass('note dashed')
|
||||
.addText('hem', 'center note')
|
||||
} else {
|
||||
paths.hem = new Path().move(points.waistDartRight).line(points.sideWaist).hide()
|
||||
}
|
||||
|
||||
paths.seamSA = new Path()
|
||||
.move(points.sideWaist)
|
||||
.line(points.armhole)
|
||||
.join(paths.cut)
|
||||
.line(points.shoulderDartOutside)
|
||||
.join(paths.princessSeam)
|
||||
.line(points.waistDartRight)
|
||||
.hide()
|
||||
|
||||
paths.seam = paths.seamSA.clone().join(paths.hem).close().unhide().attr('class', 'fabric')
|
||||
|
||||
points.grainTop = points.armhole.shift(225, 20)
|
||||
points.grainBottom = points.sideWaistInitial.shift(135, 20)
|
||||
macro('grainline', {
|
||||
from: points.grainBottom,
|
||||
to: points.grainTop,
|
||||
})
|
||||
|
||||
store.cutlist.addCut({ cut: 2, from: 'fabric' })
|
||||
|
||||
points.snippet = paths.princessSeam.shiftAlong(
|
||||
paths.princessSeam.length() - store.get('shoulderDartTipNotch')
|
||||
)
|
||||
snippets.shoulderDartTip = new Snippet('notch', points.snippet)
|
||||
|
||||
points.titleAnchor = points.waistDartRight
|
||||
.shiftFractionTowards(points.armhole, 0.3)
|
||||
.shiftFractionTowards(points.shoulderDartOutside, 0.2)
|
||||
macro('title', {
|
||||
at: points.titleAnchor,
|
||||
nr: 2,
|
||||
title: 'tristan:frontOutside',
|
||||
})
|
||||
points.gridAnchor = points.armholeCpTarget.clone()
|
||||
|
||||
points.scaleboxAnchor = points.titleAnchor.shiftFractionTowards(points.sideWaist, 0.5)
|
||||
points.scaleboxAnchor.x = points.titleAnchor.x
|
||||
macro('miniscale', { at: points.scaleboxAnchor })
|
||||
|
||||
if (sa) {
|
||||
if (options.hem && !options.peplum) {
|
||||
paths.sa = new Path()
|
||||
.move(points.sideWaistHem)
|
||||
.join(
|
||||
new Path()
|
||||
.move(points.sideWaistHem)
|
||||
.join(paths.seamSA)
|
||||
.line(points.waistDartRightHem)
|
||||
.offset(sa)
|
||||
)
|
||||
.line(points.waistDartRightHem)
|
||||
.attr('class', 'fabric sa')
|
||||
} else {
|
||||
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
|
||||
}
|
||||
}
|
||||
|
||||
const pLeft = paths.princessSeam.edge('left')
|
||||
macro('hd', {
|
||||
from: points.waistDartRight,
|
||||
to: points.armholeOutsidePitchCp1,
|
||||
y: points.sideWaistInitial.y + sa + 35,
|
||||
id: 'dartToArmhole',
|
||||
})
|
||||
macro('hd', {
|
||||
from: points.waistDartRight,
|
||||
to: points.sideWaistInitial,
|
||||
y: points.sideWaistInitial.y + sa + 25,
|
||||
id: 'dartToSide',
|
||||
})
|
||||
macro('hd', {
|
||||
from: pLeft,
|
||||
to: points.sideWaistInitial,
|
||||
y: points.sideWaistInitial.y + sa + 15,
|
||||
id: 'leftToSide',
|
||||
})
|
||||
macro('hd', {
|
||||
from: points.shoulderDartOutside,
|
||||
to: points.strapOutside,
|
||||
y: points.shoulderDartOutside.y - sa - 15,
|
||||
id: 'dartToShoulder',
|
||||
})
|
||||
macro('hd', {
|
||||
from: points.snippet,
|
||||
to: points.strapOutside,
|
||||
y: points.shoulderDartOutside.y - sa - 25,
|
||||
id: 'dartPointToShoulder',
|
||||
})
|
||||
macro('hd', {
|
||||
from: pLeft,
|
||||
to: points.strapOutside,
|
||||
y: points.shoulderDartOutside.y - sa - 35,
|
||||
id: 'leftToShoulder',
|
||||
})
|
||||
|
||||
macro('vd', {
|
||||
from: points.armholeOutsidePitchCp1,
|
||||
to: points.sideWaistInitial,
|
||||
x: points.sideWaistInitial.x + sa + 15,
|
||||
id: 'waistToArmhole',
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.waistDartRight,
|
||||
to: pLeft,
|
||||
x: pLeft.x - sa - 15,
|
||||
id: 'waistToLeft',
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.strapOutside,
|
||||
to: points.sideWaistInitial,
|
||||
x: points.sideWaistInitial.x + sa + 25,
|
||||
id: 'waistToShoulder',
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.shoulderDartOutside,
|
||||
to: points.sideWaistInitial,
|
||||
x: points.shoulderDartOutside.x,
|
||||
id: 'sideWaistToShoulderDart',
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.waistDartRight,
|
||||
to: points.shoulderDartOutside,
|
||||
x: pLeft.x - sa - 25,
|
||||
id: 'waistToShoulderDart',
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.snippet,
|
||||
to: points.shoulderDartOutside,
|
||||
x: pLeft.x - sa - 15,
|
||||
id: 'shoulderDartToDartPoint',
|
||||
})
|
||||
|
||||
return part
|
||||
},
|
||||
}
|
240
designs/tristan/src/frontpoints.mjs
Normal file
|
@ -0,0 +1,240 @@
|
|||
import { frontPoints as nobleFrontPoints } from '@freesewing/noble'
|
||||
import { pctBasedOn, hidePresets } from '@freesewing/core'
|
||||
|
||||
export const frontPoints = {
|
||||
name: 'tristan.frontPoints',
|
||||
from: nobleFrontPoints,
|
||||
hide: hidePresets.HIDE_ALL,
|
||||
options: {
|
||||
// Static
|
||||
armholeBackDepth: 0.6,
|
||||
armholeBackIn: 0.6,
|
||||
armholeDartPosition: 0.5,
|
||||
armholeFrontDepth: 0.65,
|
||||
armholeFrontIn: 0.2,
|
||||
backArmholeCurvature: 0.63,
|
||||
backArmholePitchDepth: 0.035,
|
||||
backArmholeSlant: 5,
|
||||
backDartHeight: 0.46,
|
||||
backHemSlope: 2.5,
|
||||
backNeckCutout: 0.06,
|
||||
bustDartCurve: 1,
|
||||
bustDartLength: 0.9,
|
||||
dartPosition: 'shoulder',
|
||||
frontArmholeCurvature: 0.63,
|
||||
frontArmholePitchDepth: 0.29,
|
||||
shoulderToShoulderCorrection: 0.995,
|
||||
|
||||
// Percentages
|
||||
bustSpanEase: { pct: 0, min: -5, max: 20, ...pctBasedOn('bustSpan'), menu: 'fit' },
|
||||
armholeDepth: { pct: 44, min: 38, max: 55, menu: 'style' },
|
||||
cutDepthBack: { pct: 40, min: 5, max: 90, menu: 'style' },
|
||||
cutDepthFront: { pct: 80, min: 0, max: 125, menu: 'style' },
|
||||
cutRoundnessBack: { pct: 20, min: 0, max: 100, menu: 'style' },
|
||||
cutRoundnessFront: { pct: 10, min: 0, max: 100, menu: 'style' },
|
||||
shoulderDartPosition: { pct: 50, min: 10, max: 90, menu: 'style' },
|
||||
strapWidth: { pct: 45, min: 5, max: 90, menu: 'style' },
|
||||
hemSize: {
|
||||
pct: 5.62,
|
||||
min: 1,
|
||||
max: 25,
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
menu: (settings, mergedOptions) =>
|
||||
mergedOptions.hem === false || mergedOptions.peplum === true ? false : 'options',
|
||||
},
|
||||
upperDartLength: { pct: 90, min: 80, max: 95, menu: 'advanced' },
|
||||
waistDartLength: { pct: 90, min: 75, max: 95, menu: 'advanced' },
|
||||
|
||||
// Options
|
||||
zipperLocation: { dflt: 'side', list: ['front', 'side', 'back'], menu: 'options' },
|
||||
hem: {
|
||||
bool: false,
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
menu: (settings, mergedOptions) => (mergedOptions.peplum === true ? false : 'options'),
|
||||
},
|
||||
lacing: { bool: true, menu: 'options' },
|
||||
lacingLocation: {
|
||||
dflt: 'front',
|
||||
list: ['front', 'back'],
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
menu: (settings, mergedOptions) => (mergedOptions.lacing === false ? false : 'options'),
|
||||
},
|
||||
lacingWidth: {
|
||||
pct: 20,
|
||||
min: 0,
|
||||
max: 50,
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
menu: (settings, mergedOptions) => (mergedOptions.lacing === false ? false : 'options'),
|
||||
},
|
||||
},
|
||||
draft: ({ points, Path, paths, snippets, options, macro, store, utils, units, part }) => {
|
||||
const lacing = true == options.lacing && 'front' == options.lacingLocation
|
||||
|
||||
// Hide Noble paths
|
||||
for (const key of Object.keys(paths)) paths[key].hide()
|
||||
for (const i in snippets) delete snippets[i]
|
||||
|
||||
// Remove macros from Noble
|
||||
macro('rmtitle')
|
||||
macro('rmscalebox')
|
||||
macro('rmcutonfold')
|
||||
|
||||
points.sideWaist = points.sideHem.clone()
|
||||
points.sideWaistInitial = points.sideHemInitial.clone()
|
||||
points.cfWaist = points.cfHem.clone()
|
||||
|
||||
store.cutlist.removeCut()
|
||||
|
||||
const shoulderWidthInside = points.shoulderDartInside.dist(points.hps)
|
||||
const shoulderWidthOutside = points.shoulderDartOutside.dist(points.shoulder)
|
||||
let strapWidth = (shoulderWidthInside + shoulderWidthOutside) * options.strapWidth
|
||||
|
||||
if (strapWidth / 2 > shoulderWidthInside) {
|
||||
strapWidth = shoulderWidthInside * 2
|
||||
}
|
||||
if (strapWidth / 2 > shoulderWidthOutside) {
|
||||
strapWidth = shoulderWidthOutside * 2
|
||||
}
|
||||
store.set('strapWidth', strapWidth)
|
||||
|
||||
if (strapWidth != (shoulderWidthInside + shoulderWidthOutside) * options.strapWidth) {
|
||||
store.flag.info({
|
||||
msg: 'tristan:strapWidthAdjusted',
|
||||
replace: {
|
||||
width: units(strapWidth),
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
points.strapInside = points.shoulderDartInside.shiftTowards(points.hps, strapWidth / 2)
|
||||
points.strapOutside = points.shoulderDartOutside.shiftTowards(points.shoulder, strapWidth / 2)
|
||||
|
||||
points.cfCut = points.cfNeck.shiftFractionTowards(points.cfBust, options.cutDepthFront)
|
||||
|
||||
paths.cutSeamInside = new Path()
|
||||
.move(points.waistDartLeft)
|
||||
.curve(points.waistDartLeftCp, points.shoulderDartTipCpDownInside, points.shoulderDartTip)
|
||||
.line(points.shoulderDartInside)
|
||||
.hide()
|
||||
points.cutSeamInside = paths.cutSeamInside.intersectsY(points.cfCut.y)[0]
|
||||
|
||||
points.cutSeamOutside = new Path()
|
||||
.move(points.waistDartRight)
|
||||
.curve(points.waistCpUp, points.waistUpDartRightCpDown, points.waistUpDartRight)
|
||||
.curve(
|
||||
points.waistUpDartRightCpUp,
|
||||
points.shoulderDartTipCpDownOutside,
|
||||
points.shoulderDartOutside
|
||||
)
|
||||
.intersectsY(points.cfCut.y)[0]
|
||||
|
||||
points.cfCutCp = points.cfCut.shiftFractionTowards(
|
||||
points.cutSeamInside,
|
||||
1 - options.cutRoundnessFront
|
||||
)
|
||||
points.strapInsideCp = points.strapInside.shiftFractionTowards(
|
||||
points.cutSeamInside.shift(
|
||||
points.cutSeamInside.angle(points.shoulderDartInside) + 90,
|
||||
strapWidth / 2
|
||||
),
|
||||
1 - options.cutRoundnessFront
|
||||
)
|
||||
|
||||
points.armholeCutCp = points.armhole.shiftFractionTowards(
|
||||
points.bustDartTip,
|
||||
options.armholeFrontIn
|
||||
)
|
||||
|
||||
points.strapOutsideCp = points.strapOutside.shiftFractionTowards(
|
||||
points.bustDartTip.shift(
|
||||
points.cutSeamOutside.angle(points.shoulderDartOutside) - 90,
|
||||
strapWidth / 2
|
||||
),
|
||||
options.armholeFrontDepth
|
||||
)
|
||||
|
||||
if (points.strapOutsideCp.x > points.armholeDartCpBottom.x) {
|
||||
points.strapOutsideCp.x = points.armholeDartCpBottom.x
|
||||
}
|
||||
if (points.strapOutsideCp.y > points.armholeDartCpBottom.y) {
|
||||
points.strapOutsideCp.y = points.armholeDartCpBottom.y
|
||||
}
|
||||
|
||||
// armhole adjustment
|
||||
// if (points.sideWaist.y < points.waistDartRight.y) {
|
||||
// points.sideWaist.y = points.waistDartRight.y
|
||||
// }
|
||||
|
||||
if (lacing) {
|
||||
points.lacingCut = points.cfCut.shift(
|
||||
0,
|
||||
(points.strapInsideCp.x - points.cfCut.x) * options.lacingWidth
|
||||
)
|
||||
points.lacingWaist = points.cfWaist.shiftTowards(
|
||||
points.waistDartLeft,
|
||||
(points.strapInsideCp.x - points.cfCut.x) * options.lacingWidth
|
||||
)
|
||||
}
|
||||
|
||||
if (options.hem && !options.peplum) {
|
||||
const hemSize = points.cfWaist.dist(points.cfNeck) * options.hemSize
|
||||
store.set('hemSize', hemSize)
|
||||
|
||||
points.cfHem = (lacing ? points.lacingCut : points.cfCut).shiftOutwards(
|
||||
lacing ? points.lacingWaist : points.cfWaist,
|
||||
hemSize
|
||||
)
|
||||
points.cfHemIn = (lacing ? points.lacingWaist : points.cfWaist).shiftTowards(
|
||||
lacing ? points.lacingCut : points.cfCut,
|
||||
hemSize
|
||||
)
|
||||
const waistDartLeftHemInTemp = points.cfHemIn.shift(
|
||||
points.cfWaist.angle(points.waistDartLeft),
|
||||
points.cfWaist.dist(points.waistDartLeft) * 1.5
|
||||
)
|
||||
points.waistDartLeftHem = utils.beamIntersectsCurve(
|
||||
points.cfHemIn,
|
||||
waistDartLeftHemInTemp,
|
||||
points.waistDartLeft,
|
||||
points.waistDartLeftCp,
|
||||
points.shoulderDartTipCpDownInside,
|
||||
points.shoulderDartTip
|
||||
)
|
||||
|
||||
points.sideWaistHem = points.armhole.shiftOutwards(points.sideWaist, hemSize)
|
||||
points.sideWaistHemIn = points.sideWaist.shiftTowards(points.armhole, hemSize)
|
||||
const waistDartRightHemInTemp = points.sideWaistHemIn.shift(
|
||||
points.sideWaist.angle(points.waistDartRight),
|
||||
points.sideWaist.dist(points.waistDartRight) * 1.5
|
||||
)
|
||||
points.waistDartRightHem = utils.beamIntersectsCurve(
|
||||
points.sideWaistHemIn,
|
||||
waistDartRightHemInTemp,
|
||||
points.waistDartRight,
|
||||
points.waistDartRightCp,
|
||||
points.waistUpDartRightCpDown,
|
||||
points.waistUpDartRight
|
||||
)
|
||||
macro('mirror', {
|
||||
clone: false,
|
||||
mirror: [points.cfWaist, points.waistDartLeft],
|
||||
points: ['waistDartLeftHem'],
|
||||
})
|
||||
macro('mirror', {
|
||||
clone: false,
|
||||
mirror: [points.sideWaist, points.waistDartRight],
|
||||
points: ['waistDartRightHem'],
|
||||
})
|
||||
}
|
||||
|
||||
store.set('frontOutsideWaistLength', points.waistDartRight.dist(points.sideWaist))
|
||||
store.set(
|
||||
'frontInsideWaistLength',
|
||||
points.waistDartLeft.dist(lacing ? points.lacingWaist : points.cfWaist)
|
||||
)
|
||||
store.set('frontLength', points.cfNeck.dist(points.cfWaist))
|
||||
store.set('sideSeamLength', points.armhole.dist(points.sideWaist))
|
||||
|
||||
return part
|
||||
},
|
||||
}
|
43
designs/tristan/src/index.mjs
Normal file
|
@ -0,0 +1,43 @@
|
|||
//
|
||||
|
||||
import { Design } from '@freesewing/core'
|
||||
import { i18n } from '../i18n/index.mjs'
|
||||
import { data } from '../data.mjs'
|
||||
// Parts
|
||||
import { frontPoints } from './frontpoints.mjs'
|
||||
import { frontInside } from './frontinside.mjs'
|
||||
import { frontOutside } from './frontoutside.mjs'
|
||||
import { backPoints } from './backpoints.mjs'
|
||||
import { backInside } from './backinside.mjs'
|
||||
import { backOutside } from './backoutside.mjs'
|
||||
import { peplumFront } from './peplumFront.mjs'
|
||||
import { peplumBack } from './peplumBack.mjs'
|
||||
|
||||
// Create new design
|
||||
const Tristan = new Design({
|
||||
data,
|
||||
parts: [
|
||||
frontPoints,
|
||||
frontInside,
|
||||
frontOutside,
|
||||
backPoints,
|
||||
backInside,
|
||||
backOutside,
|
||||
peplumFront,
|
||||
peplumBack,
|
||||
],
|
||||
})
|
||||
|
||||
// Named exports
|
||||
export {
|
||||
frontPoints,
|
||||
frontInside,
|
||||
frontOutside,
|
||||
backPoints,
|
||||
backInside,
|
||||
backOutside,
|
||||
peplumFront,
|
||||
peplumBack,
|
||||
i18n,
|
||||
Tristan,
|
||||
}
|
32
designs/tristan/src/peplumBack.mjs
Normal file
|
@ -0,0 +1,32 @@
|
|||
import { plugin as ringsectorPlugin } from '@freesewing/plugin-ringsector'
|
||||
import { CreateShape, peplumFront } from './peplumFront.mjs'
|
||||
|
||||
export const peplumBack = {
|
||||
name: 'tristan.peplumBack',
|
||||
after: peplumFront,
|
||||
plugins: [ringsectorPlugin],
|
||||
draft: ({ points, paths, options, store, macro, sa, part }) => {
|
||||
if (false == options.peplum) {
|
||||
return part.hide()
|
||||
}
|
||||
|
||||
const radius = store.get('peplumRadius')
|
||||
const width = store.get('peplumWidth')
|
||||
const ratio = store.get('peplumratio')
|
||||
|
||||
CreateShape({
|
||||
points: points,
|
||||
paths: paths,
|
||||
options: options,
|
||||
macro: macro,
|
||||
store: store,
|
||||
sa: sa,
|
||||
type: 'back',
|
||||
radius: radius,
|
||||
width: width,
|
||||
ratio: 1 - ratio,
|
||||
})
|
||||
|
||||
return part
|
||||
},
|
||||
}
|
143
designs/tristan/src/peplumFront.mjs
Normal file
|
@ -0,0 +1,143 @@
|
|||
import { backPoints } from './backpoints.mjs'
|
||||
import { plugin as ringsectorPlugin } from '@freesewing/plugin-ringsector'
|
||||
|
||||
export const CreateShape = ({
|
||||
points,
|
||||
paths,
|
||||
options,
|
||||
macro,
|
||||
store,
|
||||
sa,
|
||||
type,
|
||||
radius,
|
||||
width,
|
||||
ratio,
|
||||
}) => {
|
||||
const double =
|
||||
type == options.zipperLocation || (true == options.lacing && type == options.lacingLocation)
|
||||
|
||||
macro('ringsector', {
|
||||
id: type + 'Peblum',
|
||||
angle: (options.peplumFullness / 2) * ratio * (double ? 0.5 : 1),
|
||||
insideRadius: radius,
|
||||
outsideRadius: radius + width,
|
||||
rotate: false,
|
||||
})
|
||||
|
||||
macro('cutOnFold', {
|
||||
id: type,
|
||||
from: points['__macro_ringsector_' + type + 'Peblum_in2Flipped'],
|
||||
to: points['__macro_ringsector_' + type + 'Peblum_ex2Flipped'],
|
||||
})
|
||||
|
||||
points[type + 'TitleAnchor'] = points[
|
||||
'__macro_ringsector_' + type + 'Peblum_in2FlippedRotated'
|
||||
].shiftFractionTowards(points['__macro_ringsector_' + type + 'Peblum_ex2FlippedRotated'], 0.5)
|
||||
|
||||
store.cutlist.addCut({ cut: double ? 2 : 1, from: 'fabric', onFold: true })
|
||||
|
||||
macro('title', {
|
||||
nr: 10 + ('front' == type ? 0 : 1),
|
||||
at: points[type + 'TitleAnchor'],
|
||||
id: type + 'Peplum',
|
||||
title: 'tristan:' + type + 'Peplum',
|
||||
align: 'center',
|
||||
scale: options.peplumSize * 2,
|
||||
})
|
||||
|
||||
if (sa)
|
||||
paths[type + 'SA'] = paths['__macro_ringsector_' + type + 'Peblum_path']
|
||||
.offset(sa)
|
||||
.attr('class', 'fabric sa')
|
||||
|
||||
macro('hd', {
|
||||
id: 'topWidth',
|
||||
from: points['__macro_ringsector_' + type + 'Peblum_in2Flipped'],
|
||||
to: points['__macro_ringsector_' + type + 'Peblum_in1Rotated'],
|
||||
y: points['__macro_ringsector_' + type + 'Peblum_in1Rotated'].y - 15 - sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'bottomWidth',
|
||||
from: points['__macro_ringsector_' + type + 'Peblum_ex2Flipped'],
|
||||
to: points['__macro_ringsector_' + type + 'Peblum_ex1Rotated'],
|
||||
y: points['__macro_ringsector_' + type + 'Peblum_ex1Rotated'].y + 15 + sa,
|
||||
})
|
||||
macro('ld', {
|
||||
id: 'width',
|
||||
from: points['__macro_ringsector_' + type + 'Peblum_in1Rotated'],
|
||||
to: points['__macro_ringsector_' + type + 'Peblum_ex1Rotated'],
|
||||
d: 15 + sa,
|
||||
})
|
||||
}
|
||||
|
||||
export const peplumFront = {
|
||||
name: 'tristan.peplumFront',
|
||||
after: backPoints,
|
||||
options: {
|
||||
// Options
|
||||
peplum: { bool: false, menu: 'options' },
|
||||
peplumSize: {
|
||||
pct: 10,
|
||||
min: 5,
|
||||
max: 250,
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
menu: (settings, mergedOptions) => (mergedOptions.peplum === false ? false : 'peplum'),
|
||||
},
|
||||
peplumFullness: {
|
||||
deg: 180,
|
||||
min: 180,
|
||||
max: 360,
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
menu: (settings, mergedOptions) => (mergedOptions.peplum === false ? false : 'peplum'),
|
||||
},
|
||||
},
|
||||
plugins: [ringsectorPlugin],
|
||||
draft: ({ sa, Point, points, paths, options, macro, store, units, part }) => {
|
||||
if (false == options.peplum) {
|
||||
return part.hide()
|
||||
}
|
||||
const backInsideWaistLength = store.get('backInsideWaistLength')
|
||||
const backOutsideWaistLength = store.get('backOutsideWaistLength')
|
||||
const frontInsideWaistLength = store.get('frontInsideWaistLength')
|
||||
const frontOutsideWaistLength = store.get('frontOutsideWaistLength')
|
||||
const length =
|
||||
backInsideWaistLength +
|
||||
backOutsideWaistLength +
|
||||
frontInsideWaistLength +
|
||||
frontOutsideWaistLength
|
||||
|
||||
const radius = ((length / Math.PI) * (360 / options.peplumFullness)) / 2
|
||||
const width = options.peplumSize * store.get('frontLength')
|
||||
|
||||
const frontLength = frontInsideWaistLength + frontOutsideWaistLength
|
||||
const ratio = frontLength / length
|
||||
|
||||
store.set('peplumRadius', radius)
|
||||
store.set('peplumWidth', width)
|
||||
store.set('peplumratio', ratio)
|
||||
|
||||
store.flag.note({
|
||||
msg: `tristan:peplumWidth`,
|
||||
replace: {
|
||||
peblumWidth: units(width),
|
||||
},
|
||||
})
|
||||
|
||||
CreateShape({
|
||||
Point: Point,
|
||||
points: points,
|
||||
paths: paths,
|
||||
options: options,
|
||||
macro: macro,
|
||||
store: store,
|
||||
sa: sa,
|
||||
type: 'front',
|
||||
radius: radius,
|
||||
width: width,
|
||||
offset: 0,
|
||||
ratio: ratio,
|
||||
})
|
||||
|
||||
return part
|
||||
},
|
||||
}
|
20
designs/tristan/tests/shared.test.mjs
Normal file
|
@ -0,0 +1,20 @@
|
|||
// This file is auto-generated | Any changes you make will be overwritten.
|
||||
import { Tristan, i18n } from '../src/index.mjs'
|
||||
|
||||
// Shared tests
|
||||
import { testPatternConfig } from '../../../tests/designs/config.mjs'
|
||||
import { testPatternI18n } from '../../../tests/designs/i18n.mjs'
|
||||
import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
|
||||
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
|
||||
|
||||
// Test config
|
||||
testPatternConfig(Tristan)
|
||||
|
||||
// Test translation
|
||||
testPatternI18n(Tristan, i18n)
|
||||
|
||||
// Test drafting - Change the second parameter to `true` to log errors
|
||||
testPatternDrafting(Tristan, false)
|
||||
|
||||
// Test sampling - Change the second parameter to `true` to log errors
|
||||
testPatternSampling(Tristan, false)
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Waist dart position"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **waist dart position** option controls the position of the waist 'dart', moving it to the center (negative) or side (positive).
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Waist dart position"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **waist dart position** option controls the position of the waist 'dart', moving it to the center (negative) or side (positive).
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Waist dart position"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **waist dart position** option controls the position of the waist 'dart', moving it to the center (negative) or side (positive).
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Waist dart position"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **waist dart position** option controls the position of the waist 'dart', moving it to the center (negative) or side (positive).
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Waist dart position"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **waist dart position** option controls the position of the waist 'dart', moving it to the center (negative) or side (positive).
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Waist dart position"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **waist dart position** option controls the position of the waist 'dart', moving it to the center (negative) or side (positive).
|
||||
|
||||
|
||||
|
||||
|
25
markdown/org/docs/designs/tristan/cutting/en.md
Normal file
|
@ -0,0 +1,25 @@
|
|||
---
|
||||
title: "Tristan Top: Cutting Instructions"
|
||||
---
|
||||
|
||||
In **all versions**:
|
||||
|
||||
- Cut 2 **Front Outside** parts with _good sides together_.
|
||||
- Cut 2 **Back Outside** parts with _good sides together_.
|
||||
- Cut 2 **Back Inside** parts with _good sides together_.
|
||||
|
||||
Depending on your choice of closure, also cut the following parts.
|
||||
|
||||
With a **back zip**, **side zip**, or **lace-up back (with or without side zip)** closure:
|
||||
|
||||
- Cut 1 **Front Inside** part on the fold.
|
||||
|
||||
With a **lace-up front** closure:
|
||||
|
||||
- Cut 2 **Front Inside** parts with _good sides together_.
|
||||
|
||||
If you choose to add a peplum:
|
||||
|
||||
- Cut 1 **Peplum**.
|
||||
|
||||
In **all versions**, if you want to line your top, cut the same parts out of your lining fabric.
|
8
markdown/org/docs/designs/tristan/en.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
title: "Tristan top"
|
||||
---
|
||||
|
||||
|
||||
|
||||
<DesignInfo design='tristan' docs />
|
||||
|
17
markdown/org/docs/designs/tristan/fabric/en.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
title: "Tristan top: Fabric Options"
|
||||
---
|
||||
|
||||
Tristan is designed for woven fabrics with little to no stretch.
|
||||
|
||||
For the **main fabric**, you can use most non-stretch fabrics, such as poplin, jacquard, or linen. Even quilting cotton will work. Fabrics with some structure will work best.
|
||||
|
||||
For the **lining**, if you would like a firm structure even without the use of boning, use a strong fabric, such as canvas, twill, or denim. Use something that will be comfortable against the skin.
|
||||
|
||||
<Tip>
|
||||
|
||||
##### Consider using contrasting fabrics
|
||||
|
||||
Consider using different fabrics for the inside and outside panels to highlight the prince(ss) seams.
|
||||
|
||||
</Tip>
|
138
markdown/org/docs/designs/tristan/instructions/en.md
Normal file
|
@ -0,0 +1,138 @@
|
|||
---
|
||||
title: "Tristan top: Sewing Instructions"
|
||||
---
|
||||
|
||||
<Note>
|
||||
##### There are many ways to sew a Tristan
|
||||
These instructions are for a lined Tristan top with a center-front lacing closure and bias binding at the neckline, armhole, and hem.
|
||||
</Note>
|
||||
|
||||
### Step 1: Cut your pieces
|
||||
|
||||

|
||||
|
||||
Cut your pattern pieces. If you would like to add embroidery or other decoration, now is a good time to do so.
|
||||
|
||||
<Note>
|
||||
|
||||
##### Finishing methods affect the seam allowance
|
||||
|
||||
If using bias binding, you should cut the neckline and armholes without seam allowance.
|
||||
|
||||
</Note>
|
||||
|
||||
### Step 2: Sew the back inside parts together at center back
|
||||
|
||||

|
||||
|
||||
Align the back inside (Part 3) parts at center back. Sew them together with _good sides together_.
|
||||
|
||||
### Step 3: Attach back outside parts
|
||||
|
||||

|
||||
|
||||
Attach one back outside (Part 4) part to its matching back inside (Part 3) part, _good sides together_, making sure to match any notches.
|
||||
|
||||
Do the same for the other back outside (Part 4) part.
|
||||
|
||||
### Step 4: Attach front outside parts at the side seams
|
||||
|
||||

|
||||
|
||||
Attach one front outside (Part 2) part to its matching back outside (Part 3) part, _good sides together_.
|
||||
|
||||
Do the same for the other front outside (Part 2) part.
|
||||
|
||||
### Step 5: Attach front inside parts
|
||||
|
||||

|
||||
|
||||
Finally, attach one front inside (Part 1) part to its matching front inside (Part 2) part, _good sides together_.
|
||||
|
||||
Do the same for the other front inside (Part 1) part.
|
||||
|
||||

|
||||
|
||||
Press all the seam allowances flat.
|
||||
|
||||
### Step 6: Sew at the shoulders
|
||||
|
||||

|
||||
|
||||
Sew at the shoulders to complete each armhole. Sew _good sides together_.
|
||||
|
||||
Press the seam allowances open.
|
||||
|
||||
<Note>
|
||||
##### Check the fit
|
||||
This is a good time to try on your garment and make any small adjustments. For example, if your shoulders have a different slope, you could make one shoulder strap a little shorter.
|
||||
</Note>
|
||||
|
||||
### Step 7: Repeat with lining fabric
|
||||
|
||||

|
||||
|
||||
Repeat Steps 1 through 6 with your lining fabric.
|
||||
|
||||
You will now have two identical pieces, one with your main fabric and one with your lining.
|
||||
|
||||
Turn your lining piece inside out.
|
||||
|
||||
The red arrows in the illustration are to help you identify the center insides in the next step.
|
||||
|
||||
### Step 8: Begin the closure by sewing down center front
|
||||
|
||||

|
||||
|
||||
Place the center insides of the main and lining together, _good sides together_. This will become one side of your front opening.
|
||||
|
||||
Sew down center front.
|
||||
|
||||
Open flat.
|
||||
|
||||
### Step 9: Sew your first boning channel
|
||||
|
||||

|
||||
|
||||
Turn right side out -- that is, put the two pieces together, _bad sides together_ -- and press.
|
||||
|
||||
Sew 2 mm (0.1 inch) in from center edge.
|
||||
|
||||
Allow enough space for your boning, then sew again.
|
||||
|
||||
Repeat Steps 8 through 10 on the other side.
|
||||
|
||||
<Note>
|
||||
##### Leave enough room for your boning
|
||||
Leave enough wiggle room to allow you to insert your boning. You want the channel to be snug, but not too tight.
|
||||
</Note>
|
||||
|
||||
### Step 10: Sew your second boning channel
|
||||
|
||||

|
||||
|
||||
Mark the locations of your eyelets. Allow enough space to install these later, then sew again.
|
||||
|
||||
Allow enough space for another row of boning, then sew again.
|
||||
|
||||
Repeat on the other side.
|
||||
|
||||
### Step 11: Insert your boning
|
||||
|
||||
Cap your boning if appropriate for the type of boning used. Then insert boning in the boning channels.
|
||||
|
||||
### Step 12: Install your eyelets
|
||||
|
||||
Install your eyelets between the two boning channels.
|
||||
|
||||
### Step 13: Bind and lace up your top
|
||||
|
||||
Apply bias binding to the neck hole, armholes, and hem.
|
||||
|
||||
Lace up your top.
|
||||
|
||||
### Step 14: You're done!
|
||||
|
||||

|
||||
|
||||
Enjoy your Tristan top!
|
BIN
markdown/org/docs/designs/tristan/instructions/step01.png
Normal file
After Width: | Height: | Size: 95 KiB |
BIN
markdown/org/docs/designs/tristan/instructions/step02.png
Normal file
After Width: | Height: | Size: 51 KiB |
BIN
markdown/org/docs/designs/tristan/instructions/step03.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
markdown/org/docs/designs/tristan/instructions/step04.png
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
markdown/org/docs/designs/tristan/instructions/step05.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
markdown/org/docs/designs/tristan/instructions/step05b.png
Normal file
After Width: | Height: | Size: 79 KiB |
BIN
markdown/org/docs/designs/tristan/instructions/step06.png
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
markdown/org/docs/designs/tristan/instructions/step07.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
markdown/org/docs/designs/tristan/instructions/step08.png
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
markdown/org/docs/designs/tristan/instructions/step09.png
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
markdown/org/docs/designs/tristan/instructions/step10.png
Normal file
After Width: | Height: | Size: 86 KiB |
BIN
markdown/org/docs/designs/tristan/instructions/step14.png
Normal file
After Width: | Height: | Size: 86 KiB |
5
markdown/org/docs/designs/tristan/measurements/en.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Tristan top: Required Measurements"
|
||||
---
|
||||
|
||||
<DesignMeasurements design='tristan' />
|
27
markdown/org/docs/designs/tristan/needs/en.md
Normal file
|
@ -0,0 +1,27 @@
|
|||
---
|
||||
title: "Tristan top: What You Need"
|
||||
---
|
||||
|
||||
To make Tristan, you will need the following:
|
||||
|
||||
- [Basic sewing supplies](/docs/sewing/basic-sewing-supplies)
|
||||
- About 1 meter (1.1 yards) of a suitable main fabric (see [Fabric options](/docs/designs/tristan/fabric))
|
||||
- About 1 meter (1.1 yards) of a suitable lining fabric (if lining)
|
||||
- Choice of closure - either **Zipper**, or **eyelets**, **reinforcement for the eyelets**, and **lacing**
|
||||
- If finishing with bias binding, **Bias tape** (about 4 meters (4.4 yards))
|
||||
|
||||
<Tip>
|
||||
|
||||
##### Use a separating zipper
|
||||
|
||||
We recommend a separating invisible zipper for this garment. Using a separating zipper will make it easier for you to take the top on and off.
|
||||
|
||||
##### When making Tristan with the lacing option, reinforce the eyelets
|
||||
|
||||
When making Tristan with the lacing option, make sure you reinforce the eyelets. A binding, or sewn in interfacing could work to do so. Adding boning between the eyelets and the seam is another option.
|
||||
|
||||
Tristan is not a corset, and therefore doesn't require heavy boning. We would recommend using a flexible type of boning. That would create the neatest opening. Otherwise a double layer of hair canvas and put the eyelets close to the seam. Both would require lining, or an adequately sized hem or binding.
|
||||
|
||||
</Tip>
|
||||
|
||||
|
15
markdown/org/docs/designs/tristan/notes/en.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
---
|
||||
title: "Tristan top: Designer Notes"
|
||||
---
|
||||
|
||||
Tristan is a fitted top with corset-inspired design elements.
|
||||
|
||||
It’s the result of a collaboration between Wouter and Natalia. This was a dream come true for me, Natalia, because I think Wouter is brilliant.
|
||||
|
||||
The original version had a lace-up back and was made for the Renaissance fair. I made it by tracing a new neckline and armholes on Noble directly on the body. Wouter thought it looked nice and we decided to turn it into a published standalone top design, with Wouter doing the code. Many messages, sketches, and mock-ups later, the result is Tristan.
|
||||
|
||||
Tristan allows the user a lot of control over the options. It’s a great introduction to prince(ss) seams, and since it doesn’t use a lot of fabric, could be a good project to use up scraps. Although Tristan has options for corset-inspired lacing, it is not intended to be historically accurate.
|
||||
|
||||
I chose the name “Tristan top” because I wanted something that sounded romantic and pretty and followed the traditional FreeSewing convention of a first name that starts with the same letter as the type of design.
|
||||
|
||||
Natalia
|
11
markdown/org/docs/designs/tristan/options/armholedepth/de.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Armlochtiefe"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
Die **Armlochtiefe** steuert die Tiefe des Armlochs.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/armholedepth/en.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Armhole depth"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **armhole depth** option controls the depth of the armhole.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/armholedepth/es.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Profundidad del orificio"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
La opción **de profundidad de armadura** controla la profundidad del orificio de armadura.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/armholedepth/fr.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Profondeur d'emmanchure"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
L'option **de profondeur de blindage** contrôle la profondeur de l'armure.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/armholedepth/nl.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Diepte armsgat"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
De **armsgat** optie bepaalt de diepte van het armsgat.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/armholedepth/uk.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Глибина пройми"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
Параметр **глибина пройми** регулює глибину пройми.
|
||||
|
||||
|
||||
|
||||
|
13
markdown/org/docs/designs/tristan/options/bustspanease/de.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
title: "Büstenumfang leicht"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
Die **Bustumpfschlanke** Option bestimmt, wie viel Leichtigkeit auf den Bustumpfbereich angewendet wird.
|
||||
|
||||
<Note>Dies wird das Kleidungsstück nicht leicht machen, sondern nur den Büstenpunkt beeinflussen</Note>
|
||||
|
||||
|
||||
|
||||
|
13
markdown/org/docs/designs/tristan/options/bustspanease/en.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
title: "Bust span ease"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **bust span ease** option controls how much ease is applied to the bust span.
|
||||
|
||||
<Note>This will not add ease to the garment, but merely influence the bust point</Note>
|
||||
|
||||
|
||||
|
||||
|
13
markdown/org/docs/designs/tristan/options/bustspanease/es.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
title: "Facilidad de la expansión del polvo"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
La opción **de reducción de polvo** controla la facilidad con la que se aplica a la gama de busto.
|
||||
|
||||
<Note>Esto no añadirá facilidad a la ropa, sino que simplemente influirá en el punto de busto</Note>
|
||||
|
||||
|
||||
|
||||
|
13
markdown/org/docs/designs/tristan/options/bustspanease/fr.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
title: "Aisance de l'écart poitrine"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
L'option **de facilité** de la boussole contrôle la quantité de facilité appliquée à la boussole.
|
||||
|
||||
<Note>Cela ne facilitera pas le vêtement, mais seulement le point de buste</Note>
|
||||
|
||||
|
||||
|
||||
|
13
markdown/org/docs/designs/tristan/options/bustspanease/nl.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
title: "Overwijdte bustenwijdte"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
De **bustewijdte overwijdte** optie bepaalt hoeveel overwijdte wordt toegepast op de bustewijdte.
|
||||
|
||||
<Note>Dit maakt het kledingstuk niet gemakkelijker, maar beïnvloedt alleen het bustepunt</Note>
|
||||
|
||||
|
||||
|
||||
|
13
markdown/org/docs/designs/tristan/options/bustspanease/uk.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
title: "Легкість обхвату грудей"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
Параметр **bust span ease** контролює, наскільки полегшено буде застосовано обхват бюста.
|
||||
|
||||
<Note>Це не додасть одягу легкості, а лише вплине на точку обхвату грудей</Note>
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/chestease/de.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Brustumfangszugabe"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
Mit der Option **chest ease** kannst du den Grad der Entspannung an der vollsten Stelle deiner Brust einstellen.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/chestease/en.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Chest ease"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **chest ease** option controls the amount of ease at the fullest part of your chest.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/chestease/es.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Holgura de pecho"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
La opción de **facilidad de cofre** controla la cantidad de facilidad en la parte más completa del cofre.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/chestease/fr.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Aisance de poitrine"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
L'option **facilité de poitrine** contrôle la quantité d'aisance à la partie la plus complète de votre poitrine.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/chestease/nl.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Overwijdte borst"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
De optie **borst overwijdte** bepaalt de hoeveelheid overwijdte aan het grootste deel van je borst.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/chestease/uk.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Легкість у грудях"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
Параметр **об'єму грудей** регулює об'єм грудей у найповнішій частині тіла.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/cutdepthback/de.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Depth of the cut in the back"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Depth of the cut in the back** controls how deep the neckline will be in the back.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/cutdepthback/en.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Depth of the cut in the back"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Depth of the cut in the back** controls how deep the neckline will be in the back.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/cutdepthback/es.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Depth of the cut in the back"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Depth of the cut in the back** controls how deep the neckline will be in the back.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/cutdepthback/fr.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Depth of the cut in the back"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Depth of the cut in the back** controls how deep the neckline will be in the back.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/cutdepthback/nl.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Depth of the cut in the back"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Depth of the cut in the back** controls how deep the neckline will be in the back.
|
||||
|
||||
|
||||
|
||||
|
11
markdown/org/docs/designs/tristan/options/cutdepthback/uk.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Depth of the cut in the back"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Depth of the cut in the back** controls how deep the neckline will be in the back.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Depth of the cut in the front"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Depth of the cut in the front** controls how deep the neckline will be in the front.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Depth of the cut in the front"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Depth of the cut in the front** controls how deep the neckline will be in the front.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Depth of the cut in the front"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Depth of the cut in the front** controls how deep the neckline will be in the front.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Depth of the cut in the front"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Depth of the cut in the front** controls how deep the neckline will be in the front.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Depth of the cut in the front"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Depth of the cut in the front** controls how deep the neckline will be in the front.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Depth of the cut in the front"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Depth of the cut in the front** controls how deep the neckline will be in the front.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Roundness of the cut in the back"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Roundness of the cut in the back** controls the shape of the neckline will be in the back.
|
||||
This will go from V-neck to U- shaped, with a round option between those extremes.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Roundness of the cut in the back"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Roundness of the cut in the back** controls the shape of the neckline will be in the back.
|
||||
This will go from V-neck to U- shaped, with a round option between those extremes.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Roundness of the cut in the back"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Roundness of the cut in the back** controls the shape of the neckline will be in the back.
|
||||
This will go from V-neck to U- shaped, with a round option between those extremes.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Roundness of the cut in the back"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Roundness of the cut in the back** controls the shape of the neckline will be in the back.
|
||||
This will go from V-neck to U- shaped, with a round option between those extremes.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Roundness of the cut in the back"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Roundness of the cut in the back** controls the shape of the neckline will be in the back.
|
||||
This will go from V-neck to U- shaped, with a round option between those extremes.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Roundness of the cut in the back"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Roundness of the cut in the back** controls the shape of the neckline will be in the back.
|
||||
This will go from V-neck to U- shaped, with a round option between those extremes.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Roundness of the cut in the front"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Roundness of the cut in the front** controls the shape of the neckline will be in the front.
|
||||
This will go from V-neck to U- shaped, with a round option between those extremes.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Roundness of the cut in the front"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Roundness of the cut in the front** controls the shape of the neckline will be in the front.
|
||||
This will go from V-neck to U- shaped, with a round option between those extremes.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Roundness of the cut in the front"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Roundness of the cut in the front** controls the shape of the neckline will be in the front.
|
||||
This will go from V-neck to U- shaped, with a round option between those extremes.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Roundness of the cut in the front"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Roundness of the cut in the front** controls the shape of the neckline will be in the front.
|
||||
This will go from V-neck to U- shaped, with a round option between those extremes.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Roundness of the cut in the front"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Roundness of the cut in the front** controls the shape of the neckline will be in the front.
|
||||
This will go from V-neck to U- shaped, with a round option between those extremes.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Roundness of the cut in the front"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **Roundness of the cut in the front** controls the shape of the neckline will be in the front.
|
||||
This will go from V-neck to U- shaped, with a round option between those extremes.
|
||||
|
||||
|
||||
|
||||
|
5
markdown/org/docs/designs/tristan/options/de.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Tristan top: Design Options"
|
||||
---
|
||||
|
||||
<DesignOptions design='tristan' />
|
5
markdown/org/docs/designs/tristan/options/en.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Tristan top: Design Options"
|
||||
---
|
||||
|
||||
<DesignOptions design='tristan' />
|
5
markdown/org/docs/designs/tristan/options/es.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Tristan top: Design Options"
|
||||
---
|
||||
|
||||
<DesignOptions design='tristan' />
|
5
markdown/org/docs/designs/tristan/options/fr.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Tristan top: Design Options"
|
||||
---
|
||||
|
||||
<DesignOptions design='tristan' />
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Vordere Schulterbreite"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
Die Option **Vorderschulterbreite** steuert die Breite der Schultern an der Vorderseite, relativ zur Rückseite.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Front shoulder width"
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
The **front shoulder width** option controls the width of the shoulders at the front, relative to the back.
|
||||
|
||||
|
||||
|
||||
|