Merge branch 'develop' into joost
This commit is contained in:
commit
038d0f3903
1612 changed files with 13707 additions and 3916 deletions
|
@ -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,
|
||||
|
|
8
.github/workflows/playwright.yml
vendored
8
.github/workflows/playwright.yml
vendored
|
@ -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:
|
||||
|
|
8
.github/workflows/tests.new-design.yml
vendored
8
.github/workflows/tests.new-design.yml
vendored
|
@ -1,4 +1,12 @@
|
|||
name: Test new-design
|
||||
|
||||
on: [push]
|
||||
jobs:
|
||||
noop:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo Noop.
|
||||
|
||||
#on:
|
||||
# push:
|
||||
# branches:
|
||||
|
|
|
@ -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>
|
||||
|
|
124
artwork/stickers/sticker-round-lgbtq-lg.svg
Normal file
124
artwork/stickers/sticker-round-lgbtq-lg.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 17 KiB |
|
@ -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",
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
97
designs/hugo/src/neckbinding.mjs
Normal file
97
designs/hugo/src/neckbinding.mjs
Normal 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,
|
||||
}
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
17
designs/lumina/CHANGELOG.md
Normal file
17
designs/lumina/CHANGELOG.md
Normal 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
143
designs/lumina/README.md
Normal file
|
@ -0,0 +1,143 @@
|
|||

|
||||
<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:
|
||||
>
|
||||
> [](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
35
designs/lumina/build.mjs
Normal file
|
@ -0,0 +1,35 @@
|
|||
/* This script will build the package with esbuild */
|
||||
import esbuild from 'esbuild'
|
||||
import pkg from './package.json' assert { type: 'json' }
|
||||
|
||||
// Create banner based on package info
|
||||
const banner = `/**
|
||||
* ${pkg.name} | v${pkg.version}
|
||||
* ${pkg.description}
|
||||
* (c) ${new Date().getFullYear()} ${pkg.author}
|
||||
* @license ${pkg.license}
|
||||
*/`
|
||||
|
||||
// Shared esbuild options
|
||||
const options = {
|
||||
banner: { js: banner },
|
||||
bundle: true,
|
||||
entryPoints: ['src/index.mjs'],
|
||||
format: 'esm',
|
||||
outfile: 'dist/index.mjs',
|
||||
external: ['@freesewing'],
|
||||
metafile: process.env.VERBOSE ? true : false,
|
||||
minify: process.env.NO_MINIFY ? false : true,
|
||||
sourcemap: true,
|
||||
}
|
||||
|
||||
// Let esbuild generate the build
|
||||
const build = async () => {
|
||||
const result = await esbuild.build(options).catch(() => process.exit(1))
|
||||
|
||||
if (process.env.VERBOSE) {
|
||||
const info = await esbuild.analyzeMetafile(result.metafile)
|
||||
console.log(info)
|
||||
}
|
||||
}
|
||||
build()
|
4
designs/lumina/data.mjs
Normal file
4
designs/lumina/data.mjs
Normal 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 }
|
7
designs/lumina/i18n/de.json
Normal file
7
designs/lumina/i18n/de.json
Normal 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
101
designs/lumina/i18n/en.json
Normal 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)."
|
||||
}
|
||||
}
|
||||
}
|
7
designs/lumina/i18n/es.json
Normal file
7
designs/lumina/i18n/es.json
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"t": "Lumina",
|
||||
"d": "A FreeSewing pattern that needs a description",
|
||||
"p": { },
|
||||
"s": { },
|
||||
"o": { }
|
||||
}
|
7
designs/lumina/i18n/fr.json
Normal file
7
designs/lumina/i18n/fr.json
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"t": "Lumina",
|
||||
"d": "A FreeSewing pattern that needs a description",
|
||||
"p": { },
|
||||
"s": { },
|
||||
"o": { }
|
||||
}
|
8
designs/lumina/i18n/index.mjs
Normal file
8
designs/lumina/i18n/index.mjs
Normal file
|
@ -0,0 +1,8 @@
|
|||
import en from './en.json' assert { type: 'json' }
|
||||
import de from './de.json' assert { type: 'json' }
|
||||
import es from './es.json' assert { type: 'json' }
|
||||
import fr from './fr.json' assert { type: 'json' }
|
||||
import nl from './nl.json' assert { type: 'json' }
|
||||
import uk from './uk.json' assert { type: 'json' }
|
||||
|
||||
export const i18n = { en, de, es, fr, nl, uk }
|
7
designs/lumina/i18n/nl.json
Normal file
7
designs/lumina/i18n/nl.json
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"t": "Lumina",
|
||||
"d": "A FreeSewing pattern that needs a description",
|
||||
"p": { },
|
||||
"s": { },
|
||||
"o": { }
|
||||
}
|
7
designs/lumina/i18n/uk.json
Normal file
7
designs/lumina/i18n/uk.json
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"t": "Lumina",
|
||||
"d": "A FreeSewing pattern that needs a description",
|
||||
"p": { },
|
||||
"s": { },
|
||||
"o": { }
|
||||
}
|
73
designs/lumina/package.json
Normal file
73
designs/lumina/package.json
Normal 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"
|
||||
}
|
||||
}
|
20
designs/lumina/src/index.mjs
Normal file
20
designs/lumina/src/index.mjs
Normal 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
151
designs/lumina/src/leg.mjs
Normal 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
|
||||
},
|
||||
}
|
109
designs/lumina/src/panel.mjs
Normal file
109
designs/lumina/src/panel.mjs
Normal 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
|
||||
},
|
||||
}
|
154
designs/lumina/src/pocket.mjs
Normal file
154
designs/lumina/src/pocket.mjs
Normal 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
|
||||
},
|
||||
}
|
631
designs/lumina/src/shape.mjs
Normal file
631
designs/lumina/src/shape.mjs
Normal 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()
|
||||
},
|
||||
}
|
208
designs/lumina/src/waistband.mjs
Normal file
208
designs/lumina/src/waistband.mjs
Normal 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
|
||||
},
|
||||
}
|
20
designs/lumina/tests/shared.test.mjs
Normal file
20
designs/lumina/tests/shared.test.mjs
Normal 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)
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -24,7 +24,6 @@ export const backPoints = {
|
|||
const aDown = points.dartBottomRight.angle(points.dartTip)
|
||||
const aDiff = Math.abs(aUp - aDown)
|
||||
|
||||
// let dartCpAdjustment = Math.abs( options.shoulderDartPosition -.5) +.05
|
||||
const dartCpAdjustment = aDiff / 50
|
||||
|
||||
points.shoulderDartCpUp = points.shoulderDart.shiftFractionTowards(
|
||||
|
@ -48,7 +47,7 @@ export const backPoints = {
|
|||
let diff = 0
|
||||
let angle = 0
|
||||
do {
|
||||
if (length.o) angle = diff * (length.o > length.i ? -0.1 : 0.1)
|
||||
if (length.o) angle = (diff / (length.i / 1300)) * (length.o > length.i ? -0.1 : 0.1)
|
||||
|
||||
points.dartBottomRight = points.dartBottomRight.rotate(angle, points.waistSide)
|
||||
|
||||
|
|
|
@ -1,15 +1,78 @@
|
|||
import { frontSideDart as bellaFront } from '@freesewing/bella'
|
||||
import { hidePresets } from '@freesewing/core'
|
||||
import { cbqc, hidePresets } from '@freesewing/core'
|
||||
import * as options from './options.mjs'
|
||||
|
||||
const createRightDartPoints = (points, Path, diff, utils) => {
|
||||
const radius = points.waistDartRight.dist(points.sideHemInitial)
|
||||
|
||||
points.waistDartRight = points.waistDartRight.rotate(
|
||||
utils.rad2deg(Math.atan(diff / radius)),
|
||||
points.sideHemInitial
|
||||
)
|
||||
|
||||
let outsideSeam = new Path()
|
||||
.move(points.waistDartRight)
|
||||
.curve(points.bustAcp, points.shoulderDartTipCpDownOutside, points.shoulderDartOutside)
|
||||
|
||||
points.waistUpDartRight = outsideSeam.shiftAlong(
|
||||
points.waistDartRight.dist(points.waistDartRightCp) * 0.5
|
||||
)
|
||||
points.waistUpDartRightCpDown = points.waistUpDartRight.shiftFractionTowards(
|
||||
points.waistDartRight,
|
||||
0.25
|
||||
)
|
||||
points.waistUpDartRightCpUp = points.waistUpDartRight.shiftFractionTowards(
|
||||
points.waistDartRight,
|
||||
-0.6
|
||||
)
|
||||
points.waistCpUp = points.waistDartRight
|
||||
.shiftTowards(points.sideHemInitial, points.waistDartRight.dist(points.waistUpDartRight) * 0.25)
|
||||
.rotate(90, points.waistDartRight)
|
||||
points.waistCircleInsideCp1 = points.armholeDartTip.shiftTowards(
|
||||
points.armholeDartTipCpDownInside,
|
||||
-0.5 * cbqc * points.armholeDartInside.dist(points.armholeDartTip)
|
||||
)
|
||||
|
||||
return new Path()
|
||||
.move(points.waistDartRight)
|
||||
.curve(points.waistCpUp, points.waistUpDartRightCpDown, points.waistUpDartRight)
|
||||
.curve(
|
||||
points.waistUpDartRightCpUp,
|
||||
points.shoulderDartTipCpDownOutside,
|
||||
points.shoulderDartOutside
|
||||
)
|
||||
.length()
|
||||
}
|
||||
|
||||
const createArmholeDartPoints = (points, paths, Path, direction) => {
|
||||
const dist = points.armholeDartTipInside.dist(points.armholeDartTipCpDownInside)
|
||||
points.waistCircleOutsideCp1 = points.waistCircleOutsideCp1.shiftTowards(
|
||||
points.waistUpDartRight,
|
||||
direction
|
||||
)
|
||||
points.armholeDartTipCpDownInside = points.waistCircleInsideCp1.shiftOutwards(
|
||||
points.armholeDartTipInside,
|
||||
dist
|
||||
)
|
||||
|
||||
paths.armholeTempCircleOutside = new Path()
|
||||
.move(points.armholeDartOutside)
|
||||
.curve(points.armholeCircleOutsideCp1, points.waistCircleOutsideCp1, points.waistUpDartRight)
|
||||
.curve(points.waistUpDartRightCpDown, points.waistCpUp, points.waistDartRight)
|
||||
.hide()
|
||||
paths.armholeTempCircleInside = new Path()
|
||||
.move(points.armholeDartInside)
|
||||
.curve(points.armholeCircleInsideCp1, points.waistCircleInsideCp1, points.armholeDartTipInside)
|
||||
.curve(points.armholeDartTipCpDownInside, points.waistDartLeftCp, points.waistDartLeft)
|
||||
.hide()
|
||||
}
|
||||
|
||||
export const frontPoints = {
|
||||
name: 'noble.frontPoints',
|
||||
from: bellaFront,
|
||||
hide: hidePresets.HIDE_ALL,
|
||||
options,
|
||||
draft: ({ log, points, Path, paths, snippets, options, macro, part }) => {
|
||||
const bCircle = 0.552284749831
|
||||
|
||||
draft: ({ log, points, Path, paths, snippets, options, macro, part, utils }) => {
|
||||
// Hide Bella paths
|
||||
for (const key of Object.keys(paths)) paths[key].hide()
|
||||
for (const i in snippets) delete snippets[i]
|
||||
|
@ -18,6 +81,13 @@ export const frontPoints = {
|
|||
macro('rmtitle')
|
||||
macro('rmscalebox')
|
||||
|
||||
const waistDartSize = points.waistDartLeft.dist(points.waistDartRight)
|
||||
const waistDartMove = (waistDartSize / 2) * options.waistdartposition
|
||||
|
||||
points.waistDartLeft = points.waistDartLeft.shiftTowards(points.cfHem, waistDartMove * -1)
|
||||
points.waistDartLeftCp = points.waistDartLeftCp.shift(0, waistDartMove)
|
||||
points.waistDartRight = points.waistDartRight.shiftTowards(points.sideHemInitial, waistDartMove)
|
||||
|
||||
points.shoulderDartInside = points.hps.shiftFractionTowards(
|
||||
points.shoulder,
|
||||
options.dartPosition == 'shoulder' ? options.shoulderDartPosition : 0.5
|
||||
|
@ -54,7 +124,7 @@ export const frontPoints = {
|
|||
|
||||
points.armholeCircleInsideCp1 = points.armholeDartInside.shift(
|
||||
armholeDartAngle,
|
||||
bCircle * points.armholeDartInside.dist(points.armholeDartTip)
|
||||
cbqc * points.armholeDartInside.dist(points.armholeDartTip)
|
||||
)
|
||||
points.armholeCircleOutsideCp1 = points.armholeCircleInsideCp1.clone()
|
||||
|
||||
|
@ -176,14 +246,12 @@ export const frontPoints = {
|
|||
points.bust,
|
||||
1 + (1 - options.upperDartLength) + (1 - options.waistDartLength) * dartRatio
|
||||
)
|
||||
// points.shoulderDartTipCpDownOutside = points.shoulderDartTipCpDownOutside.rotate( options.dartOutsideCP *10, points.shoulderDartOutside )
|
||||
|
||||
points.shoulderDartTipCpDownInside = points.shoulderDartInside.shiftFractionTowards(
|
||||
points.shoulderDartTip,
|
||||
1 + (1 - options.upperDartLength) + (1 - options.waistDartLength) * dartRatio
|
||||
)
|
||||
points.armholeDartTipCpDownInside = points.armholeDartTip.shiftFractionTowards(
|
||||
// points.waistDartHem,
|
||||
points.waistDartLeft,
|
||||
1 - options.upperDartLength + (1 - options.waistDartLength) * dartRatio
|
||||
)
|
||||
|
@ -219,7 +287,7 @@ export const frontPoints = {
|
|||
)
|
||||
points.waistCircleInsideCp1 = points.waistUpDartLeft.shiftTowards(
|
||||
points.waistDartLeft,
|
||||
-0.5 * bCircle * points.armholeDartOutside.dist(points.armholeDartTip)
|
||||
-0.5 * cbqc * points.armholeDartOutside.dist(points.armholeDartTip)
|
||||
)
|
||||
points.shoulderDartTipCpDownOutside = points.shoulderDartTipCpDownOutside
|
||||
.rotate(-2.5, points.shoulderDartOutside)
|
||||
|
@ -227,102 +295,37 @@ export const frontPoints = {
|
|||
|
||||
let iteration = 1
|
||||
let diff = 0
|
||||
|
||||
let rightDartLength = createRightDartPoints(points, Path, diff, utils)
|
||||
do {
|
||||
points.waistDartRight = points.waistDartRight.rotate(diff * 0.1, points.sideHemInitial)
|
||||
rightDartLength = createRightDartPoints(points, Path, diff, utils)
|
||||
|
||||
let outsideSeam = new Path()
|
||||
.move(points.waistDartRight)
|
||||
.curve(points.bustAcp, points.shoulderDartTipCpDownOutside, points.shoulderDartOutside)
|
||||
|
||||
points.waistUpDartRight = outsideSeam.shiftAlong(
|
||||
points.waistDartRight.dist(points.waistDartRightCp) * 0.5
|
||||
)
|
||||
points.waistUpDartRightCpDown = points.waistUpDartRight.shiftFractionTowards(
|
||||
points.waistDartRight,
|
||||
0.25
|
||||
)
|
||||
// points.waistUpDartRightCpUp = points.waistUpDartRight.shiftFractionTowards( points.waistDartRight, -.25 )
|
||||
points.waistUpDartRightCpUp = points.waistUpDartRight.shiftFractionTowards(
|
||||
points.waistDartRight,
|
||||
-0.6
|
||||
)
|
||||
points.waistCpUp = points.waistDartRight
|
||||
.shiftTowards(
|
||||
points.sideHemInitial,
|
||||
points.waistDartRight.dist(points.waistUpDartRight) * 0.25
|
||||
)
|
||||
.rotate(90, points.waistDartRight)
|
||||
points.waistCircleInsideCp1 = points.armholeDartTip.shiftTowards(
|
||||
points.armholeDartTipCpDownInside,
|
||||
-0.5 * bCircle * points.armholeDartInside.dist(points.armholeDartTip)
|
||||
)
|
||||
|
||||
outsideSeam = new Path()
|
||||
.move(points.waistDartRight)
|
||||
.curve(points.waistCpUp, points.waistUpDartRightCpDown, points.waistUpDartRight)
|
||||
.curve(
|
||||
points.waistUpDartRightCpUp,
|
||||
points.shoulderDartTipCpDownOutside,
|
||||
points.shoulderDartOutside
|
||||
)
|
||||
|
||||
diff = shoulderInsideSeam.length() - outsideSeam.length()
|
||||
diff = shoulderInsideSeam.length() - rightDartLength
|
||||
iteration++
|
||||
} while ((diff > 1 || diff < -1) && iteration < 200)
|
||||
if (iteration >= 200) {
|
||||
} while ((diff > 1 || diff < -1) && iteration < 100)
|
||||
|
||||
if (iteration >= 100) {
|
||||
log.error('Something is not quite right here!')
|
||||
}
|
||||
points.waistDartRightCp = points.bustAcp.clone()
|
||||
points.armholeDartTipInside = points.armholeDartTip.clone()
|
||||
points.waistCircleOutsideCp1 = points.waistUpDartRight.shiftTowards(
|
||||
points.waistDartRight,
|
||||
-1 * bCircle * points.armholeDartOutside.dist(points.armholeDartTip)
|
||||
-1 * cbqc * points.armholeDartOutside.dist(points.armholeDartTip)
|
||||
)
|
||||
|
||||
diff = 0
|
||||
createArmholeDartPoints(points, paths, Path, 0)
|
||||
diff = paths.armholeTempCircleOutside.length() - paths.armholeTempCircleInside.length()
|
||||
|
||||
iteration = 0
|
||||
do {
|
||||
const dist = points.armholeDartTipInside.dist(points.armholeDartTipCpDownInside)
|
||||
if (points.armholeDartTipInside.x > points.waistCircleOutsideCp1) {
|
||||
points.armholeDartTipInside.x = points.armholeDartTipInside.x - 0.5
|
||||
points.armholeDartTipInside.y = points.armholeDartTipInside.y + 0.5
|
||||
} else {
|
||||
points.waistCircleOutsideCp1 = points.waistCircleOutsideCp1.shiftTowards(
|
||||
points.waistUpDartRight,
|
||||
diff > 0 ? 1 : -1
|
||||
)
|
||||
}
|
||||
points.armholeDartTipCpDownInside = points.waistCircleInsideCp1.shiftOutwards(
|
||||
points.armholeDartTipInside,
|
||||
dist
|
||||
)
|
||||
|
||||
paths.armholeTempCircleOutside = new Path()
|
||||
.move(points.armholeDartOutside)
|
||||
.curve(
|
||||
points.armholeCircleOutsideCp1,
|
||||
points.waistCircleOutsideCp1,
|
||||
points.waistUpDartRight
|
||||
)
|
||||
.curve(points.waistUpDartRightCpDown, points.waistCpUp, points.waistDartRight)
|
||||
.hide()
|
||||
.attr('class', 'lining')
|
||||
paths.armholeTempCircleInside = new Path()
|
||||
.move(points.armholeDartInside)
|
||||
.curve(
|
||||
points.armholeCircleInsideCp1,
|
||||
points.waistCircleInsideCp1,
|
||||
points.armholeDartTipInside
|
||||
)
|
||||
.curve(points.armholeDartTipCpDownInside, points.waistDartLeftCp, points.waistDartLeft)
|
||||
.hide()
|
||||
.attr('class', 'lining')
|
||||
createArmholeDartPoints(points, paths, Path, diff)
|
||||
|
||||
diff = paths.armholeTempCircleOutside.length() - paths.armholeTempCircleInside.length()
|
||||
iteration++
|
||||
} while ((diff < -1 || diff > 1) && iteration < 200)
|
||||
if (iteration >= 200) {
|
||||
log.error('Something is not quite right here!')
|
||||
} while ((diff < -1 || diff > 1) && iteration < 100)
|
||||
if (iteration >= 100) {
|
||||
log.error('Something is not quite right here too!')
|
||||
}
|
||||
|
||||
return part
|
||||
|
|
|
@ -9,6 +9,7 @@ export const bustSpanEase = { pct: 0, min: -5, max: 20, ...pctBasedOn('bustSpan'
|
|||
export const backHemSlope = { deg: 2.5, min: 0, max: 5, menu: 'advanced' }
|
||||
export const upperDartLength = { pct: 90, min: 80, max: 95, menu: 'darts' }
|
||||
export const dartPosition = { dflt: 'shoulder', list: ['shoulder', 'armhole'], menu: 'darts' }
|
||||
export const waistdartposition = { pct: 0, min: -100, max: 100, menu: 'darts' }
|
||||
export const shoulderDartPosition = {
|
||||
pct: 50,
|
||||
min: 10,
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -42,6 +42,10 @@
|
|||
"hemWidth": {
|
||||
"t": "Saumbreite",
|
||||
"d": "Breite des Saumes"
|
||||
},
|
||||
"panels": {
|
||||
"t": "Panels",
|
||||
"d": "Number of panels"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,6 +61,10 @@
|
|||
"hemWidth": {
|
||||
"t": "Hem width",
|
||||
"d": "Width of the hem"
|
||||
},
|
||||
"panels": {
|
||||
"t": "Panels",
|
||||
"d": "Number of panels"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,10 @@
|
|||
"hemWidth": {
|
||||
"t": "Hem width",
|
||||
"d": "Anchura del dobladillo"
|
||||
},
|
||||
"panels": {
|
||||
"t": "Panels",
|
||||
"d": "Number of panels"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,10 @@
|
|||
"hemWidth": {
|
||||
"t": "Hem width",
|
||||
"d": "Largeur de l'ourlet"
|
||||
},
|
||||
"panels": {
|
||||
"t": "Panels",
|
||||
"d": "Number of panels"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,10 @@
|
|||
"hemWidth": {
|
||||
"t": "Breedte zoom",
|
||||
"d": "Breedte van de zoom"
|
||||
},
|
||||
"panels": {
|
||||
"t": "Panels",
|
||||
"d": "Number of panels"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,10 @@
|
|||
"hemWidth": {
|
||||
"t": "Hem width",
|
||||
"d": "Width of the hem"
|
||||
},
|
||||
"panels": {
|
||||
"t": "Panels",
|
||||
"d": "Number of panels"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
17
designs/tristan/CHANGELOG.md
Normal file
17
designs/tristan/CHANGELOG.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
# Change log for: @freesewing/tristan
|
||||
|
||||
|
||||
## 3.0.0 (2022-09-30)
|
||||
|
||||
### Changed
|
||||
|
||||
- All FreeSewing pacakges are now ESM only.
|
||||
- All FreeSewing pacakges now use named exports.
|
||||
- Dropped support for NodeJS 14. NodeJS 18 (LTS/hydrogen) or more recent is now required.
|
||||
|
||||
|
||||
This is the **initial release**, and the start of this change log.
|
||||
|
||||
> Prior to version 2, FreeSewing was not a JavaScript project.
|
||||
> As such, that history is out of scope for this change log.
|
||||
|
143
designs/tristan/README.md
Normal file
143
designs/tristan/README.md
Normal file
|
@ -0,0 +1,143 @@
|
|||

|
||||
<p align='center'><a
|
||||
href="https://www.npmjs.com/package/@freesewing/tristan"
|
||||
title="@freesewing/tristan on NPM"
|
||||
><img src="https://img.shields.io/npm/v/@freesewing/tristan.svg"
|
||||
alt="@freesewing/tristan on NPM"/>
|
||||
</a><a
|
||||
href="https://opensource.org/licenses/MIT"
|
||||
title="License: MIT"
|
||||
><img src="https://img.shields.io/npm/l/@freesewing/tristan.svg?label=License"
|
||||
alt="License: MIT"/>
|
||||
</a><a
|
||||
href="https://deepscan.io/dashboard#view=project&tid=2114&pid=2993&bid=23256"
|
||||
title="Code quality on DeepScan"
|
||||
><img src="https://deepscan.io/api/teams/2114/projects/2993/branches/23256/badge/grade.svg"
|
||||
alt="Code quality on DeepScan"/>
|
||||
</a><a
|
||||
href="https://github.com/freesewing/freesewing/issues?q=is%3Aissue+is%3Aopen+label%3Apkg%3Atristan"
|
||||
title="Open issues tagged pkg:tristan"
|
||||
><img src="https://img.shields.io/github/issues/freesewing/freesewing/pkg:tristan.svg?label=Issues"
|
||||
alt="Open issues tagged pkg:tristan"/>
|
||||
</a><a
|
||||
href="#contributors-"
|
||||
title="All Contributors"
|
||||
><img src="https://img.shields.io/badge/all_contributors-113-pink.svg"
|
||||
alt="All Contributors"/>
|
||||
</a></p><p align='center'><a
|
||||
href="https://twitter.com/freesewing_org"
|
||||
title="Follow @freesewing_org on Twitter"
|
||||
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Follow%20us-blue.svg?logo=twitter&logoColor=white&logoWidth=15"
|
||||
alt="Follow @freesewing_org on Twitter"/>
|
||||
</a><a
|
||||
href="https://chat.freesewing.org"
|
||||
title="Chat with us on Discord"
|
||||
><img src="https://img.shields.io/discord/698854858052075530?label=Chat%20on%20Discord"
|
||||
alt="Chat with us on Discord"/>
|
||||
</a><a
|
||||
href="https://freesewing.org/patrons/join"
|
||||
title="Become a FreeSewing Patron"
|
||||
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Support%20us-blueviolet.svg?logo=cash-app&logoColor=white&logoWidth=15"
|
||||
alt="Become a FreeSewing Patron"/>
|
||||
</a><a
|
||||
href="https://instagram.com/freesewing_org"
|
||||
title="Follow @freesewing_org on Twitter"
|
||||
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Follow%20us-E4405F.svg?logo=instagram&logoColor=white&logoWidth=15"
|
||||
alt="Follow @freesewing_org on Twitter"/>
|
||||
</a></p>
|
||||
|
||||
# @freesewing/tristan
|
||||
|
||||
A FreeSewing pattern for a fitted top
|
||||
|
||||
|
||||
|
||||
|
||||
## What am I looking at? 🤔
|
||||
|
||||
This repository is the FreeSewing *monorepo* holding all FreeSewing's websites, documentation, designs, plugins, and other NPM packages.
|
||||
|
||||
This folder holds: @freesewing/tristan
|
||||
|
||||
If you're not entirely sure what to do or how to start, type this command:
|
||||
|
||||
```
|
||||
npm run tips
|
||||
```
|
||||
|
||||
> If you don't want to set up a dev environment, you can run it in your browser:
|
||||
>
|
||||
> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
|
||||
>
|
||||
> We recommend that you fork our repository and then
|
||||
> put `gitpod.io/#<entire-url-of-your-fork` into a browser
|
||||
> to start up a browser-based dev environment of your own.
|
||||
|
||||
## About FreeSewing 💀
|
||||
|
||||
Where the world of makers and developers collide, that's where you'll find FreeSewing.
|
||||
|
||||
If you're a maker, checkout [freesewing.org](https://freesewing.org/) where you can generate
|
||||
sewing patterns adapted to your measurements.
|
||||
|
||||
If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
|
||||
The FreeSewing [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
|
||||
for parametric design of sewing patterns. But FreeSewing also provides a range
|
||||
of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
|
||||
functionality of the platform.
|
||||
|
||||
If you have NodeJS installed, you can try it right now by running:
|
||||
|
||||
```bash
|
||||
npx create-freesewing-pattern
|
||||
```
|
||||
|
||||
Getting started guides are available for:
|
||||
- [Linux](https://freesewing.dev/tutorials/getting-started-linux/)
|
||||
- [MacOS](https://freesewing.dev/tutorials/getting-started-mac/)
|
||||
- [Windows](https://freesewing.dev/tutorials/getting-started-windows/)
|
||||
|
||||
The [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) will
|
||||
show you how to create your first parametric design.
|
||||
|
||||
## Support FreeSewing: Become a patron 🥰
|
||||
|
||||
FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
|
||||
|
||||
If you feel FreeSewing is worthwhile, and you can spend a few coind without
|
||||
hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
|
||||
|
||||
## Links 👩💻
|
||||
|
||||
**Official channels**
|
||||
|
||||
- 💻 Makers website: [FreeSewing.org](https://freesewing.org)
|
||||
- 💻 Developers website: [FreeSewing.dev](https://freesewing.dev)
|
||||
- ✅ [Support](https://github.com/freesewing/freesewing/issues/new/choose),
|
||||
[Issues](https://github.com/freesewing/freesewing/issues) &
|
||||
[Discussions](https://github.com/freesewing/freesewing/discussions) on
|
||||
[GitHub](https://github.com/freesewing/freesewing)
|
||||
|
||||
**Social media**
|
||||
|
||||
- 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org)
|
||||
- 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
|
||||
|
||||
**Places the FreeSewing community hangs out**
|
||||
|
||||
- 💬 [Discord](https://discord.freesewing.org/)
|
||||
- 💬 [Facebook](https://www.facebook.com/groups/627769821272714/)
|
||||
- 💬 [Reddit](https://www.reddit.com/r/freesewing/)
|
||||
|
||||
## License: MIT 🤓
|
||||
|
||||
© [Joost De Cock](https://github.com/joostdecock).
|
||||
See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details.
|
||||
|
||||
## Where to get help 🤯
|
||||
|
||||
For [Support](https://github.com/freesewing/freesewing/issues/new/choose),
|
||||
please use the [Issues](https://github.com/freesewing/freesewing/issues) &
|
||||
[Discussions](https://github.com/freesewing/freesewing/discussions) on
|
||||
[GitHub](https://github.com/freesewing/freesewing).
|
||||
|
35
designs/tristan/build.mjs
Normal file
35
designs/tristan/build.mjs
Normal file
|
@ -0,0 +1,35 @@
|
|||
/* This script will build the package with esbuild */
|
||||
import esbuild from 'esbuild'
|
||||
import pkg from './package.json' assert { type: 'json' }
|
||||
|
||||
// Create banner based on package info
|
||||
const banner = `/**
|
||||
* ${pkg.name} | v${pkg.version}
|
||||
* ${pkg.description}
|
||||
* (c) ${new Date().getFullYear()} ${pkg.author}
|
||||
* @license ${pkg.license}
|
||||
*/`
|
||||
|
||||
// Shared esbuild options
|
||||
const options = {
|
||||
banner: { js: banner },
|
||||
bundle: true,
|
||||
entryPoints: ['src/index.mjs'],
|
||||
format: 'esm',
|
||||
outfile: 'dist/index.mjs',
|
||||
external: ['@freesewing'],
|
||||
metafile: process.env.VERBOSE ? true : false,
|
||||
minify: process.env.NO_MINIFY ? false : true,
|
||||
sourcemap: true,
|
||||
}
|
||||
|
||||
// Let esbuild generate the build
|
||||
const build = async () => {
|
||||
const result = await esbuild.build(options).catch(() => process.exit(1))
|
||||
|
||||
if (process.env.VERBOSE) {
|
||||
const info = await esbuild.analyzeMetafile(result.metafile)
|
||||
console.log(info)
|
||||
}
|
||||
}
|
||||
build()
|
4
designs/tristan/data.mjs
Normal file
4
designs/tristan/data.mjs
Normal file
|
@ -0,0 +1,4 @@
|
|||
// This file is auto-generated | All changes you make will be overwritten.
|
||||
export const name = '@freesewing/tristan'
|
||||
export const version = '3.0.0'
|
||||
export const data = { name, version }
|
178
designs/tristan/i18n/de.json
Normal file
178
designs/tristan/i18n/de.json
Normal file
|
@ -0,0 +1,178 @@
|
|||
{
|
||||
"t": "Tristan",
|
||||
"d": "Tristan is a fitted tank top with prince(ss) seams.",
|
||||
"p": {
|
||||
"backInside": "Back inside",
|
||||
"backOutside": "Back outside",
|
||||
"backPoints": "Back base",
|
||||
"frontInside": "Front inside",
|
||||
"frontOutside": "Front outside",
|
||||
"frontPoints": "Front base",
|
||||
"peplumFront": "Peplum front",
|
||||
"peplumBack": "Peplum back"
|
||||
},
|
||||
"s": {
|
||||
"strapWidthAdjusted.t": "The strap width has been adjusted",
|
||||
"strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
|
||||
"peplumWidth.t": "Peplum size",
|
||||
"peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
|
||||
"frontOutside": "Outside front",
|
||||
"frontInside": "Inside front",
|
||||
"backOutside": "Outside back",
|
||||
"backInside": "Inside back",
|
||||
"frontPeplum": "Peplum front",
|
||||
"backPeplum": "Peplum back",
|
||||
"hem": "Hem"
|
||||
},
|
||||
"o": {
|
||||
"bustSpanEase": {
|
||||
"t": "Bust span ease",
|
||||
"d": "Controls the amount of ease along the bust span"
|
||||
},
|
||||
"chestEase": {
|
||||
"t": "Chest ease",
|
||||
"d": "Controls the amount of ease at the chest"
|
||||
},
|
||||
"shoulderToShoulderEase": {
|
||||
"t": "Shoulder to shoulder ease",
|
||||
"d": "Controls the amount of ease along the shoulder to shoulder measurement"
|
||||
},
|
||||
"fullChestEaseReduction": {
|
||||
"t": "Full chest ease reduction",
|
||||
"d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
|
||||
},
|
||||
"waistEase": {
|
||||
"t": "Waist ease",
|
||||
"d": "Controls the amount of ease at the waist"
|
||||
},
|
||||
"waistdartposition": {
|
||||
"t": "Waist dart position",
|
||||
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
|
||||
},
|
||||
"frontShoulderWidth": {
|
||||
"t": "Front shoulder width",
|
||||
"d": "Controls how much width is added to the shoulder in the front"
|
||||
},
|
||||
"highBustWidth": {
|
||||
"t": "High bust width",
|
||||
"d": "Controls the width of the high bust"
|
||||
},
|
||||
"armholeDepth": {
|
||||
"t": "Depth of the Armhole",
|
||||
"d": "Controls how deep the armhole is"
|
||||
},
|
||||
"cutDepthBack": {
|
||||
"t": "Depth of the cut in the back",
|
||||
"d": "Controls the depth of the cut in the back"
|
||||
},
|
||||
"cutDepthFront": {
|
||||
"t": "Depth of the cut in the front",
|
||||
"d": "Controls the depth of the cut in the front"
|
||||
},
|
||||
"cutRoundnessBack": {
|
||||
"t": "Roundness of the cut in the back",
|
||||
"d": "Controls how 'round' the cut in the back is, from V to round to square"
|
||||
},
|
||||
"cutRoundnessFront": {
|
||||
"t": "Roundness of the cut in the front",
|
||||
"d": "Controls how 'round' the cut in the front is, from V to round to square"
|
||||
},
|
||||
"shoulderDartPosition": {
|
||||
"t": "Shoulder dart position",
|
||||
"d": "Controls the position of the shoulder dart"
|
||||
},
|
||||
"strapWidth": {
|
||||
"t": "Width of the straps",
|
||||
"d": "Controls the width of the straps"
|
||||
},
|
||||
"upperDartLength": {
|
||||
"t": "Upper dart length",
|
||||
"d": "Controls the length of the upper dart"
|
||||
},
|
||||
"waistDartLength": {
|
||||
"t": "Waist dart length",
|
||||
"d": "Controls the length of the waist dart"
|
||||
},
|
||||
"zipperLocation": {
|
||||
"t": "Zipper location",
|
||||
"d": "The location of the zipper: side, back, or front"
|
||||
},
|
||||
"zipperLocation.front": {
|
||||
"t": "Front zipper location",
|
||||
"d": "The location of the zipper will be in the front"
|
||||
},
|
||||
"zipperLocation.side": {
|
||||
"t": "Side zipper location",
|
||||
"d": "The location of the zipper will be on the side"
|
||||
},
|
||||
"zipperLocation.back": {
|
||||
"t": "Back zipper location",
|
||||
"d": "The location of the zipper will be in the back"
|
||||
},
|
||||
"hem": {
|
||||
"t": "Hem option",
|
||||
"d": "Add a hem."
|
||||
},
|
||||
"hemYes": {
|
||||
"t": "Add a hem",
|
||||
"d": "Add a hem at the waist"
|
||||
},
|
||||
"hemNo": {
|
||||
"t": "Do not add a hem",
|
||||
"d": "Do not add a hem at the waist"
|
||||
},
|
||||
"hemSize": {
|
||||
"t": "Size of the hem",
|
||||
"d": "Size of the hem, a percentage of the distance between the neckline and the waist"
|
||||
},
|
||||
"lacing": {
|
||||
"t": "Lacing option",
|
||||
"d": "This removes part of the seam to create an opening for lacing"
|
||||
},
|
||||
"lacingYes": {
|
||||
"t": "Add Lacing",
|
||||
"d": "Remove part of the seam to create an opening for lacing"
|
||||
},
|
||||
"lacingNo": {
|
||||
"t": "No lacing",
|
||||
"d": "Close the seams normally"
|
||||
},
|
||||
"lacingLocation": {
|
||||
"t": "Location of the lacing",
|
||||
"d": "Lacing in the front, or the back"
|
||||
},
|
||||
"lacingLocation.back": {
|
||||
"t": "Lacing in the back",
|
||||
"d": "The lacing will be in the back"
|
||||
},
|
||||
"lacingLocation.front": {
|
||||
"t": "Lacing in the front",
|
||||
"d": "The lacing will be in the front"
|
||||
},
|
||||
"lacingWidth": {
|
||||
"t": "Lacing width",
|
||||
"d": "Width of the lacing opening"
|
||||
},
|
||||
"peplum": {
|
||||
"t": "Peplum",
|
||||
"d": "Add a peplum"
|
||||
},
|
||||
"peplumYes": {
|
||||
"t": "Add a peplum",
|
||||
"d": "This will generate the peplum part."
|
||||
},
|
||||
"peplumNo": {
|
||||
"t": "No peplum",
|
||||
"d": "Pattern will be generated without a peplum"
|
||||
},
|
||||
"peplumSize": {
|
||||
"t": "Peplum size",
|
||||
"d": "Controls the size of the peplum"
|
||||
},
|
||||
"peplumFullness": {
|
||||
"t": "Peplum fullness",
|
||||
"d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue