Revert "chore: Hold back design for v3 release"
This reverts commit f9de3f6990
.
In doing so, this rescues the naomiwu design which was removed on
purpose from one branch, but then that removal commit accidentally got
merged in the branch where it was being kept.
This commit is contained in:
parent
78f410c928
commit
602f4f2a68
221 changed files with 6687 additions and 0 deletions
|
@ -519,6 +519,14 @@
|
|||
],
|
||||
"techniques": []
|
||||
},
|
||||
"naomiwu": {
|
||||
"description": "A FreeSewing pattern for Naomi Wu's signature cargo skirt",
|
||||
"code": "Joost De Cock",
|
||||
"design": ["Naomi Wu", "Joost De Cock"],
|
||||
"difficulty": 3,
|
||||
"tags": ["bottoms", "skirts"],
|
||||
"techniques": ["button", "hem", "pocket", "lining"]
|
||||
},
|
||||
"noble": {
|
||||
"code": "Wouter Van Wageningen",
|
||||
"description": "A FreeSewing pattern for a princess seam bodice block",
|
||||
|
|
9
designs/naomiwu/CHANGELOG.md
Normal file
9
designs/naomiwu/CHANGELOG.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
# Change log for: @freesewing/naomiwu
|
||||
|
||||
|
||||
|
||||
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.
|
||||
|
305
designs/naomiwu/README.md
Normal file
305
designs/naomiwu/README.md
Normal file
|
@ -0,0 +1,305 @@
|
|||

|
||||
<p align='center'><a
|
||||
href="https://www.npmjs.com/package/@freesewing/naomiwu"
|
||||
title="@freesewing/naomiwu on NPM"
|
||||
><img src="https://img.shields.io/npm/v/@freesewing/naomiwu.svg"
|
||||
alt="@freesewing/naomiwu on NPM"/>
|
||||
</a><a
|
||||
href="https://opensource.org/licenses/MIT"
|
||||
title="License: MIT"
|
||||
><img src="https://img.shields.io/npm/l/@freesewing/naomiwu.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%3Anaomiwu"
|
||||
title="Open issues tagged pkg:naomiwu"
|
||||
><img src="https://img.shields.io/github/issues/freesewing/freesewing/pkg:naomiwu.svg?label=Issues"
|
||||
alt="Open issues tagged pkg:naomiwu"/>
|
||||
</a><a
|
||||
href="#contributors-"
|
||||
title="All Contributors"
|
||||
><img src="https://img.shields.io/badge/all_contributors-111-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/naomiwu
|
||||
|
||||
A FreeSewing pattern for Naomi Wu's signature cargo skirt
|
||||
|
||||
|
||||
|
||||
|
||||
> #### Note: Version 3 is a work in progress
|
||||
>
|
||||
> We are working on a new major version (v3) but it is not ready for prime-time.
|
||||
> For production use, please refer to our v2 packages (the `latest` on NPM)
|
||||
> or [the `v2` branch in our monorepo](https://github.com/freesewing/freesewing/tree/v2).
|
||||
>
|
||||
> We the `main` branch and `next` packages on NPM holds v3 code. But it's alpha for now.
|
||||
|
||||
## What am I looking at? 🤔
|
||||
|
||||
This repository is our *monorepo* holding all our NPM designs, plugins, other NPM packages, and (web)sites.
|
||||
|
||||
This folder holds: @freesewing/naomiwu
|
||||
|
||||
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
|
||||
our sewing patterns adapted to your measurements.
|
||||
|
||||
If you're a developer, our documentation is on [freesewing.dev](https://freesewing.dev/).
|
||||
Our [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
|
||||
for parametric design of sewing patterns. But we also provide 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
|
||||
```
|
||||
|
||||
Or, consult our getting started guides
|
||||
for [Linux](https://freesewing.dev/tutorials/getting-started-linux/),
|
||||
[MacOS](https://freesewing.dev/tutorials/getting-started-mac/),
|
||||
or [Windows](https://freesewing.dev/tutorials/getting-started-windows/).
|
||||
|
||||
We also have a [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) that
|
||||
walks you through your first parametric design,
|
||||
and [a friendly community](https://freesewing.org/community/where/) with
|
||||
people who can help you when you get stuck.
|
||||
|
||||
## Support FreeSewing: Become a patron 🥰
|
||||
|
||||
FreeSewing is an open source project run by a community,
|
||||
and financially supported by our patrons.
|
||||
|
||||
If you feel what we do 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 👩💻
|
||||
|
||||
- 💻 Makers website: [freesewing.org](https://freesewing.org)
|
||||
- 💻 Developers website: [freesewing.dev](https://freesewing.dev)
|
||||
- 💬 Chat: On Discord via [discord.freesewing.org](https://discord.freesewing.org/)
|
||||
- ✅ Todo list/Kanban board: On Github via [todo.freesewing.org](https://todo.freesewing.org/)
|
||||
- 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org)
|
||||
- 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
|
||||
|
||||
## 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 🤯
|
||||
|
||||
Our [chatrooms on Discord](https://chat.freesewing.org/) are the best place to ask questions,
|
||||
share your feedback, or just hang out.
|
||||
|
||||
If you want to report a problem, please [create an issue](https://github.com/freesewing/freesewing/issues/new).
|
||||
|
||||
|
||||
|
||||
## Contributors ✨
|
||||
|
||||
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://adamrtomkins.github.io/"><img src="https://avatars.githubusercontent.com/u/5709603?v=4?s=100" width="100px;" alt="Adam Tomkins"/><br /><sub><b>Adam Tomkins</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=AdamRTomkins" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://polymerisation-des-concepts.fr/"><img src="https://avatars.githubusercontent.com/u/365999?v=4?s=100" width="100px;" alt="Alexandre Ignjatovic"/><br /><sub><b>Alexandre Ignjatovic</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=bankair" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AlfaLyr"><img src="https://avatars.githubusercontent.com/u/39273729?v=4?s=100" width="100px;" alt="AlfaLyr"/><br /><sub><b>AlfaLyr</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=AlfaLyr" title="Code">💻</a> <a href="#plugin-AlfaLyr" title="Plugin/utility libraries">🔌</a> <a href="#design-AlfaLyr" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://thelettereph.com"><img src="https://avatars.githubusercontent.com/u/357684?v=4?s=100" width="100px;" alt="Andrew James"/><br /><sub><b>Andrew James</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=ephphatha" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/annekecaramin"><img src="https://avatars.githubusercontent.com/u/38046191?v=4?s=100" width="100px;" alt="Anneke"/><br /><sub><b>Anneke</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=annekecaramin" title="Documentation">📖</a> <a href="#translation-annekecaramin" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/anniekao"><img src="https://avatars.githubusercontent.com/u/1550506?v=4?s=100" width="100px;" alt="Annie Kao"/><br /><sub><b>Annie Kao</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=anniekao" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Anternative"><img src="https://avatars.githubusercontent.com/u/81079850?v=4?s=100" width="100px;" alt="Anternative"/><br /><sub><b>Anternative</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Anternative" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Quiltmaster"><img src="https://avatars.githubusercontent.com/u/71795777?v=4?s=100" width="100px;" alt="Anthony"/><br /><sub><b>Anthony</b></sub></a><br /><a href="#question-Quiltmaster" title="Answering Questions">💬</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arigrayzel"><img src="https://avatars.githubusercontent.com/u/33040950?v=4?s=100" width="100px;" alt="Ari Grayzel-student"/><br /><sub><b>Ari Grayzel-student</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=arigrayzel" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Bart-PXL"><img src="https://avatars.githubusercontent.com/u/45118788?v=4?s=100" width="100px;" alt="Bart"/><br /><sub><b>Bart</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Bart-PXL" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BenJamesBen"><img src="https://avatars.githubusercontent.com/u/109869956?v=4?s=100" width="100px;" alt="BenJamesBen"/><br /><sub><b>BenJamesBen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=BenJamesBen" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=BenJamesBen" title="Documentation">📖</a> <a href="https://github.com/freesewing/freesewing/issues?q=author%3ABenJamesBen" title="Bug reports">🐛</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/camerondubas"><img src="https://avatars.githubusercontent.com/u/6216460?v=4?s=100" width="100px;" alt="Cameron Dubas"/><br /><sub><b>Cameron Dubas</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=camerondubas" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cabi"><img src="https://avatars.githubusercontent.com/u/2596253?v=4?s=100" width="100px;" alt="Carsten Biebricher"/><br /><sub><b>Carsten Biebricher</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=cabi" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cathyzoller"><img src="https://avatars.githubusercontent.com/u/2120275?v=4?s=100" width="100px;" alt="Cathy Zoller"/><br /><sub><b>Cathy Zoller</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=cathyzoller" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Chantalbijoux"><img src="https://avatars.githubusercontent.com/u/39673694?v=4?s=100" width="100px;" alt="Chantal Lapointe"/><br /><sub><b>Chantal Lapointe</b></sub></a><br /><a href="#translation-Chantalbijoux" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dpiquet"><img src="https://avatars.githubusercontent.com/u/4688628?v=4?s=100" width="100px;" alt="Damien PIQUET"/><br /><sub><b>Damien PIQUET</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=dpiquet" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.darigovresearch.com/"><img src="https://avatars.githubusercontent.com/u/30328618?v=4?s=100" width="100px;" alt="Darigov Research"/><br /><sub><b>Darigov Research</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=darigovresearch" title="Documentation">📖</a> <a href="#ideas-darigovresearch" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/clegganator259"><img src="https://avatars.githubusercontent.com/u/3974250?v=4?s=100" width="100px;" alt="David Clegg"/><br /><sub><b>David Clegg</b></sub></a><br /><a href="#design-clegganator259" title="Design">🎨</a> <a href="https://github.com/freesewing/freesewing/commits?author=clegganator259" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ElenaFdR"><img src="https://avatars.githubusercontent.com/u/5113815?v=4?s=100" width="100px;" alt="Elena FdR"/><br /><sub><b>Elena FdR</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=ElenaFdR" title="Documentation">📖</a> <a href="#blog-ElenaFdR" title="Blogposts">📝</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://emmanuelnyachoke.com/"><img src="https://avatars.githubusercontent.com/u/1908926?v=4?s=100" width="100px;" alt="Emmanuel Nyachoke"/><br /><sub><b>Emmanuel Nyachoke</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=enyachoke" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=enyachoke" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://enochriese.com"><img src="https://avatars.githubusercontent.com/u/5298929?v=4?s=100" width="100px;" alt="Enoch Riese"/><br /><sub><b>Enoch Riese</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=eriese" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/EvEkSwed"><img src="https://avatars.githubusercontent.com/u/39723451?v=4?s=100" width="100px;" alt="EvEkSwed"/><br /><sub><b>EvEkSwed</b></sub></a><br /><a href="#translation-EvEkSwed" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fantastik-Maman"><img src="https://avatars.githubusercontent.com/u/39785382?v=4?s=100" width="100px;" alt="Fantastik-Maman"/><br /><sub><b>Fantastik-Maman</b></sub></a><br /><a href="#translation-Fantastik-Maman" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.forresto.com/"><img src="https://avatars.githubusercontent.com/u/395307?v=4?s=100" width="100px;" alt="Forrest O."/><br /><sub><b>Forrest O.</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=forresto" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fmatray"><img src="https://avatars.githubusercontent.com/u/8267716?v=4?s=100" width="100px;" alt="Frédéric"/><br /><sub><b>Frédéric</b></sub></a><br /><a href="#translation-fmatray" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/glennfmatthews/"><img src="https://avatars.githubusercontent.com/u/5603551?v=4?s=100" width="100px;" alt="Glenn Matthews"/><br /><sub><b>Glenn Matthews</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=glennmatthews" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://greg.technology/"><img src="https://avatars.githubusercontent.com/u/1017304?v=4?s=100" width="100px;" alt="Greg Sadetsky"/><br /><sub><b>Greg Sadetsky</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=gregsadetsky" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://kirby.zone"><img src="https://avatars.githubusercontent.com/u/75245963?v=4?s=100" width="100px;" alt="Igor Couto"/><br /><sub><b>Igor Couto</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3Aiocouto" title="Bug reports">🐛</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://bandism.net/"><img src="https://avatars.githubusercontent.com/u/22633385?v=4?s=100" width="100px;" alt="Ikko Ashimine"/><br /><sub><b>Ikko Ashimine</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=eltociear" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Irapeke"><img src="https://avatars.githubusercontent.com/u/39604334?v=4?s=100" width="100px;" alt="Irapeke"/><br /><sub><b>Irapeke</b></sub></a><br /><a href="#translation-Irapeke" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ibek"><img src="https://avatars.githubusercontent.com/u/1140579?v=4?s=100" width="100px;" alt="Ivo Bek"/><br /><sub><b>Ivo Bek</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=ibek" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jsawo"><img src="https://avatars.githubusercontent.com/u/1294706?v=4?s=100" width="100px;" alt="Jacek Sawoszczuk"/><br /><sub><b>Jacek Sawoszczuk</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jsawo" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jgfichte"><img src="https://avatars.githubusercontent.com/u/1787162?v=4?s=100" width="100px;" alt="Jason Williams"/><br /><sub><b>Jason Williams</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jgfichte" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jejacks0n"><img src="https://avatars.githubusercontent.com/u/13765?v=4?s=100" width="100px;" alt="Jeremy Jackson"/><br /><sub><b>Jeremy Jackson</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jejacks0n" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://jeroenhoek.nl"><img src="https://avatars.githubusercontent.com/u/683699?v=4?s=100" width="100px;" alt="Jeroen Hoek"/><br /><sub><b>Jeroen Hoek</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jdhoek" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joeschofield0"><img src="https://avatars.githubusercontent.com/u/47668691?v=4?s=100" width="100px;" alt="Joe Schofield"/><br /><sub><b>Joe Schofield</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=joeschofield0" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Joebidido"><img src="https://avatars.githubusercontent.com/u/39796210?v=4?s=100" width="100px;" alt="Joebidido"/><br /><sub><b>Joebidido</b></sub></a><br /><a href="#translation-Joebidido" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://joost.at/"><img src="https://avatars.githubusercontent.com/u/1708494?v=4?s=100" width="100px;" alt="Joost De Cock"/><br /><sub><b>Joost De Cock</b></sub></a><br /><a href="#maintenance-joostdecock" title="Maintenance">🚧</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joshessman"><img src="https://avatars.githubusercontent.com/u/9941074?v=4?s=100" width="100px;" alt="Josh Essman"/><br /><sub><b>Josh Essman</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=joshessman" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.earth.li/~kake/"><img src="https://avatars.githubusercontent.com/u/1956810?v=4?s=100" width="100px;" alt="Kake"/><br /><sub><b>Kake</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=KakeLP" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/kapunahele"><img src="https://avatars.githubusercontent.com/u/4116963?v=4?s=100" width="100px;" alt="Kapunahele Wong"/><br /><sub><b>Kapunahele Wong</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=kapunahelewong" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/tangerineshark"><img src="https://avatars.githubusercontent.com/u/70777269?v=4?s=100" width="100px;" alt="Karen"/><br /><sub><b>Karen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=tangerineshark" title="Documentation">📖</a> <a href="#eventOrganizing-tangerineshark" title="Event Organizing">📋</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mcgnly"><img src="https://avatars.githubusercontent.com/u/5653631?v=4?s=100" width="100px;" alt="Katie McGinley"/><br /><sub><b>Katie McGinley</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=mcgnly" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.kieranklaassen.com/"><img src="https://avatars.githubusercontent.com/u/209089?v=4?s=100" width="100px;" alt="Kieran Klaassen"/><br /><sub><b>Kieran Klaassen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=kieranklaassen" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Kittycatou"><img src="https://avatars.githubusercontent.com/u/48165583?v=4?s=100" width="100px;" alt="Kittycatou"/><br /><sub><b>Kittycatou</b></sub></a><br /><a href="#translation-Kittycatou" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.krishoward.org/"><img src="https://avatars.githubusercontent.com/u/5946286?v=4?s=100" width="100px;" alt="Kris"/><br /><sub><b>Kris</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=web-goddess" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kristinruben"><img src="https://avatars.githubusercontent.com/u/17237479?v=4?s=100" width="100px;" alt="Kristin Ruben"/><br /><sub><b>Kristin Ruben</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=kristinruben" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/compilin"><img src="https://avatars.githubusercontent.com/u/40794281?v=4?s=100" width="100px;" alt="Lin"/><br /><sub><b>Lin</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=compilin" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Loudepeuter"><img src="https://avatars.githubusercontent.com/u/38081954?v=4?s=100" width="100px;" alt="Loudepeuter"/><br /><sub><b>Loudepeuter</b></sub></a><br /><a href="#translation-Loudepeuter" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lucibytes"><img src="https://avatars.githubusercontent.com/u/77203781?v=4?s=100" width="100px;" alt="Lucian"/><br /><sub><b>Lucian</b></sub></a><br /><a href="#eventOrganizing-lucibytes" title="Event Organizing">📋</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/luizfzs"><img src="https://avatars.githubusercontent.com/u/6039675?v=4?s=100" width="100px;" alt="Luiz Saggioro"/><br /><sub><b>Luiz Saggioro</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=luizfzs" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MA-TATAS"><img src="https://avatars.githubusercontent.com/u/125549564?v=4?s=100" width="100px;" alt="MA-TATAS"/><br /><sub><b>MA-TATAS</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=MA-TATAS" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/manufakturedelweiss"><img src="https://avatars.githubusercontent.com/u/38063391?v=4?s=100" width="100px;" alt="Marcus"/><br /><sub><b>Marcus</b></sub></a><br /><a href="#translation-manufakturedelweiss" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/martintribo"><img src="https://avatars.githubusercontent.com/u/1613442?v=4?s=100" width="100px;" alt="Martin Tribo"/><br /><sub><b>Martin Tribo</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=martintribo" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nadege"><img src="https://avatars.githubusercontent.com/u/3792171?v=4?s=100" width="100px;" alt="Nadege Michel"/><br /><sub><b>Nadege Michel</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nadege" title="Tests">⚠️</a> <a href="https://github.com/freesewing/freesewing/commits?author=nadege" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nataliasayang"><img src="https://avatars.githubusercontent.com/u/48160791?v=4?s=100" width="100px;" alt="Natalia"/><br /><sub><b>Natalia</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nataliasayang" title="Code">💻</a> <a href="#design-nataliasayang" title="Design">🎨</a> <a href="#blog-nataliasayang" title="Blogposts">📝</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://yergler.net/"><img src="https://avatars.githubusercontent.com/u/510875?v=4?s=100" width="100px;" alt="Nathan Yergler"/><br /><sub><b>Nathan Yergler</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nyergler" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nicholasdower"><img src="https://avatars.githubusercontent.com/u/9117775?v=4?s=100" width="100px;" alt="Nick Dower"/><br /><sub><b>Nick Dower</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nicholasdower" title="Documentation">📖</a> <a href="https://github.com/freesewing/freesewing/commits?author=nicholasdower" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/issues?q=author%3Anicholasdower" title="Bug reports">🐛</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nchilada"><img src="https://avatars.githubusercontent.com/u/692925?v=4?s=100" width="100px;" alt="Nikhil Chelliah"/><br /><sub><b>Nikhil Chelliah</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nchilada" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/OysteinHoiby"><img src="https://avatars.githubusercontent.com/u/49735055?v=4?s=100" width="100px;" alt="OysteinHoiby"/><br /><sub><b>OysteinHoiby</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=OysteinHoiby" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://pat.forringer.com/"><img src="https://avatars.githubusercontent.com/u/136456?v=4?s=100" width="100px;" alt="Patrick Forringer"/><br /><sub><b>Patrick Forringer</b></sub></a><br /><a href="#plugin-destos" title="Plugin/utility libraries">🔌</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://pd75.github.io/"><img src="https://avatars.githubusercontent.com/u/10294795?v=4?s=100" width="100px;" alt="Paul"/><br /><sub><b>Paul</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=PD75" title="Documentation">📖</a> <a href="#blog-PD75" title="Blogposts">📝</a> <a href="#translation-PD75" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/phillipthelen"><img src="https://avatars.githubusercontent.com/u/298062?v=4?s=100" width="100px;" alt="Phillip Thelen"/><br /><sub><b>Phillip Thelen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=phillipthelen" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Pixieish"><img src="https://avatars.githubusercontent.com/u/32991415?v=4?s=100" width="100px;" alt="Pixieish"/><br /><sub><b>Pixieish</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Pixieish" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.uza.be/persoon/prof-dr-sorcha-ni-dhubhghaill"><img src="https://avatars.githubusercontent.com/u/30624634?v=4?s=100" width="100px;" alt="Prof. dr. Sorcha Ní Dhubhghaill"/><br /><sub><b>Prof. dr. Sorcha Ní Dhubhghaill</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=sorchanidhubhghaill" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/QuentinFelix"><img src="https://avatars.githubusercontent.com/u/5288091?v=4?s=100" width="100px;" alt="Quentin FELIX"/><br /><sub><b>Quentin FELIX</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=QuentinFelix" title="Code">💻</a> <a href="#design-QuentinFelix" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/RikHekker"><img src="https://avatars.githubusercontent.com/u/31843274?v=4?s=100" width="100px;" alt="Rik Hekker"/><br /><sub><b>Rik Hekker</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3ARikHekker" title="Bug reports">🐛</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://resume.livingston-gray.com/faq.html"><img src="https://avatars.githubusercontent.com/u/6462?v=4?s=100" width="100px;" alt="Sam Livingston-Gray"/><br /><sub><b>Sam Livingston-Gray</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=geeksam" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sannek"><img src="https://avatars.githubusercontent.com/u/17491062?v=4?s=100" width="100px;" alt="Sanne"/><br /><sub><b>Sanne</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=sannek" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=sannek" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Tyrannogina"><img src="https://avatars.githubusercontent.com/u/19556565?v=4?s=100" width="100px;" alt="Sara Latorre"/><br /><sub><b>Sara Latorre</b></sub></a><br /><a href="#translation-Tyrannogina" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SeaZeeZee"><img src="https://avatars.githubusercontent.com/u/86711383?v=4?s=100" width="100px;" alt="SeaZeeZee"/><br /><sub><b>SeaZeeZee</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=SeaZeeZee" title="Documentation">📖</a> <a href="https://github.com/freesewing/freesewing/commits?author=SeaZeeZee" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SimonbJohnson"><img src="https://avatars.githubusercontent.com/u/2110742?v=4?s=100" width="100px;" alt="SimonbJohnson"/><br /><sub><b>SimonbJohnson</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3ASimonbJohnson" title="Bug reports">🐛</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SirCharlotte"><img src="https://avatars.githubusercontent.com/u/63847870?v=4?s=100" width="100px;" alt="SirCharlotte"/><br /><sub><b>SirCharlotte</b></sub></a><br /><a href="#translation-SirCharlotte" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.instagram.com/celine_mge/"><img src="https://avatars.githubusercontent.com/u/57619777?v=4?s=100" width="100px;" alt="Slylele"/><br /><sub><b>Slylele</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Slylele" title="Documentation">📖</a> <a href="#translation-Slylele" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Soazillon"><img src="https://avatars.githubusercontent.com/u/40845940?v=4?s=100" width="100px;" alt="Soazillon"/><br /><sub><b>Soazillon</b></sub></a><br /><a href="#translation-Soazillon" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SoneaTheBest"><img src="https://avatars.githubusercontent.com/u/64635425?v=4?s=100" width="100px;" alt="SoneaTheBest"/><br /><sub><b>SoneaTheBest</b></sub></a><br /><a href="#translation-SoneaTheBest" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://metafly.info/"><img src="https://avatars.githubusercontent.com/u/961256?v=4?s=100" width="100px;" alt="Stefan Sydow"/><br /><sub><b>Stefan Sydow</b></sub></a><br /><a href="#translation-stsydow" title="Translation">🌍</a> <a href="https://github.com/freesewing/freesewing/commits?author=stsydow" title="Documentation">📖</a> <a href="https://github.com/freesewing/freesewing/commits?author=stsydow" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/trentonTrama"><img src="https://avatars.githubusercontent.com/u/41126812?v=4?s=100" width="100px;" alt="Trent Trama"/><br /><sub><b>Trent Trama</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=trentonTrama" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TriploidTree"><img src="https://avatars.githubusercontent.com/u/4170521?v=4?s=100" width="100px;" alt="Tríona"/><br /><sub><b>Tríona</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=TriploidTree" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/theUnmutual"><img src="https://avatars.githubusercontent.com/u/22374635?v=4?s=100" width="100px;" alt="Unmutual"/><br /><sub><b>Unmutual</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=theUnmutual" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/woutervdub"><img src="https://avatars.githubusercontent.com/u/24414629?v=4?s=100" width="100px;" alt="Wouter van Wageningen"/><br /><sub><b>Wouter van Wageningen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=woutervdub" title="Code">💻</a> <a href="#design-woutervdub" title="Design">🎨</a> <a href="#tool-woutervdub" title="Tools">🔧</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/amysews"><img src="https://avatars.githubusercontent.com/u/25280778?v=4?s=100" width="100px;" alt="amysews"/><br /><sub><b>amysews</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=amysews" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/anna-puk"><img src="https://avatars.githubusercontent.com/u/100537439?v=4?s=100" width="100px;" alt="anna-puk"/><br /><sub><b>anna-puk</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=anna-puk" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/beautifulsummermoon"><img src="https://avatars.githubusercontent.com/u/40396388?v=4?s=100" width="100px;" alt="beautifulsummermoon"/><br /><sub><b>beautifulsummermoon</b></sub></a><br /><a href="#translation-beautifulsummermoon" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/berce"><img src="https://avatars.githubusercontent.com/u/10439709?v=4?s=100" width="100px;" alt="berce"/><br /><sub><b>berce</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=berce" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/biou"><img src="https://avatars.githubusercontent.com/u/1340376?v=4?s=100" width="100px;" alt="biou"/><br /><sub><b>biou</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=biou" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bobgeorgethe3rd"><img src="https://avatars.githubusercontent.com/u/16866285?v=4?s=100" width="100px;" alt="bobgeorgethe3rd"/><br /><sub><b>bobgeorgethe3rd</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=bobgeorgethe3rd" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=bobgeorgethe3rd" title="Documentation">📖</a> <a href="#design-bobgeorgethe3rd" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/brmlyklr"><img src="https://avatars.githubusercontent.com/u/22308713?v=4?s=100" width="100px;" alt="brmlyklr"/><br /><sub><b>brmlyklr</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=brmlyklr" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.chrisbarrett.fr"><img src="https://avatars.githubusercontent.com/u/2373249?v=4?s=100" width="100px;" alt="chri5b"/><br /><sub><b>chri5b</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=chri5b" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=chri5b" title="Tests">⚠️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dingcycle"><img src="https://avatars.githubusercontent.com/u/1681985?v=4?s=100" width="100px;" alt="dingcycle"/><br /><sub><b>dingcycle</b></sub></a><br /><a href="#translation-dingcycle" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/drowned-in-books"><img src="https://avatars.githubusercontent.com/u/100040772?v=4?s=100" width="100px;" alt="drowned-in-books"/><br /><sub><b>drowned-in-books</b></sub></a><br /><a href="#question-drowned-in-books" title="Answering Questions">💬</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/econo202"><img src="https://avatars.githubusercontent.com/u/34138153?v=4?s=100" width="100px;" alt="econo202"/><br /><sub><b>econo202</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=econo202" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ericamattos"><img src="https://avatars.githubusercontent.com/u/4341417?v=4?s=100" width="100px;" alt="ericamattos"/><br /><sub><b>ericamattos</b></sub></a><br /><a href="#translation-ericamattos" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/evilrobotfromouterspace"><img src="https://avatars.githubusercontent.com/u/143673955?v=4?s=100" width="100px;" alt="evilrobotfromouterspace"/><br /><sub><b>evilrobotfromouterspace</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3Aevilrobotfromouterspace" title="Bug reports">🐛</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fightingrabbit"><img src="https://avatars.githubusercontent.com/u/25751445?v=4?s=100" width="100px;" alt="fightingrabbit"/><br /><sub><b>fightingrabbit</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=fightingrabbit" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DocSpencer77"><img src="https://avatars.githubusercontent.com/u/43393580?v=4?s=100" width="100px;" alt="gaylyndie"/><br /><sub><b>gaylyndie</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=DocSpencer77" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/grimlokason"><img src="https://avatars.githubusercontent.com/u/5112238?v=4?s=100" width="100px;" alt="grimlokason"/><br /><sub><b>grimlokason</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=grimlokason" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://weblog.redisdead.net"><img src="https://avatars.githubusercontent.com/u/6494414?v=4?s=100" width="100px;" alt="hellgy"/><br /><sub><b>hellgy</b></sub></a><br /><a href="#design-hellgy" title="Design">🎨</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jackseye"><img src="https://avatars.githubusercontent.com/u/27834526?v=4?s=100" width="100px;" alt="jackseye"/><br /><sub><b>jackseye</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jackseye" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marckiesel"><img src="https://avatars.githubusercontent.com/u/39653780?v=4?s=100" width="100px;" alt="marckiesel"/><br /><sub><b>marckiesel</b></sub></a><br /><a href="#translation-marckiesel" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marpants"><img src="https://avatars.githubusercontent.com/u/61366665?v=4?s=100" width="100px;" alt="marpants"/><br /><sub><b>marpants</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=marpants" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://tech.lgbt/@mergerg"><img src="https://avatars.githubusercontent.com/u/64447714?v=4?s=100" width="100px;" alt="mergerg"/><br /><sub><b>mergerg</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=raphaelsiz" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mesil"><img src="https://avatars.githubusercontent.com/u/14284175?v=4?s=100" width="100px;" alt="mesil"/><br /><sub><b>mesil</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3Amesil" title="Bug reports">🐛</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/starfetch"><img src="https://avatars.githubusercontent.com/u/80041179?v=4?s=100" width="100px;" alt="starfetch"/><br /><sub><b>starfetch</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=starfetch" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=starfetch" title="Documentation">📖</a> <a href="#translation-starfetch" title="Translation">🌍</a> <a href="#design-starfetch" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/timorl"><img src="https://avatars.githubusercontent.com/u/4363804?v=4?s=100" width="100px;" alt="timorl"/><br /><sub><b>timorl</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=timorl" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ttimearl"><img src="https://avatars.githubusercontent.com/u/77916590?v=4?s=100" width="100px;" alt="ttimearl"/><br /><sub><b>ttimearl</b></sub></a><br /><a href="#content-ttimearl" title="Content">🖋</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/chrisgloom"><img src="https://avatars.githubusercontent.com/u/15905991?v=4?s=100" width="100px;" alt="tuesgloomsday"/><br /><sub><b>tuesgloomsday</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=chrisgloom" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/valadaptive"><img src="https://avatars.githubusercontent.com/u/79560998?v=4?s=100" width="100px;" alt="valadaptive"/><br /><sub><b>valadaptive</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=valadaptive" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/viocky"><img src="https://avatars.githubusercontent.com/u/39279173?v=4?s=100" width="100px;" alt="viocky"/><br /><sub><b>viocky</b></sub></a><br /><a href="#translation-viocky" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/woolishboy"><img src="https://avatars.githubusercontent.com/u/57816321?v=4?s=100" width="100px;" alt="woolishboy"/><br /><sub><b>woolishboy</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=woolishboy" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cloutiy"><img src="https://avatars.githubusercontent.com/u/8433147?v=4?s=100" width="100px;" alt="yc"/><br /><sub><b>yc</b></sub></a><br /><a href="#translation-cloutiy" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
|
||||
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
|
||||
|
35
designs/naomiwu/build.mjs
Normal file
35
designs/naomiwu/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/naomiwu/data.mjs
Normal file
4
designs/naomiwu/data.mjs
Normal file
|
@ -0,0 +1,4 @@
|
|||
// This file is auto-generated | All changes you make will be overwritten.
|
||||
export const name = '@freesewing/naomiwu'
|
||||
export const version = '3.0.0-alpha.10'
|
||||
export const data = { name, version }
|
104
designs/naomiwu/i18n/de.json
Normal file
104
designs/naomiwu/i18n/de.json
Normal file
|
@ -0,0 +1,104 @@
|
|||
{
|
||||
"t": "Naomi Wu Cargo Skirt",
|
||||
"d": "This is Naomi's Wu's signature cargo skirt design.",
|
||||
"s": {},
|
||||
"o": {
|
||||
"backAttachmentDepth": {
|
||||
"t": "Back attachment depth",
|
||||
"d": "Controls the depth of the back attachment."
|
||||
},
|
||||
"backAttachmentFlapChamferSize": {
|
||||
"t": "Back attachment flap chamfer size",
|
||||
"d": "Controls the size of the chamfer on the back attachment flap."
|
||||
},
|
||||
"backAttachmentWidth": {
|
||||
"t": "Back attachment width",
|
||||
"d": "Controls the width of the front attachment."
|
||||
},
|
||||
"backPocketChamferSize": {
|
||||
"t": "Back pocket chamfer size",
|
||||
"d": "Controls the size of the chamfer on the back pocket."
|
||||
},
|
||||
"backPocketDepth": {
|
||||
"t": "Back pocket depth",
|
||||
"d": "Controls the depth of the back pockets."
|
||||
},
|
||||
"beltloopWidth": {
|
||||
"t": "Beltloop width",
|
||||
"d": "Controls the width of the beltloops."
|
||||
},
|
||||
"dartLength": {
|
||||
"t": "Dart length",
|
||||
"d": "Controls the length of the darts at the back."
|
||||
},
|
||||
"dartWidth": {
|
||||
"t": "Dart width",
|
||||
"d": "Controls the width of the darts at the back."
|
||||
},
|
||||
"flyLength": {
|
||||
"t": "Fly lengt",
|
||||
"d": "Controls the length of the fly."
|
||||
},
|
||||
"flyWidth": {
|
||||
"t": "Fly width",
|
||||
"d": "Controls the width of the fly."
|
||||
},
|
||||
"frontAttachmentChamferSize": {
|
||||
"t": "Front attachment chamfer size",
|
||||
"d": "Controls the size of the chamfer on the front attachment."
|
||||
},
|
||||
"frontAttachmentWidth": {
|
||||
"t": "Front attachment width",
|
||||
"d": "Controls the width of the front attachment."
|
||||
},
|
||||
"frontHalf": {
|
||||
"t": "Front half",
|
||||
"d": "Controls the proportion of the skirt that will make up the front panel."
|
||||
},
|
||||
"frontPocketOpeningBend": {
|
||||
"t": "Front pocket opening bend",
|
||||
"d": "Controls the curvature of the front pocket opening."
|
||||
},
|
||||
"frontPocketOpeningDepth": {
|
||||
"t": "Front pocket opening depth",
|
||||
"d": "Controls the depth of the front pocket opening."
|
||||
},
|
||||
"frontPocketOpeningWidth": {
|
||||
"t": "Front pocket opening width",
|
||||
"d": "Controls the width of the front pocket opening."
|
||||
},
|
||||
"hipsEase": {
|
||||
"t": "Hips ease",
|
||||
"d": "Controls the amount of ease at your hips."
|
||||
},
|
||||
"jseamBend": {
|
||||
"t": "J-Seam bend",
|
||||
"d": "Controls the curvature of the J-Seam, that J-shaped seam at the fly."
|
||||
},
|
||||
"length": {
|
||||
"t": "Length",
|
||||
"d": "Controls the length of the skirt."
|
||||
},
|
||||
"minDartWidth": {
|
||||
"t": "Minimal dart width",
|
||||
"d": "Controls the minimal width below which darts will be ommitted in favor of shaping at the seams."
|
||||
},
|
||||
"seatEase": {
|
||||
"t": "Seat ease",
|
||||
"d": "Controls the amount of ease at your seat."
|
||||
},
|
||||
"waistbandOverlap": {
|
||||
"t": "Waistband overlap",
|
||||
"d": "Controls how much the waistband overlaps at the front closure."
|
||||
},
|
||||
"waistbandWidth": {
|
||||
"t": "Waistband width",
|
||||
"d": "Controls the width of the waistband."
|
||||
},
|
||||
"waistSlant": {
|
||||
"t": "Waist slant",
|
||||
"d": "Controls the slant of the waistband, how much the back is raised higher than the front."
|
||||
}
|
||||
},
|
||||
"p": {}
|
||||
}
|
137
designs/naomiwu/i18n/en.json
Normal file
137
designs/naomiwu/i18n/en.json
Normal file
|
@ -0,0 +1,137 @@
|
|||
{
|
||||
"t": "Naomi Wu Cargo Skirt",
|
||||
"d": "This is Naomi's Wu's signature cargo skirt design.",
|
||||
"p": {
|
||||
"backAttachmentBack": "Back Attachment Back",
|
||||
"backAttachmentFlap": "Back Attachment Flap",
|
||||
"backAttachmentFront": "Back Attachment Front",
|
||||
"backPocket": "Back Pocket",
|
||||
"backPocketFlap": "Back Pocket Flap",
|
||||
"back": "Back",
|
||||
"beltLoop": "Belt Loop",
|
||||
"backBeltLoop": "Back Belt Loop",
|
||||
"flyShield": "Fly Shield",
|
||||
"frontAttachmentFacing": "Front Attachment Facing",
|
||||
"frontAttachment": "Front Attachment",
|
||||
"frontBase": "Front Base",
|
||||
"frontFlySide": "Front fly side",
|
||||
"frontNoFlySide": "Front no-fly side",
|
||||
"frontNoFlySideLeft": "Front no-fly side (left)",
|
||||
"frontNoFlySideRight": "Front no-fly side (right)",
|
||||
"frontFlySideLeft": "Front fly side (left)",
|
||||
"frontFlySideRight": "Front fly side (right)",
|
||||
"frontPocketBag": "Front Pocket Bag",
|
||||
"frontPocketFacing": "Front Pocket Facing",
|
||||
"shared": "Shared Code",
|
||||
"waistband": "Waistband"
|
||||
},
|
||||
"s": {
|
||||
"backAttachmentTooWide": "The **Back attachement** is currently wider than the space between the belt loops.\n\nYou can decrease the width until it fits, or you can leave it as-is but then you will need to modify the beltloop spacing yourself.",
|
||||
"cutBackAttachmentBack.t": "The back attachement back is not shown",
|
||||
"cutBackAttachmentBack.d": "The **Back attachement back** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long (this includes seam allowance). This part is not shown because the **expand** core setting is currently disabled. Enable it to show this pattern part.",
|
||||
"cutBeltLoop.t": "The belt loop is not shown",
|
||||
"cutBeltLoop.d": "The **Belt loop** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long (this includes seam allowance). You need 6 of them. This part is not shown because the **expand** core setting is currently disabled. Enable it to show this pattern part.",
|
||||
"cutBackBeltLoop.t": "The back belt loop is not shown",
|
||||
"cutBackBeltLoop.d": "The **Back belt loop** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long (this includes seam allowance). This part is not shown because the **expand** core setting is currently disabled. Enable it to show this pattern part.",
|
||||
"cutFlyShield.t": "The fly shield is not shown",
|
||||
"cutFlyShield.d": "The **Fly shield** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long (this includes seam allowance). This part is not shown because the **expand** core setting is currently disabled. Enable it to show this pattern part."
|
||||
},
|
||||
"o": {
|
||||
"backAttachmentDepth": {
|
||||
"t": "Back attachment depth",
|
||||
"d": "Controls the depth of the back attachment."
|
||||
},
|
||||
"backAttachmentFlapChamferSize": {
|
||||
"t": "Back attachment flap chamfer size",
|
||||
"d": "Controls the size of the chamfer on the back attachment flap."
|
||||
},
|
||||
"backAttachmentWidth": {
|
||||
"t": "Back attachment width",
|
||||
"d": "Controls the width of the front attachment."
|
||||
},
|
||||
"backPocketChamferSize": {
|
||||
"t": "Back pocket chamfer size",
|
||||
"d": "Controls the size of the chamfer on the back pocket."
|
||||
},
|
||||
"backPocketDepth": {
|
||||
"t": "Back pocket depth",
|
||||
"d": "Controls the depth of the back pockets."
|
||||
},
|
||||
"beltLoopWidth": {
|
||||
"t": "Belt loop width",
|
||||
"d": "Controls the width of the belt loops."
|
||||
},
|
||||
"dartLength": {
|
||||
"t": "Back dart length",
|
||||
"d": "Controls the length of the darts at the back."
|
||||
},
|
||||
"dartWidth": {
|
||||
"t": "Back dart width",
|
||||
"d": "Controls the width of the darts at the back."
|
||||
},
|
||||
"flyLength": {
|
||||
"t": "Fly lengt",
|
||||
"d": "Controls the length of the fly."
|
||||
},
|
||||
"flyWidth": {
|
||||
"t": "Fly width",
|
||||
"d": "Controls the width of the fly."
|
||||
},
|
||||
"frontAttachmentChamferSize": {
|
||||
"t": "Front attachment chamfer size",
|
||||
"d": "Controls the size of the chamfer on the front attachment."
|
||||
},
|
||||
"frontAttachmentWidth": {
|
||||
"t": "Front attachment width",
|
||||
"d": "Controls the width of the front attachment."
|
||||
},
|
||||
"frontHalf": {
|
||||
"t": "Front half proportion",
|
||||
"d": "Controls the proportion of the skirt that will make up the front panel."
|
||||
},
|
||||
"frontPocketOpeningBend": {
|
||||
"t": "Front pocket opening bend",
|
||||
"d": "Controls the curvature of the front pocket opening."
|
||||
},
|
||||
"frontPocketOpeningDepth": {
|
||||
"t": "Front pocket opening depth",
|
||||
"d": "Controls the depth of the front pocket opening."
|
||||
},
|
||||
"frontPocketOpeningWidth": {
|
||||
"t": "Front pocket opening width",
|
||||
"d": "Controls the width of the front pocket opening."
|
||||
},
|
||||
"hipsEase": {
|
||||
"t": "Hips ease",
|
||||
"d": "Controls the amount of ease at your hips."
|
||||
},
|
||||
"invertFly": {
|
||||
"t": "Invert the side of the fly",
|
||||
"d": "Allows you to control the side the fly is on, for convenience of gender-expression."
|
||||
},
|
||||
"jseamBend": {
|
||||
"t": "J-Seam bend",
|
||||
"d": "Controls the curvature of the J-Seam, that J-shaped seam at the fly."
|
||||
},
|
||||
"length": {
|
||||
"t": "Length",
|
||||
"d": "Controls the length of the skirt."
|
||||
},
|
||||
"minDartWidth": {
|
||||
"t": "Minimal dart width",
|
||||
"d": "Controls the minimal width below which darts will be ommitted in favor of shaping at the seams."
|
||||
},
|
||||
"seatEase": {
|
||||
"t": "Seat ease",
|
||||
"d": "Controls the amount of ease at your seat."
|
||||
},
|
||||
"waistbandWidth": {
|
||||
"t": "Waistband width",
|
||||
"d": "Controls the width of the waistband."
|
||||
},
|
||||
"waistSlant": {
|
||||
"t": "Waist slant",
|
||||
"d": "Controls the slant of the waistband, how much the back is raised higher than the front."
|
||||
}
|
||||
}
|
||||
}
|
104
designs/naomiwu/i18n/es.json
Normal file
104
designs/naomiwu/i18n/es.json
Normal file
|
@ -0,0 +1,104 @@
|
|||
{
|
||||
"t": "Naomi Wu Cargo Skirt",
|
||||
"d": "This is Naomi's Wu's signature cargo skirt design.",
|
||||
"s": {},
|
||||
"o": {
|
||||
"backAttachmentDepth": {
|
||||
"t": "Back attachment depth",
|
||||
"d": "Controls the depth of the back attachment."
|
||||
},
|
||||
"backAttachmentFlapChamferSize": {
|
||||
"t": "Back attachment flap chamfer size",
|
||||
"d": "Controls the size of the chamfer on the back attachment flap."
|
||||
},
|
||||
"backAttachmentWidth": {
|
||||
"t": "Back attachment width",
|
||||
"d": "Controls the width of the front attachment."
|
||||
},
|
||||
"backPocketChamferSize": {
|
||||
"t": "Back pocket chamfer size",
|
||||
"d": "Controls the size of the chamfer on the back pocket."
|
||||
},
|
||||
"backPocketDepth": {
|
||||
"t": "Back pocket depth",
|
||||
"d": "Controls the depth of the back pockets."
|
||||
},
|
||||
"beltloopWidth": {
|
||||
"t": "Beltloop width",
|
||||
"d": "Controls the width of the beltloops."
|
||||
},
|
||||
"dartLength": {
|
||||
"t": "Dart length",
|
||||
"d": "Controls the length of the darts at the back."
|
||||
},
|
||||
"dartWidth": {
|
||||
"t": "Dart width",
|
||||
"d": "Controls the width of the darts at the back."
|
||||
},
|
||||
"flyLength": {
|
||||
"t": "Fly lengt",
|
||||
"d": "Controls the length of the fly."
|
||||
},
|
||||
"flyWidth": {
|
||||
"t": "Fly width",
|
||||
"d": "Controls the width of the fly."
|
||||
},
|
||||
"frontAttachmentChamferSize": {
|
||||
"t": "Front attachment chamfer size",
|
||||
"d": "Controls the size of the chamfer on the front attachment."
|
||||
},
|
||||
"frontAttachmentWidth": {
|
||||
"t": "Front attachment width",
|
||||
"d": "Controls the width of the front attachment."
|
||||
},
|
||||
"frontHalf": {
|
||||
"t": "Front half",
|
||||
"d": "Controls the proportion of the skirt that will make up the front panel."
|
||||
},
|
||||
"frontPocketOpeningBend": {
|
||||
"t": "Front pocket opening bend",
|
||||
"d": "Controls the curvature of the front pocket opening."
|
||||
},
|
||||
"frontPocketOpeningDepth": {
|
||||
"t": "Front pocket opening depth",
|
||||
"d": "Controls the depth of the front pocket opening."
|
||||
},
|
||||
"frontPocketOpeningWidth": {
|
||||
"t": "Front pocket opening width",
|
||||
"d": "Controls the width of the front pocket opening."
|
||||
},
|
||||
"hipsEase": {
|
||||
"t": "Hips ease",
|
||||
"d": "Controls the amount of ease at your hips."
|
||||
},
|
||||
"jseamBend": {
|
||||
"t": "J-Seam bend",
|
||||
"d": "Controls the curvature of the J-Seam, that J-shaped seam at the fly."
|
||||
},
|
||||
"length": {
|
||||
"t": "Length",
|
||||
"d": "Controls the length of the skirt."
|
||||
},
|
||||
"minDartWidth": {
|
||||
"t": "Minimal dart width",
|
||||
"d": "Controls the minimal width below which darts will be ommitted in favor of shaping at the seams."
|
||||
},
|
||||
"seatEase": {
|
||||
"t": "Seat ease",
|
||||
"d": "Controls the amount of ease at your seat."
|
||||
},
|
||||
"waistbandOverlap": {
|
||||
"t": "Waistband overlap",
|
||||
"d": "Controls how much the waistband overlaps at the front closure."
|
||||
},
|
||||
"waistbandWidth": {
|
||||
"t": "Waistband width",
|
||||
"d": "Controls the width of the waistband."
|
||||
},
|
||||
"waistSlant": {
|
||||
"t": "Waist slant",
|
||||
"d": "Controls the slant of the waistband, how much the back is raised higher than the front."
|
||||
}
|
||||
},
|
||||
"p": {}
|
||||
}
|
104
designs/naomiwu/i18n/fr.json
Normal file
104
designs/naomiwu/i18n/fr.json
Normal file
|
@ -0,0 +1,104 @@
|
|||
{
|
||||
"t": "Naomi Wu Cargo Skirt",
|
||||
"d": "This is Naomi's Wu's signature cargo skirt design.",
|
||||
"s": {},
|
||||
"o": {
|
||||
"backAttachmentDepth": {
|
||||
"t": "Back attachment depth",
|
||||
"d": "Controls the depth of the back attachment."
|
||||
},
|
||||
"backAttachmentFlapChamferSize": {
|
||||
"t": "Back attachment flap chamfer size",
|
||||
"d": "Controls the size of the chamfer on the back attachment flap."
|
||||
},
|
||||
"backAttachmentWidth": {
|
||||
"t": "Back attachment width",
|
||||
"d": "Controls the width of the front attachment."
|
||||
},
|
||||
"backPocketChamferSize": {
|
||||
"t": "Back pocket chamfer size",
|
||||
"d": "Controls the size of the chamfer on the back pocket."
|
||||
},
|
||||
"backPocketDepth": {
|
||||
"t": "Back pocket depth",
|
||||
"d": "Controls the depth of the back pockets."
|
||||
},
|
||||
"beltloopWidth": {
|
||||
"t": "Beltloop width",
|
||||
"d": "Controls the width of the beltloops."
|
||||
},
|
||||
"dartLength": {
|
||||
"t": "Dart length",
|
||||
"d": "Controls the length of the darts at the back."
|
||||
},
|
||||
"dartWidth": {
|
||||
"t": "Dart width",
|
||||
"d": "Controls the width of the darts at the back."
|
||||
},
|
||||
"flyLength": {
|
||||
"t": "Fly lengt",
|
||||
"d": "Controls the length of the fly."
|
||||
},
|
||||
"flyWidth": {
|
||||
"t": "Fly width",
|
||||
"d": "Controls the width of the fly."
|
||||
},
|
||||
"frontAttachmentChamferSize": {
|
||||
"t": "Front attachment chamfer size",
|
||||
"d": "Controls the size of the chamfer on the front attachment."
|
||||
},
|
||||
"frontAttachmentWidth": {
|
||||
"t": "Front attachment width",
|
||||
"d": "Controls the width of the front attachment."
|
||||
},
|
||||
"frontHalf": {
|
||||
"t": "Front half",
|
||||
"d": "Controls the proportion of the skirt that will make up the front panel."
|
||||
},
|
||||
"frontPocketOpeningBend": {
|
||||
"t": "Front pocket opening bend",
|
||||
"d": "Controls the curvature of the front pocket opening."
|
||||
},
|
||||
"frontPocketOpeningDepth": {
|
||||
"t": "Front pocket opening depth",
|
||||
"d": "Controls the depth of the front pocket opening."
|
||||
},
|
||||
"frontPocketOpeningWidth": {
|
||||
"t": "Front pocket opening width",
|
||||
"d": "Controls the width of the front pocket opening."
|
||||
},
|
||||
"hipsEase": {
|
||||
"t": "Hips ease",
|
||||
"d": "Controls the amount of ease at your hips."
|
||||
},
|
||||
"jseamBend": {
|
||||
"t": "J-Seam bend",
|
||||
"d": "Controls the curvature of the J-Seam, that J-shaped seam at the fly."
|
||||
},
|
||||
"length": {
|
||||
"t": "Length",
|
||||
"d": "Controls the length of the skirt."
|
||||
},
|
||||
"minDartWidth": {
|
||||
"t": "Minimal dart width",
|
||||
"d": "Controls the minimal width below which darts will be ommitted in favor of shaping at the seams."
|
||||
},
|
||||
"seatEase": {
|
||||
"t": "Seat ease",
|
||||
"d": "Controls the amount of ease at your seat."
|
||||
},
|
||||
"waistbandOverlap": {
|
||||
"t": "Waistband overlap",
|
||||
"d": "Controls how much the waistband overlaps at the front closure."
|
||||
},
|
||||
"waistbandWidth": {
|
||||
"t": "Waistband width",
|
||||
"d": "Controls the width of the waistband."
|
||||
},
|
||||
"waistSlant": {
|
||||
"t": "Waist slant",
|
||||
"d": "Controls the slant of the waistband, how much the back is raised higher than the front."
|
||||
}
|
||||
},
|
||||
"p": {}
|
||||
}
|
8
designs/naomiwu/i18n/index.mjs
Normal file
8
designs/naomiwu/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 }
|
104
designs/naomiwu/i18n/nl.json
Normal file
104
designs/naomiwu/i18n/nl.json
Normal file
|
@ -0,0 +1,104 @@
|
|||
{
|
||||
"t": "Naomi Wu Cargo Skirt",
|
||||
"d": "This is Naomi's Wu's signature cargo skirt design.",
|
||||
"s": {},
|
||||
"o": {
|
||||
"backAttachmentDepth": {
|
||||
"t": "Back attachment depth",
|
||||
"d": "Controls the depth of the back attachment."
|
||||
},
|
||||
"backAttachmentFlapChamferSize": {
|
||||
"t": "Back attachment flap chamfer size",
|
||||
"d": "Controls the size of the chamfer on the back attachment flap."
|
||||
},
|
||||
"backAttachmentWidth": {
|
||||
"t": "Back attachment width",
|
||||
"d": "Controls the width of the front attachment."
|
||||
},
|
||||
"backPocketChamferSize": {
|
||||
"t": "Back pocket chamfer size",
|
||||
"d": "Controls the size of the chamfer on the back pocket."
|
||||
},
|
||||
"backPocketDepth": {
|
||||
"t": "Back pocket depth",
|
||||
"d": "Controls the depth of the back pockets."
|
||||
},
|
||||
"beltloopWidth": {
|
||||
"t": "Beltloop width",
|
||||
"d": "Controls the width of the beltloops."
|
||||
},
|
||||
"dartLength": {
|
||||
"t": "Dart length",
|
||||
"d": "Controls the length of the darts at the back."
|
||||
},
|
||||
"dartWidth": {
|
||||
"t": "Dart width",
|
||||
"d": "Controls the width of the darts at the back."
|
||||
},
|
||||
"flyLength": {
|
||||
"t": "Fly lengt",
|
||||
"d": "Controls the length of the fly."
|
||||
},
|
||||
"flyWidth": {
|
||||
"t": "Fly width",
|
||||
"d": "Controls the width of the fly."
|
||||
},
|
||||
"frontAttachmentChamferSize": {
|
||||
"t": "Front attachment chamfer size",
|
||||
"d": "Controls the size of the chamfer on the front attachment."
|
||||
},
|
||||
"frontAttachmentWidth": {
|
||||
"t": "Front attachment width",
|
||||
"d": "Controls the width of the front attachment."
|
||||
},
|
||||
"frontHalf": {
|
||||
"t": "Front half",
|
||||
"d": "Controls the proportion of the skirt that will make up the front panel."
|
||||
},
|
||||
"frontPocketOpeningBend": {
|
||||
"t": "Front pocket opening bend",
|
||||
"d": "Controls the curvature of the front pocket opening."
|
||||
},
|
||||
"frontPocketOpeningDepth": {
|
||||
"t": "Front pocket opening depth",
|
||||
"d": "Controls the depth of the front pocket opening."
|
||||
},
|
||||
"frontPocketOpeningWidth": {
|
||||
"t": "Front pocket opening width",
|
||||
"d": "Controls the width of the front pocket opening."
|
||||
},
|
||||
"hipsEase": {
|
||||
"t": "Hips ease",
|
||||
"d": "Controls the amount of ease at your hips."
|
||||
},
|
||||
"jseamBend": {
|
||||
"t": "J-Seam bend",
|
||||
"d": "Controls the curvature of the J-Seam, that J-shaped seam at the fly."
|
||||
},
|
||||
"length": {
|
||||
"t": "Length",
|
||||
"d": "Controls the length of the skirt."
|
||||
},
|
||||
"minDartWidth": {
|
||||
"t": "Minimal dart width",
|
||||
"d": "Controls the minimal width below which darts will be ommitted in favor of shaping at the seams."
|
||||
},
|
||||
"seatEase": {
|
||||
"t": "Seat ease",
|
||||
"d": "Controls the amount of ease at your seat."
|
||||
},
|
||||
"waistbandOverlap": {
|
||||
"t": "Waistband overlap",
|
||||
"d": "Controls how much the waistband overlaps at the front closure."
|
||||
},
|
||||
"waistbandWidth": {
|
||||
"t": "Waistband width",
|
||||
"d": "Controls the width of the waistband."
|
||||
},
|
||||
"waistSlant": {
|
||||
"t": "Waist slant",
|
||||
"d": "Controls the slant of the waistband, how much the back is raised higher than the front."
|
||||
}
|
||||
},
|
||||
"p": {}
|
||||
}
|
104
designs/naomiwu/i18n/uk.json
Normal file
104
designs/naomiwu/i18n/uk.json
Normal file
|
@ -0,0 +1,104 @@
|
|||
{
|
||||
"t": "Naomi Wu Cargo Skirt",
|
||||
"d": "This is Naomi's Wu's signature cargo skirt design.",
|
||||
"s": {},
|
||||
"o": {
|
||||
"backAttachmentDepth": {
|
||||
"t": "Back attachment depth",
|
||||
"d": "Controls the depth of the back attachment."
|
||||
},
|
||||
"backAttachmentFlapChamferSize": {
|
||||
"t": "Back attachment flap chamfer size",
|
||||
"d": "Controls the size of the chamfer on the back attachment flap."
|
||||
},
|
||||
"backAttachmentWidth": {
|
||||
"t": "Back attachment width",
|
||||
"d": "Controls the width of the front attachment."
|
||||
},
|
||||
"backPocketChamferSize": {
|
||||
"t": "Back pocket chamfer size",
|
||||
"d": "Controls the size of the chamfer on the back pocket."
|
||||
},
|
||||
"backPocketDepth": {
|
||||
"t": "Back pocket depth",
|
||||
"d": "Controls the depth of the back pockets."
|
||||
},
|
||||
"beltloopWidth": {
|
||||
"t": "Beltloop width",
|
||||
"d": "Controls the width of the beltloops."
|
||||
},
|
||||
"dartLength": {
|
||||
"t": "Dart length",
|
||||
"d": "Controls the length of the darts at the back."
|
||||
},
|
||||
"dartWidth": {
|
||||
"t": "Dart width",
|
||||
"d": "Controls the width of the darts at the back."
|
||||
},
|
||||
"flyLength": {
|
||||
"t": "Fly lengt",
|
||||
"d": "Controls the length of the fly."
|
||||
},
|
||||
"flyWidth": {
|
||||
"t": "Fly width",
|
||||
"d": "Controls the width of the fly."
|
||||
},
|
||||
"frontAttachmentChamferSize": {
|
||||
"t": "Front attachment chamfer size",
|
||||
"d": "Controls the size of the chamfer on the front attachment."
|
||||
},
|
||||
"frontAttachmentWidth": {
|
||||
"t": "Front attachment width",
|
||||
"d": "Controls the width of the front attachment."
|
||||
},
|
||||
"frontHalf": {
|
||||
"t": "Front half",
|
||||
"d": "Controls the proportion of the skirt that will make up the front panel."
|
||||
},
|
||||
"frontPocketOpeningBend": {
|
||||
"t": "Front pocket opening bend",
|
||||
"d": "Controls the curvature of the front pocket opening."
|
||||
},
|
||||
"frontPocketOpeningDepth": {
|
||||
"t": "Front pocket opening depth",
|
||||
"d": "Controls the depth of the front pocket opening."
|
||||
},
|
||||
"frontPocketOpeningWidth": {
|
||||
"t": "Front pocket opening width",
|
||||
"d": "Controls the width of the front pocket opening."
|
||||
},
|
||||
"hipsEase": {
|
||||
"t": "Hips ease",
|
||||
"d": "Controls the amount of ease at your hips."
|
||||
},
|
||||
"jseamBend": {
|
||||
"t": "J-Seam bend",
|
||||
"d": "Controls the curvature of the J-Seam, that J-shaped seam at the fly."
|
||||
},
|
||||
"length": {
|
||||
"t": "Length",
|
||||
"d": "Controls the length of the skirt."
|
||||
},
|
||||
"minDartWidth": {
|
||||
"t": "Minimal dart width",
|
||||
"d": "Controls the minimal width below which darts will be ommitted in favor of shaping at the seams."
|
||||
},
|
||||
"seatEase": {
|
||||
"t": "Seat ease",
|
||||
"d": "Controls the amount of ease at your seat."
|
||||
},
|
||||
"waistbandOverlap": {
|
||||
"t": "Waistband overlap",
|
||||
"d": "Controls how much the waistband overlaps at the front closure."
|
||||
},
|
||||
"waistbandWidth": {
|
||||
"t": "Waistband width",
|
||||
"d": "Controls the width of the waistband."
|
||||
},
|
||||
"waistSlant": {
|
||||
"t": "Waist slant",
|
||||
"d": "Controls the slant of the waistband, how much the back is raised higher than the front."
|
||||
}
|
||||
},
|
||||
"p": {}
|
||||
}
|
73
designs/naomiwu/package.json
Normal file
73
designs/naomiwu/package.json
Normal file
|
@ -0,0 +1,73 @@
|
|||
{
|
||||
"name": "@freesewing/naomiwu",
|
||||
"version": "3.0.0-alpha.10",
|
||||
"description": "A FreeSewing pattern for Naomi Wu's signature cargo skirt",
|
||||
"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-alpha.10"
|
||||
},
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"mocha": "10.2.0",
|
||||
"chai": "4.3.7",
|
||||
"@freesewing/models": "3.0.0-alpha.10",
|
||||
"@freesewing/plugin-timing": "3.0.0-alpha.10"
|
||||
},
|
||||
"files": [
|
||||
"dist/*",
|
||||
"README.md"
|
||||
],
|
||||
"publishConfig": {
|
||||
"access": "public",
|
||||
"tag": "next"
|
||||
},
|
||||
"engines": {
|
||||
"node": "18",
|
||||
"npm": "9"
|
||||
}
|
||||
}
|
162
designs/naomiwu/src/back-attachment-back.mjs
Normal file
162
designs/naomiwu/src/back-attachment-back.mjs
Normal file
|
@ -0,0 +1,162 @@
|
|||
import { waistband } from './waistband.mjs'
|
||||
|
||||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const backAttachmentBack = {
|
||||
name: 'naomiwu.backAttachmentBack', // The name in design::part format
|
||||
draft: draftBackAttachmentBack, // The method to call to draft this part
|
||||
after: waistband, // Ensure this is drafted after the (imported) waistband part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the back of the back attachment of the skirt
|
||||
*/
|
||||
function draftBackAttachmentBack({
|
||||
Point,
|
||||
points,
|
||||
Path,
|
||||
paths,
|
||||
store,
|
||||
part,
|
||||
options,
|
||||
complete,
|
||||
sa,
|
||||
snippets,
|
||||
Snippet,
|
||||
macro,
|
||||
expand,
|
||||
units,
|
||||
absoluteOptions,
|
||||
}) {
|
||||
const width = absoluteOptions.backAttachmentWidth
|
||||
const height = width * options.backAttachmentDepth
|
||||
|
||||
/*
|
||||
* Draw the back of the back attachment shape
|
||||
*/
|
||||
points.topLeft = new Point(0, 0)
|
||||
points.topRight = new Point(width, 0)
|
||||
points.bottomLeft = new Point(0, height)
|
||||
points.bottomRight = new Point(width, height)
|
||||
|
||||
/*
|
||||
* Add points to mark the edge of the attachment's front
|
||||
* Even if expand is off, we need these in other parts
|
||||
*/
|
||||
points.frontLeft = points.topLeft.shiftFractionTowards(points.bottomLeft, 0.22)
|
||||
points.frontRight = new Point(points.topRight.x, points.frontLeft.y)
|
||||
|
||||
/*
|
||||
* We allow the user to control the back attachment, but warn them when it's
|
||||
* too wide to fit between the belt loops, because that is inconvenient.
|
||||
*/
|
||||
if (absoluteOptions.backAttachmentWidth > store.get('backAttachmentMaxWidth')) {
|
||||
store.flag.warn({
|
||||
msg: 'naomiwu:backAttachmentTooWide',
|
||||
replace: {
|
||||
delta: units(absoluteOptions.backAttachmentWidth - store.get('backAttachmentMaxWidth')),
|
||||
},
|
||||
suggest: {
|
||||
text: 'flag:decrease',
|
||||
icon: 'down',
|
||||
update: {
|
||||
settings: ['options.backAttachmentWidth', options.backAttachmentWidth * 0.9],
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
if (expand) {
|
||||
store.flag.preset('expandIsOn')
|
||||
} else {
|
||||
// Expand is off, do not draw the part but flag this to the user
|
||||
store.flag.note({
|
||||
msg: `naomiwu:cutBackAttachmentBack`,
|
||||
replace: {
|
||||
width: units(width + 2 * sa),
|
||||
length: units(height + 2 * sa),
|
||||
},
|
||||
suggest: {
|
||||
text: 'flag:show',
|
||||
icon: 'expand',
|
||||
update: {
|
||||
settings: ['expand', 1],
|
||||
},
|
||||
},
|
||||
})
|
||||
// Also hint about expand
|
||||
store.flag.preset('expandIsOff')
|
||||
|
||||
return part.hide()
|
||||
}
|
||||
|
||||
/*
|
||||
* The seam line
|
||||
*/
|
||||
paths.seam = new Path()
|
||||
.move(points.topLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomRight)
|
||||
.line(points.topRight)
|
||||
.line(points.topLeft)
|
||||
.close()
|
||||
.addClass('fabric')
|
||||
|
||||
/*
|
||||
* Add the front edge line
|
||||
*/
|
||||
if (complete)
|
||||
paths.frontEdge = new Path()
|
||||
.move(points.frontLeft)
|
||||
.line(points.frontRight)
|
||||
.addClass('note stroke-sm dashed')
|
||||
|
||||
/*
|
||||
* Only add SA when it's requested.
|
||||
* This also adds extra SA to fold under the edge.
|
||||
*/
|
||||
if (sa) paths.sa = paths.seam.offset(sa).addClass('fabric sa')
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 1, from: 'fabric' })
|
||||
|
||||
/*
|
||||
* Add the title
|
||||
*/
|
||||
points.title = points.frontLeft.shiftFractionTowards(points.bottomRight, 0.5)
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 12,
|
||||
title: 'backAttachmentBack',
|
||||
align: 'center',
|
||||
scale: 0.666,
|
||||
})
|
||||
|
||||
/*
|
||||
* Add the logo
|
||||
*/
|
||||
points.logo = points.title.shift(90, 65)
|
||||
snippets.logo = new Snippet('logo', points.logo).scale(0.5)
|
||||
|
||||
/*
|
||||
* Dimensions
|
||||
*/
|
||||
macro('hd', {
|
||||
id: 'width',
|
||||
from: points.bottomLeft,
|
||||
to: points.bottomRight,
|
||||
y: points.bottomLeft.y + sa + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'length',
|
||||
from: points.bottomRight,
|
||||
to: points.topRight,
|
||||
x: points.topRight.x + sa + 15,
|
||||
})
|
||||
|
||||
return part
|
||||
}
|
140
designs/naomiwu/src/back-attachment-flap.mjs
Normal file
140
designs/naomiwu/src/back-attachment-flap.mjs
Normal file
|
@ -0,0 +1,140 @@
|
|||
import { backAttachmentFront } from './back-attachment-front.mjs'
|
||||
|
||||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const backAttachmentFlap = {
|
||||
name: 'naomiwu.backAttachmentFlap', // The name in design::part format
|
||||
draft: draftBackAttachmentFlap, // The method to call to draft this part
|
||||
from: backAttachmentFront, // Draft this part starting from the (imported) `backAttachmentBack` part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the flap of the back attachment of the skirt
|
||||
*/
|
||||
function draftBackAttachmentFlap({
|
||||
Point,
|
||||
points,
|
||||
Path,
|
||||
paths,
|
||||
store,
|
||||
part,
|
||||
options,
|
||||
complete,
|
||||
sa,
|
||||
snippets,
|
||||
Snippet,
|
||||
macro,
|
||||
}) {
|
||||
/*
|
||||
* Shorten the bottom
|
||||
*/
|
||||
points.bottomLeft = new Point(
|
||||
points.topLeft.x,
|
||||
points.velcroBottomLeft.y + points.velcroBottomLeft.dx(points.velcroBottomRight)
|
||||
)
|
||||
points.bottomRight = new Point(points.topRight.x, points.bottomLeft.y)
|
||||
|
||||
/*
|
||||
* Add chamfer
|
||||
*/
|
||||
const size = points.frontRight.x * options.backAttachmentFlapChamferSize
|
||||
points.chamferLeftTop = points.bottomLeft.shift(90, size)
|
||||
points.chamferLeftBottom = points.bottomLeft.shift(0, size)
|
||||
points.chamferRightTop = points.bottomRight.shift(90, size)
|
||||
points.chamferRightBottom = points.bottomRight.shift(180, size)
|
||||
|
||||
/*
|
||||
* Extend the velcro strip
|
||||
*/
|
||||
points.velcroBottomLeft = new Point(points.velcroBottomLeft.x, points.bottomLeft.y * 0.92)
|
||||
points.velcroBottomRight = new Point(points.velcroBottomRight.x, points.velcroBottomLeft.y)
|
||||
|
||||
/*
|
||||
* The seam line
|
||||
*/
|
||||
paths.seam = new Path()
|
||||
.move(points.topLeft)
|
||||
.line(points.chamferLeftTop)
|
||||
.line(points.chamferLeftBottom)
|
||||
.line(points.chamferRightBottom)
|
||||
.line(points.chamferRightTop)
|
||||
.line(points.topRight)
|
||||
.line(points.topLeft)
|
||||
.close()
|
||||
.addClass('fabric')
|
||||
|
||||
/*
|
||||
* Mark the velcro strip
|
||||
*/
|
||||
if (complete) {
|
||||
paths.velcro = new Path()
|
||||
.move(points.velcroTopLeft)
|
||||
.line(points.velcroBottomLeft)
|
||||
.line(points.velcroBottomRight)
|
||||
.line(points.velcroTopRight)
|
||||
.line(points.velcroTopLeft)
|
||||
.close()
|
||||
.addClass('note stroke-sm dashed')
|
||||
macro('banner', {
|
||||
path: paths.velcro,
|
||||
text: 'velcro',
|
||||
classes: 'fill-note text-xs',
|
||||
spaces: 2,
|
||||
})
|
||||
}
|
||||
|
||||
/*
|
||||
* Only add SA when it's requested.
|
||||
* This also adds extra SA to fold under the edge.
|
||||
*/
|
||||
if (sa) paths.sa = paths.seam.offset(sa).close().addClass('fabric sa')
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 1, from: 'fabric' })
|
||||
|
||||
/*
|
||||
* Add the title
|
||||
*/
|
||||
points.title = points.topLeft.shift(-90, 25).shift(0, 10)
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 14,
|
||||
title: 'backAttachmentFlap',
|
||||
scale: 0.5,
|
||||
})
|
||||
|
||||
/*
|
||||
* Add the logo
|
||||
*/
|
||||
points.logo = points.title.shift(-90, 30)
|
||||
snippets.logo = new Snippet('logo', points.logo).scale(0.333)
|
||||
|
||||
/*
|
||||
* Dimensions
|
||||
*/
|
||||
macro('hd', {
|
||||
id: 'width',
|
||||
from: points.bottomLeft,
|
||||
to: points.bottomRight,
|
||||
y: points.bottomLeft.y + sa + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'length',
|
||||
from: points.bottomRight,
|
||||
to: points.topRight,
|
||||
x: points.topRight.x + sa + 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'chamferWidth',
|
||||
from: points.chamferRightBottom,
|
||||
to: points.chamferRightTop,
|
||||
y: points.chamferRightTop.y - 15,
|
||||
})
|
||||
|
||||
return part
|
||||
}
|
121
designs/naomiwu/src/back-attachment-front.mjs
Normal file
121
designs/naomiwu/src/back-attachment-front.mjs
Normal file
|
@ -0,0 +1,121 @@
|
|||
import { backAttachmentBack } from './back-attachment-back.mjs'
|
||||
|
||||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const backAttachmentFront = {
|
||||
name: 'naomiwu.backAttachmentFront', // The name in design::part format
|
||||
draft: draftBackAttachmentFront, // The method to call to draft this part
|
||||
from: backAttachmentBack, // Draft this part starting from the (imported) `backAttachmentBack` part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the front of the back attachment of the skirt
|
||||
*/
|
||||
function draftBackAttachmentFront({ points, Path, paths, store, part, complete, sa, macro }) {
|
||||
/*
|
||||
* Clear up what we don't need from the backAttachmentBack part
|
||||
*/
|
||||
delete paths.frontEdge
|
||||
|
||||
/*
|
||||
* Add points for the velcro strip
|
||||
*/
|
||||
points.velcroTopLeft = points.frontLeft
|
||||
.shiftFractionTowards(points.frontRight, 0.4)
|
||||
.shift(-90, points.frontRight.x / 10)
|
||||
points.velcroTopRight = points.frontRight
|
||||
.shiftFractionTowards(points.frontLeft, 0.4)
|
||||
.shift(-90, points.frontRight.x / 10)
|
||||
points.velcroBottomLeft = points.velcroTopLeft.shift(-90, points.frontRight.x / 3)
|
||||
points.velcroBottomRight = points.velcroTopRight.shift(-90, points.frontRight.x / 3)
|
||||
|
||||
/*
|
||||
* The seam line
|
||||
*/
|
||||
paths.seam = new Path()
|
||||
.move(points.frontLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomRight)
|
||||
.line(points.frontRight)
|
||||
.line(points.frontLeft)
|
||||
.close()
|
||||
.addClass('fabric')
|
||||
|
||||
/*
|
||||
* Mark the velcro strip
|
||||
*/
|
||||
if (complete) {
|
||||
paths.velcro = new Path()
|
||||
.move(points.velcroTopLeft)
|
||||
.line(points.velcroBottomLeft)
|
||||
.line(points.velcroBottomRight)
|
||||
.line(points.velcroTopRight)
|
||||
.line(points.velcroTopLeft)
|
||||
.close()
|
||||
.addClass('note stroke-sm dashed')
|
||||
macro('banner', {
|
||||
path: paths.velcro,
|
||||
text: 'velcro',
|
||||
classes: 'fill-note text-xs',
|
||||
spaces: 2,
|
||||
})
|
||||
}
|
||||
|
||||
/*
|
||||
* Only add SA when it's requested.
|
||||
* This also adds extra SA to fold under the edge.
|
||||
*/
|
||||
if (sa)
|
||||
paths.sa = new Path()
|
||||
.move(points.frontLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomRight)
|
||||
.line(points.frontRight)
|
||||
.offset(sa)
|
||||
.join(
|
||||
new Path()
|
||||
.move(points.frontRight)
|
||||
.line(points.frontLeft)
|
||||
.offset(3 * sa)
|
||||
)
|
||||
.close()
|
||||
.addClass('fabric sa')
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 1, from: 'fabric' })
|
||||
|
||||
/*
|
||||
* Add the title
|
||||
*/
|
||||
points.title = points.frontLeft.shiftFractionTowards(points.bottomRight, 0.5)
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 13,
|
||||
title: 'backAttachmentFront',
|
||||
align: 'center',
|
||||
scale: 0.666,
|
||||
})
|
||||
|
||||
/*
|
||||
* Dimensions
|
||||
*/
|
||||
macro('hd', {
|
||||
id: 'width',
|
||||
from: points.bottomLeft,
|
||||
to: points.bottomRight,
|
||||
y: points.bottomLeft.y + sa + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'length',
|
||||
from: points.bottomRight,
|
||||
to: points.frontRight,
|
||||
x: points.topRight.x + sa + 15,
|
||||
})
|
||||
|
||||
return part
|
||||
}
|
136
designs/naomiwu/src/back-belt-loop.mjs
Normal file
136
designs/naomiwu/src/back-belt-loop.mjs
Normal file
|
@ -0,0 +1,136 @@
|
|||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const backBeltLoop = {
|
||||
name: 'naomiwu.backBeltLoop', // The name in design::part format
|
||||
draft: draftBackBeltLoop, // The method to call to draft this part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the waistband of the skirt
|
||||
*/
|
||||
function draftBackBeltLoop({
|
||||
Point,
|
||||
points,
|
||||
Path,
|
||||
paths,
|
||||
store,
|
||||
part,
|
||||
sa,
|
||||
expand,
|
||||
units,
|
||||
macro,
|
||||
absoluteOptions,
|
||||
}) {
|
||||
const w = absoluteOptions.beltLoopWidth * 4.5
|
||||
const h = absoluteOptions.waistbandWidth * 1.5
|
||||
|
||||
if (expand) {
|
||||
store.flag.preset('expandIsOn')
|
||||
} else {
|
||||
// Expand is off, do not draw the part but flag this to the user
|
||||
store.flag.note({
|
||||
msg: `naomiwu:cutBackBeltLoop`,
|
||||
replace: {
|
||||
width: units(w + 4 * sa),
|
||||
length: units(h + 2 * sa),
|
||||
},
|
||||
suggest: {
|
||||
text: 'flag:show',
|
||||
icon: 'expand',
|
||||
update: {
|
||||
settings: ['expand', 1],
|
||||
},
|
||||
},
|
||||
})
|
||||
// Also hint about expand
|
||||
store.flag.preset('expandIsOff')
|
||||
|
||||
return part.hide()
|
||||
}
|
||||
|
||||
/*
|
||||
* It's a rectangle
|
||||
*/
|
||||
points.topLeft = new Point(0, 0)
|
||||
points.topRight = new Point(w, 0)
|
||||
points.bottomLeft = new Point(0, h)
|
||||
points.bottomRight = new Point(w, h)
|
||||
|
||||
/*
|
||||
* Seamline
|
||||
*/
|
||||
paths.seam = new Path()
|
||||
.move(points.topLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomRight)
|
||||
.line(points.topRight)
|
||||
.line(points.topLeft)
|
||||
.close()
|
||||
.addClass('fabric')
|
||||
|
||||
/*
|
||||
* Only add SA when requested (note that this adds extra SA at the sides for hemming)
|
||||
*/
|
||||
if (sa)
|
||||
paths.sa = new Path()
|
||||
.move(points.topLeft.shift(180, sa))
|
||||
.line(points.bottomLeft.shift(180, sa))
|
||||
.line(points.bottomRight.shift(0, sa))
|
||||
.line(points.topRight.shift(0, sa))
|
||||
.line(points.topLeft.shift(180, sa))
|
||||
.close()
|
||||
.offset(sa)
|
||||
.addClass('fabric sa')
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 6, from: 'fabric' })
|
||||
|
||||
/*
|
||||
* Add the title
|
||||
*/
|
||||
points.title = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 15,
|
||||
title: 'beltLoop',
|
||||
align: 'center',
|
||||
scale: 0.666,
|
||||
})
|
||||
|
||||
/*
|
||||
* Add a grainline indicator
|
||||
*/
|
||||
points.grainlineTop = points.topLeft.shift(0, 7)
|
||||
points.grainlineBottom = points.bottomLeft.shift(0, 7)
|
||||
macro('grainline', {
|
||||
from: points.grainlineBottom,
|
||||
to: points.grainlineTop,
|
||||
classes: {
|
||||
line: 'stroke-sm note',
|
||||
text: 'text-sm fill-note center',
|
||||
},
|
||||
})
|
||||
|
||||
/*
|
||||
* Dimensions
|
||||
*/
|
||||
macro('hd', {
|
||||
id: 'wFull',
|
||||
from: points.bottomLeft,
|
||||
to: points.bottomRight,
|
||||
y: points.bottomLeft.y + 15 + sa,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'hFull',
|
||||
from: points.bottomRight,
|
||||
to: points.topRight,
|
||||
x: points.topRight.x + 15 + 2 * sa,
|
||||
})
|
||||
|
||||
return part
|
||||
}
|
93
designs/naomiwu/src/back-pocket-flap.mjs
Normal file
93
designs/naomiwu/src/back-pocket-flap.mjs
Normal file
|
@ -0,0 +1,93 @@
|
|||
import { backPocket } from './back-pocket.mjs'
|
||||
|
||||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const backPocketFlap = {
|
||||
name: 'naomiwu.backPocketFlap', // The name in design::part format
|
||||
draft: draftBackPocketFlap, // The method to call to draft this part
|
||||
from: backPocket, // Draft this part starting from the (imported) `backPocket` part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the back pocket flap of the skirt
|
||||
*/
|
||||
function draftBackPocketFlap({ Point, points, paths, store, part, sa, snippets, Snippet, macro }) {
|
||||
/*
|
||||
* Clean up what we don't need from the backPocket part
|
||||
*/
|
||||
delete paths.pocket
|
||||
macro('rmvd', 'height')
|
||||
macro('rmhd', 'width')
|
||||
macro('rmhd', 'wChamfer')
|
||||
macro('rmvd', 'hChamfer')
|
||||
|
||||
/*
|
||||
* The seam line
|
||||
*/
|
||||
paths.seam = paths.flap.clone().setClass('fabric')
|
||||
paths.flap.hide()
|
||||
|
||||
/*
|
||||
* Only add SA when it's requested
|
||||
*/
|
||||
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 2, from: 'fabric' })
|
||||
|
||||
/*
|
||||
* Add the title
|
||||
*/
|
||||
points.title = points.pocketTopLeft.shiftFractionTowards(points.flapBottomLeft, 0.6).shift(0, 20)
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 11,
|
||||
title: 'backPocketFlap',
|
||||
scale: 0.7,
|
||||
})
|
||||
|
||||
/*
|
||||
* Add the logo
|
||||
*/
|
||||
points.logo = points.title.shift(0, 70)
|
||||
snippets.logo = new Snippet('logo', points.logo).scale(0.5)
|
||||
|
||||
/*
|
||||
* Add a grainline indicator
|
||||
*/
|
||||
points.grainlineBottom = points.flapBottomLeft.shift(0, 10)
|
||||
points.grainlineTop = new Point(points.grainlineBottom.x, points.flapTopRight.y)
|
||||
macro('grainline', {
|
||||
from: points.grainlineBottom,
|
||||
to: points.grainlineTop,
|
||||
})
|
||||
|
||||
/*
|
||||
* Dimensions
|
||||
*/
|
||||
macro('vd', {
|
||||
id: 'leftHeight',
|
||||
from: points.flapBottomLeft,
|
||||
to: points.flapTopLeft,
|
||||
x: points.flapTopLeft.x - sa - 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'rightHeight',
|
||||
from: points.flapBottomRight,
|
||||
to: points.flapTopRight,
|
||||
x: points.flapTopRight.x + sa + 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'width',
|
||||
from: points.flapTopLeft,
|
||||
to: points.flapTopRight,
|
||||
y: points.flapTopRight.y - sa - 15,
|
||||
})
|
||||
|
||||
return part
|
||||
}
|
132
designs/naomiwu/src/back-pocket.mjs
Normal file
132
designs/naomiwu/src/back-pocket.mjs
Normal file
|
@ -0,0 +1,132 @@
|
|||
import { back } from './back.mjs'
|
||||
|
||||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const backPocket = {
|
||||
name: 'naomiwu.backPocket', // The name in design::part format
|
||||
draft: draftBackPocket, // The method to call to draft this part
|
||||
from: back, // Draft this part starting from the (imported) `back` part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the back pocket of the skirt
|
||||
*/
|
||||
function draftBackPocket({
|
||||
Point,
|
||||
points,
|
||||
Path,
|
||||
paths,
|
||||
store,
|
||||
part,
|
||||
complete,
|
||||
sa,
|
||||
snippets,
|
||||
Snippet,
|
||||
macro,
|
||||
}) {
|
||||
/*
|
||||
* Clean up what we don't need from the back part
|
||||
*/
|
||||
delete paths.cb
|
||||
delete paths.hem
|
||||
delete paths.hipLine
|
||||
delete paths.side
|
||||
delete paths.backSeam
|
||||
if (!complete) delete paths.flap
|
||||
delete snippets['dartLeft-bnotch']
|
||||
delete snippets['dartRight-bnotch']
|
||||
delete snippets['dartTip-bnotch']
|
||||
macro('rmad')
|
||||
|
||||
/*
|
||||
* The seam line
|
||||
*/
|
||||
paths.pocket.hide()
|
||||
paths.seam = paths.pocket.clone().setClass('fabric').unhide()
|
||||
|
||||
/*
|
||||
* Only add SA when it's requested.
|
||||
* This also adds extra SA to fold under the edge.
|
||||
*/
|
||||
if (sa)
|
||||
paths.sa = new Path()
|
||||
.move(points.pocketTopLeft)
|
||||
.line(points.chamferLeftTop)
|
||||
.line(points.chamferLeft)
|
||||
.line(points.chamferRight)
|
||||
.line(points.chamferRightTop)
|
||||
.line(points.pocketTopRight)
|
||||
.offset(sa)
|
||||
.join(
|
||||
new Path()
|
||||
.move(points.pocketTopRight)
|
||||
.line(points.pocketTopLeft)
|
||||
.offset(3 * sa)
|
||||
)
|
||||
.close()
|
||||
.attr('class', 'fabric sa')
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 2, from: 'fabric' })
|
||||
|
||||
/*
|
||||
* Add the title
|
||||
*/
|
||||
points.title = points.pocketTopLeft.shiftFractionTowards(points.chamferLeft, 0.5)
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 10,
|
||||
title: 'backPocket',
|
||||
})
|
||||
|
||||
/*
|
||||
* Add the logo
|
||||
*/
|
||||
points.logo = points.title.shift(20, 80)
|
||||
snippets.logo = new Snippet('logo', points.logo).scale(0.5)
|
||||
|
||||
/*
|
||||
* Add the grainline indicator
|
||||
*/
|
||||
points.grainlineBottom = points.chamferRight.shiftFractionTowards(points.chamferLeft, 0.1)
|
||||
points.grainlineTop = new Point(points.grainlineBottom.x, points.pocketTopRight.y)
|
||||
macro('grainline', {
|
||||
from: points.grainlineBottom,
|
||||
to: points.grainlineTop,
|
||||
})
|
||||
|
||||
/*
|
||||
* Dimensions
|
||||
*/
|
||||
macro('hd', {
|
||||
id: 'wChamfer',
|
||||
from: points.chamferRight,
|
||||
to: points.chamferRightTop,
|
||||
y: points.chamferLeft.y + sa + 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'width',
|
||||
from: points.chamferLeftTop,
|
||||
to: points.chamferRightTop,
|
||||
y: points.chamferLeft.y + sa + 30,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'hChamfer',
|
||||
from: points.chamferRight,
|
||||
to: points.chamferRightTop,
|
||||
x: points.pocketTopRight.x + sa + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'height',
|
||||
from: points.chamferRight,
|
||||
to: points.pocketTopRight,
|
||||
x: points.pocketTopRight.x + sa + 30,
|
||||
})
|
||||
|
||||
return part
|
||||
}
|
405
designs/naomiwu/src/back.mjs
Normal file
405
designs/naomiwu/src/back.mjs
Normal file
|
@ -0,0 +1,405 @@
|
|||
import { shared } from './shared.mjs'
|
||||
|
||||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const back = {
|
||||
name: 'naomiwu.back', // The name in design::part format
|
||||
draft: draftBack, // The method to call to draft this part
|
||||
after: shared, // Indicate the `shared` part (see import above) needs to be drafted prior to this part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the back panel of the skirt
|
||||
*/
|
||||
function draftBack({
|
||||
Point,
|
||||
points,
|
||||
Path,
|
||||
paths,
|
||||
store,
|
||||
part,
|
||||
options,
|
||||
complete,
|
||||
sa,
|
||||
snippets,
|
||||
Snippet,
|
||||
macro,
|
||||
absoluteOptions,
|
||||
}) {
|
||||
/*
|
||||
* How much we need to reduce from seat to hips
|
||||
*/
|
||||
const reduce = store.get('hipsQuarterReduction')
|
||||
|
||||
/*
|
||||
* Do we need to add darts?
|
||||
* Shaping happens at both back panels, so everthing we take out is doubled.
|
||||
* In addition, shaping happens on both side seam and dart, so doubled again
|
||||
* So only if the total reduction is more than 4x the minimal dart width do we add darts
|
||||
*/
|
||||
store.set(
|
||||
'darts',
|
||||
store.get('hipsQuarterReduction') > 4 * absoluteOptions.minDartWidth ? true : false
|
||||
)
|
||||
|
||||
/*
|
||||
* How much shaping should we add in the panel?
|
||||
*/
|
||||
const shaping = store.get('darts') ? reduce - absoluteOptions.dartWidth * 2 : reduce
|
||||
|
||||
/*
|
||||
* We start with drawing a simple skirt outline for the back panel
|
||||
*/
|
||||
points.topLeft = new Point(shaping / 2, 0)
|
||||
points.topCp = new Point(store.get('backQuarterHips') / 2, 0)
|
||||
points.topRight = new Point(
|
||||
points.topLeft.x + store.get('backQuarterHips'),
|
||||
absoluteOptions.waistSlant
|
||||
)
|
||||
points.bottomLeft = new Point(0, points.topRight.y + absoluteOptions.length)
|
||||
points.bottomRight = new Point(store.get('backQuarterSeat'), points.bottomLeft.y)
|
||||
|
||||
/*
|
||||
* To find the top of the dart is easy if the waistline is a straight line.
|
||||
* However, if the `waistSlant` option is non-zero, the waistline will be a curve.
|
||||
* So we need to follow that curve to find a point on it to use as the middle for the dart.
|
||||
* Store the hipline curve/line so we can re-use it later, but hide it from the output.
|
||||
*/
|
||||
paths.hipLine =
|
||||
options.waistSlant > 0
|
||||
? new Path().move(points.topRight)._curve(points.topCp, points.topLeft).hide()
|
||||
: new Path().move(points.topRight).line(points.topLeft).hide()
|
||||
|
||||
/*
|
||||
* Store the waist length so we can accurately notch the waistband
|
||||
*/
|
||||
store.set('backHipLength', paths.hipLine.length())
|
||||
|
||||
/*
|
||||
* Add back darts, but only if they are not too narrow to sew
|
||||
*/
|
||||
if (store.get('darts')) {
|
||||
/*
|
||||
* Find the middle of the hipline
|
||||
*/
|
||||
points.dartTopMiddle = paths.hipLine.shiftFractionAlong(0.5)
|
||||
/*
|
||||
* Bottom of the dart is controlled by the dart length option which is a factor
|
||||
* of the distance between hipline and seatline.
|
||||
*/
|
||||
points.dartTip = points.dartTopMiddle.shift(-90, absoluteOptions.dartLength)
|
||||
/*
|
||||
* Now open up the dart
|
||||
*/
|
||||
const len = store.get('backHipLength')
|
||||
points.dartRight = paths.hipLine.shiftAlong(len / 2 - absoluteOptions.dartWidth)
|
||||
points.dartLeft = paths.hipLine.shiftAlong(len / 2 + absoluteOptions.dartWidth)
|
||||
/*
|
||||
* Finally, move the topRight point outwards to compensate for the draft shaping
|
||||
* If the hipLine is curved, this is not a 100% accurate match as we need to extende the
|
||||
* curve further than it goes. However, by going in a straight line from the dartRight
|
||||
* to the topRight point, we will follow the general direction of the curve and things will
|
||||
* smooth out
|
||||
*/
|
||||
points.topRight = points.dartRight.shiftOutwards(points.topRight, absoluteOptions.dartWidth * 2)
|
||||
}
|
||||
|
||||
/*
|
||||
* Draw the back pockets, or at least their outline
|
||||
* We only create the points here, we will only include this outline of the user requests a
|
||||
* complete pattern (see below)
|
||||
*/
|
||||
points.waistCenter = points.topLeft.shiftFractionTowards(points.topRight, 0.5)
|
||||
points.hemCenter = new Point(points.waistCenter.x, points.bottomRight.y)
|
||||
points.pocketBottomRight = points.hemCenter.shiftFractionTowards(points.bottomRight, 0.75)
|
||||
points.pocketBottomLeft = points.hemCenter.shiftFractionTowards(points.bottomRight, -0.75)
|
||||
points.pocketTopRight = points.pocketBottomRight.shift(
|
||||
-90,
|
||||
points.pocketBottomRight.dy(points.topRight) * options.backPocketDepth
|
||||
)
|
||||
points.pocketTopLeft = new Point(points.pocketBottomLeft.x, points.pocketTopRight.y)
|
||||
points.chamferLeft = points.pocketBottomLeft.shiftFractionTowards(
|
||||
points.pocketBottomRight,
|
||||
options.backPocketChamferSize
|
||||
)
|
||||
points.chamferRight = points.pocketBottomRight.shiftFractionTowards(
|
||||
points.pocketBottomLeft,
|
||||
options.backPocketChamferSize
|
||||
)
|
||||
points.chamferLeftTop = points.chamferLeft.rotate(90, points.pocketBottomLeft)
|
||||
points.chamferRightTop = new Point(points.pocketBottomRight.x, points.chamferLeftTop.y)
|
||||
|
||||
/*
|
||||
* Also draw the back pocket flap outline
|
||||
* We only create the points here, we will only include this outline of the user requests a
|
||||
* complete pattern (see below)
|
||||
*/
|
||||
points.flapTopLeft = points.pocketTopRight.shiftFractionTowards(points.pocketTopLeft, 1.02)
|
||||
points.flapTopRight = points.pocketTopLeft.shiftFractionTowards(points.pocketTopRight, 1.02)
|
||||
points.flapBottomLeft = points.flapTopLeft.shift(
|
||||
-90,
|
||||
points.flapTopLeft.dy(points.pocketBottomLeft) / 3
|
||||
)
|
||||
points.flapBottomRight = points.flapTopRight.shift(
|
||||
-90,
|
||||
points.flapTopLeft.dy(points.pocketBottomLeft) / 4
|
||||
)
|
||||
|
||||
/*
|
||||
* Draw the actual seamline
|
||||
*/
|
||||
paths.seam = new Path()
|
||||
.move(points.topLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomRight)
|
||||
.line(points.topRight)
|
||||
if (store.get('darts')) {
|
||||
paths.seam = paths.seam
|
||||
.join(paths.hipLine.split(points.dartRight).shift())
|
||||
.line(points.dartTip)
|
||||
.line(points.dartLeft)
|
||||
.join(paths.hipLine.split(points.dartLeft).pop())
|
||||
} else paths.seam._curve(points.topCp, points.topLeft)
|
||||
|
||||
/*
|
||||
* Apply CSS classes and close the seamline path
|
||||
*/
|
||||
paths.seam.addClass('fabric').close()
|
||||
|
||||
/*
|
||||
* Draw the outline of the back pocket on the pattern in dashed line so that people
|
||||
* have a visual guide for where the pocket should go when constructing the skirt
|
||||
* (but only if the user wants a complete pattern)
|
||||
*/
|
||||
paths.pocket = new Path()
|
||||
.move(points.pocketTopLeft)
|
||||
.line(points.chamferLeftTop)
|
||||
.line(points.chamferLeft)
|
||||
.line(points.chamferRight)
|
||||
.line(points.chamferRightTop)
|
||||
.line(points.pocketTopRight)
|
||||
.line(points.pocketTopLeft)
|
||||
.close()
|
||||
.addClass('note dashed stroke-sm')
|
||||
.hide()
|
||||
|
||||
/*
|
||||
* Does the user want seam allowance (sa) included on the pattern?
|
||||
*/
|
||||
if (sa) {
|
||||
/*
|
||||
* Our dart complicates matters, so we need a version without the dart as the SA base
|
||||
* We also need to make sure the hem allowance is different/bigger
|
||||
*/
|
||||
paths.saBase = new Path()
|
||||
.move(points.topLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomLeft.shift(-90, 2 * sa)) // extra hem SA
|
||||
.line(points.bottomRight.shift(-90, 2 * sa)) // extra hem SA
|
||||
.line(points.bottomRight)
|
||||
.line(points.topRight)
|
||||
.join(paths.hipLine)
|
||||
.close()
|
||||
.hide()
|
||||
paths.sa = paths.saBase.offset(sa).attr('class', 'fabric sa')
|
||||
}
|
||||
|
||||
/*
|
||||
* Store the side seam length so we can match it in the front part
|
||||
*/
|
||||
store.set('sideSeam', points.topRight.dist(points.bottomRight))
|
||||
|
||||
/*
|
||||
* If the user wants a complete pattern, let's add some more guidance
|
||||
*/
|
||||
if (complete) {
|
||||
/*
|
||||
* Show the pocket outline
|
||||
*/
|
||||
paths.pocket.unhide()
|
||||
|
||||
/*
|
||||
* Some thing with the pocket flap. Note that drawing both pocket and pocket flap
|
||||
* also helps people know which side is up, so to speak.
|
||||
*/
|
||||
paths.flap = new Path()
|
||||
.move(points.flapTopRight)
|
||||
.line(points.flapTopLeft)
|
||||
.line(points.flapBottomLeft)
|
||||
.line(points.flapBottomRight)
|
||||
.line(points.flapTopRight)
|
||||
.close()
|
||||
.addClass('note dashed stroke-sm')
|
||||
|
||||
/*
|
||||
* Add a note on the center back seam (CB) to clarify this is center back
|
||||
*/
|
||||
paths.cb = new Path()
|
||||
.move(points.bottomLeft)
|
||||
.line(points.topLeft)
|
||||
.addText('centerBack', 'center fill-note text-sm')
|
||||
.attr('data-text-dy', 8)
|
||||
/*
|
||||
* Add a note on the side seam to clarify this is the side
|
||||
*/
|
||||
paths.side = new Path()
|
||||
.move(points.bottomRight)
|
||||
.line(points.topRight)
|
||||
.addClass('hidden')
|
||||
.addText('sideSeam', 'center fill-note text-sm')
|
||||
.attr('data-text-dy', -1)
|
||||
/*
|
||||
* Add a note on the hem to clarify this is the hem
|
||||
*/
|
||||
paths.hem = new Path()
|
||||
.move(points.bottomLeft)
|
||||
.line(points.bottomRight)
|
||||
.addClass('hidden')
|
||||
.addText('hem', 'center fill-note text-sm')
|
||||
.attr('data-text-dy', -1)
|
||||
/*
|
||||
* Add a note on the top seam to clarify this is where the waistband shoud be attached
|
||||
*/
|
||||
points.topRight
|
||||
.addText('attachWaistband', 'fill-note right text-sm')
|
||||
.attr('data-text-dy', 8)
|
||||
.attr('data-text-dx', -8)
|
||||
points.topLeft
|
||||
.addText('attachWaistband', 'fill-note left text-sm')
|
||||
.attr('data-text-dy', 8)
|
||||
.attr('data-text-dx', 8)
|
||||
}
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 2, from: 'fabric' })
|
||||
|
||||
/*
|
||||
* Add skully, the FreeSewing logo :)
|
||||
*/
|
||||
points.logo = points.topLeft
|
||||
.shiftFractionTowards(points.bottomLeft, 0.3)
|
||||
.shift(0, points.topRight.x / 4)
|
||||
snippets.logo = new Snippet('logo', points.logo)
|
||||
|
||||
/*
|
||||
* Add a title for this part
|
||||
*/
|
||||
points.title = points.logo.shift(-90, 70)
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 1,
|
||||
title: 'back',
|
||||
})
|
||||
|
||||
/*
|
||||
* Add a grainline to indicate the fabric grain
|
||||
*/
|
||||
points.grainlineTop = points.topRight.shift(225, 25)
|
||||
points.grainlineBottom = new Point(points.grainlineTop.x, points.bottomRight.y - 25)
|
||||
macro('grainline', {
|
||||
from: points.grainlineBottom,
|
||||
to: points.grainlineTop,
|
||||
})
|
||||
|
||||
/*
|
||||
* Add (back) notches
|
||||
*/
|
||||
const notches = ['pocketTopLeft', 'pocketTopRight']
|
||||
if (store.get('darts')) notches.push('dartLeft', 'dartRight', 'dartTip')
|
||||
macro('sprinkle', {
|
||||
snippet: 'bnotch',
|
||||
on: notches,
|
||||
})
|
||||
|
||||
// Add dimensions
|
||||
if (points.topLeft.x > points.bottomLeft.x) {
|
||||
macro('hd', {
|
||||
id: 'bottomWidth',
|
||||
from: points.bottomLeft,
|
||||
to: points.bottomRight,
|
||||
y: points.bottomLeft.y + 3 * sa + 30,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'topLeftToBottomWidth',
|
||||
from: points.topLeft,
|
||||
to: points.bottomRight,
|
||||
y: points.bottomLeft.y + 3 * sa + 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wCbWaistToSideWaist',
|
||||
from: points.topLeft,
|
||||
to: points.topRight,
|
||||
y: points.topLeft.y - sa - 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'topWidth',
|
||||
from: points.bottomLeft,
|
||||
to: points.topRight,
|
||||
y: points.topLeft.y - sa - 30,
|
||||
})
|
||||
} else {
|
||||
macro('hd', {
|
||||
id: 'bottomWidth',
|
||||
from: points.bottomLeft,
|
||||
to: points.bottomRight,
|
||||
y: points.bottomLeft.y + 3 * sa + 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'topLeftToBottomWidth',
|
||||
from: points.topLeft,
|
||||
to: points.bottomRight,
|
||||
y: points.bottomLeft.y + 3 * sa + 30,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'bottomLeftToTopWidth',
|
||||
from: points.bottomLeft,
|
||||
to: points.topRight,
|
||||
y: points.topLeft.y - sa - 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'topWidth',
|
||||
from: points.topLeft,
|
||||
to: points.topRight,
|
||||
y: points.topLeft.y - sa - 30,
|
||||
})
|
||||
}
|
||||
if (store.get('darts')) {
|
||||
macro('hd', {
|
||||
id: 'topLeftToDartWidth',
|
||||
from: points.topLeft,
|
||||
to: points.dartLeft,
|
||||
y: points.topLeft.y + 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'topRightToDartWidth',
|
||||
from: points.dartRight,
|
||||
to: points.topRight,
|
||||
y: points.topLeft.y + 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'dartWidth',
|
||||
from: points.dartLeft,
|
||||
to: points.dartRight,
|
||||
y: points.dartTip.y + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'dartLength',
|
||||
from: points.dartTip,
|
||||
to: points.dartRight,
|
||||
x: points.dartRight.x + 15,
|
||||
})
|
||||
}
|
||||
macro('vd', {
|
||||
id: 'rightHeight',
|
||||
from: points.bottomRight,
|
||||
to: points.topRight,
|
||||
x: points.topRight.x + sa + 15,
|
||||
})
|
||||
|
||||
return part
|
||||
}
|
127
designs/naomiwu/src/belt-loop.mjs
Normal file
127
designs/naomiwu/src/belt-loop.mjs
Normal file
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const beltLoop = {
|
||||
name: 'naomiwu.beltLoop', // The name in design::part format
|
||||
draft: draftBeltLoop, // The method to call to draft this part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the waistband of the skirt
|
||||
*/
|
||||
function draftBeltLoop({
|
||||
Point,
|
||||
points,
|
||||
Path,
|
||||
paths,
|
||||
store,
|
||||
part,
|
||||
sa,
|
||||
expand,
|
||||
units,
|
||||
macro,
|
||||
absoluteOptions,
|
||||
}) {
|
||||
const w = absoluteOptions.beltLoopWidth
|
||||
const h = absoluteOptions.waistbandWidth * 1.5
|
||||
|
||||
if (expand) {
|
||||
store.flag.preset('expandIsOn')
|
||||
} else {
|
||||
// Expand is off, do not draw the part but flag this to the user
|
||||
store.flag.note({
|
||||
msg: `naomiwu:cutBeltLoop`,
|
||||
replace: {
|
||||
width: units(w + 2 * sa),
|
||||
length: units(h + 2 * sa),
|
||||
},
|
||||
suggest: {
|
||||
text: 'flag:show',
|
||||
icon: 'expand',
|
||||
update: {
|
||||
settings: ['expand', 1],
|
||||
},
|
||||
},
|
||||
})
|
||||
// Also hint about expand
|
||||
store.flag.preset('expandIsOff')
|
||||
|
||||
return part.hide()
|
||||
}
|
||||
|
||||
/*
|
||||
* It's a rectangle
|
||||
*/
|
||||
points.topLeft = new Point(0, 0)
|
||||
points.topRight = new Point(w, 0)
|
||||
points.bottomLeft = new Point(0, h)
|
||||
points.bottomRight = new Point(w, h)
|
||||
|
||||
/*
|
||||
* Seamline
|
||||
*/
|
||||
paths.seam = new Path()
|
||||
.move(points.topLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomRight)
|
||||
.line(points.topRight)
|
||||
.line(points.topLeft)
|
||||
.close()
|
||||
.addClass('fabric')
|
||||
|
||||
/*
|
||||
* Only add SA when requested
|
||||
*/
|
||||
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 6, from: 'fabric' })
|
||||
|
||||
/*
|
||||
* Add the title
|
||||
*/
|
||||
points.title = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 15,
|
||||
title: 'beltLoop',
|
||||
align: 'center',
|
||||
scale: 0.333,
|
||||
})
|
||||
|
||||
/*
|
||||
* Add a grainline indicator
|
||||
*/
|
||||
points.grainlineTop = points.topLeft.shift(0, 5)
|
||||
points.grainlineBottom = points.bottomLeft.shift(0, 5)
|
||||
macro('grainline', {
|
||||
from: points.grainlineBottom,
|
||||
to: points.grainlineTop,
|
||||
classes: {
|
||||
line: 'stroke-sm note',
|
||||
text: 'text-xs fill-note center',
|
||||
},
|
||||
})
|
||||
|
||||
/*
|
||||
* Dimensions
|
||||
*/
|
||||
macro('hd', {
|
||||
id: 'wFull',
|
||||
from: points.bottomLeft,
|
||||
to: points.bottomRight,
|
||||
y: points.bottomLeft.y + 15 + sa,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'hFull',
|
||||
from: points.bottomRight,
|
||||
to: points.topRight,
|
||||
x: points.topRight.x + 15 + sa,
|
||||
})
|
||||
|
||||
return part
|
||||
}
|
149
designs/naomiwu/src/fly-shield.mjs
Normal file
149
designs/naomiwu/src/fly-shield.mjs
Normal file
|
@ -0,0 +1,149 @@
|
|||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const flyShield = {
|
||||
name: 'naomiwu.flyShield', // The name in the form of design::name
|
||||
draft: draftFlyShield, // The method to call for drafting this part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the fly shield.
|
||||
* Giving it a descriptive name is optional, but helps with debugging.
|
||||
*/
|
||||
function draftFlyShield({
|
||||
Point,
|
||||
points,
|
||||
Path,
|
||||
paths,
|
||||
part,
|
||||
complete,
|
||||
store,
|
||||
units,
|
||||
sa,
|
||||
expand,
|
||||
macro,
|
||||
absoluteOptions,
|
||||
}) {
|
||||
/*
|
||||
* Save ourselves some typing by storing width and height
|
||||
*/
|
||||
const w = absoluteOptions.flyWidth
|
||||
const h = absoluteOptions.flyLength * 1.05 // A bit longer than the fly so the seam will catch
|
||||
|
||||
if (expand) {
|
||||
store.flag.preset('expandIsOn')
|
||||
} else {
|
||||
// Expand is off, do not draw the part but flag this to the user
|
||||
store.flag.note({
|
||||
msg: `naomiwu:cutFlyShield`,
|
||||
replace: {
|
||||
width: units(w + 2 * sa),
|
||||
length: units(h + 2 * sa),
|
||||
},
|
||||
suggest: {
|
||||
text: 'flag:show',
|
||||
icon: 'expand',
|
||||
update: {
|
||||
settings: ['expand', 1],
|
||||
},
|
||||
},
|
||||
})
|
||||
// Also hint about expand
|
||||
store.flag.preset('expandIsOff')
|
||||
|
||||
return part.hide()
|
||||
}
|
||||
|
||||
/*
|
||||
* Fly shield is a simple rectangle folder in half
|
||||
*/
|
||||
points.topLeft = new Point(0, 0)
|
||||
points.topMid = new Point(w, 0)
|
||||
points.topRight = new Point(2 * w, 0)
|
||||
points.bottomLeft = new Point(0, h)
|
||||
points.bottomMid = new Point(w, h)
|
||||
points.bottomRight = new Point(2 * w, h)
|
||||
|
||||
/*
|
||||
* The seam line
|
||||
*/
|
||||
paths.seam = new Path()
|
||||
.move(points.topLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.bottomRight)
|
||||
.line(points.topRight)
|
||||
.line(points.topLeft)
|
||||
.close()
|
||||
.addClass('fabric')
|
||||
|
||||
/*
|
||||
* Add seam allowance only when requested
|
||||
*/
|
||||
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
|
||||
|
||||
/*
|
||||
* If the user wants a complete pattern, let's add some more guidance
|
||||
*/
|
||||
if (complete) {
|
||||
/*
|
||||
* Indicate this needs to be folded in half
|
||||
*/
|
||||
paths.fold = new Path().move(points.bottomMid).line(points.topMid).addClass('note help')
|
||||
|
||||
/*
|
||||
* Print a message that it needs to be holded in half
|
||||
*/
|
||||
macro('banner', {
|
||||
path: paths.fold,
|
||||
text: 'foldHere',
|
||||
className: 'text-sm fill-note',
|
||||
})
|
||||
}
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 1, from: 'fabric' })
|
||||
|
||||
/*
|
||||
* Add a title
|
||||
*/
|
||||
points.title = points.topMid.shiftFractionTowards(points.bottomMid, 0.5)
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 4,
|
||||
title: 'flyShield',
|
||||
scale: 0.6,
|
||||
align: 'center',
|
||||
})
|
||||
|
||||
/*
|
||||
* Add the grainline
|
||||
*/
|
||||
points.grainlineTop = points.topLeft.shiftFractionTowards(points.topMid, 0.5)
|
||||
points.grainlineBottom = new Point(points.grainlineTop.x, points.bottomLeft.y)
|
||||
macro('grainline', {
|
||||
from: points.grainlineBottom,
|
||||
to: points.grainlineTop,
|
||||
})
|
||||
|
||||
/*
|
||||
* Add dimensions
|
||||
*/
|
||||
macro('hd', {
|
||||
id: 'wFull',
|
||||
from: points.bottomLeft,
|
||||
to: points.bottomRight,
|
||||
y: points.bottomLeft.y + sa + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'hFull',
|
||||
from: points.bottomRight,
|
||||
to: points.topRight,
|
||||
x: points.bottomRight.x + sa + 15,
|
||||
})
|
||||
|
||||
return part
|
||||
}
|
138
designs/naomiwu/src/front-attachment-facing.mjs
Normal file
138
designs/naomiwu/src/front-attachment-facing.mjs
Normal file
|
@ -0,0 +1,138 @@
|
|||
import { frontAttachment } from './front-attachment.mjs'
|
||||
|
||||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const frontAttachmentFacing = {
|
||||
name: 'naomiwu.frontAttachmentFacing', // The name in design::part format
|
||||
draft: draftFrontAttachmentFacing, // The method to call to draft this part
|
||||
from: frontAttachment, // Draft this part starting from the (imported) frontAttachment part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the front attachment facing of the skirt
|
||||
*/
|
||||
function draftFrontAttachmentFacing({
|
||||
Point,
|
||||
points,
|
||||
Path,
|
||||
paths,
|
||||
part,
|
||||
store,
|
||||
options,
|
||||
sa,
|
||||
snippets,
|
||||
Snippet,
|
||||
macro,
|
||||
}) {
|
||||
/*
|
||||
* Adapt shape from the front attachment main shape
|
||||
*/
|
||||
points.waistLeft = points.topRight.shiftFractionTowards(
|
||||
points.frontPocketStart,
|
||||
options.frontAttachmentWidth
|
||||
)
|
||||
points.waistRight = points.frontPocketStart.shiftFractionTowards(points.topRight, 0.95)
|
||||
points.startLeft = new Point(points.waistLeft.x, points.frontPocketCurveStart.y)
|
||||
points.startRight = new Point(points.waistRight.x, points.frontPocketCurveStart.y)
|
||||
points.edgeLeft = points.foldLeft.shiftFractionTowards(points.startLeft, -0.4)
|
||||
points.edgeRight = new Point(points.waistRight.x, points.edgeLeft.y)
|
||||
|
||||
/*
|
||||
* The seam line
|
||||
*/
|
||||
paths.seam = new Path()
|
||||
.move(points.startLeft)
|
||||
.line(points.edgeLeft)
|
||||
.line(points.edgeRight)
|
||||
.line(points.startRight)
|
||||
.line(points.startLeft)
|
||||
.close()
|
||||
|
||||
/*
|
||||
* Only add SA when it's requested.
|
||||
* This also adds extra SA to fold under the edge.
|
||||
*/
|
||||
if (sa)
|
||||
paths.sa = new Path()
|
||||
.move(points.startLeft)
|
||||
.line(points.edgeLeft)
|
||||
.line(points.edgeRight)
|
||||
.line(points.startRight)
|
||||
.offset(sa)
|
||||
.join(
|
||||
new Path()
|
||||
.move(points.startRight)
|
||||
.line(points.startLeft)
|
||||
.offset(3 * sa)
|
||||
)
|
||||
.close()
|
||||
.addClass('fabric sa')
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 1, from: 'fabric' })
|
||||
|
||||
/*
|
||||
* Add the title
|
||||
*/
|
||||
points.title = points.waistLeft
|
||||
.shiftFractionTowards(points.waistRight, 0.1)
|
||||
.shift(-90, points.foldRight.y / 1.5)
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 9,
|
||||
title: 'frontAttachmentFacing',
|
||||
})
|
||||
|
||||
/*
|
||||
* Add the logo
|
||||
*/
|
||||
points.logo = points.title.shift(-70, 70)
|
||||
snippets.logo = new Snippet('logo', points.logo).scale(0.666)
|
||||
|
||||
/*
|
||||
* Dimensions
|
||||
*/
|
||||
macro('hd', {
|
||||
id: 'width',
|
||||
from: points.edgeLeft,
|
||||
to: points.edgeRight,
|
||||
y: points.edgeLeft.y + sa + 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'chamferWidth',
|
||||
from: points.foldLeft,
|
||||
to: points.chamferLeft,
|
||||
y: points.chamferLeftBottom.y + sa + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'chamferHeight',
|
||||
from: points.chamferLeftBottom,
|
||||
to: points.chamferLeft,
|
||||
x: points.chamferLeft.x + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'bottomLength',
|
||||
from: points.edgeRight,
|
||||
to: points.foldRight,
|
||||
x: points.edgeRight.x + sa + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'topLength',
|
||||
from: points.foldRight,
|
||||
to: points.startRight,
|
||||
x: points.edgeRight.x + sa + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'length',
|
||||
from: points.edgeRight,
|
||||
to: points.startRight,
|
||||
x: points.edgeRight.x + sa + 30,
|
||||
})
|
||||
|
||||
return part
|
||||
}
|
214
designs/naomiwu/src/front-attachment.mjs
Normal file
214
designs/naomiwu/src/front-attachment.mjs
Normal file
|
@ -0,0 +1,214 @@
|
|||
import { frontBase } from './front-base.mjs'
|
||||
|
||||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const frontAttachment = {
|
||||
name: 'naomiwu.frontAttachment', // The name in design::part format
|
||||
draft: draftFrontAttachment, // The method to call to draft this part
|
||||
from: frontBase, // Draft this part starting from the (imported) frontBase part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the front attachment of the skirt
|
||||
*/
|
||||
function draftFrontAttachment({
|
||||
Point,
|
||||
points,
|
||||
Path,
|
||||
paths,
|
||||
store,
|
||||
part,
|
||||
options,
|
||||
complete,
|
||||
sa,
|
||||
snippets,
|
||||
Snippet,
|
||||
macro,
|
||||
}) {
|
||||
/*
|
||||
* Draw the front attachment shape, or at least the part that's not
|
||||
* made out of the main materials (aka the facing)
|
||||
*/
|
||||
points.waistLeft = points.topRight.shiftFractionTowards(
|
||||
points.frontPocketStart,
|
||||
options.frontAttachmentWidth
|
||||
)
|
||||
points.waistRight = points.frontPocketStart.shiftFractionTowards(points.topRight, 0.95)
|
||||
points.foldLeft = new Point(points.waistLeft.x, points.trueBottomRight.y)
|
||||
points.foldRight = new Point(points.waistRight.x, points.foldLeft.y)
|
||||
points.edgeLeft = points.foldLeft.shift(-90, points.foldLeft.y - points.frontPocketSide.y / 2)
|
||||
points.edgeRight = new Point(points.waistRight.x, points.edgeLeft.y)
|
||||
|
||||
/*
|
||||
* Indicate the chamfers and fold line
|
||||
*/
|
||||
points.chamferLeft = points.foldLeft.shiftFractionTowards(
|
||||
points.foldRight,
|
||||
options.frontAttachmentChamferSize
|
||||
)
|
||||
points.chamferRight = points.foldRight.shiftFractionTowards(
|
||||
points.foldLeft,
|
||||
options.frontAttachmentChamferSize
|
||||
)
|
||||
points.chamferLeftTop = points.chamferLeft.rotate(90, points.foldLeft)
|
||||
points.chamferLeftBottom = points.chamferLeft.rotate(-90, points.foldLeft)
|
||||
points.chamferRightTop = new Point(points.foldRight.x, points.chamferLeftTop.y)
|
||||
points.chamferRightBottom = new Point(points.foldRight.x, points.chamferLeftBottom.y)
|
||||
|
||||
/*
|
||||
* The seam line
|
||||
*/
|
||||
paths.seam = new Path()
|
||||
.move(points.waistLeft)
|
||||
.line(points.edgeLeft)
|
||||
.line(points.edgeRight)
|
||||
.line(points.waistRight)
|
||||
.line(points.waistLeft)
|
||||
.close()
|
||||
.addClass('fabric')
|
||||
|
||||
/*
|
||||
* Only add SA when it's requested.
|
||||
* This also adds extra SA to fold under the edge.
|
||||
*/
|
||||
if (sa)
|
||||
paths.sa = new Path()
|
||||
.move(points.edgeRight)
|
||||
.line(points.waistRight)
|
||||
.line(points.waistLeft)
|
||||
.line(points.edgeLeft)
|
||||
.offset(sa)
|
||||
.join(
|
||||
new Path()
|
||||
.move(points.edgeLeft)
|
||||
.line(points.edgeRight)
|
||||
.offset(3 * sa)
|
||||
)
|
||||
.close()
|
||||
.attr('class', 'fabric sa')
|
||||
|
||||
/*
|
||||
* If the user wants a complete pattern, let's add some more guidance
|
||||
*/
|
||||
if (complete) {
|
||||
/*
|
||||
* Add the fold line
|
||||
*/
|
||||
paths.fold = new Path().move(points.foldLeft).line(points.foldRight).addClass('help note')
|
||||
|
||||
/*
|
||||
* Add the chamfers (the 45-degree slant at the corners of the fold)
|
||||
*/
|
||||
paths.chamfer = new Path()
|
||||
.move(points.chamferLeftTop)
|
||||
.line(points.chamferLeft)
|
||||
.line(points.chamferLeftBottom)
|
||||
.move(points.chamferRightTop)
|
||||
.line(points.chamferRight)
|
||||
.line(points.chamferRightBottom)
|
||||
.addClass('note dashed stroke-sm')
|
||||
}
|
||||
|
||||
/*
|
||||
* Clean up a bit
|
||||
*/
|
||||
delete paths.corner
|
||||
delete paths.hem
|
||||
delete paths.side
|
||||
delete paths.frontWaist
|
||||
delete paths.pocketbag
|
||||
delete paths.pocketbagBoundary
|
||||
delete paths.pocketfacingBoundary
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 1, from: 'fabric' })
|
||||
|
||||
/*
|
||||
* Add the title
|
||||
*/
|
||||
points.title = points.foldLeft
|
||||
.shiftFractionTowards(points.foldRight, 0.2)
|
||||
.shift(90, points.foldLeft.y / 2)
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 8,
|
||||
title: 'frontAttachment',
|
||||
})
|
||||
|
||||
/*
|
||||
* Add the logo
|
||||
*/
|
||||
points.logo = points.title.shift(-70, 70)
|
||||
snippets.logo = new Snippet('logo', points.logo)
|
||||
|
||||
/*
|
||||
* Add a 'fold here' note
|
||||
*/
|
||||
macro('banner', {
|
||||
path: paths.fold,
|
||||
text: 'foldHere',
|
||||
className: 'text-sm fill-note',
|
||||
})
|
||||
|
||||
/*
|
||||
* Sprinkle some notches
|
||||
*/
|
||||
macro('sprinkle', {
|
||||
snippet: 'notch',
|
||||
on: [
|
||||
'chamferLeftTop',
|
||||
'chamferLeftBottom',
|
||||
'chamferLeft',
|
||||
'chamferRightTop',
|
||||
'chamferRightBottom',
|
||||
'chamferRight',
|
||||
],
|
||||
})
|
||||
|
||||
/*
|
||||
* Dimensions
|
||||
*/
|
||||
macro('hd', {
|
||||
id: 'width',
|
||||
from: points.edgeLeft,
|
||||
to: points.edgeRight,
|
||||
y: points.edgeLeft.y + 3 * sa + 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'chamferWidth',
|
||||
from: points.foldLeft,
|
||||
to: points.chamferLeft,
|
||||
y: points.chamferLeftBottom.y + sa + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'chamferHeight',
|
||||
from: points.chamferLeftBottom,
|
||||
to: points.chamferLeft,
|
||||
x: points.chamferLeft.x + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'bottomLength',
|
||||
from: points.edgeRight,
|
||||
to: points.foldRight,
|
||||
x: points.edgeRight.x + sa + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'topLength',
|
||||
from: points.foldRight,
|
||||
to: points.waistRight,
|
||||
x: points.edgeRight.x + sa + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'length',
|
||||
from: points.edgeRight,
|
||||
to: points.waistRight,
|
||||
x: points.edgeRight.x + sa + 30,
|
||||
})
|
||||
|
||||
return part
|
||||
}
|
346
designs/naomiwu/src/front-base.mjs
Normal file
346
designs/naomiwu/src/front-base.mjs
Normal file
|
@ -0,0 +1,346 @@
|
|||
import { back } from './back.mjs'
|
||||
|
||||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const frontBase = {
|
||||
name: 'naomiwu.frontBase', // The name in design::part format
|
||||
draft: draftFrontBase, // The method to call to draft this part
|
||||
hide: { self: true }, // This part is hidden by default
|
||||
after: back, // Draw the (imported) back part prior to drafting this part
|
||||
}
|
||||
|
||||
/*
|
||||
* A helper method to find a point on the (potentially curved) waistline for a
|
||||
* given X coordinate
|
||||
*
|
||||
* @param {x} number - The X-coordinate to find the intersection with the waist
|
||||
* for
|
||||
* @return {point} Point - A Point object that lies at the intersection of the
|
||||
* waist with x
|
||||
*/
|
||||
export const xOnWaist = (x, part) => {
|
||||
const { options, utils, points, Point } = part.shorthand()
|
||||
|
||||
return options.waistSlant
|
||||
? utils.curveIntersectsX(points.topLeft, points.topCp, points.topRight, points.topRight, x)
|
||||
: new Point(x, points.topLeft.y)
|
||||
}
|
||||
|
||||
/*
|
||||
* A helper method to draw the corner of the front where the pocket goes
|
||||
*
|
||||
* This is abstracted into a method because we need to draft two fronts that
|
||||
* are mirror images of one another. If we mirror them, the entire path will be
|
||||
* mirrored, including text and so on. So this method allows us to mirror
|
||||
* first, then call this method again to draw the non-mirrored path using the
|
||||
* mirrored points, which is what we want.
|
||||
*
|
||||
* @param {part} Part - The current part object
|
||||
*
|
||||
* @return {path} Path - The path object that was drawn
|
||||
*/
|
||||
export const drawCornerPath = (part) => {
|
||||
const { Path, points, paths } = part.shorthand()
|
||||
|
||||
return new Path()
|
||||
.move(points.frontPocketSide)
|
||||
.line(points.topRight)
|
||||
.join(paths.frontWaistSide)
|
||||
.addClass('note dashed stroke-sm')
|
||||
}
|
||||
|
||||
/*
|
||||
* A helper method to draw the corner of the front where the pocket goes
|
||||
*
|
||||
* This is abstracted into a method because we need to draft two fronts that
|
||||
* are mirror images of one another. If we mirror them, the entire path will be
|
||||
* mirrored, including text and so on. So this method allows us to mirror
|
||||
* first, then call this method again to draw the non-mirrored path using the
|
||||
* mirrored points, which is what we want.
|
||||
*
|
||||
* @param {part} Part - The current part object
|
||||
*
|
||||
* @return {path} Path - The path object that was drawn
|
||||
*/
|
||||
export const drawSeamLine = (part) => {
|
||||
const { Path, points, paths } = part.shorthand()
|
||||
|
||||
return new Path()
|
||||
.move(points.topLeft)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.trueBottomRight)
|
||||
.line(points.frontPocketSide)
|
||||
.line(points.frontPocketCurveStart)
|
||||
.curve(points.frontPocketCpSide, points.frontPocketCpTop, points.frontPocketStart)
|
||||
.join(paths.frontWaistCenter)
|
||||
.close()
|
||||
.addClass('fabric')
|
||||
}
|
||||
|
||||
/*
|
||||
* A helper method to draw a note on the side seam
|
||||
*
|
||||
* This is abstracted into a method because we need to draft two fronts that
|
||||
* are mirror images of one another. If we mirror them, the entire path will be
|
||||
* mirrored, including text and so on. So this method allows us to mirror
|
||||
* first, then call this method again to draw the non-mirrored path using the
|
||||
* mirrored points, which is what we want.
|
||||
*
|
||||
* @param {part} Part - The current part object
|
||||
*
|
||||
* @return {path} Path - The path object that was drawn
|
||||
*/
|
||||
export const drawSideNote = (part) => {
|
||||
const { Path, points } = part.shorthand()
|
||||
|
||||
return new Path()
|
||||
.move(points.trueBottomRight)
|
||||
.line(points.topRight)
|
||||
.addClass('hidden')
|
||||
.addText('sideSeam', 'center fill-note text-sm')
|
||||
.attr('data-text-dy', -1)
|
||||
}
|
||||
|
||||
/*
|
||||
* A helper method to draw a note on the hem seam
|
||||
*
|
||||
* This is abstracted into a method because we need to draft two fronts that
|
||||
* are mirror images of one another. If we mirror them, the entire path will be
|
||||
* mirrored, including text and so on. So this method allows us to mirror
|
||||
* first, then call this method again to draw the non-mirrored path using the
|
||||
* mirrored points, which is what we want.
|
||||
*
|
||||
* @param {part} Part - The current part object
|
||||
*
|
||||
* @return {path} Path - The path object that was drawn
|
||||
*/
|
||||
export const drawHemNote = (part) => {
|
||||
const { Path, points } = part.shorthand()
|
||||
|
||||
return new Path()
|
||||
.move(points.bottomLeft)
|
||||
.line(points.trueBottomRight)
|
||||
.addClass('hidden')
|
||||
.addText('hem', 'center fill-note text-sm')
|
||||
.attr('data-text-dy', -1)
|
||||
}
|
||||
|
||||
/*
|
||||
* A helper method to draw a the pocket outline
|
||||
*
|
||||
* This is abstracted into a method because we need to draft two fronts that
|
||||
* are mirror images of one another. If we mirror them, the entire path will be
|
||||
* mirrored, including text and so on. So this method allows us to mirror
|
||||
* first, then call this method again to draw the non-mirrored path using the
|
||||
* mirrored points, which is what we want.
|
||||
*
|
||||
* @param {part} Part - The current part object
|
||||
* @param {reverse} bool - Indicates whether we are drawing the reversed version or not
|
||||
*
|
||||
* @return {path} Path - The path object that was drawn
|
||||
*/
|
||||
export const drawPocketBag = (part, reverse) => {
|
||||
const { paths, Path, points } = part.shorthand()
|
||||
|
||||
paths.pocketbag = new Path()
|
||||
.move(points.frontPocketBagStart)
|
||||
.line(points.frontPocketBagHem)
|
||||
.addClass('note dashed stroke-sm')
|
||||
paths.pocketfacingBoundary = new Path()
|
||||
.move(reverse ? points.frontPocketFacingSide : points.frontPocketFacingCenter)
|
||||
.line(reverse ? points.frontPocketFacingCenter : points.frontPocketFacingSide)
|
||||
.addClass('note dashed stroke-sm')
|
||||
.addText('pocketFacing', 'fill-note center text-sm')
|
||||
paths.pocketbagBoundary = new Path()
|
||||
.move(reverse ? points.frontPocketFacingSide : points.frontPocketFacingCenter)
|
||||
.line(reverse ? points.frontPocketFacingCenter : points.frontPocketFacingSide)
|
||||
.addClass('hidden')
|
||||
.addText('pocketBag', 'fill-note center text-sm')
|
||||
.attr('data-text-dy', 6)
|
||||
}
|
||||
|
||||
/*
|
||||
* A helper method to split the front waist at the point the pocket cutout starts
|
||||
*
|
||||
* Does not return, but mutates the part object
|
||||
*
|
||||
* @param {part} Part - The current part object
|
||||
*/
|
||||
export const splitFrontWaist = (part) => {
|
||||
const { paths, points, Path, options } = part.shorthand()
|
||||
// Handle the split of the waitline at the pocket openinig
|
||||
paths.frontWaist = new Path().move(points.topRight)
|
||||
if (options.waistSlant) paths.frontWaist.curve(points.topRight, points.topCp, points.topLeft)
|
||||
else paths.frontWaist.line(points.topLeft)
|
||||
paths.frontWaist.addClass('hidden')
|
||||
|
||||
// Store both halves for re-use
|
||||
const halves = paths.frontWaist.split(part.points.frontPocketStart)
|
||||
paths.frontWaistSide = halves[0].hide()
|
||||
paths.frontWaistCenter = halves[1].hide()
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the back panel of the skirt
|
||||
*/
|
||||
function draftFrontBase({
|
||||
Point,
|
||||
points,
|
||||
Path,
|
||||
paths,
|
||||
store,
|
||||
part,
|
||||
options,
|
||||
complete,
|
||||
sa,
|
||||
snippets,
|
||||
Snippet,
|
||||
macro,
|
||||
absoluteOptions,
|
||||
utils,
|
||||
}) {
|
||||
/*
|
||||
* How much shaping should we add in the panel?
|
||||
*/
|
||||
const shaping = store.get('hipsQuarterReduction')
|
||||
|
||||
/*
|
||||
* Simple skirt outline for the front panel
|
||||
*/
|
||||
points.topLeft = new Point(shaping / 2, 0)
|
||||
points.topCp = new Point(store.get('frontQuarterHips') / 2, 0)
|
||||
points.topRight = new Point(
|
||||
points.topLeft.x + store.get('frontQuarterHips'),
|
||||
absoluteOptions.waistSlant * -1
|
||||
)
|
||||
points.bottomLeft = new Point(0, points.topRight.y + absoluteOptions.length)
|
||||
points.bottomRight = new Point(store.get('frontQuarterSeat'), points.bottomLeft.y)
|
||||
|
||||
/*
|
||||
* Store the waist length so we can accurately notch the waistband
|
||||
*/
|
||||
store.set(
|
||||
'frontHipLength',
|
||||
options.waistSlant
|
||||
? new Path().move(points.topLeft).curve_(points.topCp, points.topRight).length()
|
||||
: points.topLeft.dx(points.topRight)
|
||||
)
|
||||
|
||||
/*
|
||||
* True the side seam
|
||||
*/
|
||||
points.trueBottomRight = points.topRight.shiftTowards(points.bottomRight, store.get('sideSeam'))
|
||||
points.trueBottomLeft = new Point(0, points.trueBottomRight.y)
|
||||
|
||||
/*
|
||||
* Construct the fly J-seam - see paths.jseam
|
||||
*/
|
||||
points.jseamTop = xOnWaist(points.topLeft.x + absoluteOptions.flyWidth, part)
|
||||
points.jseamBottom = points.topLeft.shiftTowards(points.bottomLeft, absoluteOptions.flyLength)
|
||||
points.jseamCorner = points.jseamBottom
|
||||
.shiftTowards(points.topLeft, absoluteOptions.flyWidth)
|
||||
.rotate(-90, points.jseamBottom)
|
||||
points.jseamCurveStart = points.jseamCorner.shiftTowards(
|
||||
points.jseamTop,
|
||||
absoluteOptions.flyWidth
|
||||
)
|
||||
points.jseamCpTop = points.jseamCorner.shiftFractionTowards(
|
||||
points.jseamCurveStart,
|
||||
1 - options.jseamBend
|
||||
)
|
||||
points.jseamCpBottom = points.jseamCorner.shiftFractionTowards(
|
||||
points.jseamBottom,
|
||||
1 - options.jseamBend
|
||||
)
|
||||
|
||||
/*
|
||||
* Construct the fly extention (fe) - see paths.seam
|
||||
*/
|
||||
macro('mirror', {
|
||||
clone: true,
|
||||
mirror: [points.jseamBottom, points.topLeft],
|
||||
points: [
|
||||
'jseamTop',
|
||||
'jseamBottom',
|
||||
'jseamCorner',
|
||||
'jseamCurveStart',
|
||||
'jseamCpTop',
|
||||
'jseamCpBottom',
|
||||
],
|
||||
nameFormat: (name) => `${name}Fe`, //Fe = Fly extension
|
||||
})
|
||||
|
||||
/*
|
||||
* Construct the front pocket cutout
|
||||
*/
|
||||
points.frontPocketStart = xOnWaist(absoluteOptions.frontPocketOpeningWidth, part)
|
||||
points.frontPocketSide = utils.beamIntersectsY(
|
||||
points.topRight,
|
||||
points.trueBottomRight,
|
||||
absoluteOptions.frontPocketOpeningDepth
|
||||
)
|
||||
points.frontPocketCorner = new Point(points.frontPocketStart.x, points.frontPocketSide.y)
|
||||
points.frontPocketCurveStart = points.frontPocketStart.rotate(-90, points.frontPocketCorner)
|
||||
points.frontPocketCpTop = points.frontPocketCorner.shiftFractionTowards(
|
||||
points.frontPocketStart,
|
||||
1 - options.frontPocketOpeningBend
|
||||
)
|
||||
points.frontPocketCpSide = points.frontPocketCorner.shiftFractionTowards(
|
||||
points.frontPocketCurveStart,
|
||||
1 - options.frontPocketOpeningBend
|
||||
)
|
||||
|
||||
/*
|
||||
* Front pocket bag/facing outline
|
||||
*/
|
||||
points.frontPocketBagStart = points.frontPocketStart.shiftFractionTowards(points.jseamTop, 0.4)
|
||||
points.frontPocketBagHem = new Point(points.frontPocketBagStart.x, points.bottomRight.y)
|
||||
points.frontPocketFacingSide = points.frontPocketSide.shiftFractionTowards(points.topRight, -0.4)
|
||||
points.frontPocketFacingCenter = new Point(
|
||||
points.frontPocketBagStart.x,
|
||||
points.frontPocketFacingSide.y
|
||||
)
|
||||
|
||||
/*
|
||||
* Paths
|
||||
*/
|
||||
splitFrontWaist(part) // Handle the split of the waitline at the pocket openinig
|
||||
paths.seam = drawSeamLine(part) // Seamline
|
||||
|
||||
// Complete?
|
||||
if (complete) {
|
||||
/*
|
||||
* Add the logo
|
||||
*/
|
||||
points.logo = points.topLeft
|
||||
.shiftFractionTowards(points.bottomLeft, 0.3)
|
||||
.shift(0, points.topRight.x / 3)
|
||||
snippets.logo = new Snippet('logo', points.logo)
|
||||
|
||||
/*
|
||||
* Add the title
|
||||
*/
|
||||
points.title = points.logo.shift(-90, 70)
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: '0',
|
||||
title: 'frontBase',
|
||||
})
|
||||
|
||||
/*
|
||||
* Add various helper paths
|
||||
*/
|
||||
paths.corner = drawCornerPath(part) // Pocket corner
|
||||
drawPocketBag(part) // Pocket bag
|
||||
paths.side = drawSideNote(part) // Note on side seam
|
||||
paths.hem = drawHemNote(part) // Note on hem
|
||||
|
||||
/*
|
||||
* Add seam allowance only if requested
|
||||
*/
|
||||
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
|
||||
}
|
||||
|
||||
return part
|
||||
}
|
252
designs/naomiwu/src/front-fly-side.mjs
Normal file
252
designs/naomiwu/src/front-fly-side.mjs
Normal file
|
@ -0,0 +1,252 @@
|
|||
import {
|
||||
frontBase,
|
||||
splitFrontWaist,
|
||||
drawCornerPath,
|
||||
drawSideNote,
|
||||
drawHemNote,
|
||||
drawPocketBag,
|
||||
} from './front-base.mjs'
|
||||
|
||||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const frontFlySide = {
|
||||
name: 'naomiwu.frontFlySide', // Name in design::part format
|
||||
draft: draftFrontFlySide, // Method to call to draft this part
|
||||
from: frontBase, // Draft this part starting from (the imported) frontBase
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the front panel of the skirt with the fly on it
|
||||
* Whether that ends up being the right or left panel depends on the
|
||||
* 'invertFly' option.
|
||||
* By default, this is the left panel, if the option is truthy, this becomes
|
||||
* the right panel.
|
||||
*
|
||||
* Basic outline was drafted in frontBase
|
||||
*
|
||||
* Note that Left/Right is always from the vantage point the wearer
|
||||
*/
|
||||
function draftFrontFlySide({
|
||||
Point,
|
||||
points,
|
||||
Path,
|
||||
paths,
|
||||
store,
|
||||
part,
|
||||
options,
|
||||
complete,
|
||||
sa,
|
||||
paperless,
|
||||
snippets,
|
||||
Snippet,
|
||||
macro,
|
||||
}) {
|
||||
/*
|
||||
* If the user wants the fly side inverted, we should mirror the entire thing
|
||||
*/
|
||||
if (options.invertFly) {
|
||||
for (const p in points) points[p] = points[p].flipX()
|
||||
|
||||
/*
|
||||
* We need to re-split the waist after mirroring
|
||||
*/
|
||||
splitFrontWaist(part)
|
||||
}
|
||||
|
||||
/*
|
||||
* Store the J-Seam dimensions to construct the fly shield later
|
||||
*/
|
||||
store.set('jseamWidth', points.jseamCorner.x)
|
||||
store.set('jseamHeight', points.jseamCorner.y)
|
||||
|
||||
/*
|
||||
* The Seamline
|
||||
*/
|
||||
paths.seam = new Path()
|
||||
.move(points.topLeft)
|
||||
.line(points.jseamTopFe)
|
||||
.line(points.jseamCurveStartFe)
|
||||
.curve(points.jseamCpTopFe, points.jseamCpBottomFe, points.jseamBottomFe)
|
||||
.line(points.bottomLeft)
|
||||
.line(points.trueBottomRight)
|
||||
.line(points.frontPocketSide)
|
||||
.line(points.frontPocketCurveStart)
|
||||
.curve(points.frontPocketCpSide, points.frontPocketCpTop, points.frontPocketStart)
|
||||
.join(paths.frontWaistCenter)
|
||||
.close()
|
||||
.addClass('fabric')
|
||||
|
||||
/*
|
||||
* Seam allowance. Only if the user wants it.
|
||||
*/
|
||||
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
|
||||
|
||||
/*
|
||||
* If the user wants a complete pattern, let's add some more guidance
|
||||
*/
|
||||
if (complete) {
|
||||
/*
|
||||
* The J-Seam
|
||||
*/
|
||||
paths.jseam = new Path()
|
||||
.move(points.jseamBottom)
|
||||
.curve(points.jseamCpBottom, points.jseamCpTop, points.jseamCurveStart)
|
||||
.line(points.jseamTop)
|
||||
.addClass('note dashed stroke-sm')
|
||||
.addText('jSeam', 'text-sm center fill-note')
|
||||
|
||||
/*
|
||||
* The fly fold line
|
||||
*/
|
||||
paths.flyFold = new Path()
|
||||
.move(points.jseamBottom)
|
||||
.line(points.topLeft)
|
||||
.addClass('note help stroke-sm')
|
||||
|
||||
/*
|
||||
* Add a 'fold here' note along the fold line
|
||||
*/
|
||||
macro('banner', {
|
||||
path: paths.flyFold,
|
||||
text: 'foldHere',
|
||||
className: 'text-sm fill-note',
|
||||
})
|
||||
|
||||
/*
|
||||
* Add various helper paths
|
||||
*/
|
||||
paths.corner = drawCornerPath(part) // Pocket corner
|
||||
drawPocketBag(part) // Pocket bag
|
||||
paths.side = drawSideNote(part) // Note on side seam
|
||||
paths.hem = drawHemNote(part) // Note on hem
|
||||
}
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 1, from: 'fabric' })
|
||||
|
||||
/*
|
||||
* Add a grainline indicator
|
||||
*/
|
||||
points.grainlineTop = points.jseamTop.shiftFractionTowards(points.topLeft, 0.5)
|
||||
points.grainlineBottom = new Point(points.grainlineTop.x, points.bottomLeft.y)
|
||||
macro('grainline', {
|
||||
from: points.grainlineBottom,
|
||||
to: points.grainlineTop,
|
||||
})
|
||||
|
||||
/*
|
||||
* Remove title from frontBase and add our own title
|
||||
*/
|
||||
macro('rmtitle')
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 2,
|
||||
title: options.invertFly ? 'frontFlySideRight' : 'frontFlySideLeft',
|
||||
})
|
||||
|
||||
/*
|
||||
* Overwrite logo from frontBase to add our own logo in the place we want
|
||||
*/
|
||||
points.logo = points.frontPocketCurveStart.shiftFractionTowards(points.bottomRight, 0.5)
|
||||
snippets.logo = new Snippet('logo', points.logo)
|
||||
|
||||
/*
|
||||
* Add notches
|
||||
*/
|
||||
macro('sprinkle', {
|
||||
snippet: 'notch',
|
||||
on: ['jseamTop', 'frontPocketBagStart', 'topLeft', 'jseamBottomFe'],
|
||||
})
|
||||
|
||||
/*
|
||||
* Add dimentions for paperless only when needed
|
||||
*/
|
||||
if (paperless) {
|
||||
macro('hd', {
|
||||
id: 'wFlyExtension',
|
||||
from: points.jseamTopFe,
|
||||
to: points.topLeft,
|
||||
y: points.jseamTopFe.y - sa - 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wFly',
|
||||
from: points.topLeft,
|
||||
to: points.jseamTop,
|
||||
y: points.jseamTopFe.y - sa - 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wCfrontToPocket',
|
||||
from: points.topLeft,
|
||||
to: points.frontPocketStart,
|
||||
y: points.jseamTopFe.y - sa - 30,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wCfrontToFlyExtensionBottom',
|
||||
from: points.jseamCurveStartFe,
|
||||
to: points.topLeft,
|
||||
y: points.jseamTopFe.y - sa - 30,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wCfrontToSideWaist',
|
||||
from: points.topLeft,
|
||||
to: points.topRight,
|
||||
y: points.jseamTopFe.y - sa - 45,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wCfrontToSidePocket',
|
||||
from: points.topLeft,
|
||||
to: points.frontPocketSide,
|
||||
y: points.jseamTopFe.y - sa - 60,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wCfrontToSieHem',
|
||||
from: points.topLeft,
|
||||
to: points.trueBottomRight,
|
||||
y: points.jseamTopFe.y - sa - 75,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wCfBottomToSidePocket',
|
||||
from: points.bottomLeft,
|
||||
to: points.frontPocketSide,
|
||||
y: points.bottomLeft.y + sa + 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wCfBottomToSideHem',
|
||||
from: points.bottomLeft,
|
||||
to: points.trueBottomRight,
|
||||
y: points.bottomLeft.y + sa + 30,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wFull',
|
||||
from: points.jseamCurveStartFe,
|
||||
to: points.trueBottomRight,
|
||||
y: points.bottomLeft.y + sa + 45,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'hSideHemToPocket',
|
||||
from: points.trueBottomRight,
|
||||
to: points.frontPocketSide,
|
||||
x: points.trueBottomRight.x + sa + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'hSideHemToWaist',
|
||||
from: points.trueBottomRight,
|
||||
to: points.frontPocketStart,
|
||||
x: points.trueBottomRight.x + sa + 30,
|
||||
})
|
||||
if (options.waistSlant) {
|
||||
macro('vd', {
|
||||
id: 'hFullWithSlant',
|
||||
from: points.trueBottomRight,
|
||||
to: points.topRight,
|
||||
x: points.trueBottomRight.x + sa + 45,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return part
|
||||
}
|
201
designs/naomiwu/src/front-nofly-side.mjs
Normal file
201
designs/naomiwu/src/front-nofly-side.mjs
Normal file
|
@ -0,0 +1,201 @@
|
|||
import {
|
||||
frontBase,
|
||||
splitFrontWaist,
|
||||
drawCornerPath,
|
||||
drawSeamLine,
|
||||
drawSideNote,
|
||||
drawHemNote,
|
||||
drawPocketBag,
|
||||
} from './front-base.mjs'
|
||||
|
||||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
/*
|
||||
* This function drafts the front panel of the skirt without the fly on it
|
||||
* Whether that ends up being the right or left panel depends on the
|
||||
* 'invertFly' option.
|
||||
* By default, this is the right panel, if the option is truthy, this becomes
|
||||
* the right panel.
|
||||
*
|
||||
* Basic outline was drafted in frontBase
|
||||
*
|
||||
* Note that Left/Right is always from the vantage point the wearer
|
||||
*/
|
||||
export const frontNoFlySide = {
|
||||
name: 'naomiwu.frontNoFlySide', // Name in design:part format
|
||||
draft: draftFrontNoFlySide, // Method to call to draft this part
|
||||
from: frontBase, // Draft this starting from (the imported) frontBase part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the right front panel of the skirt
|
||||
*
|
||||
* Basic outline was drafted in frontBase
|
||||
* Now we adapt it for the right panel
|
||||
*
|
||||
* Note that Left/Right is always from the vantage point the wearer
|
||||
*/
|
||||
function draftFrontNoFlySide({
|
||||
Point,
|
||||
points,
|
||||
paths,
|
||||
store,
|
||||
part,
|
||||
options,
|
||||
complete,
|
||||
sa,
|
||||
snippets,
|
||||
Snippet,
|
||||
macro,
|
||||
}) {
|
||||
/*
|
||||
* Let's mirror the entire thing, unless the user wants the fly side inverted
|
||||
* In that case, we already have it the way it should be.
|
||||
*/
|
||||
if (!options.invertFly) {
|
||||
for (const p in points) points[p] = points[p].flipX()
|
||||
|
||||
/*
|
||||
* We need to re-split the waist after mirroring it and re-draw paths
|
||||
*/
|
||||
splitFrontWaist(part)
|
||||
paths.corner = drawCornerPath(part) // Corner
|
||||
paths.seam = drawSeamLine(part) // Seamline
|
||||
}
|
||||
|
||||
/*
|
||||
* Only add SA if it's requested
|
||||
*/
|
||||
if (sa) paths.sa = paths.seam.offset(-1 * sa).attr('class', 'fabric sa')
|
||||
|
||||
/*
|
||||
* If the user wants a complete pattern, let's add some more guidance
|
||||
*/
|
||||
if (complete) {
|
||||
/*
|
||||
* Draw various helper paths
|
||||
*/
|
||||
drawPocketBag(part, true) // Pocket bage
|
||||
paths.side = drawSideNote(part) // Helper note on the side seam
|
||||
paths.hem = drawHemNote(part).reverse(true) // Helper note on the hem
|
||||
}
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 1, from: 'fabric' })
|
||||
|
||||
/*
|
||||
* Overwrite title from frontBase to add our own title
|
||||
*/
|
||||
macro('rmtitle')
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 3,
|
||||
title: options.invertFly ? 'frontNoFlySideLeft' : 'frontNoFlySideRight',
|
||||
})
|
||||
|
||||
/*
|
||||
* Add the 1 notch that is on this part
|
||||
*/
|
||||
snippets.notch = new Snippet('notch', points.frontPocketBagStart)
|
||||
|
||||
/*
|
||||
* Add a grainline indicator
|
||||
*/
|
||||
points.grainlineTop = points.topLeft.shiftFractionTowards(points.jseamTop, 0.5)
|
||||
points.grainlineBottom = new Point(points.grainlineTop.x, points.bottomLeft.y)
|
||||
macro('grainline', {
|
||||
from: points.grainlineBottom,
|
||||
to: points.grainlineTop,
|
||||
})
|
||||
|
||||
/*
|
||||
* Overwrite logo from frontBase to add our own (or rather the same in our preferred location)
|
||||
*/
|
||||
points.logo = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)
|
||||
snippets.logo = new Snippet('logo', points.logo)
|
||||
|
||||
/*
|
||||
* Dimensions
|
||||
*/
|
||||
macro('hd', {
|
||||
id: 'wAtHem',
|
||||
from: points.trueBottomRight,
|
||||
to: points.bottomLeft,
|
||||
y: points.bottomLeft.y + sa + 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wPocketNotchToCfront',
|
||||
from: points.frontPocketBagStart,
|
||||
to: points.topLeft,
|
||||
y: points.frontPocketStart.y - sa - 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wPocketCutoutToCfront',
|
||||
from: points.frontPocketStart,
|
||||
to: points.topLeft,
|
||||
y: points.frontPocketStart.y - sa - 30,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wPocketCutout',
|
||||
from: points.frontPocketSide,
|
||||
to: points.frontPocketStart,
|
||||
y: points.frontPocketStart.y - sa - 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wPocketCutoutToCfHem',
|
||||
from: points.frontPocketStart,
|
||||
to: points.trueBottomLeft,
|
||||
y: points.frontPocketStart.y - sa - 45,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wSideHemToStartPocketCutout',
|
||||
from: points.trueBottomRight,
|
||||
to: points.frontPocketStart,
|
||||
y: points.frontPocketStart.y - sa - 30,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'hSideHemToPocketCutout',
|
||||
from: points.trueBottomRight,
|
||||
to: points.frontPocketSide,
|
||||
x: points.bottomRight.x - sa - 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'hHemBottomToPocketCutout',
|
||||
from: points.bottomLeft,
|
||||
to: points.frontPocketSide,
|
||||
x: points.bottomRight.x - sa - 30,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'hCfHemToPoketStart',
|
||||
from: points.bottomLeft,
|
||||
to: points.frontPocketStart,
|
||||
x: points.bottomRight.x - sa - 45,
|
||||
})
|
||||
macro('vd', {
|
||||
from: points.bottomLeft,
|
||||
id: 'hTopLeftBottomLeft',
|
||||
to: points.topLeft,
|
||||
x: points.bottomLeft.x + sa + 15,
|
||||
})
|
||||
if (options.waistSlant) {
|
||||
macro('vd', {
|
||||
id: 'hFullWithSlant',
|
||||
from: points.bottomLeft,
|
||||
to: points.topRight,
|
||||
x: points.bottomRight.x - sa - 60,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'hWithSlantCfront',
|
||||
from: points.bottomLeft,
|
||||
to: points.frontPocketStart,
|
||||
x: points.bottomLeft.x + sa + 30,
|
||||
})
|
||||
}
|
||||
|
||||
return part
|
||||
}
|
111
designs/naomiwu/src/front-pocket-bag.mjs
Normal file
111
designs/naomiwu/src/front-pocket-bag.mjs
Normal file
|
@ -0,0 +1,111 @@
|
|||
import { frontBase } from './front-base.mjs'
|
||||
|
||||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const frontPocketBag = {
|
||||
name: 'naomiwu.frontPocketBag', // The name in design::part format
|
||||
draft: draftFrontPocketBag, // The method to call to draft this part
|
||||
from: frontBase, // Draft this starting from the (imported) frontBase part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the front pocket bag of the skirt
|
||||
*/
|
||||
function draftFrontPocketBag({
|
||||
Point,
|
||||
points,
|
||||
Path,
|
||||
paths,
|
||||
part,
|
||||
store,
|
||||
sa,
|
||||
snippets,
|
||||
Snippet,
|
||||
macro,
|
||||
}) {
|
||||
/*
|
||||
* Remove paths we don't need
|
||||
*/
|
||||
delete paths.corner
|
||||
delete paths.hem
|
||||
delete paths.frontWaist
|
||||
delete paths.pocketbag
|
||||
|
||||
/*
|
||||
* The seam line
|
||||
*/
|
||||
paths.seam = new Path()
|
||||
.move(points.frontPocketBagStart)
|
||||
.line(points.frontPocketBagHem)
|
||||
.line(points.trueBottomRight)
|
||||
.line(points.topRight)
|
||||
.join(paths.frontWaistSide)
|
||||
.line(points.frontPocketBagStart)
|
||||
.close()
|
||||
.addClass('various')
|
||||
|
||||
/*
|
||||
* Add SA only when requested
|
||||
*/
|
||||
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 2, from: 'lining', onFold: true })
|
||||
|
||||
/*
|
||||
* Overwrite title from frontBase
|
||||
*/
|
||||
points.title = new Point(
|
||||
points.frontPocketFacingCenter.x * 1.5,
|
||||
points.frontPocketFacingCenter.y / 1.5
|
||||
)
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 5,
|
||||
title: 'frontPocketBag',
|
||||
})
|
||||
|
||||
/*
|
||||
* Overwrite logo from frontBase
|
||||
*/
|
||||
points.logo = points.title.shift(12, 100)
|
||||
snippets.logo = new Snippet('logo', points.logo)
|
||||
|
||||
/*
|
||||
* Add a cut-on-fold indicator
|
||||
*/
|
||||
macro('cutonfold', {
|
||||
from: points.frontPocketBagStart,
|
||||
to: points.frontPocketBagHem,
|
||||
grainline: true,
|
||||
})
|
||||
|
||||
/*
|
||||
* Dimensions
|
||||
*/
|
||||
macro('hd', {
|
||||
id: 'wAtTop',
|
||||
from: points.frontPocketBagStart,
|
||||
to: points.topRight,
|
||||
y: points.topLeft.y - sa - 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wAtBottom',
|
||||
from: points.frontPocketBagHem,
|
||||
to: points.bottomRight,
|
||||
y: points.bottomLeft.y + sa + 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'hFull',
|
||||
from: points.frontPocketBagHem,
|
||||
to: points.frontPocketBagStart,
|
||||
x: points.frontPocketBagHem.x - sa - 15,
|
||||
})
|
||||
|
||||
return part
|
||||
}
|
100
designs/naomiwu/src/front-pocket-facing.mjs
Normal file
100
designs/naomiwu/src/front-pocket-facing.mjs
Normal file
|
@ -0,0 +1,100 @@
|
|||
import { frontPocketBag } from './front-pocket-bag.mjs'
|
||||
|
||||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const frontPocketFacing = {
|
||||
name: 'naomiwu.frontPocketFacing', // The name in design::part format
|
||||
draft: draftFrontPocketFacing, // The method to call to draft this part
|
||||
from: frontPocketBag, // Draft this starting from the (imported) frontPocketBag part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the front pocket facing of the skirt
|
||||
*/
|
||||
function draftFrontPocketFacing({ points, Path, paths, store, part, sa, macro }) {
|
||||
/*
|
||||
* Clean up what we don't need
|
||||
*/
|
||||
delete paths.pocketbagBoundary
|
||||
delete paths.pocketfacingBoundary
|
||||
macro('rmad') // Removes all dimensions
|
||||
|
||||
/*
|
||||
* The seam line
|
||||
*/
|
||||
paths.seam = new Path()
|
||||
.move(points.frontPocketBagStart)
|
||||
.line(points.frontPocketFacingCenter)
|
||||
.line(points.frontPocketFacingSide)
|
||||
.line(points.topRight)
|
||||
.join(paths.frontWaistSide)
|
||||
.line(points.frontPocketBagStart)
|
||||
.close()
|
||||
.addClass('fabric')
|
||||
|
||||
/*
|
||||
* Only add SA when requested
|
||||
*/
|
||||
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
|
||||
|
||||
/*
|
||||
* Fix text alignement on the side seam
|
||||
*/
|
||||
paths.side = new Path()
|
||||
.move(points.frontPocketFacingSide)
|
||||
.line(points.topRight)
|
||||
.addClass('hidden')
|
||||
.addText('sideSeam', 'center fill-note text-sm')
|
||||
.attr('data-text-dy', -1)
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 2, from: 'fabric', onFold: true })
|
||||
|
||||
/*
|
||||
* Add the title ( and remove the inherited one)
|
||||
*/
|
||||
macro('rmtitle')
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 6,
|
||||
title: 'frontPocketFacing',
|
||||
})
|
||||
|
||||
/*
|
||||
* Add cut-on-fold indicator
|
||||
*/
|
||||
macro('cutonfold', {
|
||||
from: points.frontPocketBagStart,
|
||||
to: points.frontPocketFacingCenter,
|
||||
grainline: true,
|
||||
})
|
||||
|
||||
/*
|
||||
* Dimensions
|
||||
*/
|
||||
macro('hd', {
|
||||
id: 'wAtBottom',
|
||||
from: points.frontPocketFacingCenter,
|
||||
to: points.frontPocketFacingSide,
|
||||
y: points.frontPocketFacingCenter.y + sa + 15,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'wAtTop',
|
||||
from: points.frontPocketBagStart,
|
||||
to: points.topRight,
|
||||
y: points.topRight.y - sa - 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'hFull',
|
||||
from: points.frontPocketFacingCenter,
|
||||
to: points.frontPocketBagStart,
|
||||
x: points.frontPocketFacingCenter.x - sa - 15,
|
||||
})
|
||||
|
||||
return part
|
||||
}
|
94
designs/naomiwu/src/index.mjs
Normal file
94
designs/naomiwu/src/index.mjs
Normal file
|
@ -0,0 +1,94 @@
|
|||
import { Design } from '@freesewing/core'
|
||||
import { data } from '../data.mjs'
|
||||
import { i18n } from '../i18n/index.mjs'
|
||||
// Parts
|
||||
import { shared } from './shared.mjs'
|
||||
import { back } from './back.mjs'
|
||||
import { frontBase } from './front-base.mjs'
|
||||
import { frontFlySide } from './front-fly-side.mjs'
|
||||
import { frontNoFlySide } from './front-nofly-side.mjs'
|
||||
import { waistband } from './waistband.mjs'
|
||||
import { flyShield } from './fly-shield.mjs'
|
||||
import { frontPocketBag } from './front-pocket-bag.mjs'
|
||||
import { frontPocketFacing } from './front-pocket-facing.mjs'
|
||||
import { frontAttachment } from './front-attachment.mjs'
|
||||
import { frontAttachmentFacing } from './front-attachment-facing.mjs'
|
||||
import { backPocket } from './back-pocket.mjs'
|
||||
import { backPocketFlap } from './back-pocket-flap.mjs'
|
||||
import { backAttachmentBack } from './back-attachment-back.mjs'
|
||||
import { backAttachmentFront } from './back-attachment-front.mjs'
|
||||
import { backAttachmentFlap } from './back-attachment-flap.mjs'
|
||||
import { beltLoop } from './belt-loop.mjs'
|
||||
import { backBeltLoop } from './back-belt-loop.mjs'
|
||||
|
||||
/*
|
||||
* Create new design
|
||||
*/
|
||||
const Naomiwu = new Design({
|
||||
data,
|
||||
parts: [
|
||||
shared,
|
||||
back,
|
||||
frontBase,
|
||||
frontFlySide,
|
||||
frontNoFlySide,
|
||||
waistband,
|
||||
flyShield,
|
||||
frontPocketBag,
|
||||
frontPocketFacing,
|
||||
frontAttachment,
|
||||
frontAttachmentFacing,
|
||||
backPocket,
|
||||
backPocketFlap,
|
||||
backAttachmentBack,
|
||||
backAttachmentFront,
|
||||
backAttachmentFlap,
|
||||
beltLoop,
|
||||
backBeltLoop,
|
||||
],
|
||||
})
|
||||
|
||||
/*
|
||||
* Note that we are creating this above as 'Naomiwu' and not 'NaomiWu', which
|
||||
* would be the correctly camel-cased name of the person it's named after.
|
||||
*
|
||||
* The reason is that when discussing the name with Naomi, she originally
|
||||
* suggested 'Open Cargo Skirt'. After explaining that we typically use
|
||||
* first-names for our designs because we provide a website in multiple
|
||||
* languages and want to have a name that does not need translation, she
|
||||
* suggested either 'Wu Cargo Skirt' or 'Naomi Wu Cargo Skirt'.
|
||||
*
|
||||
* So we landed on 'Naomi Wu Cargo Skirt' which makes the short name of this
|
||||
* pattern (as used in the NPM package and URLs) 'naomiwu'.
|
||||
* To get the constructor from that, we capitalize the design name, so that
|
||||
* is why 'Naomiwu' is exported.
|
||||
*
|
||||
* However, to be flexible, we also export this design as NaomiWu below.
|
||||
* This way, both ways work.
|
||||
*/
|
||||
const NaomiWu = Naomiwu
|
||||
|
||||
// Named exports
|
||||
export {
|
||||
shared,
|
||||
back,
|
||||
frontBase,
|
||||
frontFlySide,
|
||||
frontNoFlySide,
|
||||
waistband,
|
||||
flyShield,
|
||||
frontPocketBag,
|
||||
frontPocketFacing,
|
||||
frontAttachment,
|
||||
frontAttachmentFacing,
|
||||
backPocket,
|
||||
backPocketFlap,
|
||||
backAttachmentBack,
|
||||
backAttachmentFront,
|
||||
backAttachmentFlap,
|
||||
beltLoop,
|
||||
backBeltLoop,
|
||||
Naomiwu,
|
||||
NaomiWu, // See note above
|
||||
i18n,
|
||||
}
|
322
designs/naomiwu/src/shared.mjs
Normal file
322
designs/naomiwu/src/shared.mjs
Normal file
|
@ -0,0 +1,322 @@
|
|||
import { pctBasedOn } from '@freesewing/core'
|
||||
|
||||
function draft({ store, measurements, options, part }) {
|
||||
// Set values in the store for re-use
|
||||
const hips = measurements.hips * (1 + options.hipsEase)
|
||||
store.set('hips', hips)
|
||||
store.set('frontQuarterHips', (hips * options.frontHalf) / 2)
|
||||
store.set('backQuarterHips', (hips * (1 - options.frontHalf)) / 2)
|
||||
const seat = measurements.seat * (1 + options.seatEase)
|
||||
store.set('seat', seat)
|
||||
store.set('frontQuarterSeat', (seat * options.frontHalf) / 2)
|
||||
store.set('backQuarterSeat', (seat * (1 - options.frontHalf)) / 2)
|
||||
store.set('hipsToSeat', measurements.waistToSeat - measurements.waistToHips)
|
||||
store.set('hipsToUpperLeg', measurements.waistToUpperLeg - measurements.waistToHips)
|
||||
store.set('seatToUpperLeg', measurements.waistToUpperLeg - measurements.waistToSeat)
|
||||
// Never reduce a negative amount
|
||||
const reduce = (seat - hips) / 4
|
||||
store.set('hipsQuarterReduction', reduce > 0 ? reduce : 0)
|
||||
|
||||
return part
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper method like pctBasedOn, but using quarter hips for measurement
|
||||
*/
|
||||
const pctBasedOnQhips = () => ({
|
||||
toAbs: (value, { measurements }) => value * (measurements.hips / 4),
|
||||
fromAbs: (value, { measurements }) => measurements.hips / 4 / value,
|
||||
})
|
||||
|
||||
/*
|
||||
* Helper method like pctBasedOn, but using hips to upperleg
|
||||
*/
|
||||
const pctBasedOnHipsToUleg = () => ({
|
||||
toAbs: (value, { measurements }) =>
|
||||
value * (measurements.waistToUpperLeg - measurements.waistToHips),
|
||||
fromAbs: (value, { measurements }) =>
|
||||
(measurements.waistToUpperLeg - measurements.waistToHips) / value,
|
||||
})
|
||||
|
||||
export const shared = {
|
||||
name: 'naomiwu.shared',
|
||||
measurements: ['hips', 'seat', 'waistToHips', 'waistToSeat', 'waistToUpperLeg'],
|
||||
hide: { self: true },
|
||||
options: {
|
||||
// Fit options
|
||||
|
||||
/*
|
||||
* Amount of ease at the hips.
|
||||
* By default this has no ease + elasticated waist (partially) because this
|
||||
* is supposed to support cargo without sliding down. (belt is better, but still).
|
||||
*/
|
||||
hipsEase: {
|
||||
pct: 0,
|
||||
min: -5,
|
||||
max: 5,
|
||||
menu: 'fit',
|
||||
...pctBasedOn('hips'),
|
||||
},
|
||||
|
||||
/*
|
||||
* Amount of ease at the seat.
|
||||
* Needs to be sufficient to allow dexterity but not so much that it's to flared
|
||||
*/
|
||||
seatEase: {
|
||||
pct: 5,
|
||||
min: 0,
|
||||
max: 15,
|
||||
menu: 'fit',
|
||||
...pctBasedOn('seat'),
|
||||
},
|
||||
|
||||
/*
|
||||
* How much the waist should slant downward at the front (and up at the back)
|
||||
* This is based on a model with a perfectly horizontal waistline.
|
||||
* However, people who -- as Sir Mix A Lot would say -- got (more) back benefit
|
||||
* from a sloped waistline that raises up at teh back and dips lower at the front.
|
||||
* This option facilitates that.
|
||||
*/
|
||||
waistSlant: {
|
||||
pct: 0,
|
||||
min: 0,
|
||||
max: 2,
|
||||
menu: 'fit',
|
||||
...pctBasedOn('hips'),
|
||||
},
|
||||
|
||||
// Style options
|
||||
|
||||
/*
|
||||
* Allows one to swap the fly side for what is more convenient or best
|
||||
* matches one's gender expression.
|
||||
*
|
||||
* This design is based ona physical skirt made/worn by Naomi Wu and that
|
||||
* skirt had the traditional left-over-right fly that is the most common
|
||||
* style used in all menswear but also often in womenswear bottoms.
|
||||
*
|
||||
* Changing this option will draft a right-over-left style which is common
|
||||
* for womenswear tops and bottoms, and as such is more female-presenting.
|
||||
*
|
||||
* There's no right or wrong way, it's just preference. The reason
|
||||
* left-over-right is the default here is because that's how it was on
|
||||
* the skirt we based this on.
|
||||
*/
|
||||
invertFly: {
|
||||
bool: false,
|
||||
menu: 'style',
|
||||
},
|
||||
|
||||
/*
|
||||
* The length as a percentage of the hips to upper leg measurements
|
||||
*/
|
||||
length: {
|
||||
pct: 40,
|
||||
min: 0,
|
||||
max: 80,
|
||||
menu: 'style',
|
||||
toAbs: (value, { measurements }) =>
|
||||
(1 + value) * (measurements.waistToUpperLeg - measurements.waistToHips),
|
||||
fromAbs: (value, { measurements }) =>
|
||||
(measurements.waistToUpperLeg - measurements.waistToHips) / (1 + value),
|
||||
},
|
||||
|
||||
waistbandWidth: {
|
||||
pct: 4.4,
|
||||
min: 2,
|
||||
max: 10,
|
||||
menu: 'style',
|
||||
...pctBasedOn('hips'),
|
||||
},
|
||||
|
||||
beltLoopWidth: {
|
||||
pct: 40,
|
||||
min: 20,
|
||||
max: 60,
|
||||
menu: 'style',
|
||||
toAbs: (value, { measurements }, mergedOptions) =>
|
||||
value * measurements.hips * mergedOptions.waistbandWidth,
|
||||
fromAbs: (value, { measurements }, mergedOptions) =>
|
||||
(measurements.hips * mergedOptions.waistbandWidth) / value,
|
||||
},
|
||||
|
||||
// Pocket options
|
||||
|
||||
/*
|
||||
* Controls the curvature of the front pocket opening
|
||||
*/
|
||||
frontPocketOpeningBend: {
|
||||
pct: 80,
|
||||
min: 0,
|
||||
max: 100,
|
||||
menu: 'pockets',
|
||||
},
|
||||
|
||||
/*
|
||||
* Controls the depth of the front pocket opening as a factor of
|
||||
* waistToUpperLeg - waistToHip
|
||||
*/
|
||||
frontPocketOpeningDepth: {
|
||||
pct: 33,
|
||||
min: 25,
|
||||
max: 45,
|
||||
menu: 'pockets',
|
||||
...pctBasedOnQhips(),
|
||||
},
|
||||
|
||||
// Pocket options
|
||||
backPocketDepth: {
|
||||
pct: 70,
|
||||
min: 60,
|
||||
max: 85,
|
||||
menu: 'pockets',
|
||||
},
|
||||
backPocketChamferSize: {
|
||||
pct: 15,
|
||||
min: 5,
|
||||
max: 25,
|
||||
menu: 'pockets',
|
||||
},
|
||||
frontPocketOpeningWidth: {
|
||||
pct: 33,
|
||||
min: 25,
|
||||
max: 45,
|
||||
menu: 'pockets',
|
||||
...pctBasedOnQhips(),
|
||||
},
|
||||
|
||||
// Width of the back attachment
|
||||
backAttachmentWidth: {
|
||||
pct: 40,
|
||||
min: 25,
|
||||
max: 55,
|
||||
menu: 'pockets',
|
||||
...pctBasedOnQhips(),
|
||||
},
|
||||
backAttachmentDepth: {
|
||||
pct: 190,
|
||||
min: 100,
|
||||
max: 220,
|
||||
menu: 'pockets',
|
||||
},
|
||||
|
||||
// Width of the front attachment
|
||||
frontAttachmentWidth: {
|
||||
pct: 95,
|
||||
min: 80,
|
||||
max: 110,
|
||||
menu: 'pockets',
|
||||
},
|
||||
frontAttachmentChamferSize: {
|
||||
pct: 15,
|
||||
min: 5,
|
||||
max: 25,
|
||||
menu: 'pockets',
|
||||
},
|
||||
backAttachmentFlapChamferSize: {
|
||||
pct: 15,
|
||||
min: 5,
|
||||
max: 25,
|
||||
menu: 'pockets',
|
||||
},
|
||||
|
||||
// Advanced options
|
||||
|
||||
/*
|
||||
* The dart length.
|
||||
* Is a factor between the distance between the hipline and seatline
|
||||
*/
|
||||
dartLength: {
|
||||
pct: 90,
|
||||
min: 50,
|
||||
max: 100,
|
||||
menu: 'advanced',
|
||||
toAbs: (value, { measurements }) =>
|
||||
value * (measurements.waistToSeat - measurements.waistToHips),
|
||||
fromAbs: (value, { measurements }) =>
|
||||
(measurements.waistToSeat - measurements.waistToHips) / value,
|
||||
},
|
||||
|
||||
/*
|
||||
* The dart width.
|
||||
* Doesn't influence fit, but rather determines how much shaping is done in the darts
|
||||
*/
|
||||
dartWidth: {
|
||||
pct: 5,
|
||||
min: 4,
|
||||
max: 8,
|
||||
menu: 'advanced',
|
||||
...pctBasedOnQhips(),
|
||||
},
|
||||
|
||||
/*
|
||||
* The fly length.
|
||||
*/
|
||||
flyLength: {
|
||||
pct: 75,
|
||||
min: 50,
|
||||
max: 85,
|
||||
menu: 'advanced',
|
||||
...pctBasedOnHipsToUleg(),
|
||||
},
|
||||
/*
|
||||
* The fly width.
|
||||
*/
|
||||
flyWidth: {
|
||||
pct: 16,
|
||||
min: 10,
|
||||
max: 22,
|
||||
menu: 'advanced',
|
||||
...pctBasedOnQhips(),
|
||||
},
|
||||
|
||||
/*
|
||||
* Percentage of the full circumference that should be made up
|
||||
* by the front panels. Increasing this will shift the side seams
|
||||
* to the back, which increases space for the pockets. However if
|
||||
* you shift them too far, the pocket opening sits too far to the
|
||||
* side and becomes difficult to access. The default 60% is a good
|
||||
* average.
|
||||
*/
|
||||
frontHalf: {
|
||||
pct: 55,
|
||||
min: 50,
|
||||
max: 60,
|
||||
menu: 'advanced',
|
||||
},
|
||||
|
||||
/*
|
||||
* Curvature of the J-Seam bend
|
||||
*/
|
||||
jseamBend: {
|
||||
pct: 65,
|
||||
min: 50,
|
||||
max: 100,
|
||||
menu: 'advanced',
|
||||
},
|
||||
|
||||
/*
|
||||
* Minimal dart width. Below this width, we don't create darts but
|
||||
* instead do all shaping in the side seams.
|
||||
*/
|
||||
minDartWidth: {
|
||||
pct: 2,
|
||||
min: 0.5,
|
||||
max: 4,
|
||||
menu: 'advanced',
|
||||
toAbs: (pct, settings, mergedOptions) =>
|
||||
(pct *
|
||||
settings.measurements.hips *
|
||||
(1 + mergedOptions.hipsEase) *
|
||||
(1 - mergedOptions.frontHalf)) /
|
||||
2,
|
||||
fromAbs: (mm, settings) =>
|
||||
(settings.measurements.hips *
|
||||
(1 + settings.options.hipsEase) *
|
||||
(1 - settings.options.frontHalf)) /
|
||||
2 /
|
||||
mm,
|
||||
},
|
||||
},
|
||||
draft: draft,
|
||||
}
|
377
designs/naomiwu/src/waistband.mjs
Normal file
377
designs/naomiwu/src/waistband.mjs
Normal file
|
@ -0,0 +1,377 @@
|
|||
import { frontBase } from './front-base.mjs'
|
||||
import { capitalize } from '@freesewing/core'
|
||||
|
||||
/*
|
||||
* This is the exported part object
|
||||
*/
|
||||
export const waistband = {
|
||||
name: 'naomiwu.waistband', // The name in design::part format
|
||||
draft: draftWaistband, // The method to call to draft this part
|
||||
after: frontBase, // Draft this part starting from the (imported) frontBase part
|
||||
}
|
||||
|
||||
/*
|
||||
* This function drafts the waistband of the skirt
|
||||
*/
|
||||
function draftWaistband({
|
||||
Point,
|
||||
points,
|
||||
Path,
|
||||
paths,
|
||||
store,
|
||||
part,
|
||||
options,
|
||||
complete,
|
||||
sa,
|
||||
snippets,
|
||||
Snippet,
|
||||
macro,
|
||||
absoluteOptions,
|
||||
}) {
|
||||
/*
|
||||
* We start from center back and make our way towards the front in both directions
|
||||
*/
|
||||
points.cbTop = new Point(0, 0)
|
||||
points.cbBottom = new Point(points.cbTop.x, absoluteOptions.waistbandWidth * 2)
|
||||
|
||||
/*
|
||||
* First add the back parts
|
||||
*/
|
||||
points.leftSideTop = points.cbTop.shift(180, store.get('backHipLength'))
|
||||
points.leftSideBottom = new Point(points.leftSideTop.x, points.cbBottom.y)
|
||||
points.rightSideTop = points.leftSideTop.flipX()
|
||||
points.rightSideBottom = points.leftSideBottom.flipX()
|
||||
|
||||
/*
|
||||
* Now continue with the fronts
|
||||
*/
|
||||
points.leftFrontTop = points.leftSideTop.shift(180, store.get('frontHipLength'))
|
||||
points.leftFrontBottom = new Point(points.leftFrontTop.x, points.cbBottom.y)
|
||||
points.rightFrontTop = points.leftFrontTop.flipX()
|
||||
points.rightFrontBottom = points.leftFrontBottom.flipX()
|
||||
|
||||
/*
|
||||
* Add the overlap at the button side (noFly side)
|
||||
*/
|
||||
points.rightEdgeTop = points.rightFrontTop.shift(0, absoluteOptions.flyWidth)
|
||||
points.rightEdgeBottom = new Point(points.rightEdgeTop.x, points.cbBottom.y)
|
||||
|
||||
/*
|
||||
* Fold in the middle
|
||||
*/
|
||||
points.midLeft = new Point(points.leftFrontTop.x, points.cbBottom.y / 2)
|
||||
points.midRight = new Point(points.rightEdgeTop.x, points.midLeft.y)
|
||||
|
||||
/*
|
||||
* Location of the buttonhole (taking invertFly option into account)
|
||||
*/
|
||||
points.buttonhole = points.leftFrontBottom
|
||||
.shiftFractionTowards(points.leftFrontTop, options.invertFly ? 0.75 : 0.25)
|
||||
.shift(0, absoluteOptions.waistbandWidth / 4)
|
||||
|
||||
/*
|
||||
* Location of the button
|
||||
*/
|
||||
points.button = new Point(
|
||||
points.rightEdgeTop.x - absoluteOptions.flyWidth / 2,
|
||||
points.buttonhole.y
|
||||
)
|
||||
|
||||
/*
|
||||
* Indicate the location of the belt loops
|
||||
*/
|
||||
points.leftBackLoopTop = points.cbTop.shiftFractionTowards(points.leftSideTop, 0.5)
|
||||
points.leftSideLoopTop = points.leftSideTop.shiftFractionTowards(points.leftFrontTop, 0.06)
|
||||
points.leftFrontLoopTop = points.leftSideTop.shiftFractionTowards(points.leftFrontTop, 0.53)
|
||||
for (const key of ['Back', 'Side', 'Front']) {
|
||||
points[`left${key}LoopBottom`] = new Point(points[`left${key}LoopTop`].x, points.cbBottom.y)
|
||||
points[`right${key}LoopTop`] = points[`left${key}LoopTop`].flipX()
|
||||
points[`right${key}LoopBottom`] = new Point(points[`right${key}LoopTop`].x, points.cbBottom.y)
|
||||
/*
|
||||
* Also add points on the left and right edge of the belt loop
|
||||
* so we can draw the path later
|
||||
*/
|
||||
for (const side of ['left', 'right']) {
|
||||
points[`${side}${key}LoopTopLeft`] = points[`${side}${key}LoopTop`].shift(
|
||||
180,
|
||||
absoluteOptions.beltLoopWidth / 2
|
||||
)
|
||||
points[`${side}${key}LoopTopRight`] = points[`${side}${key}LoopTop`].shift(
|
||||
0,
|
||||
absoluteOptions.beltLoopWidth / 2
|
||||
)
|
||||
points[`${side}${key}LoopBottomLeft`] = points[`${side}${key}LoopBottom`].shift(
|
||||
180,
|
||||
absoluteOptions.beltLoopWidth / 2
|
||||
)
|
||||
points[`${side}${key}LoopBottomRight`] = points[`${side}${key}LoopBottom`].shift(
|
||||
0,
|
||||
absoluteOptions.beltLoopWidth / 2
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Center back belt loop is different (a large wide one)
|
||||
*/
|
||||
points.cbLoopTopLeft = points.cbTop.shiftFractionTowards(points.leftBackLoopTop, 0.5)
|
||||
points.cbLoopTopRight = points.cbLoopTopLeft.flipX()
|
||||
points.cbLoopBottomLeft = new Point(points.cbLoopTopLeft.x, points.cbBottom.y)
|
||||
points.cbLoopBottomRight = points.cbLoopBottomLeft.flipX()
|
||||
|
||||
/*
|
||||
* We want to add an attachment here that can hold a mobile phone
|
||||
* However, we want to refrain from puttin it over any belt loops so let's
|
||||
* see how wide it can be (max) and store that for re-use later when drafting
|
||||
* the back attachment
|
||||
*/
|
||||
store.set('backAttachmentMaxWidth', points.leftSideLoopTopRight.dx(points.leftBackLoopTopLeft))
|
||||
|
||||
/*
|
||||
* Seamline
|
||||
*/
|
||||
paths.seam = new Path()
|
||||
.move(points.leftFrontTop)
|
||||
.line(points.leftFrontBottom)
|
||||
.line(points.rightEdgeBottom)
|
||||
.line(points.rightEdgeTop)
|
||||
.line(points.leftFrontTop)
|
||||
.close()
|
||||
.addClass('fabric')
|
||||
|
||||
/*
|
||||
* Only add SA when requested
|
||||
*/
|
||||
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
|
||||
|
||||
/*
|
||||
* If the user wants a complete pattern, let's add some more guidance
|
||||
*/
|
||||
if (complete) {
|
||||
/*
|
||||
* Add the fold line
|
||||
*/
|
||||
paths.fold = new Path().move(points.midLeft).line(points.midRight).addClass('help note')
|
||||
|
||||
/*
|
||||
* Include a message that this is where to fold the waistband
|
||||
*/
|
||||
macro('banner', {
|
||||
path: paths.fold,
|
||||
text: 'foldHere',
|
||||
className: 'text-sm fill-note',
|
||||
repeat: 50,
|
||||
})
|
||||
|
||||
/*
|
||||
* Indicate the fly edge line
|
||||
*/
|
||||
paths.flyEdge = new Path()
|
||||
.move(points.leftFrontBottom)
|
||||
.line(points.leftFrontTop)
|
||||
.addClass('note dashed')
|
||||
.addText('flyEdge', 'text-sm fill-note center')
|
||||
|
||||
/*
|
||||
* Indicate location of the belt loops
|
||||
*/
|
||||
for (const key of ['Back', 'Side', 'Front']) {
|
||||
for (const side of ['left', 'right']) {
|
||||
paths[`beltLoop${capitalize(side)}${key}`] = new Path()
|
||||
.move(points[`${side}${key}LoopTopLeft`])
|
||||
.line(points[`${side}${key}LoopBottomLeft`])
|
||||
.move(points[`${side}${key}LoopBottomRight`])
|
||||
.line(points[`${side}${key}LoopTopRight`])
|
||||
.addClass('note stroke-sm dashed')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Annotations
|
||||
*/
|
||||
|
||||
// Cutlist
|
||||
store.cutlist.setCut({ cut: 1, from: 'fabric' })
|
||||
|
||||
/*
|
||||
* Add the logo
|
||||
*/
|
||||
points.logo = points.midLeft.shiftFractionTowards(points.midRight, 0.65)
|
||||
snippets.logo = new Snippet('logo', points.logo).scale(0.666)
|
||||
|
||||
/*
|
||||
* Add the title
|
||||
*/
|
||||
points.title = points.logo.shift(0, 70)
|
||||
macro('title', {
|
||||
at: points.title,
|
||||
nr: 7,
|
||||
title: 'waistband',
|
||||
align: 'center',
|
||||
scale: 0.666,
|
||||
})
|
||||
|
||||
/*
|
||||
* Add the button hole
|
||||
*/
|
||||
snippets.buttonhole = new Snippet('buttonhole-start', points.buttonhole)
|
||||
.attr('data-scale', absoluteOptions.waistbandWidth / 16)
|
||||
.attr('data-rotate', 90)
|
||||
|
||||
/*
|
||||
* Add the button
|
||||
*/
|
||||
snippets.button = new Snippet('button', points.button).attr(
|
||||
'data-scale',
|
||||
absoluteOptions.waistbandWidth / 16
|
||||
)
|
||||
|
||||
/*
|
||||
* Add notches to indicate the location of the seams
|
||||
*/
|
||||
macro('sprinkle', {
|
||||
snippet: 'notch',
|
||||
on: [
|
||||
'leftSideTop',
|
||||
'rightSideTop',
|
||||
'leftFrontTop',
|
||||
'cbTop',
|
||||
'leftSideBottom',
|
||||
'rightSideBottom',
|
||||
'leftFrontBottom',
|
||||
'cbBottom',
|
||||
],
|
||||
})
|
||||
|
||||
/*
|
||||
* Add a grainline indicator
|
||||
*/
|
||||
points.grainlineTop = points.leftFrontTop.shiftFractionTowards(points.leftFrontLoopTop, 0.5)
|
||||
points.grainlineBottom = new Point(points.grainlineTop.x, points.cbBottom.y)
|
||||
macro('grainline', {
|
||||
from: points.grainlineBottom,
|
||||
to: points.grainlineTop,
|
||||
})
|
||||
|
||||
/*
|
||||
* Dimensions
|
||||
*/
|
||||
macro('hd', {
|
||||
id: 'frontLeft',
|
||||
from: points.leftFrontBottom,
|
||||
to: points.leftSideBottom,
|
||||
y: points.cbBottom.y + 15 + sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'backLeft',
|
||||
from: points.leftSideBottom,
|
||||
to: points.cbBottom,
|
||||
y: points.cbBottom.y + 15 + sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'backRight',
|
||||
from: points.cbBottom,
|
||||
to: points.rightSideBottom,
|
||||
y: points.cbBottom.y + 15 + sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'frontRight',
|
||||
from: points.rightSideBottom,
|
||||
to: points.rightFrontBottom,
|
||||
y: points.cbBottom.y + 15 + sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'overlapRight',
|
||||
from: points.rightFrontBottom,
|
||||
to: points.rightEdgeBottom,
|
||||
y: points.cbBottom.y + 15 + sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'leftHalf',
|
||||
from: points.leftFrontBottom,
|
||||
to: points.cbBottom,
|
||||
y: points.cbBottom.y + 30 + sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'rightHalf',
|
||||
from: points.cbBottom,
|
||||
to: points.rightFrontBottom,
|
||||
y: points.cbBottom.y + 30 + sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'fullLength',
|
||||
from: points.leftFrontBottom,
|
||||
to: points.rightEdgeBottom,
|
||||
y: points.cbBottom.y + 45 + sa,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'buttonHeight',
|
||||
from: points.rightEdgeBottom,
|
||||
to: points.button,
|
||||
x: points.rightEdgeBottom.x + 15 + sa,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'buttonHoleHeight',
|
||||
from: points.leftFrontBottom,
|
||||
to: points.buttonhole,
|
||||
x: points.leftFrontBottom.x - sa - 15,
|
||||
})
|
||||
macro('vd', {
|
||||
id: 'fullWidth',
|
||||
from: points.leftFrontBottom,
|
||||
to: points.leftFrontTop,
|
||||
x: points.leftFrontBottom.x - sa - 30,
|
||||
scale: 0.5,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'belLoopLeftFront',
|
||||
from: points.leftFrontTop,
|
||||
to: points.leftFrontLoopTop,
|
||||
y: points.cbTop.y - 30 - sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'beltLoopLeftSide',
|
||||
from: points.leftFrontLoopTop,
|
||||
to: points.leftSideLoopTop,
|
||||
y: points.cbTop.y - 30 - sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'beltLoopLeftBack',
|
||||
from: points.leftSideLoopTop,
|
||||
to: points.leftBackLoopTop,
|
||||
y: points.cbTop.y - 30 - sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'beltLoopLeftCb',
|
||||
from: points.leftBackLoopTop,
|
||||
to: points.cbTop,
|
||||
y: points.cbTop.y - 30 - sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'beltLoopRightCb',
|
||||
from: points.cbTop,
|
||||
to: points.rightBackLoopTop,
|
||||
y: points.cbTop.y - 30 - sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'beltLoopRightBack',
|
||||
from: points.rightBackLoopTop,
|
||||
to: points.rightSideLoopTop,
|
||||
y: points.cbTop.y - 30 - sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'beltLoopRightSide',
|
||||
from: points.rightSideLoopTop,
|
||||
to: points.rightFrontLoopTop,
|
||||
y: points.cbTop.y - 30 - sa,
|
||||
})
|
||||
macro('hd', {
|
||||
id: 'beltLoopRightFront',
|
||||
from: points.rightFrontLoopTop,
|
||||
to: points.rightFrontTop,
|
||||
y: points.cbTop.y - 30 - sa,
|
||||
})
|
||||
|
||||
return part
|
||||
}
|
20
designs/naomiwu/tests/shared.test.mjs
Normal file
20
designs/naomiwu/tests/shared.test.mjs
Normal file
|
@ -0,0 +1,20 @@
|
|||
// This file is auto-generated | Any changes you make will be overwritten.
|
||||
import { Naomiwu, 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(Naomiwu)
|
||||
|
||||
// Test translation
|
||||
testPatternI18n(Naomiwu, i18n)
|
||||
|
||||
// Test drafting - Change the second parameter to `true` to log errors
|
||||
testPatternDrafting(Naomiwu, false)
|
||||
|
||||
// Test sampling - Change the second parameter to `true` to log errors
|
||||
testPatternSampling(Naomiwu, false)
|
26
markdown/org/docs/designs/naomiwu/cutting/de.md
Normal file
26
markdown/org/docs/designs/naomiwu/cutting/de.md
Normal file
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Cutting Instructions"
|
||||
---
|
||||
|
||||
## Oberstoff
|
||||
|
||||
- Part 1 (back): Cut 2 from main fabric
|
||||
- Part 2 (front fly side): Cut 1 from main fabric
|
||||
- Part 3 (front no-fly side): Cut 1 from main fabric
|
||||
- Part 4 (fly shield): Cut 1 from main fabric
|
||||
- Part 6 (front pocket facing): Cut 2 from main fabric
|
||||
- Part 7 (waistband): Cut 1 from main fabric
|
||||
- Part 8 (front attachment): Cut 1 from main fabric
|
||||
- Part 9 (front attachment facing): Cut 1 from main fabric
|
||||
- Part 10 (back pocket): Cut 2 from main fabric
|
||||
- Part 11 (back pocket flap): Cut 2 from main fabric
|
||||
- Part 12 (back attachment back): Cut 1 from main fabric
|
||||
- Part 13 (back attachment front): Cut 1 from main fabric
|
||||
- Part 14 (back attachment flap): Cut 1 from main fabric
|
||||
|
||||
## Lining
|
||||
|
||||
- Part 5 (fly shield): Cut 1 from lining
|
||||
|
||||
<Fixme compact>Write documentation</Fixme>
|
||||
|
26
markdown/org/docs/designs/naomiwu/cutting/en.md
Normal file
26
markdown/org/docs/designs/naomiwu/cutting/en.md
Normal file
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Cutting Instructions"
|
||||
---
|
||||
|
||||
## Main fabric
|
||||
|
||||
- Part 1 (back): Cut 2 from main fabric
|
||||
- Part 2 (front fly side): Cut 1 from main fabric
|
||||
- Part 3 (front no-fly side): Cut 1 from main fabric
|
||||
- Part 4 (fly shield): Cut 1 from main fabric
|
||||
- Part 6 (front pocket facing): Cut 2 from main fabric
|
||||
- Part 7 (waistband): Cut 1 from main fabric
|
||||
- Part 8 (front attachment): Cut 1 from main fabric
|
||||
- Part 9 (front attachment facing): Cut 1 from main fabric
|
||||
- Part 10 (back pocket): Cut 2 from main fabric
|
||||
- Part 11 (back pocket flap): Cut 2 from main fabric
|
||||
- Part 12 (back attachment back): Cut 1 from main fabric
|
||||
- Part 13 (back attachment front): Cut 1 from main fabric
|
||||
- Part 14 (back attachment flap): Cut 1 from main fabric
|
||||
|
||||
## Lining
|
||||
|
||||
- Part 5 (fly shield): Cut 1 from lining
|
||||
|
||||
<Fixme compact>Write documentation</Fixme>
|
||||
|
26
markdown/org/docs/designs/naomiwu/cutting/es.md
Normal file
26
markdown/org/docs/designs/naomiwu/cutting/es.md
Normal file
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Cutting Instructions"
|
||||
---
|
||||
|
||||
## Tela principal
|
||||
|
||||
- Part 1 (back): Cut 2 from main fabric
|
||||
- Part 2 (front fly side): Cut 1 from main fabric
|
||||
- Part 3 (front no-fly side): Cut 1 from main fabric
|
||||
- Part 4 (fly shield): Cut 1 from main fabric
|
||||
- Part 6 (front pocket facing): Cut 2 from main fabric
|
||||
- Part 7 (waistband): Cut 1 from main fabric
|
||||
- Part 8 (front attachment): Cut 1 from main fabric
|
||||
- Part 9 (front attachment facing): Cut 1 from main fabric
|
||||
- Part 10 (back pocket): Cut 2 from main fabric
|
||||
- Part 11 (back pocket flap): Cut 2 from main fabric
|
||||
- Part 12 (back attachment back): Cut 1 from main fabric
|
||||
- Part 13 (back attachment front): Cut 1 from main fabric
|
||||
- Part 14 (back attachment flap): Cut 1 from main fabric
|
||||
|
||||
## Terminal
|
||||
|
||||
- Part 5 (fly shield): Cut 1 from lining
|
||||
|
||||
<Fixme compact>Write documentation</Fixme>
|
||||
|
26
markdown/org/docs/designs/naomiwu/cutting/fr.md
Normal file
26
markdown/org/docs/designs/naomiwu/cutting/fr.md
Normal file
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Cutting Instructions"
|
||||
---
|
||||
|
||||
## Tissu principal
|
||||
|
||||
- Part 1 (back): Cut 2 from main fabric
|
||||
- Part 2 (front fly side): Cut 1 from main fabric
|
||||
- Part 3 (front no-fly side): Cut 1 from main fabric
|
||||
- Part 4 (fly shield): Cut 1 from main fabric
|
||||
- Part 6 (front pocket facing): Cut 2 from main fabric
|
||||
- Part 7 (waistband): Cut 1 from main fabric
|
||||
- Part 8 (front attachment): Cut 1 from main fabric
|
||||
- Part 9 (front attachment facing): Cut 1 from main fabric
|
||||
- Part 10 (back pocket): Cut 2 from main fabric
|
||||
- Part 11 (back pocket flap): Cut 2 from main fabric
|
||||
- Part 12 (back attachment back): Cut 1 from main fabric
|
||||
- Part 13 (back attachment front): Cut 1 from main fabric
|
||||
- Part 14 (back attachment flap): Cut 1 from main fabric
|
||||
|
||||
## Doublure
|
||||
|
||||
- Part 5 (fly shield): Cut 1 from lining
|
||||
|
||||
<Fixme compact>Write documentation</Fixme>
|
||||
|
26
markdown/org/docs/designs/naomiwu/cutting/nl.md
Normal file
26
markdown/org/docs/designs/naomiwu/cutting/nl.md
Normal file
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Cutting Instructions"
|
||||
---
|
||||
|
||||
## Buitenstof
|
||||
|
||||
- Part 1 (back): Cut 2 from main fabric
|
||||
- Part 2 (front fly side): Cut 1 from main fabric
|
||||
- Part 3 (front no-fly side): Cut 1 from main fabric
|
||||
- Part 4 (fly shield): Cut 1 from main fabric
|
||||
- Part 6 (front pocket facing): Cut 2 from main fabric
|
||||
- Part 7 (waistband): Cut 1 from main fabric
|
||||
- Part 8 (front attachment): Cut 1 from main fabric
|
||||
- Part 9 (front attachment facing): Cut 1 from main fabric
|
||||
- Part 10 (back pocket): Cut 2 from main fabric
|
||||
- Part 11 (back pocket flap): Cut 2 from main fabric
|
||||
- Part 12 (back attachment back): Cut 1 from main fabric
|
||||
- Part 13 (back attachment front): Cut 1 from main fabric
|
||||
- Part 14 (back attachment flap): Cut 1 from main fabric
|
||||
|
||||
## Voering
|
||||
|
||||
- Part 5 (fly shield): Cut 1 from lining
|
||||
|
||||
<Fixme compact>Write documentation</Fixme>
|
||||
|
26
markdown/org/docs/designs/naomiwu/cutting/uk.md
Normal file
26
markdown/org/docs/designs/naomiwu/cutting/uk.md
Normal file
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Cutting Instructions"
|
||||
---
|
||||
|
||||
## Основна тканина
|
||||
|
||||
- Part 1 (back): Cut 2 from main fabric
|
||||
- Part 2 (front fly side): Cut 1 from main fabric
|
||||
- Part 3 (front no-fly side): Cut 1 from main fabric
|
||||
- Part 4 (fly shield): Cut 1 from main fabric
|
||||
- Part 6 (front pocket facing): Cut 2 from main fabric
|
||||
- Part 7 (waistband): Cut 1 from main fabric
|
||||
- Part 8 (front attachment): Cut 1 from main fabric
|
||||
- Part 9 (front attachment facing): Cut 1 from main fabric
|
||||
- Part 10 (back pocket): Cut 2 from main fabric
|
||||
- Part 11 (back pocket flap): Cut 2 from main fabric
|
||||
- Part 12 (back attachment back): Cut 1 from main fabric
|
||||
- Part 13 (back attachment front): Cut 1 from main fabric
|
||||
- Part 14 (back attachment flap): Cut 1 from main fabric
|
||||
|
||||
## Підкладка
|
||||
|
||||
- Part 5 (fly shield): Cut 1 from lining
|
||||
|
||||
<Fixme compact>Write documentation</Fixme>
|
||||
|
5
markdown/org/docs/designs/naomiwu/de.md
Normal file
5
markdown/org/docs/designs/naomiwu/de.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt"
|
||||
---
|
||||
|
||||
<PatternDocs pattern='naomiwu' />
|
8
markdown/org/docs/designs/naomiwu/en.md
Normal file
8
markdown/org/docs/designs/naomiwu/en.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt"
|
||||
---
|
||||
|
||||
import { DesignInfo } from 'shared/components/designs/info.mjs'
|
||||
|
||||
<DesignInfo design='naomiwu' docs />
|
||||
|
5
markdown/org/docs/designs/naomiwu/es.md
Normal file
5
markdown/org/docs/designs/naomiwu/es.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt"
|
||||
---
|
||||
|
||||
<PatternDocs pattern='naomiwu' />
|
10
markdown/org/docs/designs/naomiwu/fabric/de.md
Normal file
10
markdown/org/docs/designs/naomiwu/fabric/de.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Fabric Options"
|
||||
---
|
||||
|
||||
A cargo skirt is work wear, so you want to go with fabric that can stand the wear and tear of screwdrivers being wiped clean on them, nuts and bolds rattling around in its pockets.
|
||||
|
||||
While there's plenty of choice in synthetic fibers, I would recommend a heavy-weight cotton or canvas. You also can't go wrong with what has been the de-facto standard for heavy duty workwear for many years: denim.
|
||||
|
||||
However, avoid any hint of stretchy fibers. You want zero stretch. This baby should not start sagging as you load it with cargo.
|
||||
|
15
markdown/org/docs/designs/naomiwu/fabric/en.md
Normal file
15
markdown/org/docs/designs/naomiwu/fabric/en.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Fabric Options"
|
||||
---
|
||||
|
||||
A cargo skirt is work wear, so you want to go with fabric that can stand the
|
||||
wear and tear of screwdrivers being wiped clean on them, nuts and bolds
|
||||
rattling around in its pockets.
|
||||
|
||||
While there's plenty of choice in synthetic fibers, I would recommend a
|
||||
heavy-weight cotton or canvas. You also can't go wrong with what has been the
|
||||
de-facto standard for heavy duty workwear for many years: denim.
|
||||
|
||||
However, avoid any hint of stretchy fibers. You want zero stretch. This baby
|
||||
should not start sagging as you load it with cargo.
|
||||
|
10
markdown/org/docs/designs/naomiwu/fabric/es.md
Normal file
10
markdown/org/docs/designs/naomiwu/fabric/es.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Fabric Options"
|
||||
---
|
||||
|
||||
A cargo skirt is work wear, so you want to go with fabric that can stand the wear and tear of screwdrivers being wiped clean on them, nuts and bolds rattling around in its pockets.
|
||||
|
||||
While there's plenty of choice in synthetic fibers, I would recommend a heavy-weight cotton or canvas. You also can't go wrong with what has been the de-facto standard for heavy duty workwear for many years: denim.
|
||||
|
||||
However, avoid any hint of stretchy fibers. You want zero stretch. This baby should not start sagging as you load it with cargo.
|
||||
|
10
markdown/org/docs/designs/naomiwu/fabric/fr.md
Normal file
10
markdown/org/docs/designs/naomiwu/fabric/fr.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Fabric Options"
|
||||
---
|
||||
|
||||
A cargo skirt is work wear, so you want to go with fabric that can stand the wear and tear of screwdrivers being wiped clean on them, nuts and bolds rattling around in its pockets.
|
||||
|
||||
While there's plenty of choice in synthetic fibers, I would recommend a heavy-weight cotton or canvas. You also can't go wrong with what has been the de-facto standard for heavy duty workwear for many years: denim.
|
||||
|
||||
However, avoid any hint of stretchy fibers. You want zero stretch. This baby should not start sagging as you load it with cargo.
|
||||
|
10
markdown/org/docs/designs/naomiwu/fabric/nl.md
Normal file
10
markdown/org/docs/designs/naomiwu/fabric/nl.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Fabric Options"
|
||||
---
|
||||
|
||||
A cargo skirt is work wear, so you want to go with fabric that can stand the wear and tear of screwdrivers being wiped clean on them, nuts and bolds rattling around in its pockets.
|
||||
|
||||
While there's plenty of choice in synthetic fibers, I would recommend a heavy-weight cotton or canvas. You also can't go wrong with what has been the de-facto standard for heavy duty workwear for many years: denim.
|
||||
|
||||
However, avoid any hint of stretchy fibers. You want zero stretch. This baby should not start sagging as you load it with cargo.
|
||||
|
10
markdown/org/docs/designs/naomiwu/fabric/uk.md
Normal file
10
markdown/org/docs/designs/naomiwu/fabric/uk.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Fabric Options"
|
||||
---
|
||||
|
||||
A cargo skirt is work wear, so you want to go with fabric that can stand the wear and tear of screwdrivers being wiped clean on them, nuts and bolds rattling around in its pockets.
|
||||
|
||||
While there's plenty of choice in synthetic fibers, I would recommend a heavy-weight cotton or canvas. You also can't go wrong with what has been the de-facto standard for heavy duty workwear for many years: denim.
|
||||
|
||||
However, avoid any hint of stretchy fibers. You want zero stretch. This baby should not start sagging as you load it with cargo.
|
||||
|
5
markdown/org/docs/designs/naomiwu/fr.md
Normal file
5
markdown/org/docs/designs/naomiwu/fr.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt"
|
||||
---
|
||||
|
||||
<PatternDocs pattern='naomiwu' />
|
5
markdown/org/docs/designs/naomiwu/instructions/de.md
Normal file
5
markdown/org/docs/designs/naomiwu/instructions/de.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Sewing Instructions"
|
||||
---
|
||||
|
||||
<Fixme compact> Write these </Fixme>
|
5
markdown/org/docs/designs/naomiwu/instructions/en.md
Normal file
5
markdown/org/docs/designs/naomiwu/instructions/en.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Sewing Instructions"
|
||||
---
|
||||
|
||||
<Fixme compact> Write these </Fixme>
|
5
markdown/org/docs/designs/naomiwu/instructions/es.md
Normal file
5
markdown/org/docs/designs/naomiwu/instructions/es.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Sewing Instructions"
|
||||
---
|
||||
|
||||
<Fixme compact> Write these </Fixme>
|
5
markdown/org/docs/designs/naomiwu/instructions/fr.md
Normal file
5
markdown/org/docs/designs/naomiwu/instructions/fr.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Sewing Instructions"
|
||||
---
|
||||
|
||||
<Fixme compact> Write these </Fixme>
|
5
markdown/org/docs/designs/naomiwu/instructions/nl.md
Normal file
5
markdown/org/docs/designs/naomiwu/instructions/nl.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Sewing Instructions"
|
||||
---
|
||||
|
||||
<Fixme compact> Write these </Fixme>
|
5
markdown/org/docs/designs/naomiwu/instructions/uk.md
Normal file
5
markdown/org/docs/designs/naomiwu/instructions/uk.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Sewing Instructions"
|
||||
---
|
||||
|
||||
<Fixme compact> Write these </Fixme>
|
5
markdown/org/docs/designs/naomiwu/measurements/de.md
Normal file
5
markdown/org/docs/designs/naomiwu/measurements/de.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Required Measurements"
|
||||
---
|
||||
|
||||
<PatternMeasurements pattern='naomiwu' />
|
5
markdown/org/docs/designs/naomiwu/measurements/en.md
Normal file
5
markdown/org/docs/designs/naomiwu/measurements/en.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Required Measurements"
|
||||
---
|
||||
|
||||
<PatternMeasurements pattern='naomiwu' />
|
5
markdown/org/docs/designs/naomiwu/measurements/es.md
Normal file
5
markdown/org/docs/designs/naomiwu/measurements/es.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Required Measurements"
|
||||
---
|
||||
|
||||
<PatternMeasurements pattern='naomiwu' />
|
5
markdown/org/docs/designs/naomiwu/measurements/fr.md
Normal file
5
markdown/org/docs/designs/naomiwu/measurements/fr.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Required Measurements"
|
||||
---
|
||||
|
||||
<PatternMeasurements pattern='naomiwu' />
|
5
markdown/org/docs/designs/naomiwu/measurements/nl.md
Normal file
5
markdown/org/docs/designs/naomiwu/measurements/nl.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Required Measurements"
|
||||
---
|
||||
|
||||
<PatternMeasurements pattern='naomiwu' />
|
5
markdown/org/docs/designs/naomiwu/measurements/uk.md
Normal file
5
markdown/org/docs/designs/naomiwu/measurements/uk.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Required Measurements"
|
||||
---
|
||||
|
||||
<PatternMeasurements pattern='naomiwu' />
|
23
markdown/org/docs/designs/naomiwu/needs/de.md
Normal file
23
markdown/org/docs/designs/naomiwu/needs/de.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: What You Need"
|
||||
---
|
||||
|
||||
To make Naomi Wu's signature cargo skirt, you will need the following:
|
||||
|
||||
- [Grundlegendes Nähzubehör](/docs/sewing/basic-sewing-supplies)
|
||||
- Etwa 0.75 cm (0.8") eines geeigneten Stoffes ([siehe Stoffoptionen](/docs/patterns/naomiwu/fabric))
|
||||
- About 0.20 meters (0.25 yards) of a suitable lining fabric ([see Fabric options](/docs/patterns/naomiwu/fabric))
|
||||
- A zipper
|
||||
- A snap button (both stuf and socket)
|
||||
- About 5 centimeter (2 inches) velcro strip (both sides)
|
||||
- About 0.50 meters (20 inches) of strong ribbon (about 2cm/1inch wide)
|
||||
- A D-ring to match the ribbon
|
||||
- About 0.40 (16 inches) of waistband elastic
|
||||
|
||||
<Note>
|
||||
|
||||
These are estimates. Real requirements will vary based on your sizing.
|
||||
|
||||
Refer to the designer messages or paperless view for more detailed dimensions.
|
||||
|
||||
</Note>
|
23
markdown/org/docs/designs/naomiwu/needs/en.md
Normal file
23
markdown/org/docs/designs/naomiwu/needs/en.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: What You Need"
|
||||
---
|
||||
|
||||
To make Naomi Wu's signature cargo skirt, you will need the following:
|
||||
|
||||
- [Basic sewing supplies](/docs/sewing/basic-sewing-supplies)
|
||||
- About 0.75 meters (0.8 yards) of a suitable fabric ([see Fabric options](/docs/patterns/naomiwu/fabric))
|
||||
- About 0.20 meters (0.25 yards) of a suitable lining fabric ([see Fabric options](/docs/patterns/naomiwu/fabric))
|
||||
- A zipper
|
||||
- A snap button (both stuf and socket)
|
||||
- About 5 centimeter (2 inches) velcro strip (both sides)
|
||||
- About 0.50 meters (20 inches) of strong ribbon (about 2cm/1inch wide)
|
||||
- A D-ring to match the ribbon
|
||||
- About 0.40 (16 inches) of waistband elastic
|
||||
|
||||
<Note>
|
||||
|
||||
These are estimates. Real requirements will vary based on your sizing.
|
||||
|
||||
Refer to the designer messages or paperless view for more detailed dimensions.
|
||||
|
||||
</Note>
|
23
markdown/org/docs/designs/naomiwu/needs/es.md
Normal file
23
markdown/org/docs/designs/naomiwu/needs/es.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: What You Need"
|
||||
---
|
||||
|
||||
To make Naomi Wu's signature cargo skirt, you will need the following:
|
||||
|
||||
- [Suministros básicos de costura](/docs/sewing/basic-sewing-supplies)
|
||||
- Unos 0,75 metros (0,8 yardas) de una tela adecuada ([ver Opciones de tela](/docs/patterns/naomiwu/fabric))
|
||||
- About 0.20 meters (0.25 yards) of a suitable lining fabric ([see Fabric options](/docs/patterns/naomiwu/fabric))
|
||||
- A zipper
|
||||
- A snap button (both stuf and socket)
|
||||
- About 5 centimeter (2 inches) velcro strip (both sides)
|
||||
- About 0.50 meters (20 inches) of strong ribbon (about 2cm/1inch wide)
|
||||
- A D-ring to match the ribbon
|
||||
- About 0.40 (16 inches) of waistband elastic
|
||||
|
||||
<Note>
|
||||
|
||||
These are estimates. Real requirements will vary based on your sizing.
|
||||
|
||||
Refer to the designer messages or paperless view for more detailed dimensions.
|
||||
|
||||
</Note>
|
23
markdown/org/docs/designs/naomiwu/needs/fr.md
Normal file
23
markdown/org/docs/designs/naomiwu/needs/fr.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: What You Need"
|
||||
---
|
||||
|
||||
To make Naomi Wu's signature cargo skirt, you will need the following:
|
||||
|
||||
- [Fourniture de base pour la couture](/docs/sewing/basic-sewing-supplies)
|
||||
- Environ 0.75 mètre (0.8 yard) d'un tissu adapté ([voir Options de tissu](/docs/patterns/naomiwu/fabric))
|
||||
- About 0.20 meters (0.25 yards) of a suitable lining fabric ([see Fabric options](/docs/patterns/naomiwu/fabric))
|
||||
- A zipper
|
||||
- A snap button (both stuf and socket)
|
||||
- About 5 centimeter (2 inches) velcro strip (both sides)
|
||||
- About 0.50 meters (20 inches) of strong ribbon (about 2cm/1inch wide)
|
||||
- A D-ring to match the ribbon
|
||||
- About 0.40 (16 inches) of waistband elastic
|
||||
|
||||
<Note>
|
||||
|
||||
These are estimates. Real requirements will vary based on your sizing.
|
||||
|
||||
Refer to the designer messages or paperless view for more detailed dimensions.
|
||||
|
||||
</Note>
|
23
markdown/org/docs/designs/naomiwu/needs/nl.md
Normal file
23
markdown/org/docs/designs/naomiwu/needs/nl.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: What You Need"
|
||||
---
|
||||
|
||||
To make Naomi Wu's signature cargo skirt, you will need the following:
|
||||
|
||||
- [Basis naaimateriaal](/docs/sewing/basic-sewing-supplies)
|
||||
- Ongeveer 0,75 meter van een geschikte stof ([zie Stofopties](/docs/patterns/naomiwu/fabric))
|
||||
- About 0.20 meters (0.25 yards) of a suitable lining fabric ([see Fabric options](/docs/patterns/naomiwu/fabric))
|
||||
- A zipper
|
||||
- A snap button (both stuf and socket)
|
||||
- About 5 centimeter (2 inches) velcro strip (both sides)
|
||||
- About 0.50 meters (20 inches) of strong ribbon (about 2cm/1inch wide)
|
||||
- A D-ring to match the ribbon
|
||||
- About 0.40 (16 inches) of waistband elastic
|
||||
|
||||
<Note>
|
||||
|
||||
These are estimates. Real requirements will vary based on your sizing.
|
||||
|
||||
Refer to the designer messages or paperless view for more detailed dimensions.
|
||||
|
||||
</Note>
|
23
markdown/org/docs/designs/naomiwu/needs/uk.md
Normal file
23
markdown/org/docs/designs/naomiwu/needs/uk.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: What You Need"
|
||||
---
|
||||
|
||||
To make Naomi Wu's signature cargo skirt, you will need the following:
|
||||
|
||||
- [Базові матеріали для шиття](/docs/sewing/basic-sewing-supplies)
|
||||
- Приблизно 0,75 метра (0,8 ярдів) відповідної тканини ([див. варіанти тканини](/docs/patterns/naomiwu/fabric))
|
||||
- About 0.20 meters (0.25 yards) of a suitable lining fabric ([see Fabric options](/docs/patterns/naomiwu/fabric))
|
||||
- A zipper
|
||||
- A snap button (both stuf and socket)
|
||||
- About 5 centimeter (2 inches) velcro strip (both sides)
|
||||
- About 0.50 meters (20 inches) of strong ribbon (about 2cm/1inch wide)
|
||||
- A D-ring to match the ribbon
|
||||
- About 0.40 (16 inches) of waistband elastic
|
||||
|
||||
<Note>
|
||||
|
||||
These are estimates. Real requirements will vary based on your sizing.
|
||||
|
||||
Refer to the designer messages or paperless view for more detailed dimensions.
|
||||
|
||||
</Note>
|
5
markdown/org/docs/designs/naomiwu/nl.md
Normal file
5
markdown/org/docs/designs/naomiwu/nl.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt"
|
||||
---
|
||||
|
||||
<PatternDocs pattern='naomiwu' />
|
61
markdown/org/docs/designs/naomiwu/notes/en.md
Normal file
61
markdown/org/docs/designs/naomiwu/notes/en.md
Normal file
|
@ -0,0 +1,61 @@
|
|||
---
|
||||
title: "Naomi Wu Cargo Skirt: Designer Notes"
|
||||
---
|
||||
|
||||
As these are the *designer notes* I first want to clear up any
|
||||
misunderstanding: I am not the designer of this skirt. Naomi Wu is.
|
||||
I merely wrote the code to implement this as a FreeSewing design, and worked
|
||||
with Naomi to ensure that said code represents her vision for the design.
|
||||
|
||||
I've collaborated with others before to bring a design to fruition, but that
|
||||
was typically with friends or people from the FreeSewing community, and my role
|
||||
in that collaboration was always much bigger. This was my first time
|
||||
working with a bona-fide celebrity, in addition to being someone I find hugely
|
||||
inspiring and have a ton of respect for. If I'm being honest, I was really
|
||||
nervous about this.
|
||||
|
||||
The process was also different from other collaborations which typically start
|
||||
with an idea that we then try to implement together. Here, everything was
|
||||
already done. Naomi already had the skirt and done all the work. The reason I
|
||||
came on board is because she wanted to offer it in a size-inclusive range. In
|
||||
other words, it was my job to make her design parametric.
|
||||
|
||||
So one day in the spring of 2023, a package arrived on my doorstep all the way
|
||||
from China. Inside it was Naomi Wu's very own cargo skirt. A veritable
|
||||
smorgasbord of storage options in which even the pockets have pockets.
|
||||
|
||||
It was a lot more elaborate than I anticipated, but somehow also very practical.
|
||||
It dawned on me as I was working on this that I should make one of these for
|
||||
myself because I always misplace tools when I'm working on something. This is
|
||||
like a tool chest that you can wear. Only better organized.
|
||||
|
||||
At Naomi's explicit request, I made the fronts reversible so they can me more
|
||||
female or male presenting as you see fit (with the zipper being on this or that
|
||||
side having certain significance towards gender-expression), and I added an
|
||||
option to slope the waistband which will benefit more curvy people.
|
||||
|
||||
In the end, you get what it says on the tin: Naomi Wu's cargo skirt. Or at
|
||||
least the close as you can get to the original item that landed on my doorstep
|
||||
that fateful day.
|
||||
|
||||
I want to thank Naomi Wu for trusting FreeSewing -- and myself -- with her plans
|
||||
to offer her skirt design as open source. I think it's a big deal for FreeSewing
|
||||
to get this kind of recognition, and I know it was a big deal for me personally.
|
||||
|
||||
joost
|
||||
|
||||
<Note>
|
||||
|
||||
##### Naomi Who?
|
||||
|
||||
[Naomi Wu](https://en.wikipedia.org/wiki/Naomi_Wu), also known by her online pseudonym *SexyCyborg* is a Chinese tech & DIY girl from Shenzhen, China.
|
||||
She is known for her signature style blending DIY, electronics, and fashion, and has proven to be a
|
||||
relentless advocate for women in STEM and LGBTQ rights.
|
||||
|
||||
Despite all prejudice and setbacks due to her gender expression, she managed to grow a large online audience, become a minor celebrity in the 3D-printers community, and at one point single-handedly compelled Chinese companies to take GPL-violations serious. As further testament to her status as a famous maker, she graced the cover of Make magazine in 2018.
|
||||
|
||||
As an outspoken Chinese citizen with a tendency for telling it like it is, and a large international following, Noami drew the heat, and in the summer of 2023 the Chinese government de-facto silenced her. Ever since, her [Twitter](https://twitter.com/realsexycyborg) and [Instagram](https://www.instagram.com/reallysexycyborg/) accounts, and [YouTube channel](
|
||||
www.youtube.com/c/SexyCyborg) have fallen silent. Although [her online shop remains available](https://cybernightmarket.com/).
|
||||
|
||||
</Note>
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: "Back attachment depth"
|
||||
---
|
||||
|
||||
This option controls the depth of the back attachment.
|
||||
|
||||
The back attachment is like a pocket that is only attached at the waist. It is a common feature on workwear as it allows greater mobility. An attachment like this exists because it's not so easy to bend over when there's a big wrench in your pocket.
|
||||
|
||||
This option controls the depth of the back attachment.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Back attachment depth"
|
||||
---
|
||||
|
||||
This option controls the depth of the back attachment.
|
||||
|
||||
The back attachment is like a pocket that is only attached at the waist. It is a common feature on workwear as it allows greater mobility.
|
||||
An attachment like this exists because it's not so easy to bend over when there's a big wrench in your pocket.
|
||||
|
||||
This option controls the depth of the back attachment.
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: "Back attachment depth"
|
||||
---
|
||||
|
||||
This option controls the depth of the back attachment.
|
||||
|
||||
The back attachment is like a pocket that is only attached at the waist. It is a common feature on workwear as it allows greater mobility. An attachment like this exists because it's not so easy to bend over when there's a big wrench in your pocket.
|
||||
|
||||
This option controls the depth of the back attachment.
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: "Back attachment depth"
|
||||
---
|
||||
|
||||
This option controls the depth of the back attachment.
|
||||
|
||||
The back attachment is like a pocket that is only attached at the waist. It is a common feature on workwear as it allows greater mobility. An attachment like this exists because it's not so easy to bend over when there's a big wrench in your pocket.
|
||||
|
||||
This option controls the depth of the back attachment.
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: "Back attachment depth"
|
||||
---
|
||||
|
||||
This option controls the depth of the back attachment.
|
||||
|
||||
The back attachment is like a pocket that is only attached at the waist. It is a common feature on workwear as it allows greater mobility. An attachment like this exists because it's not so easy to bend over when there's a big wrench in your pocket.
|
||||
|
||||
This option controls the depth of the back attachment.
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: "Back attachment depth"
|
||||
---
|
||||
|
||||
This option controls the depth of the back attachment.
|
||||
|
||||
The back attachment is like a pocket that is only attached at the waist. It is a common feature on workwear as it allows greater mobility. An attachment like this exists because it's not so easy to bend over when there's a big wrench in your pocket.
|
||||
|
||||
This option controls the depth of the back attachment.
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
title: "Back attachment flap chamfer size"
|
||||
---
|
||||
|
||||
This option controls the chamfer size of the back attachment flap.
|
||||
|
||||
This option has no effect whatsoever on fit or functionality. It is mostly aesthetic.
|
||||
|
||||
<Note>
|
||||
|
||||
A [chamfer](https://en.wikipedia.org/wiki/Chamfer) is a term borrowed from the machining world to describe the process of softening a sharp 90° angle into two consecutive 45° angles.
|
||||
|
||||
</Note>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
title: "Back attachment flap chamfer size"
|
||||
---
|
||||
|
||||
This option controls the chamfer size of the back attachment flap.
|
||||
|
||||
This option has no effect whatsoever on fit or functionality. It is mostly aesthetic.
|
||||
|
||||
<Note>
|
||||
|
||||
A [chamfer](https://en.wikipedia.org/wiki/Chamfer) is a term borrowed from the machining world to describe the process of softening a sharp 90° angle into two consecutive 45° angles.
|
||||
|
||||
</Note>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
title: "Back attachment flap chamfer size"
|
||||
---
|
||||
|
||||
This option controls the chamfer size of the back attachment flap.
|
||||
|
||||
This option has no effect whatsoever on fit or functionality. It is mostly aesthetic.
|
||||
|
||||
<Note>
|
||||
|
||||
A [chamfer](https://en.wikipedia.org/wiki/Chamfer) is a term borrowed from the machining world to describe the process of softening a sharp 90° angle into two consecutive 45° angles.
|
||||
|
||||
</Note>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
title: "Back attachment flap chamfer size"
|
||||
---
|
||||
|
||||
This option controls the chamfer size of the back attachment flap.
|
||||
|
||||
This option has no effect whatsoever on fit or functionality. It is mostly aesthetic.
|
||||
|
||||
<Note>
|
||||
|
||||
A [chamfer](https://en.wikipedia.org/wiki/Chamfer) is a term borrowed from the machining world to describe the process of softening a sharp 90° angle into two consecutive 45° angles.
|
||||
|
||||
</Note>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
title: "Back attachment flap chamfer size"
|
||||
---
|
||||
|
||||
This option controls the chamfer size of the back attachment flap.
|
||||
|
||||
This option has no effect whatsoever on fit or functionality. It is mostly aesthetic.
|
||||
|
||||
<Note>
|
||||
|
||||
A [chamfer](https://en.wikipedia.org/wiki/Chamfer) is a term borrowed from the machining world to describe the process of softening a sharp 90° angle into two consecutive 45° angles.
|
||||
|
||||
</Note>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
title: "Back attachment flap chamfer size"
|
||||
---
|
||||
|
||||
This option controls the chamfer size of the back attachment flap.
|
||||
|
||||
This option has no effect whatsoever on fit or functionality. It is mostly aesthetic.
|
||||
|
||||
<Note>
|
||||
|
||||
A [chamfer](https://en.wikipedia.org/wiki/Chamfer) is a term borrowed from the machining world to describe the process of softening a sharp 90° angle into two consecutive 45° angles.
|
||||
|
||||
</Note>
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Back attachment width"
|
||||
---
|
||||
|
||||
This option controls the width of the back attachment.
|
||||
|
||||
The back attachment is like a pocket that is only attached at the waist. It is a common feature on workwear as it allows greater mobility. An attachment like this exists because it's not so easy to bend over when there's a big wrench in your pocket.
|
||||
|
||||
If the back attachment gets too wide to fit between the belt loops, the pattern will warn you about this as it complicates construction.
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Back attachment width"
|
||||
---
|
||||
|
||||
This option controls the width of the back attachment.
|
||||
|
||||
The back attachment is like a pocket that is only attached at the waist. It is a common feature on workwear as it allows greater mobility.
|
||||
An attachment like this exists because it's not so easy to bend over when there's a big wrench in your pocket.
|
||||
|
||||
If the back attachment gets too wide to fit between the belt loops, the pattern will warn you about this as it complicates construction.
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Back attachment width"
|
||||
---
|
||||
|
||||
This option controls the width of the back attachment.
|
||||
|
||||
The back attachment is like a pocket that is only attached at the waist. It is a common feature on workwear as it allows greater mobility. An attachment like this exists because it's not so easy to bend over when there's a big wrench in your pocket.
|
||||
|
||||
If the back attachment gets too wide to fit between the belt loops, the pattern will warn you about this as it complicates construction.
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Back attachment width"
|
||||
---
|
||||
|
||||
This option controls the width of the back attachment.
|
||||
|
||||
The back attachment is like a pocket that is only attached at the waist. It is a common feature on workwear as it allows greater mobility. An attachment like this exists because it's not so easy to bend over when there's a big wrench in your pocket.
|
||||
|
||||
If the back attachment gets too wide to fit between the belt loops, the pattern will warn you about this as it complicates construction.
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Back attachment width"
|
||||
---
|
||||
|
||||
This option controls the width of the back attachment.
|
||||
|
||||
The back attachment is like a pocket that is only attached at the waist. It is a common feature on workwear as it allows greater mobility. An attachment like this exists because it's not so easy to bend over when there's a big wrench in your pocket.
|
||||
|
||||
If the back attachment gets too wide to fit between the belt loops, the pattern will warn you about this as it complicates construction.
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Back attachment width"
|
||||
---
|
||||
|
||||
This option controls the width of the back attachment.
|
||||
|
||||
The back attachment is like a pocket that is only attached at the waist. It is a common feature on workwear as it allows greater mobility. An attachment like this exists because it's not so easy to bend over when there's a big wrench in your pocket.
|
||||
|
||||
If the back attachment gets too wide to fit between the belt loops, the pattern will warn you about this as it complicates construction.
|
||||
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
title: "Back pocket chamfer size"
|
||||
---
|
||||
|
||||
This option controls the chamfer size at the bottom of the back pocket.
|
||||
|
||||
A back pocket with chamfered corners at the bottom help to avoid small items getting lost in the corners of your pockets.
|
||||
|
||||
<Note>
|
||||
|
||||
A [chamfer](https://en.wikipedia.org/wiki/Chamfer) is a term borrowed from the machining world to describe the process of softening a sharp 90° angle into two consecutive 45° angles.
|
||||
|
||||
</Note>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
title: "Back pocket chamfer size"
|
||||
---
|
||||
|
||||
This option controls the chamfer size at the bottom of the back pocket.
|
||||
|
||||
A back pocket with chamfered corners at the bottom help to avoid small items getting lost in the corners of your pockets.
|
||||
|
||||
<Note>
|
||||
|
||||
A [chamfer](https://en.wikipedia.org/wiki/Chamfer) is a term borrowed from the machining world to describe the process of softening a sharp 90° angle into two consecutive 45° angles.
|
||||
|
||||
</Note>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
title: "Back pocket chamfer size"
|
||||
---
|
||||
|
||||
This option controls the chamfer size at the bottom of the back pocket.
|
||||
|
||||
A back pocket with chamfered corners at the bottom help to avoid small items getting lost in the corners of your pockets.
|
||||
|
||||
<Note>
|
||||
|
||||
A [chamfer](https://en.wikipedia.org/wiki/Chamfer) is a term borrowed from the machining world to describe the process of softening a sharp 90° angle into two consecutive 45° angles.
|
||||
|
||||
</Note>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
title: "Back pocket chamfer size"
|
||||
---
|
||||
|
||||
This option controls the chamfer size at the bottom of the back pocket.
|
||||
|
||||
A back pocket with chamfered corners at the bottom help to avoid small items getting lost in the corners of your pockets.
|
||||
|
||||
<Note>
|
||||
|
||||
A [chamfer](https://en.wikipedia.org/wiki/Chamfer) is a term borrowed from the machining world to describe the process of softening a sharp 90° angle into two consecutive 45° angles.
|
||||
|
||||
</Note>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
title: "Back pocket chamfer size"
|
||||
---
|
||||
|
||||
This option controls the chamfer size at the bottom of the back pocket.
|
||||
|
||||
A back pocket with chamfered corners at the bottom help to avoid small items getting lost in the corners of your pockets.
|
||||
|
||||
<Note>
|
||||
|
||||
A [chamfer](https://en.wikipedia.org/wiki/Chamfer) is a term borrowed from the machining world to describe the process of softening a sharp 90° angle into two consecutive 45° angles.
|
||||
|
||||
</Note>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
title: "Back pocket chamfer size"
|
||||
---
|
||||
|
||||
This option controls the chamfer size at the bottom of the back pocket.
|
||||
|
||||
A back pocket with chamfered corners at the bottom help to avoid small items getting lost in the corners of your pockets.
|
||||
|
||||
<Note>
|
||||
|
||||
A [chamfer](https://en.wikipedia.org/wiki/Chamfer) is a term borrowed from the machining world to describe the process of softening a sharp 90° angle into two consecutive 45° angles.
|
||||
|
||||
</Note>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
title: "Tiefe der hinteren Tasche"
|
||||
---
|
||||
|
||||
This option controls the depth of the back pocket.
|
||||
|
||||
Deeper pockets can hold more stuff. But are harder to get to the bottom off.
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
title: "Back pocket depth"
|
||||
---
|
||||
|
||||
This option controls the depth of the back pocket.
|
||||
|
||||
Deeper pockets can hold more stuff. But are harder to get to the bottom off.
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
title: "Profundidad del bolsillo trasero"
|
||||
---
|
||||
|
||||
This option controls the depth of the back pocket.
|
||||
|
||||
Deeper pockets can hold more stuff. But are harder to get to the bottom off.
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
title: "Profondeur de la poche arrière"
|
||||
---
|
||||
|
||||
This option controls the depth of the back pocket.
|
||||
|
||||
Deeper pockets can hold more stuff. But are harder to get to the bottom off.
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
title: "Diepte achterzak"
|
||||
---
|
||||
|
||||
This option controls the depth of the back pocket.
|
||||
|
||||
Deeper pockets can hold more stuff. But are harder to get to the bottom off.
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
title: "Глибина задньої кишені"
|
||||
---
|
||||
|
||||
This option controls the depth of the back pocket.
|
||||
|
||||
Deeper pockets can hold more stuff. But are harder to get to the bottom off.
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
title: "Belt loop width"
|
||||
---
|
||||
|
||||
This option controls the width of the belt loops.
|
||||
|
||||
Wider belt loops are stronger, although this skirt already uses a extra-wide beltloop for the center back, which is the beltloop that typically gets the most strain.
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue