1
0
Fork 0

Merge pull request #5084 from freesewing/skully

[skully]: Update for v3 improvements #5068
This commit is contained in:
Joost De Cock 2023-10-12 08:44:40 +02:00 committed by GitHub
commit 059cf70fc6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
45 changed files with 3349 additions and 1 deletions

View file

@ -330,7 +330,7 @@
"design": "Wouter Van Wageningen", "design": "Wouter Van Wageningen",
"difficulty": 3, "difficulty": 3,
"tags": ["blocks", "tops"], "tags": ["blocks", "tops"],
"techniques": ["curvedSeam", "precision", "princessSeam"] "techniques": ["block", "curvedSeam", "precision", "princessSeam"]
}, },
"octoplushy": { "octoplushy": {
"lab": true, "lab": true,
@ -414,6 +414,14 @@
"tags": ["tops"], "tags": ["tops"],
"techniques": ["hem", "button", "interfacing", "curvedSeam", "flatFelledSeam", "flatSleeve"] "techniques": ["hem", "button", "interfacing", "curvedSeam", "flatFelledSeam", "flatSleeve"]
}, },
"skully": {
"description": "A FreeSewing pattern for skully, our logo, a plushy toy",
"code": "Wouter Van Wageningen",
"design": "Wouter Van Wageningen",
"difficulty": 4,
"tags": ["accessories", "toys"],
"techniques": ["curvedSeam", "precision"]
},
"sven": { "sven": {
"lab": true, "lab": true,
"org": true, "org": true,

View file

@ -0,0 +1,9 @@
# Change log for: @freesewing/skully
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.

297
designs/skully/README.md Normal file
View file

@ -0,0 +1,297 @@
![FreeSewing](https://static.freesewing.org/banner.png)
<p align='center'><a
href="https://www.npmjs.com/package/@freesewing/skully"
title="@freesewing/skully on NPM"
><img src="https://img.shields.io/npm/v/@freesewing/skully.svg"
alt="@freesewing/skully on NPM"/>
</a><a
href="https://opensource.org/licenses/MIT"
title="License: MIT"
><img src="https://img.shields.io/npm/l/@freesewing/skully.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%3Askully"
title="Open issues tagged pkg:skully"
><img src="https://img.shields.io/github/issues/freesewing/freesewing/pkg:skully.svg?label=Issues"
alt="Open issues tagged pkg:skully"/>
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-105-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/skully
A FreeSewing pattern for skully, our logo, a plushy toy
> #### 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/skully
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:
>
> [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](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/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>
<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>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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/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>
<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/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>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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>
<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/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>
</tr>
<tr>
<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>
<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://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>
</tr>
<tr>
<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>
<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/skully/build.mjs Normal file
View 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/skully/data.mjs Normal file
View file

@ -0,0 +1,4 @@
// This file is auto-generated | All changes you make will be overwritten.
export const name = '@freesewing/skully'
export const version = '3.0.0-alpha.8'
export const data = { name, version }

View file

@ -0,0 +1,38 @@
{
"t": "Skully logo plush toy",
"d": "A FreeSewing pattern for skully, our logo, a plushy toy.",
"p": {
"cheek": "Cheek",
"cheekbone": "Cheekbone",
"eye": "Eye",
"forehead": "Forehead",
"head1": "Head1",
"head2": "Head2",
"head3": "Head3",
"jawfloor": "Jawfloor",
"lowerjaw": "Lowerjaw",
"lowermouth": "Lowermouth",
"nose": "Nose",
"uppermouth": "Uppermouth"
},
"s": {
"cheek": "Cheek",
"cheekbone": "Cheekbone",
"eye": "Eye",
"forehead": "Forehead",
"head1": "Head1",
"head2": "Head2",
"head3": "Head3",
"jawfloor": "Jawfloor",
"lowerjaw": "Lowerjaw",
"lowermouth": "Lowermouth",
"nose": "Nose",
"uppermouth": "Uppermouth"
},
"o": {
"size": {
"t": "Size",
"d": "Controls the overall size (value shown is the size of the head)"
}
}
}

View file

@ -0,0 +1,25 @@
{
"t": "Skully logo plush toy",
"d": "A FreeSewing pattern for skully, our logo, a plushy toy.",
"p": {
"cheek": "Cheek",
"cheekbone": "Cheekbone",
"eye": "Eye",
"forehead": "Forehead",
"head1": "Head part 1",
"head2": "Head part 2",
"head3": "Head part 3",
"jawfloor": "Jaw floor",
"lowerjaw": "Lower Jaw",
"lowermouth": "Lower Mouth",
"nose": "Nose",
"uppermouth": "Upper Mouth"
},
"s": {},
"o": {
"size": {
"t": "Size",
"d": "Controls the overall size (value shown is the resulting height of Skully)"
}
}
}

View file

@ -0,0 +1,38 @@
{
"t": "Skully logo plush toy",
"d": "A FreeSewing pattern for skully, our logo, a plushy toy.",
"p": {
"cheek": "Cheek",
"cheekbone": "Cheekbone",
"eye": "Eye",
"forehead": "Forehead",
"head1": "Head1",
"head2": "Head2",
"head3": "Head3",
"jawfloor": "Jawfloor",
"lowerjaw": "Lowerjaw",
"lowermouth": "Lowermouth",
"nose": "Nose",
"uppermouth": "Uppermouth"
},
"s": {
"cheek": "Cheek",
"cheekbone": "Cheekbone",
"eye": "Eye",
"forehead": "Forehead",
"head1": "Head1",
"head2": "Head2",
"head3": "Head3",
"jawfloor": "Jawfloor",
"lowerjaw": "Lowerjaw",
"lowermouth": "Lowermouth",
"nose": "Nose",
"uppermouth": "Uppermouth"
},
"o": {
"size": {
"t": "Size",
"d": "Controls the overall size (value shown is the size of the head)"
}
}
}

View file

@ -0,0 +1,38 @@
{
"t": "Skully logo plush toy",
"d": "A FreeSewing pattern for skully, our logo, a plushy toy.",
"p": {
"cheek": "Cheek",
"cheekbone": "Cheekbone",
"eye": "Eye",
"forehead": "Forehead",
"head1": "Head1",
"head2": "Head2",
"head3": "Head3",
"jawfloor": "Jawfloor",
"lowerjaw": "Lowerjaw",
"lowermouth": "Lowermouth",
"nose": "Nose",
"uppermouth": "Uppermouth"
},
"s": {
"cheek": "Cheek",
"cheekbone": "Cheekbone",
"eye": "Eye",
"forehead": "Forehead",
"head1": "Head1",
"head2": "Head2",
"head3": "Head3",
"jawfloor": "Jawfloor",
"lowerjaw": "Lowerjaw",
"lowermouth": "Lowermouth",
"nose": "Nose",
"uppermouth": "Uppermouth"
},
"o": {
"size": {
"t": "Size",
"d": "Controls the overall size (value shown is the size of the head)"
}
}
}

View 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 }

View file

@ -0,0 +1,38 @@
{
"t": "Skully logo plush toy",
"d": "A FreeSewing pattern for skully, our logo, a plushy toy.",
"p": {
"cheek": "Cheek",
"cheekbone": "Cheekbone",
"eye": "Eye",
"forehead": "Forehead",
"head1": "Head1",
"head2": "Head2",
"head3": "Head3",
"jawfloor": "Jawfloor",
"lowerjaw": "Lowerjaw",
"lowermouth": "Lowermouth",
"nose": "Nose",
"uppermouth": "Uppermouth"
},
"s": {
"cheek": "Cheek",
"cheekbone": "Cheekbone",
"eye": "Eye",
"forehead": "Forehead",
"head1": "Head1",
"head2": "Head2",
"head3": "Head3",
"jawfloor": "Jawfloor",
"lowerjaw": "Lowerjaw",
"lowermouth": "Lowermouth",
"nose": "Nose",
"uppermouth": "Uppermouth"
},
"o": {
"size": {
"t": "Size",
"d": "Controls the overall size (value shown is the size of the head)"
}
}
}

View file

@ -0,0 +1,25 @@
{
"t": "Skully logo plush toy",
"d": "A FreeSewing pattern for skully, our logo, a plushy toy.",
"p": {
"cheek": "Cheek",
"cheekbone": "Cheekbone",
"eye": "Eye",
"forehead": "Forehead",
"head1": "Head part 1",
"head2": "Head part 2",
"head3": "Head part 3",
"jawfloor": "Jaw floor",
"lowerjaw": "Lower Jaw",
"lowermouth": "Lower Mouth",
"nose": "Nose",
"uppermouth": "Upper Mouth"
},
"s": {},
"o": {
"size": {
"t": "Size",
"d": "Controls the overall size (value shown is the resulting height of Skully)"
}
}
}

View file

@ -0,0 +1,69 @@
{
"name": "@freesewing/skully",
"version": "3.0.0-alpha.8",
"description": "A FreeSewing pattern for skully, our logo, a plushy toy",
"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": {
".": "./dist/index.mjs"
},
"scripts": {
"build": "node build.mjs",
"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": "npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
"cibuild_step5": "node build.mjs",
"wbuild": "node build.mjs",
"wcibuild_step5": "node build.mjs"
},
"peerDependencies": {
"@freesewing/core": "3.0.0-alpha.8",
"@freesewing/plugin-bundle": "3.0.0-alpha.8"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.0.0",
"chai": "4.2.0"
},
"files": [
"dist/*",
"README.md"
],
"publishConfig": {
"access": "public",
"tag": "next"
},
"engines": {
"node": ">=16.0.0",
"npm": ">=8"
}
}

View file

@ -0,0 +1,301 @@
export const cheek = {
name: 'skully.cheek',
options: {
size: {
pct: 75,
min: 10,
max: 300,
// eslint-disable-next-line no-unused-vars
toAbs: (value, { measurements }, mergedOptions) =>
value * ((measurements?.head ? measurements.head : 596) / 929.5) * 2 * 175,
menu: 'fit',
},
},
optionalMeasurements: ['head'],
draft: ({
options,
Point,
Path,
points,
paths,
Snippet,
snippets,
measurements,
sa,
complete,
store,
macro,
part,
}) => {
const textAttribute = 'text-xs center'
const sizeFactor =
(('head' in measurements ? measurements.head : 596) / 929.5) * options.size * 2
store.set('sizeFactor', sizeFactor)
points.point0 = new Point(0, 0)
points.point1 = points.point0.shift(254.78244159705943, 22.5254232590644 * sizeFactor)
points.point1Cp1 = points.point1.shift(321.2022157426192, 7.140882368447221 * sizeFactor)
points.point2 = points.point0.shift(260.1018837009255, 44.64105174612264 * sizeFactor)
points.point2Cp1 = points.point2.shift(243.25309471936828, 16.615062563830442 * sizeFactor)
points.point2Cp2 = points.point2.shift(322.6411575424251, 21.283352555459906 * sizeFactor)
points.point3 = points.point0.shift(261.38174456728586, 76.35866165668438 * sizeFactor)
points.point3Cp1 = points.point3.shift(333.3176703576494, 12.168666812761435 * sizeFactor)
points.point3Cp2 = points.point3.shift(85.91520774712568, 11.731692674119953 * sizeFactor)
points.point4 = points.point0.shift(299.45265842618784, 86.78060596475459 * sizeFactor)
points.point4Cp1 = points.point4.shift(84.35380802294482, 49.11521286943584 * sizeFactor)
points.point4Cp2 = points.point4.shift(184.39630340760462, 19.40463369919666 * sizeFactor)
points.point5 = points.point0.shift(342.8506386745285, 121.04758752176764 * sizeFactor)
points.point5Cp1 = points.point5.shift(137.52316754335672, 29.889370057597382 * sizeFactor)
points.point5Cp2 = points.point5.shift(196.75764739545923, 56.96390931984925 * sizeFactor)
points.point6 = points.point0.shift(1.1205493505415198, 54.26948752485138 * sizeFactor)
points.point6Cp2 = points.point6.shift(316.18924774003017, 44.726876316259826 * sizeFactor)
points.point7 = points.point0.shift(357.37806779049225, 43.287782602138435 * sizeFactor)
points.point7Cp1 = points.point7.shift(299.1399624138707, 19.59910745416729 * sizeFactor)
points.point8 = points.point0.shift(317.5381963475652, 36.1375990486363 * sizeFactor)
points.point8Cp1 = points.point8.shift(173.12090742697325, 12.479807891149623 * sizeFactor)
points.point8Cp2 = points.point8.shift(353.1201304168364, 15.075322060904695 * sizeFactor)
points.point9 = points.point0.shift(336.14503661026947, 8.388980629373263 * sizeFactor)
points.point9Cp2 = points.point9.shift(255.27121271777986, 18.645853640957277 * sizeFactor)
points.point5a = new Path()
.move(points.point6)
.curve(points.point6Cp2, points.point5Cp1, points.point5)
.shiftAlong(65 * sizeFactor)
const sp = new Path()
.move(points.point5)
.curve(points.point5Cp1, points.point6Cp2, points.point6)
.split(points.point5a)
points.point5aCp1 = sp[1].ops[1].cp1.clone()
points.point6Cp2 = sp[1].ops[1].cp2.clone()
points.point5 = points.point5.rotate(357, points.point0)
points.point5Cp2 = points.point5.shift(196.75764739545923, 56.96390931984925 * sizeFactor)
paths.eyeBottom = new Path()
.move(points.point7)
.curve(points.point7Cp1, points.point8Cp2, points.point8)
.curve(points.point8Cp1, points.point9Cp2, points.point9)
.setText(complete ? 'eyeBottom' + ' (4)' : '', textAttribute)
.addClass('hidden')
paths.mouthTop = new Path()
.move(points.point3)
.curve(points.point3Cp1, points.point4Cp2, points.point4)
.setText(complete ? 'mouthTop' + ' (16)' : '', textAttribute)
.addClass('hidden')
paths.upperJaw = new Path()
.move(points.point4)
.curve(points.point4Cp1, points.point5Cp2, points.point5)
.setText(complete ? 'upperJaw' + ' (16)' : '', textAttribute)
.addClass('hidden')
paths.nose = new Path()
.move(points.point1)
.curve(points.point1Cp1, points.point2Cp2, points.point2)
.setText(complete ? 'nose (10)' : '', textAttribute)
.addClass('hidden')
store.set('templeToJaw', points.point5.dist(points.point5a))
store.set('upperJaw', paths.upperJaw.length())
paths.seam1 = new Path()
.move(points.point9)
.line(points.point0)
.setText(complete ? '1' : '', textAttribute)
.addClass('hidden')
paths.seam2 = new Path()
.move(points.point6)
.line(points.point7)
.setText(complete ? '2' : '', textAttribute)
.addClass('hidden')
paths.seam5 = new Path()
.move(points.point5a)
.curve(points.point5aCp1, points.point6Cp2, points.point6)
.setText(complete ? '5' : '', textAttribute)
.addClass('hidden')
paths.seam7 = new Path()
.move(points.point0)
.line(points.point1)
.setText(complete ? '7' : '', textAttribute)
.addClass('hidden')
paths.seam8 = new Path()
.move(points.point2)
.curve(points.point2Cp1, points.point3Cp2, points.point3)
.setText(complete ? '8' : '', textAttribute)
.addClass('hidden')
paths.seam = new Path()
.move(points.point0)
.join(paths.seam7)
.join(paths.nose)
.join(paths.seam8)
.join(paths.mouthTop)
.join(paths.upperJaw)
.line(points.point5a)
.join(paths.seam5)
.join(paths.seam2)
.join(paths.eyeBottom)
.join(paths.seam1)
.close()
store.set('templeWidth', points.point6.dist(points.point7))
store.set('noseBridgeWidth', points.point0.dist(points.point9))
store.set('templeWidth', points.point6.dist(points.point7))
store.set('mouthTop', paths.mouthTop.length())
store.set('eyeBottom', paths.eyeBottom.length())
store.set('noseSide', paths.nose.length())
store.set('noseHeight', points.point1.dist(points.point2))
store.cutlist.addCut({ cut: 2, from: 'Fabric' })
points.title = points.point4Cp2.shiftFractionTowards(points.point0, 0.3)
macro('title', {
nr: 1,
at: points.title,
scale: 0.5,
title: 'cheek',
})
snippets.n1 = new Snippet('notch', points.point9)
snippets.n2 = new Snippet('notch', points.point5)
snippets.n3 = new Snippet('notch', points.point5a)
snippets.n4 = new Snippet('notch', points.point1)
snippets.n5 = new Snippet('bnotch', points.point7)
snippets.n6 = new Snippet('bnotch', points.point2)
points.gridAnchor = points.point4.clone()
points.logo = points.point7
.shiftFractionTowards(points.point5, 0.5)
.shiftFractionTowards(points.point4, 0.25)
snippets.logo = new Snippet('logo', points.logo).attr('data-scale', 0.3)
if (sa) {
paths.sa = paths.seam.offset(sa).trim().attr('class', 'fabric sa')
}
points.noseX = paths.nose.edge('right')
points.eyeBottomY = paths.eyeBottom.edge('bottom')
points.upperJaw = paths.upperJaw.shiftFractionAlong(0.42)
macro('hd', {
from: points.noseX,
to: points.point4,
y: points.noseX.y + 5,
id: 'noseToBackOfJaw',
})
macro('hd', {
from: points.point6,
to: points.point5,
y: points.point6.y - sa - 15,
id: 'cheekBoneToBackOfJaw',
})
macro('hd', {
from: points.point6,
to: points.point5a,
y: points.point6.y - sa - 5,
id: 'cheekBoneWidth',
})
macro('hd', {
from: points.point7,
to: points.point5,
y: points.point6.y - sa - 25,
id: 'rightEyeToBackOfJaw',
})
macro('hd', {
from: points.point3,
to: points.point7,
y: points.point6.y - sa - 35,
id: 'leftToRightEye',
})
macro('hd', {
from: points.point2,
to: points.point7,
y: points.point6.y - sa - 25,
id: 'bottomNoseToRigthEye',
})
macro('hd', {
from: points.point1,
to: points.point7,
y: points.point6.y - sa - 15,
id: 'topNoseToRigthEye',
})
macro('hd', {
from: points.point0,
to: points.point7,
y: points.point6.y - sa - 5,
id: 'foreheadToRightEye',
})
macro('hd', {
from: points.point9,
to: points.point7,
y: points.point6.y - sa + 5,
id: 'eyeWidth',
})
macro('hd', {
from: points.point3,
to: points.point4,
y: points.point4.y + sa + 15,
id: 'jawWidth',
})
macro('hd', {
from: points.point4,
to: points.point5,
y: points.point4.y + sa + 15,
id: 'jawToRight',
})
macro('vd', {
from: points.eyeBottomY,
to: points.point4,
x: points.point4.x,
id: 'eyeToJaw',
})
macro('vd', {
from: points.point6,
to: points.point5a,
x: points.point5.x + sa + 10,
id: 'cheekBoneHeight',
})
macro('vd', {
from: points.point6,
to: points.point5,
x: points.point5.x + sa + 20,
id: 'cheekBoneToJawCorner',
})
macro('vd', {
from: points.point5,
to: points.point4,
x: points.point5.x + sa + 20,
id: 'bottomToJaw',
})
macro('vd', {
from: points.point3,
to: points.point2,
x: points.point2.x - sa - 10,
id: 'jawToBottomNose',
})
macro('vd', {
from: points.point3,
to: points.point1,
x: points.point2.x - sa - 20,
id: 'jawToTopNose',
})
macro('vd', {
from: points.point1,
to: points.point0,
x: points.point2.x - sa - 20,
id: 'topNoseToForehead',
})
macro('vd', {
from: points.point6,
to: points.upperJaw,
x: points.point6.x,
id: 'cheekBoneToJaw',
})
return part
},
}

View file

@ -0,0 +1,94 @@
import { cheek } from './cheek.mjs'
export const cheekbone = {
name: 'skully.cheekbone',
after: cheek,
draft: ({ Point, Path, points, paths, sa, complete, store, macro, part }) => {
const textAttribute = 'text-xs center text-decoration="line-through"'
const sizeFactor = store.get('sizeFactor')
points.point0 = new Point(0, 0)
points.point0Cp1 = points.point0.shift(26.9653561519379, 19.25431213546719 * sizeFactor)
points.point1 = points.point0.shift(23.857094414377794, 57.23972922717229 * sizeFactor)
points.point1Cp1 = points.point1.shift(135.7075072577942, 32.47486987518195 * sizeFactor)
points.point1Cp2 = points.point1.shift(180.82587279494425, 29.902106313769938 * sizeFactor)
paths.seam5 = new Path()
.move(points.point1)
.curve_(points.point1Cp1, points.point0)
.setText(complete ? '5' : '', textAttribute)
.addClass('hidden')
paths.seam6 = new Path()
.move(points.point0)
.curve(points.point0Cp1, points.point1Cp2, points.point1)
.setText(complete ? '6' : '', textAttribute)
.attr('data-text-text-decoration', 'underline')
.addClass('hidden')
paths.seam = new Path().move(points.point0).join(paths.seam6).join(paths.seam5).close()
store.cutlist.addCut({ cut: 2, from: 'Fabric' })
points.gridAnchor = points.point0.clone()
points.title = points.point0
.shiftFractionTowards(points.point1, 0.65)
.shiftFractionTowards(points.point1Cp2, 0.4)
macro('title', {
nr: 6,
at: points.title,
scale: 0.15,
rotation: 325,
title: 'cheekbone',
})
// points.logo = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)
// snippets.logo = new Snippet('logo', points.logo)
// points.text = points.logo
// .shift(-90, w / 8)
if (sa) {
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
}
points.pointY = paths.seam.edge('top')
macro('hd', {
from: points.point0,
to: points.point1,
y: points.point0.y + sa + 15,
id: 'width',
})
macro('hd', {
from: points.point0,
to: points.pointY,
y: points.pointY.y - sa - 15,
id: 'leftToTop',
})
macro('hd', {
from: points.pointY,
to: points.point1,
y: points.pointY.y - sa - 15,
id: 'topToRight',
noStartMarker: true,
noEndMarker: true,
})
macro('vd', {
from: points.point1,
to: points.point0,
x: points.point1.x + sa + 15,
id: 'cornerToCornerHeight',
noStartMarker: true,
noEndMarker: true,
})
macro('vd', {
from: points.pointY,
to: points.point0,
x: points.point0.x - sa - 15,
id: 'height',
noStartMarker: true,
noEndMarker: true,
})
return part
},
}

132
designs/skully/src/eye.mjs Normal file
View file

@ -0,0 +1,132 @@
import { cheek } from './cheek.mjs'
import { forehead } from './forehead.mjs'
export const eye = {
name: 'skully.eye',
after: [cheek, forehead],
draft: ({ Point, Path, points, paths, Snippet, snippets, sa, complete, store, macro, part }) => {
const textAttribute = 'text-xs center'
const eyeCircumference = store.get('eyeBottom') + store.get('eyeTop')
const eyeDiameter = (eyeCircumference / Math.PI) * 2
const c = 0.55191502449351
points.point0 = new Point(0, 0)
points.point2 = points.point0.shift(0, eyeDiameter / 2).shift(90, eyeDiameter / 2)
points.point0Cp1 = points.point0.shift(0, (eyeDiameter / 2) * c)
points.point2Cp2 = points.point2.shift(270, (eyeDiameter / 2) * c)
const p = new Path()
.move(points.point0)
.curve(points.point0Cp1, points.point2Cp2, points.point2)
points.point1 = p.shiftAlong(p.length() / 2)
const sp = p.split(points.point1)
points.p0 = sp[0].ops[0].to.clone()
points.p0Cp1 = sp[0].ops[1].cp1.clone()
points.p1Cp2 = sp[0].ops[1].cp2.clone()
points.p1 = sp[1].ops[0].to.clone()
points.p1Cp1 = sp[1].ops[1].cp1.clone()
points.p2Cp2 = sp[1].ops[1].cp2.clone()
points.p2 = sp[1].ops[1].to.clone()
points.p0Cp1 = points.p0.shift(0, (eyeDiameter / 2) * c * 0.4)
points.p2Cp2 = points.p2.shift(270, (eyeDiameter / 2) * c * 0.4)
points.p1Cp1 = points.p1.shift(45, (eyeDiameter / 2) * c * 0.7)
points.p1Cp2 = points.p1.shift(225, (eyeDiameter / 2) * c * 0.7)
points.p0Cp2 = points.p0Cp1.flipX()
points.p4 = points.p2.flipX()
points.p4Cp1 = points.p2Cp2.flipX()
points.p3 = points.p1.flipX()
points.p3Cp2 = points.p1Cp1.flipX()
points.p3Cp1 = points.p1Cp2.flipX()
paths.eye = new Path()
.move(points.p4)
.curve(points.p4Cp1, points.p3Cp2, points.p3)
.curve(points.p3Cp1, points.p0Cp2, points.p0)
.curve(points.p0Cp1, points.p1Cp2, points.p1)
.curve(points.p1Cp1, points.p2Cp2, points.p2)
points.pointNotch = paths.eye.shiftAlong(store.get('eyeTop'))
const ps = paths.eye.split(points.pointNotch)
paths.eyeTop = ps[0].clone().setText(complete ? 'eyeTop' + ' (4)' : '', textAttribute)
paths.eyeBottom = ps[1].clone().setText(complete ? 'eyeBottom' + ' (4)' : '', textAttribute)
paths.seam = new Path()
.move(points.p4)
.join(paths.eyeTop)
.join(paths.eyeBottom)
.line(points.p4)
.close()
points.title = points.p4
.shiftFractionTowards(points.p1, 0.45)
.shiftFractionTowards(points.p0, 0.5)
macro('title', {
nr: 9,
at: points.title,
scale: 0.3,
title: 'eye',
})
points.ps3a = points.p2.shiftFractionTowards(points.p4, 0.25)
points.ps3aCp1 = points.ps3a.shift(270, points.p4.dist(points.p2) / 6)
points.ps3 = points.p2.shiftFractionTowards(points.p4, 0.5)
points.ps3cross1 = points.ps3.shiftFractionTowards(points.p0, 0.1)
points.ps3cross2 = points.ps3.shiftFractionTowards(points.p0, -0.1)
points.ps3b = points.p2.shiftFractionTowards(points.p4, 0.75)
points.ps3bCp1 = points.ps3b.shift(270, points.p4.dist(points.p2) / 6)
points.gridAnchor = points.ps3.clone()
store.cutlist.addCut({ cut: 2, from: 'Fabric' })
macro('sewtogether', {
from: points.ps3a,
to: points.ps3b,
hinge: true,
})
snippets.n1 = new Snippet('notch', points.p2)
snippets.n2 = new Snippet('notch', points.p4)
snippets.n3 = new Snippet('bnotch', points.pointNotch)
// points.logo = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)
// snippets.logo = new Snippet('logo', points.logo)
// points.text = points.logo
// .shift(-90, w / 8)
if (sa) {
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
}
macro('hd', {
from: points.p4,
to: points.pointNotch,
y: points.p0.y + sa + 15,
id: 'leftToNotch',
noStartMarker: true,
noEndMarker: true,
})
macro('hd', {
from: points.p4,
to: points.p2,
y: points.p2.y - sa - 15,
id: 'width',
})
macro('vd', {
from: points.p2,
to: points.p0,
x: points.p2.x + sa + 15,
id: 'height',
})
return part
},
}

View file

@ -0,0 +1,246 @@
import { cheek } from './cheek.mjs'
export const forehead = {
name: 'skully.forehead',
after: cheek,
draft: ({ Point, Path, points, paths, Snippet, snippets, sa, complete, store, macro, part }) => {
const textAttribute = 'text-xs center'
const sizeFactor = store.get('sizeFactor')
points.point0 = new Point(0, 0)
points.point0Cp1 = points.point0.shift(241.92955090220636, 37.666339998598225 * sizeFactor)
points.point0Cp2 = points.point0.shift(333.9339465987448, 38.41308527689494 * sizeFactor)
points.point1 = points.point0.shift(255.81688050452775, 105.61426225557886 * sizeFactor)
points.point1Cp2 = points.point1.shift(122.25481630103288, 16.221492810466046 * sizeFactor)
points.point2 = points.point0.shift(260.36453213741225, 104.78002255825727 * sizeFactor)
points.point2Cp1 = points.point2.shift(104.52547665837686, 6.962227517109787 * sizeFactor)
points.point3 = points.point0.shift(266.83135324063875, 91.72676538115797 * sizeFactor)
points.point3Cp1 = points.point3.shift(10.824271939403667, 7.255955140434657 * sizeFactor)
points.point3Cp2 = points.point3.shift(190.82219510192064, 8.8744083082141 * sizeFactor)
points.point4 = points.point0.shift(279.23029819067256, 99.89481626481647 * sizeFactor)
points.point4Cp2 = points.point4.shift(109.3914373863736, 10.114793621226355 * sizeFactor)
points.point5 = points.point0.shift(285.6356187763194, 96.73748550220853 * sizeFactor)
points.point5Cp1 = points.point5.shift(322.25160644653687, 21.112881376069897 * sizeFactor)
points.point6 = points.point0.shift(299.0865415436474, 123.293691591622 * sizeFactor)
points.point6Cp1 = points.point6.shift(102.44153405115529, 30.07799330075059 * sizeFactor)
points.point6Cp2 = points.point6.shift(171.33241486296131, 9.49614011059247 * sizeFactor)
points.point7 = points.point0.shift(301.8945694309706, 53.41879968784397 * sizeFactor)
points.point7Cp1 = points.point7.shift(330.8064552671208, 26.14383661592154 * sizeFactor)
points.point7Cp2 = points.point7.shift(306.82890730505164, 20.883100248765764 * sizeFactor)
points.point8 = points.point0.shift(315.99934749521526, 121.10503287183268 * sizeFactor)
points.point8Cp2 = points.point8.shift(138.225501502238, 23.326308173390803 * sizeFactor)
points.point9 = points.point0.shift(325.07215199461336, 129.7747702101221 * sizeFactor)
points.point9Cp1 = points.point9.shift(126.07355572621562, 42.01723333347864 * sizeFactor)
paths.firstSeam = new Path()
.move(points.point9)
.curve(points.point9Cp1, points.point0Cp2, points.point0)
.setText(complete ? '20' : '', textAttribute)
.addClass('hidden')
store.set('firstSeam', paths.firstSeam.length())
store.set(
'templeTop',
new Path().move(points.point8).line(points.point9).length() +
new Path()
.move(points.point5)
.curve(points.point5Cp1, points.point6Cp2, points.point6)
.length()
)
paths.eyeTop = new Path()
.move(points.point2)
.curve(points.point2Cp1, points.point3Cp2, points.point3)
.curve(points.point3Cp1, points.point4Cp2, points.point4)
.setText(complete ? 'eyeTop' + ' (4)' : '', textAttribute)
.addClass('hidden')
paths.seam1 = new Path()
.move(points.point1)
.line(points.point2)
.setText(complete ? '1' : '', textAttribute)
.addClass('hidden')
paths.seam2 = new Path()
.move(points.point4)
.line(points.point5)
.setText(complete ? '2' : '', textAttribute)
.addClass('hidden')
paths.seam6a = new Path()
.move(points.point5)
.curve(points.point5Cp1, points.point6Cp2, points.point6)
.setText(complete ? '6' : '', textAttribute)
.attr('data-text-text-decoration', 'underline')
.addClass('hidden')
paths.seam6b = new Path()
.move(points.point8)
.line(points.point9)
.setText(complete ? '6' : '', textAttribute)
.attr('data-text-text-decoration', 'underline')
.addClass('hidden')
paths.seam7 = new Path()
.move(points.point0)
.curve(points.point0Cp1, points.point1Cp2, points.point1)
.setText(complete ? '7' : '', textAttribute)
.addClass('hidden')
paths.seam = new Path()
.move(points.point0)
.join(paths.seam7)
.join(paths.seam1)
.join(paths.eyeTop)
.join(paths.seam2)
.join(paths.seam6a)
.line(points.point8)
.join(paths.seam6b)
.curve(points.point9Cp1, points.point0Cp2, points.point0)
.close()
paths.dart = new Path()
.move(points.point6)
.curve(points.point6Cp1, points.point7Cp2, points.point7)
.curve(points.point7Cp1, points.point8Cp2, points.point8)
store.set('eyeTop', paths.eyeTop.length())
store.cutlist.addCut({ cut: 2, from: 'Fabric' })
points.gridAnchor = points.point0.clone()
points.title = points.point3Cp1.shiftFractionTowards(points.point0, 0.3)
macro('title', {
nr: 2,
at: points.title,
scale: 0.5,
title: 'forehead',
})
snippets.n1 = new Snippet('notch', points.point2)
snippets.n2 = new Snippet('bnotch', points.point4)
// points.logo = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)
// snippets.logo = new Snippet('logo', points.logo)
// points.text = points.logo
// .shift(-90, w / 8)
if (sa) {
paths.sa = paths.seam.offset(sa).trim().attr('class', 'fabric sa')
}
points.pointX = paths.seam.edge('left')
macro('hd', {
from: points.point0,
to: points.point9,
y: points.point0.y - sa - 15,
id: 'topToRight',
})
macro('hd', {
from: points.pointX,
to: points.point0,
y: points.point0.y - sa - 15,
id: 'leftToTop',
})
macro('hd', {
from: points.point6,
to: points.point8,
y: points.point6.y + sa + 5,
id: 'dartWidth',
})
macro('hd', {
from: points.point6,
to: points.point9,
y: points.point6.y + sa + 15,
id: 'dartToRight',
})
macro('hd', {
from: points.point5,
to: points.point6,
y: points.point6.y + sa + 5,
id: 'cheekBoneToDart',
})
macro('hd', {
from: points.point4,
to: points.point6,
y: points.point6.y + sa + 15,
id: 'rightEyeToDart',
})
macro('hd', {
from: points.point2,
to: points.point6,
y: points.point6.y + sa + 25,
id: 'leftEyeToDart',
})
macro('hd', {
from: points.point1,
to: points.point6,
y: points.point6.y + sa + 35,
id: 'leftCornerToDart',
})
macro('hd', {
from: points.pointX,
to: points.point6,
y: points.point6.y + sa + 45,
id: 'leftToDart',
})
macro('hd', {
from: points.point0,
to: points.point7,
y: points.point7.y,
id: 'topToDartPoint',
})
macro('vd', {
from: points.point5,
to: points.point0,
x: points.pointX.x - sa - 10,
id: 'cheekBoneToTop',
})
macro('vd', {
from: points.point4,
to: points.point0,
x: points.pointX.x - sa - 20,
id: 'rightEyeToTop',
})
macro('vd', {
from: points.point1,
to: points.point0,
x: points.pointX.x - sa - 30,
id: 'leftCornerToTop',
})
macro('vd', {
from: points.point2,
to: points.point0,
x: points.pointX.x - sa - 40,
id: 'leftEyeToTop',
})
macro('vd', {
from: points.point0,
to: points.point9,
x: points.point9.x + sa + 10,
id: 'rightToTop',
})
macro('vd', {
from: points.point0,
to: points.point8,
x: points.point9.x + sa + 20,
id: 'rightDartToTop',
})
macro('vd', {
from: points.point0,
to: points.point6,
x: points.point9.x + sa + 30,
id: 'leftDartToTop',
})
macro('vd', {
from: points.point0,
to: points.point7,
x: points.point0.x,
id: 'dartPointToTop',
})
return part
},
}

View file

@ -0,0 +1,132 @@
import { cheek } from './cheek.mjs'
import { forehead } from './forehead.mjs'
export const head1 = {
name: 'skully.head1',
after: [cheek, forehead],
draft: ({ Point, Path, points, paths, Snippet, snippets, sa, complete, store, macro, part }) => {
const textAttribute = 'text-xs center'
const sizeFactor = store.get('sizeFactor')
points.point0 = new Point(0, 0)
points.point0Cp2 = points.point0.shift(270.9766531413822, 42.41716221059584 * sizeFactor)
points.point2 = points.point0.shift(254.08224234639044, 161.93553876093907 * sizeFactor)
points.point2Cp2 = points.point2.shift(105.78717948197567, 54.27380801428633 * sizeFactor)
points.point2Cp1 = points.point2.shift(75.48077210575057, 107.97156739510459 * sizeFactor)
points.point1 = points.point0.shift(180, 72.005 * sizeFactor)
points.point1Cp1 = points.point1.shift(268.60871199245156, 55.97160080799901 * sizeFactor)
points.point0 = points.point0.shift(270, 5)
points.point0Cp2 = points.point0.shift(270.9766531413822, 42.41716221059584 * sizeFactor)
paths.firstSeam = new Path()
.move(points.point1)
.curve(points.point1Cp1, points.point2Cp2, points.point2)
.setText(complete ? '20' : '', textAttribute)
.addClass('hidden')
points.fs1 = paths.firstSeam.shiftAlong(store.get('firstSeam'))
points.fs2 = paths.firstSeam.shiftAlong(store.get('firstSeam') + store.get('templeToJaw'))
points.gridAnchor = points.point0.clone()
store.cutlist.addCut({ cut: 2, from: 'Fabric' })
store.set(
'upperJawToLowerJaw',
paths.firstSeam.length() - store.get('firstSeam') - store.get('templeToJaw')
)
paths.secondSeam = new Path()
.move(points.point2)
.curve(points.point2Cp1, points.point0Cp2, points.point0)
.setText(complete ? '17' : '', textAttribute)
.addClass('hidden')
paths.top = new Path()
.move(points.point0)
.line(points.point1)
.setText(complete ? '19' : '', textAttribute)
.addClass('hidden')
store.set('secondSeam', paths.secondSeam.length())
paths.seam = new Path()
.move(points.point0)
.join(paths.top)
.join(paths.firstSeam)
.join(paths.secondSeam)
.close()
points.title = points.point2.shiftFractionTowards(points.point1, 0.65).shift(0, 10 * sizeFactor)
macro('title', {
nr: 3,
at: points.title,
scale: 0.5,
title: 'head' + '1',
})
// points.logo = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)
// snippets.logo = new Snippet('logo', points.logo)
// points.text = points.logo
// .shift(-90, w / 8)
snippets.n1 = new Snippet('notch', points.fs1)
snippets.n2 = new Snippet('notch', points.fs2)
if (sa) {
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
}
macro('hd', {
from: points.point1,
to: points.point2,
y: points.point2.y + sa + 10,
id: 'leftToBottom',
noStartMarker: true,
noEndMarker: true,
})
macro('hd', {
from: points.point2,
to: points.point0,
y: points.point2.y + sa + 10,
id: 'bottomToRight',
})
macro('vd', {
from: points.point0,
to: points.point2,
x: points.point0.x + sa + 15,
id: 'bottomToRight',
})
macro('vd', {
from: points.point2,
to: points.point1,
x: points.point1.x - sa - 15,
id: 'bottomToLeft',
})
macro('ld', {
from: points.point1,
to: points.point0,
d: 5,
id: 'topWidth',
})
macro('ld', {
from: points.point2,
to: points.fs2,
d: 5,
noStartMarker: true,
noEndMarker: true,
})
macro('ld', {
from: points.point2,
to: points.fs1,
d: 15,
id: 'bottomToSecondNotch',
noStartMarker: true,
noEndMarker: true,
})
return part
},
}

View file

@ -0,0 +1,229 @@
import { cheek } from './cheek.mjs'
import { head1 } from './head1.mjs'
export const head2 = {
name: 'skully.head2',
after: [cheek, head1],
draft: ({ Point, Path, points, paths, sa, complete, log, store, macro, part }) => {
const textAttribute = 'text-xs center'
const sizeFactor = store.get('sizeFactor')
points.point0 = new Point(0, 0)
points.point0Cp2 = points.point0.shift(0, 15 * sizeFactor)
points.point1 = points.point0.shift(257.7901473243395, 66.12988849226953 * sizeFactor)
points.point1Cp1 = points.point1.shift(270, 30.242724116719366 * sizeFactor)
points.point1Cp2 = points.point1.shift(90, 18.83053830882166 * sizeFactor)
points.point2 = points.point0.shift(272.3327760921532, 153.20596573567235 * sizeFactor)
points.point3 = points.point0.shift(282.5001868336755, 164.15422647315543 * sizeFactor)
points.point3Cp1 = points.point3.shift(81.44269285511335, 54.758598457228615 * sizeFactor)
points.point4 = points.point0.shift(340.927384878832, 52.16879559660159 * sizeFactor)
points.point4Cp2 = points.point4.shift(274.04106104609286, 50.57373626695976 * sizeFactor)
const secondSeam = store.get('secondSeam')
let iterations = 0
var p
do {
iterations++
p = new Path()
.move(points.point0)
._curve(points.point1Cp2, points.point1)
.curve_(points.point1Cp1, points.point2)
if (secondSeam - p.length() > 0.1 || secondSeam - p.length() < -0.1) {
points.point0 = points.point0.shift(90, secondSeam - p.length())
points.point1 = points.point1.shift(90, secondSeam - p.length())
points.point1Cp1 = points.point1.shift(270, 30.242724116719366 * sizeFactor)
points.point1Cp2 = points.point1.shift(90, 18.83053830882166 * sizeFactor)
points.point0Cp2 = points.point0.shift(0, 15 * sizeFactor)
}
} while (iterations < 100 && (secondSeam - p.length() > 1 || secondSeam - p.length() < -1))
if (iterations >= 100) {
log.error('Generating head2 could not be made to fit in 100 iterations!')
}
points.dartPoint0 = new Path()
.move(points.point3)
.curve(points.point3Cp1, points.point4Cp2, points.point4)
.shiftAlong(99.23273836900117 * sizeFactor)
points.dartPoint1 = points.point0.shift(285.96197961706986, 65.4910471438654 * sizeFactor)
points.dartPoint1Cp1 = points.dartPoint1.shift(
354.74216521134053,
13.662486193954589 * sizeFactor
)
points.dartPoint1Cp2 = points.dartPoint1.shift(
356.55115250146685,
13.680777207454268 * sizeFactor
)
points.dartPoint2 = new Path()
.move(points.point3)
.curve(points.point3Cp1, points.point4Cp2, points.point4)
.shiftAlong(92.81578231343269 * sizeFactor)
paths.secondSeam = new Path()
.move(points.point0)
._curve(points.point1Cp2, points.point1)
.curve_(points.point1Cp1, points.point2)
.setText(complete ? '17' : '', textAttribute)
.addClass('hidden')
paths.thirdSeam = new Path()
.move(points.point3)
.curve(points.point3Cp1, points.point4Cp2, points.point4)
.setText(complete ? '18' : '', textAttribute)
.addClass('hidden')
paths.top = new Path()
.move(points.point4)
.curve(points.point4, points.point0Cp2, points.point0)
.setText(complete ? '19' : '', textAttribute)
.addClass('hidden')
paths.bottom = new Path()
.move(points.point2)
.line(points.point3)
.setText(complete ? '21' : '', textAttribute)
.addClass('hidden')
store.set('thirdSeam', paths.thirdSeam.length() - points.dartPoint0.dist(points.dartPoint2))
store.set('head2width', points.point2.dist(points.point3))
paths.dart = new Path()
.move(points.dartPoint0)
._curve(points.dartPoint1Cp2, points.dartPoint1)
.curve_(points.dartPoint1Cp1, points.dartPoint2)
paths.seam = new Path()
.move(points.point0)
.join(paths.secondSeam)
.join(paths.bottom)
.join(paths.thirdSeam)
.join(paths.top)
.close()
store.cutlist.addCut({ cut: 2, from: 'Fabric' })
points.gridAnchor = points.dartPoint1.clone()
points.title = points.dartPoint1.shiftFractionTowards(points.point2, 0.35)
macro('title', {
nr: 4,
at: points.title,
scale: 0.5,
title: 'head' + '2',
})
// points.logo = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)
// snippets.logo = new Snippet('logo', points.logo)
// points.text = points.logo
// .shift(-90, w / 8)
if (sa) {
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
}
points.pointX = paths.seam.edge('right')
macro('hd', {
from: points.point0,
to: points.point4,
y: points.point0.y - sa - 15,
id: 'topWidth',
})
macro('hd', {
from: points.point0,
to: points.pointX,
y: points.point0.y - sa - 25,
id: 'topToRight',
})
macro('hd', {
from: points.point1,
to: points.pointX,
y: points.point0.y - sa - 35,
id: 'totalWidth',
})
macro('hd', {
from: points.point3,
to: points.pointX,
y: points.point3.y + sa + 15,
id: 'bottomRightToRight',
noStartMarker: true,
noEndMarker: true,
})
macro('hd', {
from: points.point2,
to: points.point3,
y: points.point3.y + sa + 15,
id: 'bottomWidth',
noStartMarker: true,
noEndMarker: true,
})
macro('hd', {
from: points.point1,
to: points.point2,
y: points.point3.y + sa + 15,
id: 'leftToBottomLeft',
noStartMarker: true,
noEndMarker: true,
})
macro('hd', {
from: points.point0,
to: points.dartPoint1,
y: points.dartPoint1.y,
id: 'leftTopToDartPoint',
noStartMarker: true,
noEndMarker: true,
})
macro('vd', {
from: points.point1,
to: points.point0,
x: points.point1.x - sa - 15,
id: 'leftToTop',
})
macro('vd', {
from: points.point2,
to: points.point1,
x: points.point1.x - sa - 15,
id: 'leftToBottomLeft',
})
macro('vd', {
from: points.point3,
to: points.point1,
x: points.point1.x - sa - 25,
id: 'leftToBottomRight',
})
macro('vd', {
from: points.point0,
to: points.point4,
x: points.point4.x + sa + 15,
id: 'topRightToTopLeft',
noStartMarker: true,
noEndMarker: true,
})
macro('vd', {
from: points.point4,
to: points.dartPoint0,
x: points.point4.x + sa + 15,
id: 'topDartToTopRight',
})
macro('vd', {
from: points.point4,
to: points.dartPoint2,
x: points.point4.x + sa + 25,
id: 'bottomDartToTopRight',
})
macro('vd', {
from: points.dartPoint2,
to: points.point3,
x: points.point4.x + sa + 25,
id: 'bottomRightToBottomDart',
})
macro('vd', {
from: points.point0,
to: points.dartPoint1,
x: points.dartPoint1.x,
id: 'dartPointToTopLeft',
})
return part
},
}

View file

@ -0,0 +1,210 @@
import { cheek } from './cheek.mjs'
import { head2 } from './head2.mjs'
import { jawfloor } from './jawfloor.mjs'
export const head3 = {
name: 'skully.head3',
after: [cheek, head2, jawfloor],
draft: ({ Point, Path, points, paths, sa, complete, log, store, macro, utils, part }) => {
const textAttribute = 'text-xs center'
const sizeFactor = store.get('sizeFactor')
points.point0 = new Point(0, 0)
points.point0Cp2 = points.point0.shift(176.85941213458383, 24.45873430903567 * sizeFactor)
points.point0Cp1 = points.point0.shift(80.97143471134606, 19.435805231582247 * sizeFactor)
points.point5 = points.point0.shift(174.83014371859687, 57.4195861357429 * sizeFactor)
points.point5Cp1 = points.point5.shift(359.48476820979687, 24.91000716579583 * sizeFactor)
points.point4 = points.point0.shift(128.37, 82.29999999999998 * sizeFactor)
points.point4Cp1 = points.point4.shift(280, 20 * sizeFactor)
points.point3 = points.point0.shift(122.10525602099625, 99.24923435875874 * sizeFactor)
points.point3Cp2 = points.point3.shift(75, 20 * sizeFactor)
points.point2 = points.point0.shift(92.0479806305003, 131.18279286933938 * sizeFactor)
points.point2Cp2 = points.point2.shift(286.4630945432234, 43.38779202725112 * sizeFactor)
points.point2Cp1 = points.point2.shift(208.11590506019132, 16.689416556608613 * sizeFactor)
points.point1 = points.point0.shift(80.96712201455671, 37.967861804426136 * sizeFactor)
points.point1Cp2 = points.point1.shift(266.0887375411011, 17.372462375840676 * sizeFactor)
points.point1Cp1 = points.point1.shift(86.08762325510818, 17.602020395397776 * sizeFactor)
points.dartPoint0 = points.point4.clone()
points.dartPoint0Cp1 = points.dartPoint0.shift(10, 15.674240045373793 * sizeFactor)
points.dartPoint1 = points.point0.shift(93.69495535762911, 79.06034303618978 * sizeFactor)
points.dartPoint1Cp1 = points.dartPoint1.shift(
190.57289744169927,
19.19488590744941 * sizeFactor
)
points.dartPoint1Cp2 = points.dartPoint1.shift(
206.69161019830457,
18.019174148667343 * sizeFactor
)
points.dartPoint2 = points.point3.clone()
points.dartPoint2Cp2 = points.dartPoint2.shift(345, 15.211717490145492 * sizeFactor)
let lowerWidth = store.get('halfOfBack') - store.get('head2width')
let tsAdjustment =
store.get('thirdSeam') -
new Path()
.move(points.point2)
.curve(points.point2Cp1, points.point3Cp2, points.point3)
.length()
let x = utils.circlesIntersect(points.dartPoint0, tsAdjustment, points.point0, lowerWidth)
if (x) {
points.point5 = x[0].clone()
} else {
log.error('Could not make the lower part of head3 fit the other parts!')
}
points.point5Cp1 = points.point5.shift(359.48476820979687, 24.91000716579583 * sizeFactor)
points.gridAnchor = points.dartPoint1.clone()
paths.thirdSeam1 = new Path()
.move(points.point2)
.curve(points.point2Cp1, points.point3Cp2, points.point3)
.setText(complete ? '18' : '', textAttribute)
.addClass('hidden')
paths.thirdSeam2 = new Path()
.move(points.point4)
.line(points.point5)
.setText(complete ? '18' : '', textAttribute)
.addClass('hidden')
paths.back = new Path()
.move(points.point0)
.curve(points.point0Cp1, points.point1Cp2, points.point1)
.curve(points.point1Cp1, points.point2Cp2, points.point2)
.setText(complete ? '19' : '', textAttribute)
.addClass('hidden')
paths.bottom = new Path()
.move(points.point5)
.line(points.point0)
.setText(complete ? '21' : '', textAttribute)
.addClass('hidden')
paths.dart = new Path()
.move(points.dartPoint0)
.curve(points.dartPoint0Cp1, points.dartPoint1Cp2, points.dartPoint1)
.curve(points.dartPoint1Cp1, points.dartPoint2Cp2, points.dartPoint2)
paths.seam = new Path()
.move(points.point0)
.join(paths.back)
.join(paths.thirdSeam1)
.line(points.point4)
.join(paths.thirdSeam2)
.join(paths.bottom)
.close()
store.cutlist.addCut({ cut: 2, from: 'Fabric' })
points.title = points.point4
.shiftFractionTowards(points.point1, 0.25)
.shiftFractionTowards(points.point0, 0.25)
macro('title', {
nr: 5,
at: points.title,
scale: 0.5,
title: 'head' + '3',
})
// points.logo = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)
// snippets.logo = new Snippet('logo', points.logo)
// points.text = points.logo
// .shift(-90, w / 8)
// .attr('data-text', 'hello')
// .attr('data-text-class', 'center')
if (sa) {
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
}
points.pointX = new Path()
.move(points.point1)
.curve(points.point1Cp1, points.point2Cp2, points.point2)
.edge('right')
macro('hd', {
from: points.dartPoint2,
to: points.point2,
y: points.point2.y - sa - 15,
id: 'topDartToTop',
})
macro('hd', {
from: points.dartPoint2,
to: points.pointX,
y: points.point2.y - sa - 25,
id: 'totalWidth',
})
macro('hd', {
from: points.dartPoint2,
to: points.point5,
y: points.point0.y + sa + 15,
id: 'topDartToBottomLeft',
noStartMarker: true,
noEndMarker: true,
})
macro('hd', {
from: points.dartPoint0,
to: points.point5,
y: points.point0.y + sa + 5,
id: 'bottomDartToBottomLeft',
noStartMarker: true,
noEndMarker: true,
})
macro('hd', {
from: points.dartPoint2,
to: points.point0,
y: points.point0.y + sa + 25,
id: 'topDartToBottomRight',
})
macro('hd', {
from: points.dartPoint2,
to: points.dartPoint1,
y: points.dartPoint2.y,
id: 'topDartToDartPoint',
})
macro('vd', {
from: points.point2,
to: points.dartPoint1,
x: points.pointX.x + sa + 15,
id: 'dartPointToTop',
})
macro('vd', {
from: points.dartPoint1,
to: points.point0,
x: points.pointX.x + sa + 15,
id: 'dartPointToBottom',
})
macro('vd', {
from: points.point2,
to: points.pointX,
x: points.pointX.x + sa + 25,
id: 'rightToTop',
})
macro('vd', {
from: points.dartPoint2,
to: points.point2,
x: points.dartPoint2.x - sa - 15,
id: 'topDartToTop',
})
macro('vd', {
from: points.dartPoint0,
to: points.dartPoint2,
x: points.dartPoint2.x - sa - 15,
id: 'dartHeight',
noStartMarker: true,
noEndMarker: true,
})
macro('vd', {
from: points.point5,
to: points.dartPoint0,
x: points.dartPoint2.x - sa - 15,
id: 'bottomDartToTop',
})
return part
},
}

View file

@ -0,0 +1,53 @@
// Skully
import { Design } from '@freesewing/core'
import { data } from '../data.mjs'
// Parts
import { cheek } from './cheek.mjs'
import { cheekbone } from './cheekbone.mjs'
import { eye } from './eye.mjs'
import { forehead } from './forehead.mjs'
import { head1 } from './head1.mjs'
import { head2 } from './head2.mjs'
import { head3 } from './head3.mjs'
import { jawfloor } from './jawfloor.mjs'
import { lowerjaw } from './lowerjaw.mjs'
import { lowermouth } from './lowermouth.mjs'
import { nose } from './nose.mjs'
import { uppermouth } from './uppermouth.mjs'
// Create new design
const Skully = new Design({
data,
parts: [
cheek,
cheekbone,
eye,
forehead,
head1,
head2,
head3,
jawfloor,
lowerjaw,
lowermouth,
nose,
uppermouth,
],
})
// Named exports
export {
cheek,
cheekbone,
eye,
forehead,
head1,
head2,
head3,
jawfloor,
lowerjaw,
lowermouth,
nose,
uppermouth,
Skully,
}

View file

@ -0,0 +1,188 @@
import { cheek } from './cheek.mjs'
import { lowerjaw } from './lowerjaw.mjs'
export const jawfloor = {
name: 'skully.jawfloor',
after: [cheek, lowerjaw],
draft: ({ Point, Path, points, paths, sa, complete, store, macro, part }) => {
const textAttribute = 'text-xs center'
const sizeFactor = store.get('sizeFactor')
points.point0 = new Point(0, 0)
points.point0Cp1 = points.point0.shift(271.5282081165893, 13.423774618191423 * sizeFactor)
points.point1 = points.point0.shift(329.79784303240206, 56.7574974166409 * sizeFactor)
points.point1Cp1 = points.point1.shift(0.11113474162861184, 14.951028125182583 * sizeFactor)
points.point1Cp2 = points.point1.shift(180.11102743493262, 10.32101937794903 * sizeFactor)
points.point2 = points.point0.shift(341.7834753138606, 84.52734739124374 * sizeFactor)
points.point2Cp1 = points.point2.shift(0.270382570357072, 8.900099100571891 * sizeFactor)
points.point2Cp2 = points.point2.shift(180.28237864410448, 8.319101033164598 * sizeFactor)
points.point3 = points.point0.shift(343.81344080631544, 113.99173416524552 * sizeFactor)
points.point3Cp1 = points.point3.shift(339.59546305762336, 4.204834955143868 * sizeFactor)
points.point3Cp2 = points.point3.shift(159.590412018152, 8.47076366096944 * sizeFactor)
points.point4 = points.point0.shift(340.4669995939806, 139.17462884448446 * sizeFactor)
points.point4Cp2 = points.point4.shift(166.50426671920425, 8.612823288562234 * sizeFactor)
points.point5 = points.point0.shift(3.560698409188234, 135.3172211952344 * sizeFactor)
points.point6 = points.point0.shift(90.34672828513591, 8.097148263432018 * sizeFactor)
points.point0Cp2 = points.point0.shift(89.35665584015415, 4.809303171978241 * sizeFactor)
points.point5 = points.point5.shift(0, points.point4.dist(points.point5) / 3)
points.point5Cp2 = points.point5.shift(270, points.point4.dist(points.point5) / 3)
points.gridAnchor = points.point5.clone()
macro('mirror', {
mirror: [points.point5, points.point6],
points: [
'point0',
'point0Cp1',
'point0Cp2',
'point1Cp2',
'point1',
'point1Cp1',
'point2Cp2',
'point2',
'point2Cp1',
'point3Cp2',
'point3',
'point3Cp1',
'point4Cp2',
'point4',
'point4',
'point5Cp2',
'point5',
'point6',
],
prefix: 'm',
})
paths.bottomJaw1 = new Path()
.move(points.point6)
._curve(points.point0Cp2, points.point0)
.curve(points.point0Cp1, points.point1Cp2, points.point1)
.curve(points.point1Cp1, points.point2Cp2, points.point2)
.curve(points.point2Cp1, points.point3Cp2, points.point3)
.curve(points.point3Cp1, points.point4Cp2, points.point4)
.setText(complete ? 'jawBottom' + ' (15)' : '', textAttribute)
.addClass('hidden')
paths.bottomJaw2 = new Path()
.move(points.mPoint4)
.curve(points.mPoint4Cp2, points.mPoint3Cp1, points.mPoint3)
.curve(points.mPoint3Cp2, points.mPoint2Cp1, points.mPoint2)
.curve(points.mPoint2Cp2, points.mPoint1Cp1, points.mPoint1)
.curve(points.mPoint1Cp2, points.mPoint0Cp1, points.mPoint0)
.curve_(points.mPoint0Cp2, points.point6)
.setText(complete ? 'jawBottom' + ' (15)' : '', textAttribute)
.addClass('hidden')
paths.back = new Path()
.move(points.point4)
.curve(points.point4, points.point5Cp2, points.point5)
.curve(points.mPoint5Cp2, points.mPoint4, points.mPoint4)
.setText(complete ? '21' : '', textAttribute)
.addClass('hidden')
paths.seam = new Path()
.move(points.point6)
.join(paths.bottomJaw1)
.join(paths.back)
.join(paths.bottomJaw2)
.close()
store.set(
'backOfLowerJaw',
new Path().move(points.point4).curve(points.point4, points.point5Cp2, points.point5).length()
)
store.cutlist.addCut({ cut: 1, from: 'Fabric' })
points.title = points.point6.shiftFractionTowards(points.point5, 0.5)
macro('title', {
nr: 8,
at: points.title,
scale: 0.5,
title: 'jawfloor',
})
// points.logo = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)
// snippets.logo = new Snippet('logo', points.logo)
// points.text = points.logo
// .shift(-90, w / 8)
if (sa) {
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
}
macro('hd', {
from: points.mPoint0,
to: points.mPoint5,
y: points.mPoint4.y - sa - 15,
id: 'width',
})
macro('hd', {
from: points.point4,
to: points.point5,
y: points.point4.y + sa + 15,
id: 'bottomRightToRight',
noStartMarker: true,
noEndMarker: true,
})
macro('hd', {
from: points.point2,
to: points.point4,
y: points.point4.y + sa + 15,
id: 'indentToBottomRight',
})
macro('hd', {
from: points.point1,
to: points.point2,
y: points.point4.y + sa + 15,
id: 'outdentToIndent',
})
macro('hd', {
from: points.point0,
to: points.point1,
y: points.point4.y + sa + 15,
id: 'leftToOutdent',
})
macro('vd', {
from: points.point1,
to: points.mPoint1,
x: points.mPoint1.x,
id: 'outdentHeight',
})
macro('vd', {
from: points.point2,
to: points.mPoint2,
x: points.mPoint2.x,
id: 'indentHeight',
})
macro('vd', {
from: points.point3,
to: points.mPoint3,
x: points.mPoint3.x,
id: 'anotherHeight',
})
macro('vd', {
from: points.point4,
to: points.mPoint4,
x: points.mPoint4.x,
id: 'totalHeight',
})
macro('vd', {
from: points.mPoint4,
to: points.point5,
x: points.point5.x + sa + 15,
id: 'middleToTop',
})
macro('vd', {
from: points.mPoint5,
to: points.point4,
x: points.mPoint5.x + sa + 15,
id: 'bottomToMiddle',
})
return part
},
}

View file

@ -0,0 +1,195 @@
import { cheek } from './cheek.mjs'
import { uppermouth } from './uppermouth.mjs'
export const lowerjaw = {
name: 'skully.lowerjaw',
after: [cheek, uppermouth],
draft: ({ Point, Path, points, paths, sa, complete, log, store, macro, part }) => {
const textAttribute = 'text-xs center'
const sizeFactor = store.get('sizeFactor')
points.point0 = new Point(0, 0)
points.point1 = points.point0.shift(174.91311161963839, 43.0264648094635 * sizeFactor)
points.point2 = points.point0.shift(240.9901082422603, 82.64382533498798 * sizeFactor)
points.point3 = points.point0.shift(251.1601763775522, 106.01579184725264 * sizeFactor)
points.point4 = points.point0.shift(276.6440430845334, 116.75813357963548 * sizeFactor)
points.point5 = points.point0.shift(264.48800048134507, 50.78381912578058 * sizeFactor)
const mouthTop = store.get('mouthTop')
points.point0 = new Point(0, 0)
points.point0Cp2 = points.point0.shift(354.9481781658739, 16.659715303689914 * sizeFactor)
points.point1 = points.point0.shift(264.91311161963836, 43.0264648094635 * sizeFactor)
points.point1Cp1 = points.point1.shift(0, 53.02160375733651 * sizeFactor)
points.point2 = points.point0.shift(331.14662128979205, 83.05325951149062 * sizeFactor)
points.point2Cp1 = points.point2.shift(23.491413537740165, 11.818521142681087 * sizeFactor)
points.point2Cp2 = points.point2.shift(203.48599545649284, 6.360957553702122 * sizeFactor)
points.point3 = points.point0.shift(341.2414817357221, 106.45865437980989 * sizeFactor)
points.point3Cp1 = points.point3.shift(83.22770461819215, 15.755934754878917 * sizeFactor)
points.point3Cp2 = points.point3.shift(263.2247839478168, 8.959567958333654 * sizeFactor)
points.point4 = points.point0.shift(6.617587088273078, 117.22282297600707 * sizeFactor)
points.point4Cp1 = points.point4.shift(171.59670910061834, 40.160161877163844 * sizeFactor)
points.point4Cp2 = points.point4.shift(255.77964223723035, 21.208879767682262 * sizeFactor)
points.point5 = points.point0.shift(354.81977589032454, 54.026610044075944 * sizeFactor)
points.point5Cp1 = points.point5.shift(166.25960112580196, 20.659041530160696 * sizeFactor)
points.point5Cp2 = points.point5.shift(76.26126036953632, 34.11095664483535 * sizeFactor)
points.point0 = new Point(0, 0)
let iterations = 0
var p
do {
iterations++
points.point5Cp1 = points.point5.shift(166.25960112580196, 20.659041530160696 * sizeFactor)
points.point5Cp2 = points.point5.shift(76.26126036953632, 34.11095664483535 * sizeFactor)
p = new Path().move(points.point5).curve(points.point5Cp1, points.point0Cp2, points.point0)
points.point5 = points.point5.shift(270, (mouthTop - p.length()) * 0.5)
} while (iterations < 100 && (mouthTop - p.length() > 1 || mouthTop - p.length() < -1))
if (iterations >= 100) {
log.error('Something is not quite right here!')
}
points.point4 = points.point4.shift(
355,
store.get('lowerJaw') -
new Path()
.move(points.point4)
.curve(points.point4Cp1, points.point5Cp2, points.point5)
.length()
)
points.point4Cp1 = points.point4.shift(171.59670910061834, 40.160161877163844 * sizeFactor)
points.point4Cp2 = points.point4.shift(255.77964223723035, 21.208879767682262 * sizeFactor)
paths.mouthBottom = new Path()
.move(points.point5)
.curve(points.point5Cp1, points.point0Cp2, points.point0)
.setText(complete ? 'mouthBottom' + ' (13)' : '', textAttribute)
.addClass('hidden')
paths.lowerJaw = new Path()
.move(points.point4)
.curve(points.point4Cp1, points.point5Cp2, points.point5)
.setText(complete ? 'lowerJaw' + ' (14)' : '', textAttribute)
.addClass('hidden')
paths.front = new Path()
.move(points.point0)
.line(points.point1)
.setText(complete ? '12' : '', textAttribute)
paths.bottomJaw = new Path()
.move(points.point1)
.curve(points.point1Cp1, points.point2Cp2, points.point2)
.curve(points.point2Cp1, points.point3Cp2, points.point3)
.curve(points.point3Cp1, points.point4Cp2, points.point4)
.setText(complete ? 'jawBottom' + '(15)' : '', textAttribute)
.addClass('hidden')
paths.seam = new Path()
.move(points.point0)
.join(paths.front)
.join(paths.bottomJaw)
.join(paths.lowerJaw)
.join(paths.mouthBottom)
.close()
store.set('bottomJaw', paths.bottomJaw.length())
store.cutlist.addCut({ cut: 2, from: 'Fabric' })
points.gridAnchor = points.point5.clone()
points.title = points.point1.shiftFractionTowards(points.point4, 0.25)
macro('title', {
nr: 11,
at: points.title,
scale: 0.4,
title: 'lowerJaw',
})
// points.logo = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)
// snippets.logo = new Snippet('logo', points.logo)
// points.text = points.logo
// .shift(-90, w / 8)
if (sa) {
paths.sa = paths.seam.offset(sa).trim().attr('class', 'fabric sa')
}
points.pointY = new Path()
.move(points.point4)
.curve(points.point4Cp1, points.point5Cp2, points.point5)
.edge('top')
macro('hd', {
from: points.point0,
to: points.point5,
y: points.pointY.y - sa - 15,
id: 'leftTopToTopHook',
})
macro('hd', {
from: points.pointY,
to: points.point4,
y: points.pointY.y - sa - 15,
id: 'topToRight',
})
macro('hd', {
from: points.point1,
to: points.point5,
y: points.pointY.y - sa - 25,
id: 'leftBottomToTopHook',
})
macro('hd', {
from: points.point5,
to: points.point4,
y: points.pointY.y - sa - 25,
id: 'topHookToRight',
})
macro('hd', {
from: points.point1,
to: points.point3,
y: points.point1.y + sa + 15,
id: 'bottomLeftToRightCorner',
})
macro('hd', {
from: points.point3,
to: points.point4,
y: points.point1.y + sa + 15,
id: 'rightCornerToRight',
noStartMarker: true,
noEndMarker: true,
})
macro('vd', {
from: points.point1,
to: points.point5,
x: points.point1.x - sa - 15,
id: 'bottomToTopHook',
})
macro('vd', {
from: points.point1,
to: points.point0,
x: points.point1.x - sa - 25,
id: 'bottomToTopLeft',
})
macro('vd', {
from: points.point1,
to: points.pointY,
x: points.point1.x - sa - 35,
id: 'totalHeight',
})
macro('vd', {
from: points.pointY,
to: points.point3,
x: points.point4.x + sa + 25,
id: 'rightCornerToTop',
})
macro('vd', {
from: points.point4,
to: points.point3,
x: points.point4.x + sa + 15,
id: 'rightCornerToRight',
})
return part
},
}

View file

@ -0,0 +1,89 @@
import { cheek } from './cheek.mjs'
export const lowermouth = {
name: 'skully.lowermouth',
after: cheek,
draft: ({ Point, Path, points, paths, sa, complete, store, macro, part }) => {
const textAttribute = 'text-xs center'
const sizeFactor = store.get('sizeFactor')
points.point0 = new Point(0, 0)
points.point1 = points.point0.shift(270, 66.14600000000002 * sizeFactor)
points.point1Cp1 = points.point1.shift(0, 0 * sizeFactor)
points.point0Cp2 = points.point0.shift(0, 0 * sizeFactor)
points.point2 = points.point0.shift(219.80599709691597, 51.66121657491237 * sizeFactor)
points.point0 = new Point(0, 0)
points.point0Cp1 = points.point0.shift(0, 0 * sizeFactor)
points.point1 = points.point0.shift(222.41579397130369, 49.03292752740774 * sizeFactor)
points.point2 = points.point0.shift(270, 66.14600000000002 * sizeFactor)
points.point2Cp2 = points.point2.shift(0, 0 * sizeFactor)
points.point1.x = points.point0.x - points.point0.dist(points.point2) / 2
points.point1Cp1 = points.point1.shift(270, 33.0746752291626 * sizeFactor)
points.point1Cp2 = points.point1.shift(90, 33.0746752291626 * sizeFactor)
paths.mouth1 = new Path()
.move(points.point0)
.curve(points.point0Cp1, points.point1Cp2, points.point1)
.setText(complete ? 'mouthBottom' + ' (13)' : '', textAttribute)
.addClass('hidden')
paths.mouth2 = new Path()
.move(points.point1)
.curve(points.point1Cp1, points.point2Cp2, points.point2)
.setText(complete ? 'mouthBottom' + ' (13)' : '', textAttribute)
.addClass('hidden')
paths.backOfMouth = new Path()
.move(points.point2)
.line(points.point0)
.setText(complete ? 'backOfMouth' + ' (11)' : '', textAttribute)
.addClass('hidden')
store.set('mouthWidth', points.point0.dist(points.point2))
paths.seam = new Path()
.move(points.point0)
.curve(points.point0Cp1, points.point1Cp2, points.point1)
.curve(points.point1Cp1, points.point2Cp2, points.point2)
.line(points.point0)
.close()
store.cutlist.addCut({ cut: 1, from: 'Fabric' })
points.gridAnchor = points.point1.clone()
points.title = points.point0
.shiftFractionTowards(points.point2, 0.25)
.shiftFractionTowards(points.point1, 0.6)
macro('title', {
nr: 10,
at: points.title,
scale: 0.25,
rotation: 90,
title: 'lowerMouth',
})
// points.logo = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)
// snippets.logo = new Snippet('logo', points.logo)
// points.text = points.logo
// .shift(-90, w / 8)
if (sa) {
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
}
macro('hd', {
from: points.point1,
to: points.point0,
y: points.point0.y - sa - 15,
id: 'width',
})
macro('vd', {
from: points.point0,
to: points.point2,
x: points.point0.x + sa + 15,
id: 'height',
})
return part
},
}

215
designs/skully/src/nose.mjs Normal file
View file

@ -0,0 +1,215 @@
import { cheek } from './cheek.mjs'
import { eye } from './eye.mjs'
import { forehead } from './forehead.mjs'
export const nose = {
name: 'skully.nose',
after: [cheek, forehead, eye],
draft: ({
Point,
Path,
points,
paths,
Snippet,
snippets,
sa,
complete,
log,
store,
macro,
part,
}) => {
const textAttribute = 'text-xs center'
const noseSide = store.get('noseSide')
const noseHeight = store.get('noseHeight')
points.point0 = new Point(0, 0)
points.point2 = points.point0.shift(90, noseHeight)
points.point0Cp1 = points.point0.shift(315, noseHeight)
points.point2Cp2 = points.point2.shift(325, noseHeight / 3)
paths.p1 = new Path()
.move(points.point0)
.curve(points.point0Cp1, points.point2Cp2, points.point2)
.hide()
points.pRotate = points.point0.shift(30, noseHeight)
paths.p0p1 = new Path().move(points.point0).line(points.point2).setClass('dashed mark')
points.point1 = points.pRotate.shiftTowards(points.point2, noseHeight * -1)
points.point1Cp2 = points.point1.shift(points.point1.angle(points.point2) + 55, noseHeight / 3)
var iterations = 0
var pl
do {
iterations++
points.point1 = points.point1.rotate(-0.5, points.point2)
points.point1Cp2 = points.point1Cp2.rotate(-0.5, points.point2)
points.point0Cp1 = points.point0Cp1.rotate(-0.5, points.point2)
paths.p1 = new Path()
.move(points.point0)
.curve(points.point0Cp1, points.point1Cp2, points.point1)
.setText(complete ? 'nose' + ' (10)' : '', textAttribute)
pl = paths.p1.length()
} while (iterations < 100 && pl - noseSide > 1)
if (iterations >= 100) {
log.error('Generating nose could not be made to fit in 100 iterations!')
}
points.pMiddle1 = points.point2.shiftFractionTowards(points.point1, 0.5)
points.point3 = points.point1.flipX()
points.point3Cp1 = points.point1Cp2.flipX()
points.point0Cp2 = points.point0Cp1.flipX()
points.pMiddle2 = points.pMiddle1.flipX()
paths.p2 = new Path()
.move(points.point3)
.curve(points.point3Cp1, points.point0Cp2, points.point0)
.setText(complete ? 'nose' + ' (10)' : '', textAttribute)
paths.seam = new Path()
.move(points.point0)
.join(paths.p1)
.line(points.point2)
.line(points.point3)
.join(paths.p2)
.close()
store.cutlist.addCut({ cut: 1, from: 'Fabric' })
points.gridAnchor = points.point0.clone()
points.title = points.point0.shiftFractionTowards(points.point3, 0.5)
macro('title', {
nr: 12,
at: points.title,
scale: 0.15,
rotation: 325,
title: 'nose',
})
snippets.n1 = new Snippet('bnotch', points.point0)
snippets.n2 = new Snippet('notch', points.point1)
snippets.n3 = new Snippet('notch', points.point2)
snippets.n4 = new Snippet('notch', points.point3)
macro('sewtogether', {
from: points.point1.shiftFractionTowards(points.point2, 0.25),
to: points.point1.shiftFractionTowards(points.point2, 0.75),
hinge: true,
id: 'st1',
})
macro('sewtogether', {
from: points.point2.shiftFractionTowards(points.point3, 0.25),
to: points.point2.shiftFractionTowards(points.point3, 0.75),
hinge: true,
id: 'st2',
})
// points.logo = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)
// snippets.logo = new Snippet('logo', points.logo)
// points.text = points.logo
// .shift(-90, w / 8)
if (sa) {
// Doing a trim() on the SA will remove the wrong part of the SA ;-)
// paths.sa = paths.seam.offset(sa).trim().attr('class', 'fabric sa')
const pathSA1 = new Path()
.move(points.point0)
.join(paths.p1)
.line(points.point2)
.offset(sa)
.addClass('hidden')
const pathSA2 = new Path()
.move(points.point2)
.line(points.point3)
.curve(points.point3Cp1, points.point0Cp2, points.point0)
.offset(sa)
.addClass('hidden')
const pSa1 = pathSA1.intersectsX(0)[0]
paths.sa1 = pathSA1.split(pSa1)[1].hide()
const pSa2 = pathSA2.intersectsX(0)[0]
paths.sa2 = pathSA2.split(pSa2)[0].hide()
paths.sa = new Path()
.move(pSa1)
.join(paths.sa1)
.join(paths.sa2)
.close()
.attr('class', 'fabric sa')
}
points.pointY1 = new Path()
.move(points.point0)
.curve(points.point0Cp1, points.point1Cp2, points.point1)
.edge('bottom')
points.pointY2 = new Path()
.move(points.point0)
.curve(points.point0Cp2, points.point3Cp1, points.point3)
.edge('bottom')
macro('vd', {
from: points.point2,
to: points.point1,
x: points.point1.x + sa + 5,
id: 'heightRight',
noStartMarker: true,
noEndMarker: true,
})
macro('vd', {
from: points.pointY1,
to: points.point2,
x: points.point3.x - sa - 5,
id: 'heightLeft',
noStartMarker: true,
noEndMarker: true,
})
macro('hd', {
from: points.point0,
to: points.point1,
y: points.point2.y - sa - 5,
id: 'widthRight',
noStartMarker: true,
noEndMarker: true,
})
macro('hd', {
from: points.point3,
to: points.point0,
y: points.point2.y - sa - 5,
id: 'widthLeft',
noStartMarker: true,
noEndMarker: true,
})
macro('hd', {
from: points.pointY1,
to: points.point1,
y: points.pointY2.y + sa + 5,
id: 'bottomToRight',
noStartMarker: true,
noEndMarker: true,
})
macro('hd', {
from: points.pointY2,
to: points.pointY1,
y: points.pointY2.y + sa + 5,
id: 'leftToRight',
noStartMarker: true,
noEndMarker: true,
})
macro('hd', {
from: points.point3,
to: points.pointY2,
y: points.pointY2.y + sa + 5,
id: 'leftToBottom',
noStartMarker: true,
noEndMarker: true,
})
return part
},
}

View file

@ -0,0 +1,305 @@
import { cheek } from './cheek.mjs'
import { head1 } from './head1.mjs'
import { lowermouth } from './lowermouth.mjs'
export const uppermouth = {
name: 'skully.uppermouth',
after: [cheek, head1, lowermouth],
draft: ({ Point, Path, points, paths, sa, complete, store, macro, part }) => {
const textAttribute = 'text-xs center'
const sizeFactor = store.get('sizeFactor')
points.point0 = new Point(0, 0)
points.point6 = points.point0.shift(0.11139916029446559, 128.58224303534288 * sizeFactor)
points.point6Cp2 = points.point6.shift(269.8182450112891, 5.359026963917993 * sizeFactor)
points.point5 = points.point0.shift(328.14341716244707, 120.52788940738986 * sizeFactor)
points.point5Cp1 = points.point5.shift(29.114015378370315, 25.571930803128662 * sizeFactor)
points.point4 = points.point0.shift(317.9233666855834, 95.68080416154534 * sizeFactor)
points.point4Cp2 = points.point4.shift(178.12857030706965, 15.433231709528583 * sizeFactor)
points.point3 = points.point0.shift(312.29520434983914, 55.53156468171955 * sizeFactor)
points.point3Cp2 = points.point3.shift(90, 6.745097849549684 * sizeFactor)
points.point3Cp1 = points.point3.shift(270, 23.140963009347697 * sizeFactor)
points.point2 = points.point0.shift(312.62624217423604, 44.01273783803957 * sizeFactor)
points.point2Cp1 = points.point2.shift(358.24231642721344, 5.05337768230318 * sizeFactor)
points.point1 = points.point0.shift(270, 32.77328218228992 * sizeFactor)
points.point1 = points.point1.shift(
90,
points.point0.dist(points.point1) - store.get('mouthWidth') / 2
)
points.point2 = points.point2.shift(
90,
points.point0.dist(points.point1) - store.get('mouthWidth') / 2
)
points.point2Cp1 = points.point2.shift(358.24231642721344, 5.05337768230318 * sizeFactor)
points.point3 = points.point3.shift(
90,
points.point0.dist(points.point1) - store.get('mouthWidth') / 2
)
points.point3Cp1 = points.point3.shift(270, 23.140963009347697 * sizeFactor)
points.point3Cp2 = points.point3.shift(90, 6.745097849549684 * sizeFactor)
points.point4 = points.point4.shift(
90,
points.point0.dist(points.point1) - store.get('mouthWidth') / 2
)
points.point4Cp2 = points.point4.shift(178.12857030706965, 15.433231709528583 * sizeFactor)
points.point5 = points.point4.shift(
0,
store.get('upperJaw') -
new Path()
.move(points.point1)
.line(points.point2)
.curve(points.point2Cp1, points.point3Cp2, points.point3)
.curve(points.point3Cp1, points.point4Cp2, points.point4)
.length()
)
points.point5Cp1 = points.point5.shift(0, 9 * sizeFactor)
points.point6 = new Point(points.point5.x, points.point0.y).shift(0, points.point5.x * 0.2)
points.point6Cp2 = points.point6.shift(270, 5 * sizeFactor)
points.pointM1 = points.point0.shift(180, store.get('mouthWidth') / 2)
points.pointM1Cp1 = points.pointM1.shift(270, 33.0746752291626 * sizeFactor)
paths.backOfUpperJaw = new Path()
.move(points.point5)
.curve(points.point5Cp1, points.point6Cp2, points.point6)
.setText(complete ? 'not sewn' : '', textAttribute)
.addClass('hidden')
points.lowerJaw = paths.backOfUpperJaw.shiftAlong(store.get('upperJawToLowerJaw'))
var ljAngle = points.lowerJaw.angle(
paths.backOfUpperJaw.shiftAlong(store.get('upperJawToLowerJaw') + 1)
)
store.set('halfOfBack', paths.backOfUpperJaw.length() - store.get('upperJawToLowerJaw'))
points.point2ToLowerJaw = points.point2.shift(0, points.point2.dist(points.lowerJaw) / 2)
points.lowerJawToPoint2 = points.lowerJaw.shift(
ljAngle + 90,
points.point2.dist(points.lowerJaw) / 3
)
macro('mirror', {
mirror: [points.pointM1, points.point6],
points: [
'point0',
'lowerJaw',
'lowerJawToPoint2',
'point2ToLowerJaw',
'pointM1Cp1',
'point1',
'point2',
'point2Cp1',
'point3',
'point3Cp1',
'point3Cp2',
'point4',
'point4Cp2',
'point5',
'point5Cp1',
'point6Cp2',
],
prefix: 'm',
})
paths.upperJaw1 = new Path()
.move(points.point1)
.line(points.point2)
.curve(points.point2Cp1, points.point3Cp2, points.point3)
.curve(points.point3Cp1, points.point4Cp2, points.point4)
.line(points.point5)
.setText(complete ? 'upperJaw' + ' (16)' : '', textAttribute)
.addClass('hidden')
paths.upperJaw2 = new Path()
.move(points.mPoint5)
.line(points.mPoint4)
.curve(points.mPoint4Cp2, points.mPoint3Cp1, points.mPoint3)
.curve(points.mPoint3Cp2, points.mPoint2Cp1, points.mPoint2)
.line(points.mPoint1)
.setText(complete ? 'upperJaw' + ' (16)' : '', textAttribute)
.addClass('hidden')
paths.front1 = new Path()
.move(points.pointM1)
.curve_(points.pointM1Cp1, points.point1)
.setText(complete ? '(16)' : '', textAttribute)
.addClass('hidden')
paths.front2 = new Path()
.move(points.mPoint1)
.curve_(points.mPointM1Cp1, points.pointM1)
.setText(complete ? '(16)' : '', textAttribute)
.addClass('hidden')
paths.backOfUpperJaw.curve(points.mPoint6Cp2, points.mPoint5Cp1, points.mPoint5)
paths.seam = new Path()
.move(points.point1)
.join(paths.upperJaw1)
.join(paths.backOfUpperJaw)
.join(paths.upperJaw2)
.join(paths.front2)
.join(paths.front1)
.close()
paths.backOfMouth = new Path()
.move(points.mPoint1)
.line(points.point1)
.setText(complete ? 'backOfMouth' + ' (11)' : '', textAttribute)
.setClass('dashed')
paths.lowerJaw1 = new Path()
.move(points.point2)
.curve(points.point2ToLowerJaw, points.lowerJawToPoint2, points.lowerJaw)
.setText(complete ? 'lowerJaw' + ' (14)' : '', textAttribute)
.setClass('dashed')
paths.lowerJaw2 = new Path()
.move(points.mPoint2)
.curve(points.mPoint2ToLowerJaw, points.mLowerJawToPoint2, points.mLowerJaw)
.setText(complete ? 'lowerJaw' + ' (14)' : '', textAttribute)
.setClass('dashed')
paths.backOfUpperJaw1 = new Path()
.move(points.point5)
.line(points.lowerJaw)
.setText(complete ? '21' : '', textAttribute)
.addClass('hidden')
paths.backOfUpperJaw2 = new Path()
.move(points.mLowerJaw)
.line(points.mPoint5)
.setText(complete ? '21' : '', textAttribute)
.addClass('hidden')
store.set('lowerJaw', paths.lowerJaw1.length() + points.point1.dist(points.point2))
store.cutlist.addCut({ cut: 1, from: 'Fabric' })
points.gridAnchor = points.point0.clone()
points.title = points.pointM1.shiftFractionTowards(points.point6, 0.5)
macro('title', {
nr: 7,
at: points.title,
scale: 0.5,
title: 'upperMouth',
})
// points.logo = points.topLeft.shiftFractionTowards(points.bottomRight, 0.5)
// snippets.logo = new Snippet('logo', points.logo)
// points.text = points.logo
// .shift(-90, w / 8)
if (sa) {
// Doing a trim() here has a weird issue. Part of the SA, related to
// the point1->point2 line, will disappear.
// paths.sa = paths.seam.offset(sa).trim().attr('class', 'fabric sa')
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
}
macro('hd', {
from: points.pointM1,
to: points.point1,
y: points.point5.y + sa + 15,
id: 'leftToBOM',
})
macro('hd', {
from: points.point1,
to: points.point3,
y: points.point5.y + sa + 15,
id: 'BOMtoCorner',
})
macro('hd', {
from: points.point3,
to: points.point5,
y: points.point5.y + sa + 15,
id: 'cornerToRight',
})
macro('hd', {
from: points.point5,
to: points.point6,
y: points.point5.y + sa + 15,
id: 'rightToMiddle',
noStartMarker: true,
noEndMarker: true,
})
macro('hd', {
from: points.pointM1,
to: points.point6,
y: points.mPoint5.y - sa - 15,
id: 'totalWidth',
})
macro('vd', {
from: points.point6,
to: points.point5,
x: points.point6.x + sa + 15,
id: 'bottomToMiddle',
})
macro('vd', {
from: points.mPoint5,
to: points.point6,
x: points.point6.x + sa + 15,
id: 'middleToTop',
})
macro('vd', {
from: points.mPoint1,
to: points.mPoint5,
x: points.pointM1.x - sa - 15,
id: 'topBOMtoTop',
noStartMarker: true,
noEndMarker: true,
})
macro('vd', {
from: points.point1,
to: points.mPoint1,
x: points.pointM1.x - sa - 15,
id: 'BOMheight1',
})
macro('vd', {
from: points.point5,
to: points.point1,
x: points.pointM1.x - sa - 15,
id: 'bottomToBottomBOM',
noStartMarker: true,
noEndMarker: true,
})
macro('vd', {
from: points.point2,
to: points.mPoint2,
x: points.point2.x,
id: 'BOMheight2',
})
macro('ld', {
from: points.point5,
to: points.lowerJaw,
d: 5,
id: 'bottomLowerJawIndicator',
noStartMarker: true,
noEndMarker: true,
})
macro('ld', {
from: points.lowerJaw,
to: points.point6,
d: 5,
id: 'bottomLowerJawIndicatorToMiddle',
})
macro('ld', {
from: points.point6,
to: points.mLowerJaw,
d: 5,
id: 'topLowerJawIndicatorToMiddle',
})
macro('ld', {
from: points.mLowerJaw,
to: points.mPoint5,
d: 5,
id: 'topLowerJawIndicator',
noStartMarker: true,
noEndMarker: true,
})
return part
},
}

View file

@ -0,0 +1,16 @@
// This file is auto-generated | Any changes you make will be overwritten.
import { Skully } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
testPatternConfig(Skully)
// Test drafting - Change the second parameter to `true` to log errors
testPatternDrafting(Skully, false)
// Test sampling - Change the second parameter to `true` to log errors
testPatternSampling(Skully, false)

View file

@ -0,0 +1,16 @@
---
title: "Skully: Cutting Instructions"
---
- **Main Fabric**
- Cut **2 Cheek**
- Cut **2 Forehead**
- Cut **2 Head part 1**
- Cut **2 Head part 2**
- Cut **2 Head part 3**
- Cut **2 Cheekbone**
- Cut **1 Upper Mouth**
- Cut **1 Jaw Floor**
- Cut **2 Eye **
- Cut **1 Lower Mouth **
- Cut **2 Lower Jaw **

View file

@ -0,0 +1,8 @@
---
title: Skully
---
import { DesignInfo } from 'shared/components/designs/info.mjs'
<DesignInfo design='skully' docs />

View file

@ -0,0 +1,21 @@
---
title: "Skully: Fabric Options"
---
## Main Fabric
This plush toy is best made from a felt type of fabric. This will provide extra rigidity to keep the shape
correct, while still allowing it to be a plush toy. Thin and stretchy fabrics are not well suited, because
the shape will change considerably due to tensions from the stuffing.
## Hair
Skully needs hair. Embrodery floss works very well, and can be had in all colors.
## Stuffing
Since this is a plush toy, it will need to be stuffed with material. Most of the time you'll want to use polyester fiberfill (polyfill), but if you have a lot of fabric scraps, you can use shredded scrap fabric. However this may be heavier and less soft than fiberfill. It's also worth thinking about whether your Hi may be at risk of getting dirty, or want to go for a swim, as not all stuffing options are washable.
## Needle
Skully has traded his sword for a needle. A needle this size is mostly sold as upholstery needles. This will come in handy when doing some of the touch-ups at the end of the construction.

View file

@ -0,0 +1,65 @@
---
title: "Skully: Sewing Instructions"
---
<Tip>
A lot of the smaller seams (eyes, nose) are best sewn by hand.
Most of the seams will benefit from being basted before being sewn.
</Tip>
## Step 1: The darts
There are six darts that need to be closed first. One on each, forhead, head2, and head3 parts. Pin and sew them closed, then remove the bulk by trimming the darts and give them a good press. Repeat for the all six darts.
## Step 2: The eyes
Sew together the sides of the eye, so you will make a cone. Trim away any bulk. Repeat for the other eye.
## Step 3: The nose
Like the eyes, the nose too has parts that need to be sewn together. There are two of these sides that need to be sew together. This creates two connected cones. This is very finicky, so take your time.
## Step 4: The head
<Tip>
The Skully pattern is set up to be sewn-by-numbers. Every seam is numbered. Please start at '1', and
keep going until you reach '21'. This is the seam through which you will fill Skully, so only close
it partly.
</Tip>
When you are sewing together the individual parts, you will be making two halves of the skull.
Sewing the eyes and nose to the cheek and forehead parts is best done by hand. You will have to align the different notches to their corresponding ones on the other part.
Sewing the lowerJaw to the lowerMouth and upperMouth is challenging. You will first be sewing a normal seam between the lowerJaw parts and the lowerMouth part. You will then have to continue this seam along
the dashed line (14) on the upperMouth part. Basting or lots of pins are your friend. And make sure you
first visualize how this will get together before doing the final sewing.
The back of the upperMouth is not sewn to anything. It is just there to provide stability.
## Step 5: Hair
Now is the time to add hair to skully. When putting the embroidery floss in, make sure you add knots on the inside, or else it is very easy to pull Skully's hair out later.
## Step 6: Stuffing
- Fill the plush toy with stuffing through the opening you left, making sure to fill all the parts
well. The areas in the front are the hardest to get to.
- _Slipsticth_ or _whipstitch_ the opening closed.
## Step 7: Tweaks
You can use the long upholstery needle to add some tweaks to Skully. Adding some stitches to attach the back of the eyes to corner of seams 14 and 21 right through the skull will help to keep the eyes from popping out, and can help with giving the head more form. The same applies to the nose.
It is also a good idea to add stitches between seams 5 and 14, along the length of both seams. This will make the cheek bones more pronounced and adds to the overall shape of the skull.
## Step 7: Enjoy!
That's it, you are all done. Start planning what pirate sewing ship you'll be joining!

View file

@ -0,0 +1,7 @@
---
title: "Skully: Optional Measurements"
---
<Note>
Skully does not require any measurements, but it can use the head circumference measurement. If used, Skully will be approximately the same size as your head.
</Note>

View file

@ -0,0 +1,19 @@
---
title: "Skully: What You Need"
---
To make Skully, you will need the following:
- [Basic sewing supplies](/docs/sewing/basic-sewing-supplies)
- About 0.5 meters (0.6 yards) of a suitable fabric ([see Skully Fabric options](/docs/patterns/skully/fabric/))
- Stuffing
- Embroidery floss for the hair
- Appropriately sized upholstery needle
<Note>
This list is based on a default Skully and you may need less or more fabric dependant on the [size you are making Skully](/docs/patterns/skully/options/size/).
For instance a 300% Skully will need 1.5 meters (0.5 meter x 300% = 1.5 meters) and a 50% skully will need 0.25 meters (0.5 meter x 50% = 0.25 meters).
</Note>

View file

@ -0,0 +1,6 @@
---
title: "Skully: Designer Notes"
---
<Fixme>Wouter designed this. They have not written any notes (yet)</Fixme>

View file

@ -0,0 +1,5 @@
---
title: "Skully: Design Options"
---
<PatternOptions pattern='skully' />

View file

@ -0,0 +1,8 @@
---
title: "Size"
---
Skully can be made in different sizes. The default is about 75% of a normal human head (about 16cm high).
If you set the percentage to 100%, and you enter your own head measurwement, Skully will
be approximately the size of your head.

View file

@ -0,0 +1,17 @@
---
title: "Skully (the logo): Cutting Instructions"
---
- **Main fabric**
- Cut **2 cheek** parts
- Cut **2 forehead** parts
- Cut **2 head1** parts
- Cut **2 head2** parts
- Cut **2 head3** parts
- Cut **2 cheekbone** parts
- Cut **1 lowermouth** part
- Cut **1 jawFloor** part
- Cut **2 eye** parts
- Cut **1 uppermouth** part
- Cut **2 lowerJaw** parts
- Cut **1 nose** part

View file

@ -0,0 +1,5 @@
---
title: Skully (the logo)
---
<PatternDocs pattern='skully' />

View file

@ -0,0 +1,19 @@
---
title: "Skully (the logo): Fabric Options"
---
## Main Fabric
This plush toy is best made from a felt type fabrics. This will provide extra rigidity to keep the shape correct, while still allowing it to be a plush toy. Thin and stretchy fabrics are not well suited, because the shape will change considerably due to tensions from the stuffing.
## Stuffing
Since this is a plush toy, it will need to be stuffed with material. Most of the time you'll want to use polyester fiberfill (polyfill), but if you have a lot of fabric scraps, you can use shredded scrap fabric. However this may be heavier and less soft than fiberfill. It's also worth thinking about whether your Skully may be at risk of getting dirty as not all stuffing options are washable.
## Hair
Skully needs hair. Embroidery floss works very well, and can be had in all colors.
## Needle
Skully has traded his sword for a needle. A needle this size is mostly sold as upholstery needles. This will come in handy when doing some of the touch-ups at the end of the construction.

View file

@ -0,0 +1,72 @@
---
title: "Skully (the logo): Sewing Instructions"
---
<Tip>
A lot of the smaller seams (eyes, nose) are best sewn by hand.
Most of the seams will benefit from being basted before being sewn.
</Tip>
## Step 1: The darts
There are three darts that need to be closed first. Pin and sew them, then remove the extra fabric and
give them a good press. Repeat for the other three darts.
## Step 2: The eyes
Sew together the sides of the eye, so you will make a cone. Cut away any excess seam allowance. Repeat for the other eye
## Step 3: The nose
Like the eyes, the nose has seams that need to be sewn together. Sew the two straight seams together creating two connected cones. This is very finicky, so take your time.
## Step 4: The head
<Tip>
The Skully pattern is set up to be sewn-by-numbers. Every seam is numbered. Please start at '1', and
keep going until you reach '21'. This is the seam through which you will fill Skully, so only close
it partly.
</Tip>
When you are sewing together the individual parts, you will be making two halves of the skull.
Sewing the eyes and nose to the cheek and forehead parts is best done by hand. You will have to align
the different notches to their corresponding ones on the other part.
Sewing the lowerJaw to the lowerMouth and upperMouth is challenging. You will be making a normal seam
between the lowerJaw parts and the lowerMouth part. You will then have to continue this seam along
the dashed line (14) on the upperMouth part. Baste or lots of pins are your friend. And make sure you
first visualize how this will get together before doing the final sewing.
The back of the upperMouth is not sewn to anything. It is just there to provide stability.
## Step 5: Hair
Now is the time to add hair to skully. When putting the embroidery floss in, make sure you add knots
on the inside, or else it is very easy to pull Skully's hair out later. I threaded two pieces of floss
through a needle, and stick it from the outside through the head. Then make an overhand knot, and push
the needle back out. You should make shorter hair towards the outside, and longer in the middle.
## Step 6: Stuffing
- Fill the plush toy with stuffing through the opening you left, making sure to fill all the parts
well. The areas in the front are the hardest to get to.
- _Slipsticth_ or _whipstitch_ the opening closed.
## Step 6: Tweaks
You can use the long upholstery needle to add some tweaks to Skully. Adding some stitches, attaching
the back of the eyes to corner of seams 14 and 21 right through the skull helps with keeping the
eyes from popping out, and can help with giving the head more form. The same applies to the nose.
It is also a good isea to add stitches between seams 5 and 14, along the length of both seams. This
will make the cheek bones more pronounced and adds to the overall shape of the skull.
## Step 7: Enjoy!
That's it, you are all done. Start planning what pirate sewing ship you'll be joining!

View file

@ -0,0 +1,7 @@
---
title: "Skully (the logo): Required Measurements"
---
<Note>
Skully does not require any measurements, but it can use the head circumference measurement. If used, Skully will be approximately 75%, or any other percentage, of the size of your head.
</Note>

View file

@ -0,0 +1,19 @@
---
title: "Skully (the logo): What You Need"
---
To make Skully, you will need the following:
- [Basic sewing supplies](/docs/sewing/basic-sewing-supplies)
- About 0.5 meters (0.6 yards) of a suitable fabric ([see Skully Fabric options](/docs/patterns/skully/fabric/))
- Stuffing
- Embroidery floss for the hair
- Appropriately sized upholstery needle
<Note>
This list is based on a default Skully and you may need less or more fabric dependant on the [size you are making Skully](/docs/patterns/skully/options/size/).
For instance a 300% Skully will need 1.5 meters (0.5 meter x 300% = 1.5 meters) and a 50% skully will need 0.25 meters (0.5 meter x 50% = 0.25 meters).
</Note>

View file

@ -0,0 +1,5 @@
---
title: "Skully (the logo): Design Options"
---
<PatternOptions pattern='skully' />

View file

@ -0,0 +1,10 @@
---
title: "Size"
---
Skully can be made in different sizes. The default is about 75% of an averge human head.
This is a percentage of the default head circumference.
If you set the percentage to 100%, and you enter your own head measurwement, Skully will
be approximately the size of your head.

View file

@ -37,6 +37,7 @@ import { Sandy as sandy } from '@freesewing/sandy'
import { Shin as shin } from '@freesewing/shin' import { Shin as shin } from '@freesewing/shin'
import { Simon as simon } from '@freesewing/simon' import { Simon as simon } from '@freesewing/simon'
import { Simone as simone } from '@freesewing/simone' import { Simone as simone } from '@freesewing/simone'
import { Skully as skully } from '@freesewing/skully'
import { Sven as sven } from '@freesewing/sven' import { Sven as sven } from '@freesewing/sven'
import { Tamiko as tamiko } from '@freesewing/tamiko' import { Tamiko as tamiko } from '@freesewing/tamiko'
import { Teagan as teagan } from '@freesewing/teagan' import { Teagan as teagan } from '@freesewing/teagan'
@ -85,6 +86,7 @@ const designs = {
shin, shin,
simon, simon,
simone, simone,
skully,
sven, sven,
tamiko, tamiko,
teagan, teagan,