1
0
Fork 0

Merge branch 'develop' into joost

This commit is contained in:
joostdecock 2024-02-04 10:17:39 +01:00
commit 038d0f3903
1612 changed files with 13707 additions and 3916 deletions

View file

@ -1122,6 +1122,33 @@
"contributions": [
"code"
]
},
{
"login": "jpmunic",
"name": "Josh Munic",
"avatar_url": "https://avatars.githubusercontent.com/u/13474972?v=4",
"profile": "https://github.com/jpmunic",
"contributions": [
"bug"
]
},
{
"login": "LunaticMuch",
"name": "Stefano",
"avatar_url": "https://avatars.githubusercontent.com/u/1659414?v=4",
"profile": "https://stefanocislaghi.com",
"contributions": [
"doc"
]
},
{
"login": "pvidas",
"name": "Paula Vidas",
"avatar_url": "https://avatars.githubusercontent.com/u/38463064?v=4",
"profile": "https://github.com/pvidas",
"contributions": [
"code"
]
}
],
"skipCi": true,

View file

@ -1,4 +1,12 @@
name: Playwright Tests
on: [push]
jobs:
noop:
runs-on: ubuntu-latest
steps:
- run: echo Noop.
# While it's nice to test e2e tests, it's not all that useful to run them on alpha code
#on:
# push:

View file

@ -1,4 +1,12 @@
name: Test new-design
on: [push]
jobs:
noop:
runs-on: ubuntu-latest
steps:
- run: echo Noop.
#on:
# push:
# branches:

View file

@ -60,108 +60,111 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<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://github.com/jpmunic"><img src="https://avatars.githubusercontent.com/u/13474972?v=4?s=100" width="100px;" alt="Josh Munic"/><br /><sub><b>Josh Munic</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3Ajpmunic" title="Bug reports">🐛</a></td>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kristinruben"><img src="https://avatars.githubusercontent.com/u/17237479?v=4?s=100" width="100px;" alt="Kristin Ruben"/><br /><sub><b>Kristin Ruben</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=kristinruben" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/compilin"><img src="https://avatars.githubusercontent.com/u/40794281?v=4?s=100" width="100px;" alt="Lin"/><br /><sub><b>Lin</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=compilin" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Loudepeuter"><img src="https://avatars.githubusercontent.com/u/38081954?v=4?s=100" width="100px;" alt="Loudepeuter"/><br /><sub><b>Loudepeuter</b></sub></a><br /><a href="#translation-Loudepeuter" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lucibytes"><img src="https://avatars.githubusercontent.com/u/77203781?v=4?s=100" width="100px;" alt="Lucian"/><br /><sub><b>Lucian</b></sub></a><br /><a href="#eventOrganizing-lucibytes" title="Event Organizing">📋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/luizfzs"><img src="https://avatars.githubusercontent.com/u/6039675?v=4?s=100" width="100px;" alt="Luiz Saggioro"/><br /><sub><b>Luiz Saggioro</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=luizfzs" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MA-TATAS"><img src="https://avatars.githubusercontent.com/u/125549564?v=4?s=100" width="100px;" alt="MA-TATAS"/><br /><sub><b>MA-TATAS</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=MA-TATAS" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/manufakturedelweiss"><img src="https://avatars.githubusercontent.com/u/38063391?v=4?s=100" width="100px;" alt="Marcus"/><br /><sub><b>Marcus</b></sub></a><br /><a href="#translation-manufakturedelweiss" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/martintribo"><img src="https://avatars.githubusercontent.com/u/1613442?v=4?s=100" width="100px;" alt="Martin Tribo"/><br /><sub><b>Martin Tribo</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=martintribo" title="Documentation">📖</a></td>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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/pvidas"><img src="https://avatars.githubusercontent.com/u/38463064?v=4?s=100" width="100px;" alt="Paula Vidas"/><br /><sub><b>Paula Vidas</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=pvidas" title="Code">💻</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>
<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>
</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>
<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>
</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/sohamtembhurne"><img src="https://avatars.githubusercontent.com/u/82658685?v=4?s=100" width="100px;" alt="Soham Tembhurne"/><br /><sub><b>Soham Tembhurne</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=sohamtembhurne" title="Code">💻</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="https://www.sophiah.gay/"><img src="https://avatars.githubusercontent.com/u/10786212?v=4?s=100" width="100px;" alt="Sophia"/><br /><sub><b>Sophia</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=SophiaH67" title="Code">💻</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://stefanocislaghi.com"><img src="https://avatars.githubusercontent.com/u/1659414?v=4?s=100" width="100px;" alt="Stefano"/><br /><sub><b>Stefano</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=LunaticMuch" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/biswassushmita947"><img src="https://avatars.githubusercontent.com/u/145688707?v=4?s=100" width="100px;" alt="Sushmita Biswas"/><br /><sub><b>Sushmita Biswas</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=biswassushmita947" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TheTanay902"><img src="https://avatars.githubusercontent.com/u/84577440?v=4?s=100" width="100px;" alt="Tanay Toshniwal"/><br /><sub><b>Tanay Toshniwal</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=TheTanay902" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/trentonTrama"><img src="https://avatars.githubusercontent.com/u/41126812?v=4?s=100" width="100px;" alt="Trent Trama"/><br /><sub><b>Trent Trama</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=trentonTrama" title="Code">💻</a></td>
</tr>
<tr>
<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/ArcticCoder"><img src="https://avatars.githubusercontent.com/u/39151688?v=4?s=100" width="100px;" alt="Vili Sinervä"/><br /><sub><b>Vili Sinervä</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=ArcticCoder" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VSinerva"><img src="https://avatars.githubusercontent.com/u/39151688?v=4?s=100" width="100px;" alt="Vili Sinervä"/><br /><sub><b>Vili Sinervä</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=VSinerva" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/woutervdub"><img src="https://avatars.githubusercontent.com/u/24414629?v=4?s=100" width="100px;" alt="Wouter van Wageningen"/><br /><sub><b>Wouter van Wageningen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=woutervdub" title="Code">💻</a> <a href="#design-woutervdub" title="Design">🎨</a> <a href="#tool-woutervdub" title="Tools">🔧</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Yash-Ambekar"><img src="https://avatars.githubusercontent.com/u/96481913?v=4?s=100" width="100px;" alt="Yash Anil Ambekar"/><br /><sub><b>Yash Anil Ambekar</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Yash-Ambekar" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/amysews"><img src="https://avatars.githubusercontent.com/u/25280778?v=4?s=100" width="100px;" alt="amysews"/><br /><sub><b>amysews</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=amysews" title="Documentation">📖</a></td>
</tr>
<tr>
<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>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bobgeorgethe3rd"><img src="https://avatars.githubusercontent.com/u/16866285?v=4?s=100" width="100px;" alt="bobgeorgethe3rd"/><br /><sub><b>bobgeorgethe3rd</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=bobgeorgethe3rd" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=bobgeorgethe3rd" title="Documentation">📖</a> <a href="#design-bobgeorgethe3rd" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/brmlyklr"><img src="https://avatars.githubusercontent.com/u/22308713?v=4?s=100" width="100px;" alt="brmlyklr"/><br /><sub><b>brmlyklr</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=brmlyklr" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.chrisbarrett.fr"><img src="https://avatars.githubusercontent.com/u/2373249?v=4?s=100" width="100px;" alt="chri5b"/><br /><sub><b>chri5b</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=chri5b" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=chri5b" title="Tests">⚠️</a></td>
</tr>
<tr>
<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>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/evilrobotfromouterspace"><img src="https://avatars.githubusercontent.com/u/143673955?v=4?s=100" width="100px;" alt="evilrobotfromouterspace"/><br /><sub><b>evilrobotfromouterspace</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3Aevilrobotfromouterspace" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fightingrabbit"><img src="https://avatars.githubusercontent.com/u/25751445?v=4?s=100" width="100px;" alt="fightingrabbit"/><br /><sub><b>fightingrabbit</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=fightingrabbit" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DocSpencer77"><img src="https://avatars.githubusercontent.com/u/43393580?v=4?s=100" width="100px;" alt="gaylyndie"/><br /><sub><b>gaylyndie</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=DocSpencer77" title="Documentation">📖</a></td>
</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>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marpants"><img src="https://avatars.githubusercontent.com/u/61366665?v=4?s=100" width="100px;" alt="marpants"/><br /><sub><b>marpants</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=marpants" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://tech.lgbt/@mergerg"><img src="https://avatars.githubusercontent.com/u/64447714?v=4?s=100" width="100px;" alt="mergerg"/><br /><sub><b>mergerg</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=raphaelsiz" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mesil"><img src="https://avatars.githubusercontent.com/u/14284175?v=4?s=100" width="100px;" alt="mesil"/><br /><sub><b>mesil</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3Amesil" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/starfetch"><img src="https://avatars.githubusercontent.com/u/80041179?v=4?s=100" width="100px;" alt="starfetch"/><br /><sub><b>starfetch</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=starfetch" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=starfetch" title="Documentation">📖</a> <a href="#translation-starfetch" title="Translation">🌍</a> <a href="#design-starfetch" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/timorl"><img src="https://avatars.githubusercontent.com/u/4363804?v=4?s=100" width="100px;" alt="timorl"/><br /><sub><b>timorl</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=timorl" title="Code">💻</a></td>
<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>
</tr>
<tr>
<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>
</tr>
<tr>
<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>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 17 KiB

View file

@ -834,6 +834,21 @@
"lining"
]
},
"tristan": {
"code": "Wouter van Wageningen",
"description": "A FreeSewing pattern for a fitted top with prince(ss) seams",
"design": "Natalia Sayang",
"difficulty": 3,
"lab": true,
"org": true,
"tags": [
"tops"
],
"techniques": [
"curvedSeam",
"precision"
]
},
"uma": {
"code": "Joost De Cock",
"description": "A FreeSewing pattern for a basic, highly-customizable underwear pattern",

View file

@ -56,7 +56,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -55,7 +55,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -56,7 +56,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -55,7 +55,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -8,7 +8,10 @@
"sleevecap": "Sleevecap",
"sleeve": "Sleeve"
},
"s": {},
"s": {
"largeShoulderWidth.t": "Shoulder Width larger than anticipated",
"largeShoulderWidth.d": "The pattern was not able to generate an optimal armhole shape using the given measurements and options. Please be aware that the generated pattern may not be correct. Please retake your measurements, verify that they are correct, and try generating a new pattern with the new measurements."
},
"o": {
"acrossBackFactor": {
"t": "Across back factor",

View file

@ -55,7 +55,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -125,6 +125,12 @@ export const base = {
(measurements.chest * (1 + options.chestEase)) / 4,
points.cbArmhole.y
)
if (points.shoulder.x >= points.armhole.x)
store.flag.warn({
msg: 'brian:largeShoulderWidth',
})
points.waist = new Point(points.armhole.x, points.cbWaist.y)
points.hips = new Point(points.armhole.x, points.cbHips.y)
points.hem = new Point(points.armhole.x, points.cbHem.y)

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -58,7 +58,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -57,7 +57,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -167,13 +167,10 @@ function draftCarltonCollar({ sa, points, options, macro, paths, Path, part, sto
._curve(points.topLeftCp, points.topLeft)
paths.seam = paths.saBase.clone().line(points.standTop).close().attr('class', 'fabric')
if (sa)
paths.sa = paths.saBase
.offset(sa)
.line(points.topLeft)
.move(points.standTop)
.line(paths.sa.start())
.addClass('fabric sa')
if (sa) {
paths.sa = paths.saBase.offset(sa).line(points.topLeft)
paths.sa.move(points.standTop).line(paths.sa.start()).addClass('fabric sa')
}
/*
* Annotations

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -56,7 +56,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -56,7 +56,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -50,7 +50,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -57,7 +57,7 @@
},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -56,7 +56,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -7,24 +7,21 @@
"front": "Front",
"hoodCenter": "Hood center",
"hoodSide": "Hood side",
"neckBinding": "Neck binding",
"pocket": "Pocket",
"pocketFacing": "Pocket facing",
"sleeve": "Sleeve",
"waistband": "Waistband"
},
"s": {
"cuff": "Cuff",
"hoodCenter": "Hood center",
"hoodSide": "Hood side",
"pocketFacing": "Pocket facing",
"pocket": "Pocket",
"waistband": "Waistband",
"cutPocket.t": "The pocket is not shown",
"cutPocket.d": "The **Pocket** (4) is not shown, but you can trace it from the Front part (1), which has the pocket outline on it (not including seam allowance).",
"cutCuff.t": "The cuff is not shown",
"cutCuff.d": "The **Cuff** (9) is a rectangular piece of ribbing fabric {{{ w }}} wide and {{{ l }}} long.",
"cutHoodCenter.t": "The hood center is not shown",
"cutHoodCenter.d": "The **Hood center** (7) is a rectangular piece of ribbing fabric {{{ w }}} wide and {{{ l }}} long.",
"cutNeckBinding.t": "The neck binding is not shown",
"cutNeckBinding.d": "The **Neck Binding** (10) is a rectangular piece of ribbing fabric {{{ w }}} wide and {{{ l }}} long.",
"cutWaistband.t": "The waistband is not shown",
"cutWaistband.d": "The **Waistband** (8) is a rectangular piece of ribbing fabric {{{ w }}} wide and {{{ l }}} long"
},

View file

@ -56,7 +56,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -11,11 +11,23 @@ import { hoodSide } from './hoodside.mjs'
import { hoodCenter } from './hoodcenter.mjs'
import { waistband } from './waistband.mjs'
import { cuff } from './cuff.mjs'
import { neckBinding } from './neckbinding.mjs'
// Setup our new design
const Hugo = new Design({
data,
parts: [back, front, sleeve, pocket, pocketFacing, hoodSide, hoodCenter, waistband, cuff],
parts: [
back,
front,
sleeve,
pocket,
pocketFacing,
hoodSide,
hoodCenter,
waistband,
cuff,
neckBinding,
],
})
// Merge translations
@ -32,6 +44,7 @@ export {
hoodCenter,
waistband,
cuff,
neckBinding,
Hugo,
i18n,
}

View file

@ -0,0 +1,97 @@
import { front } from './front.mjs'
import { back } from './back.mjs'
import { hoodCenter } from './hoodcenter.mjs'
function hugoNeckBinding({ store, sa, Point, points, Path, paths, macro, part, expand, units }) {
const length =
store.get('neckOpeningLenFront') * 2 +
store.get('neckOpeningLenBack') * 2 +
store.get('hoodCenterWidth')
const width = length / 44.2
if (expand) {
store.flag.preset('expandIsOn')
} else {
const extraSa = sa ? 2 * sa : 0
store.flag.note({
msg: `hugo:cutNeckBinding`,
notes: [sa ? 'flag:saIncluded' : 'flag:saExcluded', 'flag:partHiddenByExpand'],
replace: {
w: units(width + extraSa),
l: units(length + extraSa),
},
suggest: {
text: 'flag:show',
icon: 'expand',
update: {
settings: ['expand', 1],
},
},
})
// Also hint about expand
store.flag.preset('expandIsOff')
return part.hide()
}
points.topLeft = new Point(0, 0)
points.topRight = new Point(length, 0)
points.bottomRight = new Point(length, width)
points.bottomLeft = new Point(0, width)
paths.seam = new Path()
.move(points.topLeft)
.line(points.bottomLeft)
.line(points.bottomRight)
.line(points.topRight)
.line(points.topLeft)
.close()
.attr('class', 'fabric')
// Seam allowance
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
// Cutlist
store.cutlist.setCut({ cut: 1, from: 'fabric' })
// Grainline
macro('grainline', {
from: points.topLeft
.shiftFractionTowards(points.topRight, 0.15)
.shiftFractionTowards(points.bottomLeft, 0.6),
to: points.topRight
.shiftFractionTowards(points.topLeft, 0.15)
.shiftFractionTowards(points.bottomRight, 0.6),
})
//title
points.title = new Point(length / 2, width * 3)
macro('title', {
at: points.title,
nr: 10,
title: 'neckBinding',
scale: 0.4,
})
// Dimensions
macro('hd', {
id: 'length',
from: points.bottomLeft,
to: points.bottomRight,
y: points.bottomLeft.y + sa + 15,
})
macro('vd', {
id: 'width',
from: points.topRight,
to: points.bottomRight,
x: points.topRight.x + sa + 15,
})
return part
}
export const neckBinding = {
name: 'hugo.neckBinding',
after: [front, back, hoodCenter],
draft: hugoNeckBinding,
}

View file

@ -57,7 +57,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -0,0 +1,17 @@
# Change log for: @freesewing/lumina
## 3.0.0 (2022-09-30)
### Changed
- All FreeSewing pacakges are now ESM only.
- All FreeSewing pacakges now use named exports.
- Dropped support for NodeJS 14. NodeJS 18 (LTS/hydrogen) or more recent is now required.
This is the **initial release**, and the start of this change log.
> Prior to version 2, FreeSewing was not a JavaScript project.
> As such, that history is out of scope for this change log.

143
designs/lumina/README.md Normal file
View file

@ -0,0 +1,143 @@
![FreeSewing](https://static.freesewing.org/banner.png)
<p align='center'><a
href="https://www.npmjs.com/package/@freesewing/lumina"
title="@freesewing/lumina on NPM"
><img src="https://img.shields.io/npm/v/@freesewing/lumina.svg"
alt="@freesewing/lumina on NPM"/>
</a><a
href="https://opensource.org/licenses/MIT"
title="License: MIT"
><img src="https://img.shields.io/npm/l/@freesewing/lumina.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%3Alumina"
title="Open issues tagged pkg:lumina"
><img src="https://img.shields.io/github/issues/freesewing/freesewing/pkg:lumina.svg?label=Issues"
alt="Open issues tagged pkg:lumina"/>
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-118-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/lumina
A FreeSewing pattern that needs a description
## What am I looking at? 🤔
This repository is the FreeSewing *monorepo* holding all FreeSewing's websites, documentation, designs, plugins, and other NPM packages.
This folder holds: @freesewing/lumina
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
sewing patterns adapted to your measurements.
If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
The FreeSewing [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
for parametric design of sewing patterns. But FreeSewing also provides a range
of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
functionality of the platform.
If you have NodeJS installed, you can try it right now by running:
```bash
npx create-freesewing-pattern
```
Getting started guides are available for:
- [Linux](https://freesewing.dev/tutorials/getting-started-linux/)
- [MacOS](https://freesewing.dev/tutorials/getting-started-mac/)
- [Windows](https://freesewing.dev/tutorials/getting-started-windows/)
The [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) will
show you how to create your first parametric design.
## Support FreeSewing: Become a patron 🥰
FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
If you feel FreeSewing is worthwhile, and you can spend a few coins without
hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
## Links 👩‍💻
**Official channels**
- 💻 Makers website: [FreeSewing.org](https://freesewing.org)
- 💻 Developers website: [FreeSewing.dev](https://freesewing.dev)
- ✅ [Support](https://github.com/freesewing/freesewing/issues/new/choose),
[Issues](https://github.com/freesewing/freesewing/issues) &
[Discussions](https://github.com/freesewing/freesewing/discussions) on
[GitHub](https://github.com/freesewing/freesewing)
**Social media**
- 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org)
- 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
**Places the FreeSewing community hangs out**
- 💬 [Discord](https://discord.freesewing.org/)
- 💬 [Facebook](https://www.facebook.com/groups/627769821272714/)
- 💬 [Reddit](https://www.reddit.com/r/freesewing/)
## License: MIT 🤓
© [Joost De Cock](https://github.com/joostdecock).
See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details.
## Where to get help 🤯
For [Support](https://github.com/freesewing/freesewing/issues/new/choose),
please use the [Issues](https://github.com/freesewing/freesewing/issues) &
[Discussions](https://github.com/freesewing/freesewing/discussions) on
[GitHub](https://github.com/freesewing/freesewing).

35
designs/lumina/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/lumina/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/lumina'
export const version = '3.0.0'
export const data = { name, version }

View file

@ -0,0 +1,7 @@
{
"t": "Lumina",
"d": "A FreeSewing pattern that needs a description",
"p": { },
"s": { },
"o": { }
}

101
designs/lumina/i18n/en.json Normal file
View file

@ -0,0 +1,101 @@
{
"t": "Lumina leggings",
"d": "A FreeSewing pattern for a pair of leggings",
"p": {
"shape": "Shape",
"leg": "Leg",
"panel": "Side panel",
"pocket": "Pocket",
"waistband": "Waistband"
},
"s": {
"couldNotLowerWaist.t": "Could not lower the waist",
"cantFitTheWaistPoint.t": "Cannot fit the waist point",
"couldNoFitWaistband.t": "Could not fit the waistband",
"couldNotCreatePocket.t": "Could not create the pocket",
"dimensions.d": "Dimensions",
"dimensions.t": "Waistband will be {{{ waistbandlength }}} long total.\nThe length of the garment along the side will be {{{ length }}}."
},
"o": {
"ease": {
"t": "Ease",
"d": "This controls the amount of ease. Since this is a pattern for leggings that is normally made of stretch fabric, the ease is negative, meaning the fabric is stretched around the body."
},
"length": {
"t": "Leg length",
"d": "The length of the legs. Look in the Messages from the designer for the exact length."
},
"waistlowering": {
"t": "Waist lowering",
"d": "Lowering of the waist. This is a percentage of the Waist-To-Hips measurement."
},
"waistband": {
"t": "Waistband",
"d": "Add a separate waistband to the design."
},
"waistbandYes": {
"t": "With a Waistband",
"d": "Add a separate waistband."
},
"waistbandNo": {
"t": "Without a Waistband",
"d": "Do not add a separate waistband."
},
"lowerwaistbandback": {
"t": "Waistband Lowering",
"d": "Lower the waistband in the back."
},
"lowerwaistbandbackYes": {
"t": "Lower the Waistband",
"d": "Lower the waistband in the back, creating a 'V' shape."
},
"lowerwaistbandbackNo": {
"t": "Straight waistband",
"d": "Do not lower the waistband in the back."
},
"waistbandsize": {
"t": "Waistband size",
"d": "Size (height) of the waistband. This is a percentage of the Waist-To-Hips measurement."
},
"waistreduction": {
"t": "Waist circumference reduction",
"d": "The amount by which the waist should be reduced. This is a percentage of the waist circumference. Only available when the waistband option is selected. Look in the Messages from the designer for the exact size."
},
"pocket": {
"t": "Pocket",
"d": "Add pockets"
},
"pocketYes": {
"t": "Add pockets",
"d": "Add pockets in the side panel"
},
"pocketNo": {
"t": "No pockets",
"d": "Pockets are not added"
},
"pocketdepth": {
"t": "Pocket depth",
"d": "Depth (height) of the pocket. This is a percentage of the Waist-To-Seat measurement."
},
"fixedsidepanel": {
"t": "Side panel",
"d": "Fixed-width, or shaped side panel"
},
"fixedsidepanelYes": {
"t": "Fixed side panel",
"d": "Create a fixed-width side panel"
},
"fixedsidepanelNo": {
"t": "Shaped side panel",
"d": "Create a shaped side panel, consisting of a percentage of the leg circumference"
},
"sidepanel": {
"t": "Side Panel size",
"d": "Size (width) of the side panel. This is a percentage of the waist circumference."
},
"smoothing": {
"t": "Smoothing",
"d": "This setting controls the amount of smoothing that is done to create the side seams (and overall shape of the leggings)."
}
}
}

View file

@ -0,0 +1,7 @@
{
"t": "Lumina",
"d": "A FreeSewing pattern that needs a description",
"p": { },
"s": { },
"o": { }
}

View file

@ -0,0 +1,7 @@
{
"t": "Lumina",
"d": "A FreeSewing pattern that needs a description",
"p": { },
"s": { },
"o": { }
}

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,7 @@
{
"t": "Lumina",
"d": "A FreeSewing pattern that needs a description",
"p": { },
"s": { },
"o": { }
}

View file

@ -0,0 +1,7 @@
{
"t": "Lumina",
"d": "A FreeSewing pattern that needs a description",
"p": { },
"s": { },
"o": { }
}

View file

@ -0,0 +1,73 @@
{
"name": "@freesewing/lumina",
"version": "3.0.0",
"description": "A FreeSewing pattern that needs a description",
"author": "Joost De Cock <joost@joost.at> (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
"repository": "github:freesewing/freesewing",
"license": "MIT",
"bugs": {
"url": "https://github.com/freesewing/freesewing/issues"
},
"funding": {
"type": "individual",
"url": "https://freesewing.org/patrons/join"
},
"keywords": [
"freesewing",
"design",
"diy",
"fashion",
"made to measure",
"parametric design",
"pattern",
"sewing",
"sewing pattern"
],
"type": "module",
"module": "dist/index.mjs",
"exports": {
".": {
"internal": "./src/index.mjs",
"default": "./dist/index.mjs"
}
},
"scripts": {
"build": "node build.mjs",
"build:all": "yarn build",
"clean": "rimraf dist",
"mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
"vbuild": "VERBOSE=1 node build.mjs",
"lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
"testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
"wbuild": "node build.mjs",
"wbuild:all": "yarn wbuild"
},
"peerDependencies": {
"@freesewing/core": "3.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"@freesewing/models": "3.0.0",
"@freesewing/plugin-timing": "3.0.0"
},
"files": [
"dist/*",
"README.md"
],
"publishConfig": {
"access": "public",
"tag": "latest"
},
"engines": {
"node": "18",
"npm": "9"
}
}

View file

@ -0,0 +1,20 @@
//
import { Design } from '@freesewing/core'
import { i18n } from '../i18n/index.mjs'
import { data } from '../data.mjs'
// Parts
import { shape } from './shape.mjs'
import { panel } from './panel.mjs'
import { leg } from './leg.mjs'
import { pocket } from './pocket.mjs'
import { waistband } from './waistband.mjs'
// Create new design
const Lumina = new Design({
data,
parts: [shape, panel, leg, waistband, pocket],
})
// Named exports
export { i18n, Lumina, shape, panel, leg, waistband, pocket }

151
designs/lumina/src/leg.mjs Normal file
View file

@ -0,0 +1,151 @@
import { shape } from './shape.mjs'
export const leg = {
name: 'lumina.leg',
from: shape,
draft: ({ sa, points, Path, paths, Snippet, snippets, macro, store, part }) => {
paths.front = paths.front.reverse().unhide().addText('front', 'note center').setClass('hidden')
paths.frontSplit.unhide().addText('front', 'note center').setClass('hidden')
paths.back.unhide().addText('back', 'note center').setClass('hidden')
paths.backSplit = paths.backSplit
.reverse()
.unhide()
.addText('back', 'note center')
.setClass('hidden')
paths.seam = new Path()
.move(points.frontSplitHem)
.join(paths.backSplit)
.join(paths.backWaistband.reverse())
.join(paths.back)
.join(paths.front)
.join(paths.frontWaistband)
.join(paths.frontSplit)
.close()
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
store.cutlist.addCut({ cut: 2, from: 'fabric' })
points.gridAnchor = points.middleUpperLeg.clone()
points.logo = points.middleUpperLeg.shiftFractionTowards(points.frontSplitUpperLeg, 0.5)
snippets.logo = new Snippet('logo', points.logo)
points.title = points.middleUpperLeg.shiftFractionTowards(points.backSplitUpperLeg, 0.6)
macro('title', {
at: points.title,
nr: 1,
title: 'leg',
align: 'center',
})
points.scalebox = points.middleUpperLeg.shift(270, 50)
macro('scalebox', {
at: points.scalebox,
})
snippets.middle = new Snippet('notch', points.frontUpperLeg)
snippets.front0 = new Snippet('notch', paths.front.shiftFractionAlong(0.5))
snippets.front1 = new Snippet('notch', paths.frontSplit.shiftFractionAlong(0.2))
snippets.front2 = new Snippet('notch', paths.frontSplit.shiftFractionAlong(0.4))
snippets.front3 = new Snippet('notch', paths.frontSplit.shiftFractionAlong(0.6))
snippets.front4 = new Snippet('notch', paths.frontSplit.shiftFractionAlong(0.8))
snippets.back0 = new Snippet('notch', paths.back.shiftFractionAlong(0.5))
snippets.back1 = new Snippet('notch', paths.backSplit.shiftFractionAlong(0.25))
snippets.back2 = new Snippet('notch', paths.backSplit.shiftFractionAlong(0.5))
snippets.back3 = new Snippet('notch', paths.backSplit.shiftFractionAlong(0.75))
const middleBottom = points.frontSplitHem.shiftFractionTowards(points.backSplitHem, 0.5)
middleBottom.x = 0
const top = paths.seam.edge('top')
top.x = 0
const back = paths.seam.edge('right')
const front = paths.seam.edge('left')
if (!points.frontSplitWaistband.sitsRoughlyOn(front)) {
macro('hd', {
id: 'middleToFront',
from: front,
to: points.middleUpperLeg,
y: top.y - sa - 35,
})
}
if (!points.backSplitWaistband.sitsRoughlyOn(back)) {
macro('hd', {
id: 'middleToBack',
from: points.middleUpperLeg,
to: back,
y: top.y - sa - 35,
})
}
macro('hd', {
id: 'middleToFrontSplitWaistband',
from: points.frontSplitWaistband,
to: points.middleUpperLeg,
y: top.y - sa - 25,
})
macro('hd', {
id: 'middleToBackSplitWaistband',
from: points.middleUpperLeg,
to: points.backSplitWaistband,
y: top.y - sa - 25,
})
macro('hd', {
id: 'middleToFrontWaistband',
from: points.frontWaistband,
to: points.middleUpperLeg,
y: top.y - sa - 15,
})
macro('hd', {
id: 'middleToBackWaistband',
from: points.middleUpperLeg,
to: points.backWaistband,
y: top.y - sa - 15,
})
macro('hd', {
id: 'bottomFront',
from: points.frontSplitHem,
to: middleBottom,
y: middleBottom.y + sa + 15,
})
macro('hd', {
id: 'bottomBack',
from: middleBottom,
to: points.backSplitHem,
y: middleBottom.y + sa + 15,
})
macro('vd', {
id: 'middle',
from: points.middleUpperLeg,
to: middleBottom,
x: 0,
})
macro('vd', {
id: 'front',
from: points.frontWaistband,
to: points.middleUpperLeg,
x: -15,
})
macro('vd', {
id: 'back',
from: points.backWaistband,
to: points.middleUpperLeg,
x: 15,
})
macro('vd', {
id: 'frontSplit',
from: points.frontSplitWaistband,
to: points.frontSplitHem,
x: front.x - sa - 15,
})
macro('vd', {
id: 'backSplit',
from: points.backSplitWaistband,
to: points.backSplitHem,
x: back.x + sa + 15,
})
return part
},
}

View file

@ -0,0 +1,109 @@
import { shape } from './shape.mjs'
export const panel = {
name: 'lumina.panel',
from: shape,
draft: ({ sa, Point, points, Path, paths, Snippet, snippets, macro, store, part }) => {
paths.panelWaistband = new Path()
.move(points.frontPanelWaistband)
.line(points.backPanelWaistband)
.setText('top', 'note center')
.setClass('hidden')
paths.panelHem = new Path()
.move(points.backPanelHem)
.line(points.frontPanelHem)
.setText('bottom', 'note center')
.setClass('hidden')
paths.frontPanel.reverse().setText('front', 'note center').setClass('hidden')
paths.backPanel = paths.backPanel.unhide().setText('back', 'note center').setClass('hidden')
paths.seam = new Path()
.move(points.backPanelHem)
.join(paths.backPanel.reverse())
.join(paths.panelWaistband.reverse())
.join(paths.frontPanel)
.join(paths.panelHem.reverse())
.reverse()
.close()
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
snippets.front1 = new Snippet('notch', paths.frontPanel.shiftFractionAlong(0.2))
snippets.front2 = new Snippet('notch', paths.frontPanel.shiftFractionAlong(0.4))
snippets.front3 = new Snippet('notch', paths.frontPanel.shiftFractionAlong(0.6))
snippets.front4 = new Snippet('notch', paths.frontPanel.shiftFractionAlong(0.8))
snippets.back1 = new Snippet('notch', paths.backPanel.shiftFractionAlong(0.25))
snippets.back2 = new Snippet('notch', paths.backPanel.shiftFractionAlong(0.5))
snippets.back3 = new Snippet('notch', paths.backPanel.shiftFractionAlong(0.75))
store.cutlist.addCut({ cut: 2, from: 'fabric' })
points.gridAnchor = points.middleSeat.clone()
points.title = points.middleSeat.clone()
macro('title', {
at: points.title,
nr: 2,
title: 'panel',
align: 'center',
})
const middleTop = points.frontPanelWaistband.shiftFractionTowards(
points.backPanelWaistband,
0.5
)
const middleBottom = new Point(middleTop.x, points.frontPanelHem.y)
const back = paths.backPanel.edge('left')
const front = paths.frontPanel.edge('right')
macro('hd', {
id: 'topFront',
from: middleTop,
to: points.frontPanelWaistband,
y: middleTop.y - sa - 15,
})
macro('hd', {
id: 'topBack',
from: points.backPanelWaistband,
to: middleTop,
y: middleTop.y - sa - 15,
})
macro('hd', {
id: 'middleFront',
from: middleBottom,
to: front,
y: middleBottom.y + sa + 25,
})
macro('hd', {
id: 'middleBack',
from: back,
to: middleBottom,
y: middleBottom.y + sa + 25,
})
macro('hd', {
id: 'bottomFront',
from: middleBottom,
to: points.frontPanelHem,
y: middleBottom.y + sa + 15,
})
macro('hd', {
id: 'bottomBack',
from: points.backPanelHem,
to: middleBottom,
y: middleBottom.y + sa + 15,
})
macro('vd', {
id: 'front',
from: points.frontPanelWaistband,
to: points.frontPanelHem,
x: front.x + sa + 15,
})
macro('vd', {
id: 'back',
from: points.backPanelWaistband,
to: points.backPanelHem,
x: back.x - sa - 15,
})
return part
},
}

View file

@ -0,0 +1,154 @@
import { pctBasedOn } from '@freesewing/core'
import { panel } from './panel.mjs'
import { shape } from './shape.mjs'
export const pocket = {
name: 'lumina.pocket',
after: panel,
from: shape,
options: {
pocket: { bool: true, menu: 'style' },
pocketdepth: {
pct: 90,
min: 20,
max: 120,
...pctBasedOn('waistToSeat'),
// eslint-disable-next-line no-unused-vars
menu: (settings, mergedOptions) => (mergedOptions?.pocket ? 'style' : false),
},
},
draft: ({
measurements,
sa,
Point,
points,
Path,
paths,
Snippet,
snippets,
options,
macro,
store,
log,
part,
}) => {
if (!options.pocket) {
return part.hide()
}
const pocketDepth = measurements.waistToSeat * options.pocketdepth
paths.pocketWaistband = new Path()
.move(points.frontPanelWaistband)
.line(points.backPanelWaistband)
.addText('top', 'note center')
.setClass('hidden')
points.frontPocketHem = paths.frontPanel.shiftAlong(pocketDepth)
points.backPocketHem = paths.backPanel.shiftAlong(pocketDepth)
paths.pocketHem = new Path()
.move(points.backPocketHem)
.line(points.frontPocketHem)
.addText('bottom', 'note center')
.setClass('hidden')
const frontPocketSplit = paths.frontPanel.split(points.frontPocketHem)
if (frontPocketSplit) {
paths.frontPocket = frontPocketSplit[0]
.reverse()
.unhide()
.addText('front', 'note center')
.setClass('hidden')
} else {
log.info('lumina:couldNotCreatePocket')
return part.hide()
}
const backPocketSplit = paths.backPanel.split(points.backPocketHem)
if (backPocketSplit) {
paths.backPocket = backPocketSplit[0]
.unhide()
.addText('back', 'note center')
.setClass('hidden')
} else {
log.info('lumina:couldNotCreatePocket')
return part.hide()
}
paths.seam = new Path()
.move(points.frontPocketHem)
.join(paths.pocketHem.reverse())
.join(paths.backPocket.reverse())
.join(paths.pocketWaistband.reverse())
.join(paths.frontPocket.reverse())
.close()
.reverse()
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
for (var i = 1; i < 4; i++) {
if (paths.frontPanel.length() * (0.2 * i) < pocketDepth) {
snippets['front' + i] = new Snippet('notch', paths.frontPanel.shiftFractionAlong(0.2 * i))
}
if (paths.backPanel.length() * (0.25 * i) < pocketDepth) {
snippets['back' + i] = new Snippet('notch', paths.backPanel.shiftFractionAlong(0.25 * i))
}
}
store.cutlist.addCut({ cut: 2, from: 'fabric' })
points.gridAnchor = points.middleSeat.clone()
points.title = points.frontPocketHem.shiftFractionTowards(points.backPanelWaistband, 0.5)
macro('title', {
at: points.title,
nr: 4,
title: 'pocket',
align: 'center',
})
const middleTop = points.frontPanelWaistband.shiftFractionTowards(
points.backPanelWaistband,
0.5
)
const middleBottom = new Point(middleTop.x, points.frontPocketHem.y)
const back = paths.backPocket.edge('left')
const front = paths.frontPocket.edge('right')
macro('hd', {
id: 'topFront',
from: middleTop,
to: points.frontPanelWaistband,
y: middleTop.y - sa - 15,
})
macro('hd', {
id: 'topBack',
from: points.backPanelWaistband,
to: middleTop,
y: middleTop.y - sa - 15,
})
macro('hd', {
id: 'bottomFront',
from: middleBottom,
to: front,
y: middleBottom.y + sa + 15,
})
macro('hd', {
id: 'bottomBack',
from: back,
to: middleBottom,
y: middleBottom.y + sa + 15,
})
macro('vd', {
id: 'front',
from: points.frontPanelWaistband,
to: points.frontPocketHem,
x: points.frontPocketHem.x + sa + 15,
})
macro('vd', {
id: 'back',
from: points.backPanelWaistband,
to: points.backPocketHem,
x: points.backPocketHem.x - sa - 15,
})
return part
},
}

View file

@ -0,0 +1,631 @@
import { pctBasedOn } from '@freesewing/core'
import { extendPath, createControlPoints } from '@freesewing/lumira'
export const createPath = (paths, Path, points, pathName, names) => {
let i
paths[pathName] = new Path()
.move(points[names[0]])
._curve(points[names[1] + 'Cp2'], points[names[1]])
for (i = 2; i < names.length - 1; i++) {
paths[pathName].curve(points[names[i - 1] + 'Cp1'], points[names[i] + 'Cp2'], points[names[i]])
}
paths[pathName].curve_(points[names[i - 1] + 'Cp1'], points[names[i]])
return paths[pathName]
}
const lowerWaist = (paths, Path, points, log, waistLowering, pathName, pointName) => {
const newPath = extendPath(Path, paths[pathName], 100, 0)
const newWaist = newPath.shiftAlong(waistLowering + 100)
if (newWaist.sitsRoughlyOn(points[pathName + pointName])) {
return
}
points[pathName + pointName] = newWaist
const pTemp = newPath.split(points[pathName + pointName])
if (pTemp.length != 2) {
log.info('lumina:couldNotLowerWaist')
}
paths[pathName] = pTemp[1].hide()
}
const createWaistPoint = (options, measurements, Path, points, utils, log, front) => {
const kneeTemp = points.middleCrossSeam.shiftFractionTowards(
points.middleKnee,
options.crotchToKnee
)
const angle =
90 +
(front
? options.crossSeamAngle * (measurements.waistBack / measurements.waist)
: -1 * options.crossSeamAngle * (1 - measurements.waistBack / measurements.waist))
const crossSeam = front
? measurements.crossSeamFront
: measurements.crossSeam - measurements.crossSeamFront
let waist = kneeTemp.shift(angle, measurements.waistToKnee)
const crossSeamCp = points.middleCrossSeam.shiftFractionTowards(
utils.beamIntersectsY(kneeTemp, waist, points.middleCrossSeam.y),
options.crotchPointsCP
)
let waistCp = waist.shiftFractionTowards(points.middleKnee, options.waistToKneeCP)
const kneeToWaist = measurements.waistToKnee * 0.75
let diff = 0
let iter = 0
do {
// waist = kneeTemp.shift(angle, kneeToWaist +((diff > 0 ? 1 : -1) *iter))
waist = kneeTemp.shift(angle, kneeToWaist + diff * 1.03)
// waist = kneeTemp.shift(angle, kneeToWaist *ratio)
waistCp = waist.shiftFractionTowards(points.middleKnee, options.waistToKneeCP)
const crossSeamPath = new Path().move(points.middleCrossSeam).curve(crossSeamCp, waistCp, waist)
diff = crossSeam - crossSeamPath.length()
// console.log({i:iter,d:diff,cs:crossSeam,csl:crossSeamPath.length()})
} while (++iter < 100 && (diff > 1 || diff < -1))
if (iter >= 100) {
log.error('lumina:cantFitTheWaistPoint')
}
if (front) {
points.frontWaist = waist.clone()
points.frontWaistband = waist.clone()
points.frontWaistCp = waistCp.clone()
points.frontCrossSeamCp = crossSeamCp.clone()
} else {
points.backWaist = waist.clone()
points.backWaistband = waist.clone()
points.backWaistCp = waistCp.clone()
points.backCrossSeamCp = crossSeamCp.clone()
}
}
const createSidePoints = ({
measurements,
points,
utils,
prefix,
postfix,
names,
ratio,
ratioFixed,
ease,
waistReduction,
distanceCompensation,
fixedSidePanel,
}) => {
let measurement
let lastGood = 0
for (let i = 0; i < names.length; i++) {
let m1 = 0,
m2 = 0
if (names[i] != 'Waist') {
m1 = measurements['waistTo' + names[i]]
}
if (names[lastGood] != 'Waist') {
m2 = measurements['waistTo' + names[lastGood]]
}
let distance = m2 - m1
switch (names[i]) {
case 'UpperLeg': {
measurement = measurements['upperLeg']
const intersect = utils.beamIntersectsCurve(
points[prefix + names[i]],
points[prefix + names[i]].shift(prefix == 'front' ? 180 : 0, ratioFixed * 100),
points.middleCrossSeam,
points[prefix + 'CrossSeamCp'],
points[prefix + 'WaistCp'],
points[prefix + 'Waist']
)
if (false !== intersect) {
if (intersect.constructor === Array) {
measurement += intersect[0].dist(points[prefix + names[i]])
} else {
measurement += intersect.dist(points[prefix + names[i]])
}
}
break
}
case 'Waist': {
measurement =
(prefix == 'front'
? measurements.waist - measurements.waistBack
: measurements.waistBack) -
waistReduction * 0.5
break
}
case 'Seat': {
measurement =
prefix == 'front' ? measurements.seat - measurements.seatBack : measurements.seatBack
distance *= distanceCompensation
break
}
default: {
measurement = measurements[names[i].toLowerCase()]
// Adjust for thigh size when using positive ease
if (ease > 1 && (names[i] == 'Ankle' || names[i] == 'Knee')) {
measurement *= 1.2
}
}
}
measurement /= 2
measurement *= ease
let ci
const width = measurement * ratio
const reduction =
ratio == 0
? measurement
: fixedSidePanel > 0
? width < measurement - fixedSidePanel
? measurement - fixedSidePanel
: width
: width
if (i == 0) {
points[prefix + postfix + names[i]] = points[prefix + names[i]].shift(
prefix == 'front' ? 180 : 0,
reduction
)
} else {
let iter = 0
do {
ci = utils.circlesIntersect(
points[prefix + names[i]],
reduction * (1 + iter * 0.02),
points[prefix + postfix + names[lastGood]],
distance
)
if (false !== ci) {
points[prefix + postfix + names[i]] = ci[prefix == 'front' ? 0 : 1]
}
} while (iter++ < 100 && (false == ci || isNaN(ci[prefix == 'front' ? 0 : 1].x)))
lastGood = i
}
}
}
const smoothPoints = (points, prefix, postfix, names, smoothness) => {
let adjust
for (let i = 0; i < names.length - 2; i++) {
adjust = false
if (prefix == 'front') {
adjust =
points[prefix + postfix + names[i]].angle(points[prefix + postfix + names[i + 1]]) >
points[prefix + postfix + names[i]].angle(points[prefix + postfix + names[i + 2]])
} else {
adjust =
points[prefix + postfix + names[i]].angle(points[prefix + postfix + names[i + 1]]) <
points[prefix + postfix + names[i]].angle(points[prefix + postfix + names[i + 2]])
}
if (adjust) {
const angleDiff =
points[prefix + postfix + names[i]].angle(points[prefix + postfix + names[i + 2]]) -
points[prefix + postfix + names[i]].angle(points[prefix + postfix + names[i + 1]])
points[prefix + postfix + names[i + 1]] = points[prefix + postfix + names[i]].shift(
points[prefix + postfix + names[i]].angle(points[prefix + postfix + names[i + 1]]) +
smoothness * angleDiff,
points[prefix + postfix + names[i]].dist(points[prefix + postfix + names[i + 1]])
)
}
}
}
export const shape = {
name: 'lumina.shape',
measurements: [
'waist',
'waistBack',
'hips',
'seat',
'seatBack',
'inseam',
'waistToSeat',
'waistToUpperLeg',
'waistToKnee',
'waistToHips',
'waistToFloor',
'knee',
'ankle',
'crossSeam',
'crossSeamFront',
'heel',
'upperLeg',
],
options: {
waistband: { bool: true, menu: 'style' },
lowerwaistbandback: {
bool: true,
// eslint-disable-next-line no-unused-vars
menu: (settings, mergedOptions) => (mergedOptions?.waistband ? 'style' : false),
},
ease: { pct: -8, min: -25, max: 10, menu: 'fit' },
length: { pct: 35, min: 10, max: 100, menu: 'style' },
waistbandsize: {
pct: 50,
min: 0,
max: 150,
...pctBasedOn('waistToHips'),
// eslint-disable-next-line no-unused-vars
menu: (settings, mergedOptions) => (mergedOptions?.waistband ? 'style' : false),
},
waistlowering: { pct: 35, min: -10, max: 60, ...pctBasedOn('waistToHips'), menu: 'style' },
waistreduction: {
pct: 4,
min: 0,
max: 10,
...pctBasedOn('waist'),
// eslint-disable-next-line no-unused-vars
menu: (settings, mergedOptions) => (mergedOptions?.waistband ? 'fit' : false),
},
sidepanel: { pct: 25, min: 10, max: 40, menu: 'style' },
smoothing: { pct: 85, min: 50, max: 100, menu: 'advanced' },
fixedsidepanel: { bool: false, menu: 'style' },
crossSeamAngle: 35,
crotchToKnee: 0.4,
waistToKneeCP: 0.4,
kneeToWaistLength: 400,
crotchPointsCP: 2,
},
draft: ({
measurements,
options,
Point,
Path,
points,
paths,
utils,
store,
units,
log,
part,
}) => {
const inseam =
measurements.inseam > measurements.waistToFloor - measurements.waistToUpperLeg
? measurements.waistToFloor - measurements.waistToUpperLeg
: measurements.inseam
const crotchOffset = measurements.waistToFloor - inseam
const waistLowering = measurements.waistToHips * options.waistlowering
const waistReduction = options.waistband ? measurements.waist * options.waistreduction : 0
const waistbandSize = options.waistband
? measurements.waistToHips *
(options.waistlowering + options.waistbandsize > 1.5
? 1.5 - options.waistlowering
: options.waistbandsize)
: 0
const sideRatio = 1 - options.sidepanel
// const sideRatio = 3 / 5
const ease = options.ease + 1
const waistToAnkle = measurements.waistToFloor - measurements.heel / Math.PI
store.set('waistbandSize', waistbandSize)
store.set('waistLowering', waistLowering)
measurements['waistToAnkle'] = measurements.waistToFloor - measurements.heel / Math.PI
const sideFixed = (((measurements.waist - measurements.waistBack) * ease) / 2) * sideRatio
const fixedSidePanel =
(((measurements.waist - measurements.waistBack - waistReduction) * ease) / 2) *
options.sidepanel
points.middleWaist = new Point(0, 0)
points.middleHips = points.middleWaist.shift(270, measurements.waistToHips)
points.middleSeat = points.middleWaist.shift(270, measurements.waistToSeat)
points.frontCrossSeam =
points.backCrossSeam =
points.middleCrossSeam =
points.middleWaist.shift(270, crotchOffset)
points.frontUpperLeg =
points.backUpperLeg =
points.middleUpperLeg =
points.middleWaist.shift(270, measurements.waistToUpperLeg)
points.frontKnee =
points.backKnee =
points.middleKnee =
points.middleWaist.shift(270, measurements.waistToKnee)
points.frontAnkle =
points.backAnkle =
points.middleAnkle =
points.middleWaist.shift(270, waistToAnkle)
points.frontFloor =
points.backFloor =
points.middleFloor =
points.middleWaist.shift(270, measurements.waistToFloor)
createWaistPoint(options, measurements, Path, points, utils, log, true)
createWaistPoint(options, measurements, Path, points, utils, log, false)
const frontCrossSeam = new Path()
.move(points.frontWaist)
.curve(points.frontWaistCp, points.frontCrossSeamCp, points.middleCrossSeam)
const backCrossSeam = new Path()
.move(points.backWaist)
.curve(points.backWaistCp, points.backCrossSeamCp, points.middleCrossSeam)
points.frontSeat = frontCrossSeam.shiftAlong(
measurements.waistToSeat * (measurements.crossSeamFront / measurements.waistToUpperLeg) * 0.8
)
points.frontHips = frontCrossSeam.shiftAlong(
measurements.waistToHips * (measurements.crossSeamFront / measurements.waistToUpperLeg)
)
points.backSeat = backCrossSeam.shiftAlong(
measurements.waistToSeat * (measurements.waistToSeat / measurements.waistToUpperLeg)
)
points.backHips = backCrossSeam.shiftAlong(
measurements.waistToHips * (measurements.waistToSeat / measurements.waistToUpperLeg)
)
;['front', 'back'].forEach((prefix) => {
createSidePoints({
measurements: measurements,
points: points,
utils: utils,
prefix: prefix,
postfix: 'Side',
names: ['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'],
ratio: 0,
ratioFixed: 0.1,
ease: ease,
waistReduction: waistReduction,
distanceCompensation: 1,
fixedSidePanel: 0,
})
points[prefix + 'SideWaistband'] = points[prefix + 'SideWaist'].clone()
})
points.middleWaistband = points.middleWaist.clone()
;['front', 'back'].forEach((prefix) => {
createSidePoints({
measurements: measurements,
points: points,
utils: utils,
prefix: prefix,
postfix: 'Split',
names: ['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'],
ratio: sideRatio,
ratioFixed: sideFixed,
ease: ease,
waistReduction: waistReduction,
distanceCompensation:
(points.frontAnkle.dist(points.frontCrossSeam) + frontCrossSeam.length()) /
(measurements.waistToFloor - measurements.heel / Math.PI),
fixedSidePanel: options.fixedsidepanel ? fixedSidePanel : 0,
})
points[prefix + 'SplitWaistband'] = points[prefix + 'SplitWaist'].clone()
})
points.backHipsCp1 = points.backWaistCp.clone()
points.backWaistCp = points.backWaist.shift(
points.backWaist.angle(points.backSplitWaist) - 90,
points.backWaist.dist(points.backHips) / 3
)
points.backHipsCp2 = points.backSeat.shiftOutwards(
points.backHips,
points.backWaist.dist(points.backHips) / 4
)
points.frontHipsCp1 = points.frontWaistCp.clone()
points.frontWaistCp = points.frontWaist.shift(
points.frontWaist.angle(points.frontSplitWaist) + 90,
points.frontWaist.dist(points.frontHips) / 3
)
points.frontHipsCp2 = points.frontSeat.shiftOutwards(
points.frontHips,
points.frontWaist.dist(points.frontHips) / 4
)
paths.front = new Path()
.move(points.frontWaist)
.curve(points.frontWaistCp, points.frontHipsCp2, points.frontHips)
.curve(points.frontHipsCp1, points.frontCrossSeamCp, points.middleCrossSeam)
paths.back = new Path()
.move(points.backWaist)
.curve(points.backWaistCp, points.backHipsCp2, points.backHips)
.curve(points.backHipsCp1, points.backCrossSeamCp, points.middleCrossSeam)
;['front', 'back'].forEach((prefix) => {
// eslint-disable-next-line no-extra-semi
;['Side', 'Split'].forEach((type) => {
smoothPoints(
points,
prefix,
type,
['Ankle', 'Knee', 'UpperLeg', 'Seat', 'Waist'],
options.smoothing
)
})
})
paths.middle = new Path().move(points.middleWaist).line(points.middleFloor).setHidden()
;['front', 'back'].forEach((prefix) => {
// eslint-disable-next-line no-extra-semi
;['Side', 'Split'].forEach((type) => {
createControlPoints(points, 3, [
prefix + type + 'Waist',
prefix + type + 'Seat',
prefix + type + 'UpperLeg',
prefix + type + 'Knee',
prefix + type + 'Ankle',
])
})
})
;['front', 'back'].forEach((prefix) => {
// eslint-disable-next-line no-extra-semi
;['Side', 'Split'].forEach((type) => {
createPath(paths, Path, points, prefix + type, [
prefix + type + 'Waist',
prefix + type + 'Seat',
prefix + type + 'UpperLeg',
prefix + type + 'Knee',
prefix + type + 'Ankle',
])
})
})
;['front', 'back'].forEach((prefix) => {
// eslint-disable-next-line no-extra-semi
;['Waist', 'Waistband', 'Seat', 'UpperLeg', 'Knee', 'Ankle'].forEach((name) => {
points[prefix + 'Panel' + name] = points['middle' + name].shift(
prefix == 'front' ? 0 : 180,
points[prefix + 'Side' + name].dist(points[prefix + 'Split' + name])
)
})
})
;['front', 'back'].forEach((prefix) => {
createControlPoints(points, 3, [
prefix + 'Panel' + 'Waist',
prefix + 'Panel' + 'Seat',
prefix + 'Panel' + 'UpperLeg',
prefix + 'Panel' + 'Knee',
prefix + 'Panel' + 'Ankle',
])
})
;['front', 'back'].forEach((prefix) => {
createPath(paths, Path, points, prefix + 'Panel', [
prefix + 'Panel' + 'Waist',
prefix + 'Panel' + 'Seat',
prefix + 'Panel' + 'UpperLeg',
prefix + 'Panel' + 'Knee',
prefix + 'Panel' + 'Ankle',
])
})
const frontSplitlength = paths.frontSplit.length()
while (Math.abs(frontSplitlength - paths.frontPanel.length()) > 1) {
// eslint-disable-next-line no-extra-semi
;['front', 'back'].forEach((prefix) => {
const diff = paths[prefix + 'Split'].length() / paths[prefix + 'Panel'].length()
const names = ['Waist', 'Seat', 'UpperLeg', 'Knee', 'Ankle']
for (let i = 0; i < names.length - 1; i++) {
points[prefix + 'Panel' + names[i]] = points[
prefix + 'Panel' + names[i + 1]
].shiftFractionTowards(points[prefix + 'Panel' + names[i]], diff)
}
})
;['front', 'back'].forEach((prefix) => {
createControlPoints(points, 3, [
prefix + 'Panel' + 'Waist',
prefix + 'Panel' + 'Seat',
prefix + 'Panel' + 'UpperLeg',
prefix + 'Panel' + 'Knee',
prefix + 'Panel' + 'Ankle',
])
})
;['front', 'back'].forEach((prefix) => {
createPath(paths, Path, points, prefix + 'Panel', [
prefix + 'Panel' + 'Waist',
prefix + 'Panel' + 'Seat',
prefix + 'Panel' + 'UpperLeg',
prefix + 'Panel' + 'Knee',
prefix + 'Panel' + 'Ankle',
])
})
}
if (options.length < 1) {
const length = (1 - options.length) * (inseam - (measurements.waistToFloor - waistToAnkle))
;['front', 'back'].forEach((prefix) => {
// eslint-disable-next-line no-extra-semi
;['Side', 'Split', 'Panel'].forEach((type) => {
points[prefix + type + 'Hem'] = paths[prefix + type].reverse().shiftAlong(length)
paths[prefix + type] = paths[prefix + type].split(points[prefix + type + 'Hem'])[0]
})
})
} else {
// eslint-disable-next-line no-extra-semi
;['front', 'back'].forEach((prefix) => {
// eslint-disable-next-line no-extra-semi
;['Side', 'Split', 'Panel'].forEach((type) => {
points[prefix + type + 'Hem'] = points[prefix + type + 'Ankle']
})
})
}
lowerWaist(paths, Path, points, log, waistLowering, 'middle', 'Waist')
;['front', 'back'].forEach((prefix) => {
// eslint-disable-next-line no-extra-semi
;['Side', 'Split', 'Panel'].forEach((type) => {
lowerWaist(paths, Path, points, log, waistLowering, prefix + type, 'Waist')
})
lowerWaist(paths, Path, points, log, waistLowering, prefix, 'Waist')
})
;['front', 'back'].forEach((prefix) => {
// eslint-disable-next-line no-extra-semi
;['Side', 'Split', 'Panel'].forEach((type) => {
lowerWaist(paths, Path, points, log, waistbandSize, prefix + type, 'Waistband')
})
lowerWaist(paths, Path, points, log, waistbandSize, prefix, 'Waistband')
})
store.set(
'waistLength',
points.backWaist.dist(points.backSideWaist) + points.frontWaist.dist(points.frontSideWaist)
)
;['front', 'back'].forEach((prefix) => {
const waistbandLength = points[prefix + 'Waistband'].dist(points[prefix + 'SplitWaistband'])
const direction = prefix == 'front' ? 90 : -90
let angle = paths[prefix].shiftAlong(1).angle(points[prefix + 'Waistband'])
points[prefix + 'WaistbandCp'] = points[prefix + 'Waistband'].shift(
angle + direction,
waistbandLength * 0.35
)
angle = paths[prefix + 'Split'].shiftAlong(1).angle(points[prefix + 'SplitWaistband'])
points[prefix + 'SplitWaistbandCp'] = points[prefix + 'SplitWaistband'].shift(
angle + direction * -1,
waistbandLength * 0.35
)
paths[prefix + 'Waistband'] = new Path()
.move(points[prefix + 'Waistband'])
.curve(
points[prefix + 'WaistbandCp'],
points[prefix + 'SplitWaistbandCp'],
points[prefix + 'SplitWaistband']
)
.hide()
})
store.set(
'waistbandLength',
paths.backWaistband.length() +
paths.frontWaistband.length() +
points.frontPanelWaistband.dist(points.backPanelWaistband)
)
if (options.waistband && options.lowerwaistbandback) {
// Lower the back a little more to get a V-shape in the back
// lowerWaist(paths, Path, points, waistLowering * 0.5, 'back', 'Waistband')
lowerWaist(
paths,
Path,
points,
log,
(waistLowering + waistbandSize) * 0.5,
'back',
'Waistband'
)
paths.backWaistband = new Path()
.move(points.backWaistband)
._curve(points.backSplitWaistbandCp, points.backSplitWaistband)
.hide()
}
store.set('waistbandBackLength', paths.backWaistband.length())
store.set('waistbandFrontLength', paths.frontWaistband.length())
store.set('waistbandPanelLength', points.frontPanelWaistband.dist(points.backPanelWaistband))
store.flag.note({
msg: `lumina:dimensions`,
replace: {
waistbandlength: units(
(store.get('waistbandBackLength') +
store.get('waistbandFrontLength') +
store.get('waistbandPanelLength')) *
2
),
length: units(
store.get('waistbandSize') + points.frontPanelWaistband.dist(points.frontPanelHem)
),
},
})
return part //.hide()
},
}

View file

@ -0,0 +1,208 @@
import { shape } from './shape.mjs'
export const waistband = {
name: 'lumina.waistband',
after: shape,
draft: ({
store,
sa,
Point,
points,
Path,
paths,
Snippet,
snippets,
options,
macro,
log,
utils,
part,
}) => {
if (false === options.waistband) {
return part.hide()
}
const waistLength = store.get('waistLength')
const waistbandFrontLength = store.get('waistbandFrontLength')
const waistbandPanelLength = store.get('waistbandPanelLength')
const waistbandLength = store.get('waistbandLength')
const waistbandSize = store.get('waistbandSize')
const waistLowering = store.get('waistLowering')
if (waistbandSize <= 0) {
return part.hide()
}
points.origin = new Point(0, 0)
const angleRad = Math.asin((Math.abs(waistbandLength - waistLength) * 0.5) / waistbandSize)
const radius = (waistLength * 0.5) / Math.sin(angleRad)
const baseAngle = waistLength < waistbandLength ? 270 : 90
let angle = utils.rad2deg(angleRad)
if (isNaN(angle)) {
log.info('lumina:couldNoFitWaistband')
store.flag.note({
msg: `lumina:couldNoFitWaistband`,
})
return part.hide()
}
let diff = 0
let iter = 0
let segments, cpDistance
do {
angle += diff * 0.025
segments = 360 / angle
cpDistance = (4 / 3) * Math.tan(Math.PI / (segments * 2)) * radius
points.waistFront = points.origin.shift(baseAngle + angle, radius)
points.waistBack = points.origin.shift(baseAngle - angle, radius)
points.waistFrontCP = points.waistFront.shift(baseAngle - 90 + angle, cpDistance)
points.waistBackCP = points.waistBack.shift(baseAngle + 90 - angle, cpDistance)
paths.waist = new Path()
.move(points.waistBack)
.curve(points.waistBackCP, points.waistFrontCP, points.waistFront)
diff = waistLength - paths.waist.length()
} while (iter++ < 100 && (diff < -0.5 || diff > 0.5))
if (iter >= 100) {
log.info('lumina:couldNoFitWaistband')
return part.hide()
}
points.waistbandFront = points.waistFront.shift(270 + angle, waistbandSize)
points.waistbandBack = points.waistBack.shift(270 - angle, waistbandSize)
cpDistance =
(4 / 3) *
Math.tan(Math.PI / (segments * 2)) *
(radius + waistbandSize * (waistLength < waistbandLength ? 1 : -1))
points.waistbandFrontCP = points.waistbandFront.shift(baseAngle - 90 + angle, cpDistance)
points.waistbandBackCP = points.waistbandBack.shift(baseAngle + 90 - angle, cpDistance)
paths.waistband = new Path()
.move(points.waistbandBack)
.curve(points.waistbandBackCP, points.waistbandFrontCP, points.waistbandFront)
diff = waistbandLength - paths.waistband.length()
const rWaistband = paths.waistband.reverse()
points.snippetPanelBack = rWaistband.shiftAlong(waistbandFrontLength + waistbandPanelLength)
snippets.panelBack = new Snippet('notch', points.snippetPanelBack)
points.snippetPanelFront = rWaistband.shiftAlong(waistbandFrontLength)
snippets.panelFront = new Snippet('notch', points.snippetPanelFront)
if (options.lowerwaistbandback) {
paths.waistband = rWaistband.split(points.snippetPanelBack)[0]
points.waistbandBackPanel = points.snippetPanelBack.copy()
points.waistbandBackPanelCP = points.snippetPanelFront.shiftFractionTowards(
points.waistbandBackPanel,
1.4
)
points.waistbandBack = points.waistBack.shiftOutwards(
points.waistbandBack,
(waistLowering + waistbandSize) * 0.5
)
paths.waistband = new Path()
.move(points.waistbandBack)
._curve(points.waistbandBackPanelCP, points.waistbandBackPanel)
.join(paths.waistband.reverse())
}
paths.front = new Path()
.move(points.waistbandFront)
.line(points.waistFront)
.setText('front', 'note center')
.setClass('hidden')
paths.back = new Path()
.move(points.waistBack)
.line(points.waistbandBack)
.setText('back', 'note center')
.setClass('hidden')
let top = paths.waist.edge('top')
if (top.y == points.waistBack.y) {
top = paths.waist.edge('bottom')
}
let bottom = paths.waistband.shiftFractionAlong(0.5)
if (bottom.y == points.waistbandFront.y) {
bottom = paths.waistband.edge('top')
}
macro('cutonfold', {
from: points.waistbandFront,
to: points.waistFront,
})
store.cutlist.addCut({ cut: 2, from: 'fabric', onFold: true })
points.title = points.snippetPanelFront.shiftFractionTowards(points.snippetPanelBack, 0.5)
points.title.y = top.y + 20
macro('title', {
at: points.title,
nr: 3,
title: 'waistband',
align: 'center',
scale: 0.35,
})
paths.seamSA = new Path()
.move(points.waistFront)
.join(paths.waist.reverse())
.line(points.waistbandBack)
.join(paths.waistband)
.hide()
paths.seam = new Path().move(points.waistbandFront).line(points.waistFront).join(paths.seamSA)
if (sa) {
const seamSA = paths.seamSA.offset(sa)
paths.sa = new Path()
.move(points.waistFront)
.line(seamSA.start())
.join(seamSA)
.line(points.waistbandFront)
.attr('class', 'fabric sa')
}
macro('hd', {
id: 'top',
from: points.waistBack,
to: points.waistFront,
y: Math.min(points.waistFront.y, top.y) - sa - 15,
})
macro('hd', {
id: 'bottom',
from: points.waistbandBack,
to: points.waistbandFront,
y: Math.max(points.waistbandFront.y, Math.max(bottom.y, points.waistbandBack.y)) + sa + 15,
})
macro('vd', {
id: 'top',
from: points.waistBack,
to: top,
x: top.x - 15,
noStartMarker: true,
noEndMarker: true,
})
macro('vd', {
id: 'bottom',
from: points.waistFront,
to: bottom,
x: top.x + 15,
})
macro('ld', {
id: 'front',
from: points.waistFront,
to: points.waistbandFront,
d: 15,
})
macro('ld', {
id: 'back',
from: points.waistBack,
to: points.waistbandBack,
d: -15,
})
return part
},
}

View file

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

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -20,16 +20,17 @@ export const controlPoints = (p1, p2, p3, cpDistanceDivider) => {
} else {
angle = Math.abs(p2.angle(p1) - p2.angle(p3)) / 2
}
return {
cp1:
p3 !== undefined
? p2.shift(p2.angle(p3) - angle + 90, p2.dist(p3) / cpDistanceDivider)
: null,
cp2:
p1 !== undefined
? p2.shift(p2.angle(p1) + angle - 90, p2.dist(p1) / cpDistanceDivider)
: null,
let cp1 =
p3 !== undefined ? p2.shift(p2.angle(p3) - angle + 90, p2.dist(p3) / cpDistanceDivider) : null
let cp2 =
p1 !== undefined ? p2.shift(p2.angle(p1) + angle - 90, p2.dist(p1) / cpDistanceDivider) : null
if (p1 !== undefined && p2.sitsRoughlyOn(p1)) {
return { cp1: p1.clone(), cp2: cp2 }
}
if (p3 !== undefined && p2.sitsRoughlyOn(p3)) {
return { cp1: cp1, cp2: p3.clone() }
}
return { cp1: cp1, cp2: cp2 }
}
export const createControlPoints = (points, cpDistanceDivider, names) => {
for (let i = 0; i < names.length; i++) {

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -37,6 +37,10 @@
"t": "Bust span ease",
"d": "Controls the amount of ease along the bust span"
},
"waistdartposition": {
"t": "Waist dart position",
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
},
"backDartHeight": {
"t": "Controls the height of the back dart",
"d": "Back dart height"

View file

@ -55,7 +55,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -24,7 +24,6 @@ export const backPoints = {
const aDown = points.dartBottomRight.angle(points.dartTip)
const aDiff = Math.abs(aUp - aDown)
// let dartCpAdjustment = Math.abs( options.shoulderDartPosition -.5) +.05
const dartCpAdjustment = aDiff / 50
points.shoulderDartCpUp = points.shoulderDart.shiftFractionTowards(
@ -48,7 +47,7 @@ export const backPoints = {
let diff = 0
let angle = 0
do {
if (length.o) angle = diff * (length.o > length.i ? -0.1 : 0.1)
if (length.o) angle = (diff / (length.i / 1300)) * (length.o > length.i ? -0.1 : 0.1)
points.dartBottomRight = points.dartBottomRight.rotate(angle, points.waistSide)

View file

@ -1,15 +1,78 @@
import { frontSideDart as bellaFront } from '@freesewing/bella'
import { hidePresets } from '@freesewing/core'
import { cbqc, hidePresets } from '@freesewing/core'
import * as options from './options.mjs'
const createRightDartPoints = (points, Path, diff, utils) => {
const radius = points.waistDartRight.dist(points.sideHemInitial)
points.waistDartRight = points.waistDartRight.rotate(
utils.rad2deg(Math.atan(diff / radius)),
points.sideHemInitial
)
let outsideSeam = new Path()
.move(points.waistDartRight)
.curve(points.bustAcp, points.shoulderDartTipCpDownOutside, points.shoulderDartOutside)
points.waistUpDartRight = outsideSeam.shiftAlong(
points.waistDartRight.dist(points.waistDartRightCp) * 0.5
)
points.waistUpDartRightCpDown = points.waistUpDartRight.shiftFractionTowards(
points.waistDartRight,
0.25
)
points.waistUpDartRightCpUp = points.waistUpDartRight.shiftFractionTowards(
points.waistDartRight,
-0.6
)
points.waistCpUp = points.waistDartRight
.shiftTowards(points.sideHemInitial, points.waistDartRight.dist(points.waistUpDartRight) * 0.25)
.rotate(90, points.waistDartRight)
points.waistCircleInsideCp1 = points.armholeDartTip.shiftTowards(
points.armholeDartTipCpDownInside,
-0.5 * cbqc * points.armholeDartInside.dist(points.armholeDartTip)
)
return new Path()
.move(points.waistDartRight)
.curve(points.waistCpUp, points.waistUpDartRightCpDown, points.waistUpDartRight)
.curve(
points.waistUpDartRightCpUp,
points.shoulderDartTipCpDownOutside,
points.shoulderDartOutside
)
.length()
}
const createArmholeDartPoints = (points, paths, Path, direction) => {
const dist = points.armholeDartTipInside.dist(points.armholeDartTipCpDownInside)
points.waistCircleOutsideCp1 = points.waistCircleOutsideCp1.shiftTowards(
points.waistUpDartRight,
direction
)
points.armholeDartTipCpDownInside = points.waistCircleInsideCp1.shiftOutwards(
points.armholeDartTipInside,
dist
)
paths.armholeTempCircleOutside = new Path()
.move(points.armholeDartOutside)
.curve(points.armholeCircleOutsideCp1, points.waistCircleOutsideCp1, points.waistUpDartRight)
.curve(points.waistUpDartRightCpDown, points.waistCpUp, points.waistDartRight)
.hide()
paths.armholeTempCircleInside = new Path()
.move(points.armholeDartInside)
.curve(points.armholeCircleInsideCp1, points.waistCircleInsideCp1, points.armholeDartTipInside)
.curve(points.armholeDartTipCpDownInside, points.waistDartLeftCp, points.waistDartLeft)
.hide()
}
export const frontPoints = {
name: 'noble.frontPoints',
from: bellaFront,
hide: hidePresets.HIDE_ALL,
options,
draft: ({ log, points, Path, paths, snippets, options, macro, part }) => {
const bCircle = 0.552284749831
draft: ({ log, points, Path, paths, snippets, options, macro, part, utils }) => {
// Hide Bella paths
for (const key of Object.keys(paths)) paths[key].hide()
for (const i in snippets) delete snippets[i]
@ -18,6 +81,13 @@ export const frontPoints = {
macro('rmtitle')
macro('rmscalebox')
const waistDartSize = points.waistDartLeft.dist(points.waistDartRight)
const waistDartMove = (waistDartSize / 2) * options.waistdartposition
points.waistDartLeft = points.waistDartLeft.shiftTowards(points.cfHem, waistDartMove * -1)
points.waistDartLeftCp = points.waistDartLeftCp.shift(0, waistDartMove)
points.waistDartRight = points.waistDartRight.shiftTowards(points.sideHemInitial, waistDartMove)
points.shoulderDartInside = points.hps.shiftFractionTowards(
points.shoulder,
options.dartPosition == 'shoulder' ? options.shoulderDartPosition : 0.5
@ -54,7 +124,7 @@ export const frontPoints = {
points.armholeCircleInsideCp1 = points.armholeDartInside.shift(
armholeDartAngle,
bCircle * points.armholeDartInside.dist(points.armholeDartTip)
cbqc * points.armholeDartInside.dist(points.armholeDartTip)
)
points.armholeCircleOutsideCp1 = points.armholeCircleInsideCp1.clone()
@ -176,14 +246,12 @@ export const frontPoints = {
points.bust,
1 + (1 - options.upperDartLength) + (1 - options.waistDartLength) * dartRatio
)
// points.shoulderDartTipCpDownOutside = points.shoulderDartTipCpDownOutside.rotate( options.dartOutsideCP *10, points.shoulderDartOutside )
points.shoulderDartTipCpDownInside = points.shoulderDartInside.shiftFractionTowards(
points.shoulderDartTip,
1 + (1 - options.upperDartLength) + (1 - options.waistDartLength) * dartRatio
)
points.armholeDartTipCpDownInside = points.armholeDartTip.shiftFractionTowards(
// points.waistDartHem,
points.waistDartLeft,
1 - options.upperDartLength + (1 - options.waistDartLength) * dartRatio
)
@ -219,7 +287,7 @@ export const frontPoints = {
)
points.waistCircleInsideCp1 = points.waistUpDartLeft.shiftTowards(
points.waistDartLeft,
-0.5 * bCircle * points.armholeDartOutside.dist(points.armholeDartTip)
-0.5 * cbqc * points.armholeDartOutside.dist(points.armholeDartTip)
)
points.shoulderDartTipCpDownOutside = points.shoulderDartTipCpDownOutside
.rotate(-2.5, points.shoulderDartOutside)
@ -227,102 +295,37 @@ export const frontPoints = {
let iteration = 1
let diff = 0
let rightDartLength = createRightDartPoints(points, Path, diff, utils)
do {
points.waistDartRight = points.waistDartRight.rotate(diff * 0.1, points.sideHemInitial)
rightDartLength = createRightDartPoints(points, Path, diff, utils)
let outsideSeam = new Path()
.move(points.waistDartRight)
.curve(points.bustAcp, points.shoulderDartTipCpDownOutside, points.shoulderDartOutside)
points.waistUpDartRight = outsideSeam.shiftAlong(
points.waistDartRight.dist(points.waistDartRightCp) * 0.5
)
points.waistUpDartRightCpDown = points.waistUpDartRight.shiftFractionTowards(
points.waistDartRight,
0.25
)
// points.waistUpDartRightCpUp = points.waistUpDartRight.shiftFractionTowards( points.waistDartRight, -.25 )
points.waistUpDartRightCpUp = points.waistUpDartRight.shiftFractionTowards(
points.waistDartRight,
-0.6
)
points.waistCpUp = points.waistDartRight
.shiftTowards(
points.sideHemInitial,
points.waistDartRight.dist(points.waistUpDartRight) * 0.25
)
.rotate(90, points.waistDartRight)
points.waistCircleInsideCp1 = points.armholeDartTip.shiftTowards(
points.armholeDartTipCpDownInside,
-0.5 * bCircle * points.armholeDartInside.dist(points.armholeDartTip)
)
outsideSeam = new Path()
.move(points.waistDartRight)
.curve(points.waistCpUp, points.waistUpDartRightCpDown, points.waistUpDartRight)
.curve(
points.waistUpDartRightCpUp,
points.shoulderDartTipCpDownOutside,
points.shoulderDartOutside
)
diff = shoulderInsideSeam.length() - outsideSeam.length()
diff = shoulderInsideSeam.length() - rightDartLength
iteration++
} while ((diff > 1 || diff < -1) && iteration < 200)
if (iteration >= 200) {
} while ((diff > 1 || diff < -1) && iteration < 100)
if (iteration >= 100) {
log.error('Something is not quite right here!')
}
points.waistDartRightCp = points.bustAcp.clone()
points.armholeDartTipInside = points.armholeDartTip.clone()
points.waistCircleOutsideCp1 = points.waistUpDartRight.shiftTowards(
points.waistDartRight,
-1 * bCircle * points.armholeDartOutside.dist(points.armholeDartTip)
-1 * cbqc * points.armholeDartOutside.dist(points.armholeDartTip)
)
diff = 0
createArmholeDartPoints(points, paths, Path, 0)
diff = paths.armholeTempCircleOutside.length() - paths.armholeTempCircleInside.length()
iteration = 0
do {
const dist = points.armholeDartTipInside.dist(points.armholeDartTipCpDownInside)
if (points.armholeDartTipInside.x > points.waistCircleOutsideCp1) {
points.armholeDartTipInside.x = points.armholeDartTipInside.x - 0.5
points.armholeDartTipInside.y = points.armholeDartTipInside.y + 0.5
} else {
points.waistCircleOutsideCp1 = points.waistCircleOutsideCp1.shiftTowards(
points.waistUpDartRight,
diff > 0 ? 1 : -1
)
}
points.armholeDartTipCpDownInside = points.waistCircleInsideCp1.shiftOutwards(
points.armholeDartTipInside,
dist
)
paths.armholeTempCircleOutside = new Path()
.move(points.armholeDartOutside)
.curve(
points.armholeCircleOutsideCp1,
points.waistCircleOutsideCp1,
points.waistUpDartRight
)
.curve(points.waistUpDartRightCpDown, points.waistCpUp, points.waistDartRight)
.hide()
.attr('class', 'lining')
paths.armholeTempCircleInside = new Path()
.move(points.armholeDartInside)
.curve(
points.armholeCircleInsideCp1,
points.waistCircleInsideCp1,
points.armholeDartTipInside
)
.curve(points.armholeDartTipCpDownInside, points.waistDartLeftCp, points.waistDartLeft)
.hide()
.attr('class', 'lining')
createArmholeDartPoints(points, paths, Path, diff)
diff = paths.armholeTempCircleOutside.length() - paths.armholeTempCircleInside.length()
iteration++
} while ((diff < -1 || diff > 1) && iteration < 200)
if (iteration >= 200) {
log.error('Something is not quite right here!')
} while ((diff < -1 || diff > 1) && iteration < 100)
if (iteration >= 100) {
log.error('Something is not quite right here too!')
}
return part

View file

@ -9,6 +9,7 @@ export const bustSpanEase = { pct: 0, min: -5, max: 20, ...pctBasedOn('bustSpan'
export const backHemSlope = { deg: 2.5, min: 0, max: 5, menu: 'advanced' }
export const upperDartLength = { pct: 90, min: 80, max: 95, menu: 'darts' }
export const dartPosition = { dflt: 'shoulder', list: ['shoulder', 'armhole'], menu: 'darts' }
export const waistdartposition = { pct: 0, min: -100, max: 100, menu: 'darts' }
export const shoulderDartPosition = {
pct: 50,
min: 10,

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -56,7 +56,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -65,7 +65,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -42,6 +42,10 @@
"hemWidth": {
"t": "Saumbreite",
"d": "Breite des Saumes"
},
"panels": {
"t": "Panels",
"d": "Number of panels"
}
}
}

View file

@ -61,6 +61,10 @@
"hemWidth": {
"t": "Hem width",
"d": "Width of the hem"
},
"panels": {
"t": "Panels",
"d": "Number of panels"
}
}
}

View file

@ -42,6 +42,10 @@
"hemWidth": {
"t": "Hem width",
"d": "Anchura del dobladillo"
},
"panels": {
"t": "Panels",
"d": "Number of panels"
}
}
}

View file

@ -42,6 +42,10 @@
"hemWidth": {
"t": "Hem width",
"d": "Largeur de l'ourlet"
},
"panels": {
"t": "Panels",
"d": "Number of panels"
}
}
}

View file

@ -42,6 +42,10 @@
"hemWidth": {
"t": "Breedte zoom",
"d": "Breedte van de zoom"
},
"panels": {
"t": "Panels",
"d": "Number of panels"
}
}
}

View file

@ -42,6 +42,10 @@
"hemWidth": {
"t": "Hem width",
"d": "Width of the hem"
},
"panels": {
"t": "Panels",
"d": "Number of panels"
}
}
}

View file

@ -55,7 +55,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -49,7 +49,7 @@ function sandySkirt({
measurements.waistToFloor - measurements.waistToHips * options.waistbandPosition
)
let radiusWaist, an
let radiusWaist, angle
if (options.seamlessFullCircle) {
/**
* If the seamless full circle option is selected, the angle
@ -57,15 +57,16 @@ function sandySkirt({
* it's not selected, because in this case the fabric is cut
* in a double fold
*/
an = 90
radiusWaist = store.get('skirtCircumference') / utils.deg2rad(an) / 4
angle = 90
radiusWaist = store.get('skirtCircumference') / utils.deg2rad(angle) / 4
} else {
/**
* If the seamless full circle option is not selected, the
* angle is calculated using the circlePercent option
*/
an = 180 * options.circleRatio
radiusWaist = store.get('skirtCircumference') / utils.deg2rad(an) / 2
const totalAngle = 180 * options.circleRatio
angle = totalAngle / options.panels
radiusWaist = store.get('skirtCircumference') / utils.deg2rad(totalAngle) / 2
/**
* If the angle is too large, the seam allowance can fall out
@ -73,9 +74,9 @@ function sandySkirt({
* maximum angle calculated so the seam allowance fits in the
* fabric
*/
if (an > 90 && sa) {
const maxAn = utils.rad2deg(Math.atan(radiusWaist / sa))
if (an > 90 + maxAn) an = 90 + maxAn
if (angle > 90 && sa) {
const maxAngle = utils.rad2deg(Math.atan(radiusWaist / sa))
if (angle > 90 + maxAngle) angle = 90 + maxAngle
}
}
/**
@ -87,7 +88,7 @@ function sandySkirt({
// Call the RingSector macro to draft the part
const ids = macro('ringsector', {
angle: an,
angle: angle,
insideRadius: radiusWaist,
outsideRadius: radiusHem,
rotate: true,
@ -154,7 +155,12 @@ function sandySkirt({
* Annotations
*/
// Cutlist
store.cutlist.setCut({ cut: 1, from: 'fabric', onFold: true })
store.cutlist.setCut({
cut: options.seamlessFullCircle ? 1 : Number(options.panels),
from: 'fabric',
onFold: true,
identical: true,
})
// Cutonfold
macro('cutonfold', {
@ -218,24 +224,24 @@ function sandySkirt({
to: points.center,
x: points.ex2Flipped.x - sa - 30,
})
if (options.circleRatio !== 0.5) {
if (angle !== 90) {
macro('vd', {
id: 'hTopToOpeningRight',
from: points.ex1Rotated,
to: points.in1Rotated,
x: options.circleRatio > 0.5 ? points.in1Rotated.x - sa - 15 : points.ex1Rotated.x + sa + 15,
x: angle > 90 ? points.in1Rotated.x - sa - 15 : points.ex1Rotated.x + sa + 15,
})
macro('vd', {
id: 'hOpeningRightToCenter',
from: points.in1Rotated,
to: points.center,
x: options.circleRatio > 0.5 ? points.in1Rotated.x - sa - 15 : points.ex1Rotated.x + sa + 15,
x: angle > 90 ? points.in1Rotated.x - sa - 15 : points.ex1Rotated.x + sa + 15,
})
macro('vd', {
from: points.ex1Rotated,
id: 'hHemRightToCenter',
to: points.center,
x: options.circleRatio > 0.5 ? points.in1Rotated.x - sa - 30 : points.ex1Rotated.x + sa + 30,
x: angle > 90 ? points.in1Rotated.x - sa - 30 : points.ex1Rotated.x + sa + 30,
})
}
@ -267,6 +273,7 @@ export const skirt = {
dflt: 'straight',
menu: 'fit',
},
panels: { count: 1, min: 1, max: 8, menu: 'construction' },
},
plugins: ringsectorPlugin,
draft: sandySkirt,

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -55,7 +55,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -57,7 +57,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -58,7 +58,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -56,7 +56,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -55,7 +55,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -56,7 +56,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -54,7 +54,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -55,7 +55,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -55,7 +55,7 @@
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"chai": "5.0.3",
"@freesewing/models": "3.1.0",
"@freesewing/plugin-timing": "3.1.0"
},

View file

@ -0,0 +1,17 @@
# Change log for: @freesewing/tristan
## 3.0.0 (2022-09-30)
### Changed
- All FreeSewing pacakges are now ESM only.
- All FreeSewing pacakges now use named exports.
- Dropped support for NodeJS 14. NodeJS 18 (LTS/hydrogen) or more recent is now required.
This is the **initial release**, and the start of this change log.
> Prior to version 2, FreeSewing was not a JavaScript project.
> As such, that history is out of scope for this change log.

143
designs/tristan/README.md Normal file
View file

@ -0,0 +1,143 @@
![FreeSewing](https://static.freesewing.org/banner.png)
<p align='center'><a
href="https://www.npmjs.com/package/@freesewing/tristan"
title="@freesewing/tristan on NPM"
><img src="https://img.shields.io/npm/v/@freesewing/tristan.svg"
alt="@freesewing/tristan on NPM"/>
</a><a
href="https://opensource.org/licenses/MIT"
title="License: MIT"
><img src="https://img.shields.io/npm/l/@freesewing/tristan.svg?label=License"
alt="License: MIT"/>
</a><a
href="https://deepscan.io/dashboard#view=project&tid=2114&pid=2993&bid=23256"
title="Code quality on DeepScan"
><img src="https://deepscan.io/api/teams/2114/projects/2993/branches/23256/badge/grade.svg"
alt="Code quality on DeepScan"/>
</a><a
href="https://github.com/freesewing/freesewing/issues?q=is%3Aissue+is%3Aopen+label%3Apkg%3Atristan"
title="Open issues tagged pkg:tristan"
><img src="https://img.shields.io/github/issues/freesewing/freesewing/pkg:tristan.svg?label=Issues"
alt="Open issues tagged pkg:tristan"/>
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-113-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"
title="Follow @freesewing_org on Twitter"
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Follow%20us-blue.svg?logo=twitter&logoColor=white&logoWidth=15"
alt="Follow @freesewing_org on Twitter"/>
</a><a
href="https://chat.freesewing.org"
title="Chat with us on Discord"
><img src="https://img.shields.io/discord/698854858052075530?label=Chat%20on%20Discord"
alt="Chat with us on Discord"/>
</a><a
href="https://freesewing.org/patrons/join"
title="Become a FreeSewing Patron"
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Support%20us-blueviolet.svg?logo=cash-app&logoColor=white&logoWidth=15"
alt="Become a FreeSewing Patron"/>
</a><a
href="https://instagram.com/freesewing_org"
title="Follow @freesewing_org on Twitter"
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Follow%20us-E4405F.svg?logo=instagram&logoColor=white&logoWidth=15"
alt="Follow @freesewing_org on Twitter"/>
</a></p>
# @freesewing/tristan
A FreeSewing pattern for a fitted top
## What am I looking at? 🤔
This repository is the FreeSewing *monorepo* holding all FreeSewing's websites, documentation, designs, plugins, and other NPM packages.
This folder holds: @freesewing/tristan
If you're not entirely sure what to do or how to start, type this command:
```
npm run tips
```
> If you don't want to set up a dev environment, you can run it in your browser:
>
> [![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
sewing patterns adapted to your measurements.
If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
The FreeSewing [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
for parametric design of sewing patterns. But FreeSewing also provides a range
of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
functionality of the platform.
If you have NodeJS installed, you can try it right now by running:
```bash
npx create-freesewing-pattern
```
Getting started guides are available for:
- [Linux](https://freesewing.dev/tutorials/getting-started-linux/)
- [MacOS](https://freesewing.dev/tutorials/getting-started-mac/)
- [Windows](https://freesewing.dev/tutorials/getting-started-windows/)
The [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) will
show you how to create your first parametric design.
## Support FreeSewing: Become a patron 🥰
FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
If you feel FreeSewing is worthwhile, and you can spend a few coind without
hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
## Links 👩‍💻
**Official channels**
- 💻 Makers website: [FreeSewing.org](https://freesewing.org)
- 💻 Developers website: [FreeSewing.dev](https://freesewing.dev)
- ✅ [Support](https://github.com/freesewing/freesewing/issues/new/choose),
[Issues](https://github.com/freesewing/freesewing/issues) &
[Discussions](https://github.com/freesewing/freesewing/discussions) on
[GitHub](https://github.com/freesewing/freesewing)
**Social media**
- 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org)
- 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
**Places the FreeSewing community hangs out**
- 💬 [Discord](https://discord.freesewing.org/)
- 💬 [Facebook](https://www.facebook.com/groups/627769821272714/)
- 💬 [Reddit](https://www.reddit.com/r/freesewing/)
## License: MIT 🤓
© [Joost De Cock](https://github.com/joostdecock).
See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details.
## Where to get help 🤯
For [Support](https://github.com/freesewing/freesewing/issues/new/choose),
please use the [Issues](https://github.com/freesewing/freesewing/issues) &
[Discussions](https://github.com/freesewing/freesewing/discussions) on
[GitHub](https://github.com/freesewing/freesewing).

35
designs/tristan/build.mjs Normal file
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/tristan/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/tristan'
export const version = '3.0.0'
export const data = { name, version }

View file

@ -0,0 +1,178 @@
{
"t": "Tristan",
"d": "Tristan is a fitted tank top with prince(ss) seams.",
"p": {
"backInside": "Back inside",
"backOutside": "Back outside",
"backPoints": "Back base",
"frontInside": "Front inside",
"frontOutside": "Front outside",
"frontPoints": "Front base",
"peplumFront": "Peplum front",
"peplumBack": "Peplum back"
},
"s": {
"strapWidthAdjusted.t": "The strap width has been adjusted",
"strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
"peplumWidth.t": "Peplum size",
"peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
"frontOutside": "Outside front",
"frontInside": "Inside front",
"backOutside": "Outside back",
"backInside": "Inside back",
"frontPeplum": "Peplum front",
"backPeplum": "Peplum back",
"hem": "Hem"
},
"o": {
"bustSpanEase": {
"t": "Bust span ease",
"d": "Controls the amount of ease along the bust span"
},
"chestEase": {
"t": "Chest ease",
"d": "Controls the amount of ease at the chest"
},
"shoulderToShoulderEase": {
"t": "Shoulder to shoulder ease",
"d": "Controls the amount of ease along the shoulder to shoulder measurement"
},
"fullChestEaseReduction": {
"t": "Full chest ease reduction",
"d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
},
"waistEase": {
"t": "Waist ease",
"d": "Controls the amount of ease at the waist"
},
"waistdartposition": {
"t": "Waist dart position",
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
},
"frontShoulderWidth": {
"t": "Front shoulder width",
"d": "Controls how much width is added to the shoulder in the front"
},
"highBustWidth": {
"t": "High bust width",
"d": "Controls the width of the high bust"
},
"armholeDepth": {
"t": "Depth of the Armhole",
"d": "Controls how deep the armhole is"
},
"cutDepthBack": {
"t": "Depth of the cut in the back",
"d": "Controls the depth of the cut in the back"
},
"cutDepthFront": {
"t": "Depth of the cut in the front",
"d": "Controls the depth of the cut in the front"
},
"cutRoundnessBack": {
"t": "Roundness of the cut in the back",
"d": "Controls how 'round' the cut in the back is, from V to round to square"
},
"cutRoundnessFront": {
"t": "Roundness of the cut in the front",
"d": "Controls how 'round' the cut in the front is, from V to round to square"
},
"shoulderDartPosition": {
"t": "Shoulder dart position",
"d": "Controls the position of the shoulder dart"
},
"strapWidth": {
"t": "Width of the straps",
"d": "Controls the width of the straps"
},
"upperDartLength": {
"t": "Upper dart length",
"d": "Controls the length of the upper dart"
},
"waistDartLength": {
"t": "Waist dart length",
"d": "Controls the length of the waist dart"
},
"zipperLocation": {
"t": "Zipper location",
"d": "The location of the zipper: side, back, or front"
},
"zipperLocation.front": {
"t": "Front zipper location",
"d": "The location of the zipper will be in the front"
},
"zipperLocation.side": {
"t": "Side zipper location",
"d": "The location of the zipper will be on the side"
},
"zipperLocation.back": {
"t": "Back zipper location",
"d": "The location of the zipper will be in the back"
},
"hem": {
"t": "Hem option",
"d": "Add a hem."
},
"hemYes": {
"t": "Add a hem",
"d": "Add a hem at the waist"
},
"hemNo": {
"t": "Do not add a hem",
"d": "Do not add a hem at the waist"
},
"hemSize": {
"t": "Size of the hem",
"d": "Size of the hem, a percentage of the distance between the neckline and the waist"
},
"lacing": {
"t": "Lacing option",
"d": "This removes part of the seam to create an opening for lacing"
},
"lacingYes": {
"t": "Add Lacing",
"d": "Remove part of the seam to create an opening for lacing"
},
"lacingNo": {
"t": "No lacing",
"d": "Close the seams normally"
},
"lacingLocation": {
"t": "Location of the lacing",
"d": "Lacing in the front, or the back"
},
"lacingLocation.back": {
"t": "Lacing in the back",
"d": "The lacing will be in the back"
},
"lacingLocation.front": {
"t": "Lacing in the front",
"d": "The lacing will be in the front"
},
"lacingWidth": {
"t": "Lacing width",
"d": "Width of the lacing opening"
},
"peplum": {
"t": "Peplum",
"d": "Add a peplum"
},
"peplumYes": {
"t": "Add a peplum",
"d": "This will generate the peplum part."
},
"peplumNo": {
"t": "No peplum",
"d": "Pattern will be generated without a peplum"
},
"peplumSize": {
"t": "Peplum size",
"d": "Controls the size of the peplum"
},
"peplumFullness": {
"t": "Peplum fullness",
"d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
}
}
}

Some files were not shown because too many files have changed in this diff Show more