From b9d41e4c315fb2b66c933681b9283ed68b580b1d Mon Sep 17 00:00:00 2001 From: Joost De Cock Date: Sun, 10 Apr 2022 18:13:52 +0200 Subject: [PATCH 001/158] wip(unice): Started reworking Unice to extend Ursula This adds the code for the Unice pattern as designed by @anna-puk Anna changed the Ursula pattern for this, and the idea is that we'll untangle those changes and make Unice extend Ursula instead. --- config/descriptions.yaml | 1 + config/exceptions.yaml | 4 + packages/unice/CHANGELOG.md | 9 + packages/unice/README.md | 251 +++++++++++++++++ packages/unice/config/index.js | 51 ++++ packages/unice/example/.babelrc | 10 + packages/unice/example/README.md | 96 +++++++ packages/unice/example/netlify.toml | 9 + packages/unice/example/package.json | 56 ++++ packages/unice/example/public/favicon.ico | Bin 0 -> 12053 bytes packages/unice/example/public/index.html | 41 +++ packages/unice/example/public/layout.css | 1 + packages/unice/example/public/manifest.json | 15 + packages/unice/example/src/App.js | 45 +++ packages/unice/example/src/index.js | 12 + packages/unice/example/src/layout.css | 273 ++++++++++++++++++ packages/unice/example/src/pattern | 1 + packages/unice/example/src/serviceWorker.js | 123 +++++++++ packages/unice/package.json | 92 +++++++ packages/unice/rollup.config.js | 29 ++ packages/unice/src/back.js | 279 +++++++++++++++++++ packages/unice/src/front.js | 289 ++++++++++++++++++++ packages/unice/src/gusset.js | 82 ++++++ packages/unice/src/index.js | 29 ++ 24 files changed, 1798 insertions(+) create mode 100644 packages/unice/CHANGELOG.md create mode 100644 packages/unice/README.md create mode 100644 packages/unice/config/index.js create mode 100644 packages/unice/example/.babelrc create mode 100644 packages/unice/example/README.md create mode 100644 packages/unice/example/netlify.toml create mode 100644 packages/unice/example/package.json create mode 100644 packages/unice/example/public/favicon.ico create mode 100644 packages/unice/example/public/index.html create mode 100644 packages/unice/example/public/layout.css create mode 100644 packages/unice/example/public/manifest.json create mode 100644 packages/unice/example/src/App.js create mode 100644 packages/unice/example/src/index.js create mode 100644 packages/unice/example/src/layout.css create mode 120000 packages/unice/example/src/pattern create mode 100644 packages/unice/example/src/serviceWorker.js create mode 100644 packages/unice/package.json create mode 100644 packages/unice/rollup.config.js create mode 100644 packages/unice/src/back.js create mode 100644 packages/unice/src/front.js create mode 100644 packages/unice/src/gusset.js create mode 100644 packages/unice/src/index.js diff --git a/config/descriptions.yaml b/config/descriptions.yaml index 73e17e0dbd1..41765f6f27d 100644 --- a/config/descriptions.yaml +++ b/config/descriptions.yaml @@ -82,6 +82,7 @@ teagan: 'A FreeSewing pattern for a T-shirt' titan: 'A FreeSewing pattern for a unisex trouser block' trayvon: 'A FreeSewing pattern for a tie' tutorial: "A FreeSewing pattern for a baby bib that's used in our tutorial" +unice: 'A FreeSewing pattern for a basic, highly-customizable underwear pattern' ursula: 'A FreeSewing pattern for a basic, highly-customizable underwear pattern' utils: 'A collection of utilities shared across freesewing projects' wahid: 'A FreeSewing pattern for a classic fitted waistcoat' diff --git a/config/exceptions.yaml b/config/exceptions.yaml index 6dfc7856439..2a93d416e15 100644 --- a/config/exceptions.yaml +++ b/config/exceptions.yaml @@ -140,6 +140,10 @@ packageJson: svgtopdf: private: true tiberius: *starf + unice: + author: Anna Puk (https://github.com/anna-puk) + ursula: + author: Natalia Sayang (https://github.com/nataliasayang) utils: # react-scripts doesn't handle .mjs files correctly module: '!' diff --git a/packages/unice/CHANGELOG.md b/packages/unice/CHANGELOG.md new file mode 100644 index 00000000000..58ed84af814 --- /dev/null +++ b/packages/unice/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change log for: @freesewing/unice + + + +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. + diff --git a/packages/unice/README.md b/packages/unice/README.md new file mode 100644 index 00000000000..f2ad8c8f132 --- /dev/null +++ b/packages/unice/README.md @@ -0,0 +1,251 @@ +![FreeSewing](https://static.freesewing.org/banner.png) +

@freesewing/unice on NPM + License: MIT + Code quality on DeepScan + Open issues tagged pkg:unice + All Contributors +

Follow @freesewing_org on Twitter + Chat with us on Discord + Become a FreeSewing Patron + Follow @freesewing_org on Twitter +

+ +# @freesewing/unice + +A FreeSewing pattern for a basic, highly-customizable underwear pattern + + + +## What am I looking at? πŸ€” + +This repository is our *monorepo* +holding [all our NPM packages](https://freesewing.dev/reference/packages/). + +This folder holds: @freesewing/unice + +## About FreeSewing πŸ’€ + +Where the world of makers and developers collide, that's where you'll find FreeSewing. + +If you're a maker, checkout [freesewing.org](https://freesewing.org/) where you can generate +our sewing patterns adapted to your measurements. + +If you're a developer, our documentation is on [freesewing.dev](https://freesewing.dev/). +Our [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox +for parametric design of sewing patterns. But we also provide a range +of [plugins](https://freesewing.dev/reference/plugins/) that further extend the +functionality of the platform. + +If you have NodeJS installed, you can try it right now by running: + +```bash +npx create-freesewing-pattern +``` + +Or, consult our getting started guides +for [Linux](https://freesewing.dev/tutorials/getting-started-linux/), +[MacOS](https://freesewing.dev/tutorials/getting-started-mac/), +or [Windows](https://freesewing.dev/tutorials/getting-started-windows/). + +We also have a [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) that +walks you through your first parametric design, +and [a friendly community](https://freesewing.org/community/where/) with +people who can help you when you get stuck. + +## Support FreeSewing: Become a patron πŸ₯° + +FreeSewing is an open source project run by a community, +and financially supported by our patrons. + +If you feel what we do is worthwhile, and you can spend a few coind without +hardship, then you should [join us and become a patron](https://freesewing.org/community/join). + +## Links πŸ‘©β€πŸ’» + + - πŸ’» Makers website: [freesewing.org](https://freesewing.org) + - πŸ’» Developers website: [freesewing.dev](https://freesewing.dev) + - πŸ’¬ Chat: On Discord via [discord.freesewing.org](https://discord.freesewing.org/) + - βœ… Todo list/Kanban board: On Github via [todo.freesewing.org](https://todo.freesewing.org/) + - 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org) + - πŸ“· Instagram: [@freesewing_org](https://instagram.com/freesewing_org) + +## License: MIT πŸ€“ + +Β© [Joost De Cock](https://github.com/joostdecock). +See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details. + +## Where to get help 🀯 + +Our [chatrooms on Discord](https://chat.freesewing.org/) are the best place to ask questions, +share your feedback, or just hang out. + +If you want to report a problem, please [create an issue](https://github.com/freesewing/freesewing/issues/new). + + + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Adam Tomkins

πŸ“–

Alexandre Ignjatovic

πŸ’»

AlfaLyr

πŸ’» πŸ”Œ 🎨

Andrew James

πŸ“–

Anneke

πŸ“– 🌍

Annie Kao

πŸ“–

Anternative

πŸ“–

Anthony

πŸ’¬

Cameron Dubas

πŸ“–

Carsten Biebricher

πŸ“–

Cathy Zoller

πŸ“–

Chantal Lapointe

🌍

Damien PIQUET

πŸ’»

Darigov Research

πŸ“– πŸ€”

Elena FdR

πŸ“– πŸ“

Emmanuel Nyachoke

πŸ’» πŸ“–

EvEkSwed

🌍

Fantastik-Maman

🌍

Forrest O.

πŸ“–

FrΓ©dΓ©ric

🌍

Glenn Matthews

πŸ“–

Ikko Ashimine

πŸ“–

Irapeke

🌍

Jacek Sawoszczuk

πŸ“–

Jason Williams

πŸ“–

Jeremy Jackson

πŸ’»

Joebidido

🌍

Joost De Cock

🚧

Josh Essman

πŸ“–

Kake

πŸ“–

Kapunahele Wong

πŸ“–

Karen

πŸ“– πŸ“‹

Katie McGinley

πŸ“–

Kieran Klaassen

πŸ’»

Kittycatou

🌍

Kris

πŸ“–

Kristin Ruben

πŸ’»

Loudepeuter

🌍

Lucian

πŸ“‹

Marcus

🌍

Martin Tribo

πŸ“–

Nadege Michel

⚠️ πŸ“–

Natalia

πŸ’» 🎨 πŸ“

Nathan Yergler

πŸ“–

Nick Dower

πŸ“– πŸ’» πŸ›

Patrick Forringer

πŸ”Œ

Paul

πŸ“– πŸ“ 🌍

Phillip Thelen

πŸ’»

Pixieish

πŸ“–

Prof. dr. Sorcha NΓ­ Dhubhghaill

πŸ“–

Quentin FELIX

πŸ’» 🎨

Rik Hekker

πŸ›

Sam Livingston-Gray

πŸ“–

Sanne

πŸ’» πŸ“–

Sara Latorre

🌍

SeaZeeZee

πŸ“– πŸ’»

Slylele

πŸ“– 🌍

Soazillon

🌍

SoneaTheBest

🌍

Stefan Sydow

🌍 πŸ“– πŸ’»

TrΓ­ona

πŸ“–

Unmutual

πŸ“–

Wouter van Wageningen

πŸ’» 🎨 πŸ”§

amysews

πŸ“–

beautifulsummermoon

🌍

berce

πŸ“–

biou

πŸ’»

bobgeorgethe3rd

πŸ’» πŸ“– 🎨

brmlyklr

πŸ“–

chri5b

πŸ’» ⚠️

dingcycle

🌍

drowned-in-books

πŸ’¬

econo202

πŸ“–

ericamattos

🌍

fightingrabbit

πŸ’»

gaylyndie

πŸ“–

grimlokason

πŸ’»

hellgy

🎨

marckiesel

🌍

mesil

πŸ›

starfetch

πŸ’» πŸ“– 🌍 🎨

ttimearl

πŸ–‹

tuesgloomsday

πŸ“–

valadaptive

πŸ’»

viocky

🌍

woolishboy

πŸ’»

yc

🌍
+ + + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! + diff --git a/packages/unice/config/index.js b/packages/unice/config/index.js new file mode 100644 index 00000000000..1e3f88f1a8e --- /dev/null +++ b/packages/unice/config/index.js @@ -0,0 +1,51 @@ +import pkg from '../package.json' +import Ursula from '@freesewing/ursula' + +const design = ['Anna Puk', 'Natalia Sayang'] + +const config = { + ...Ursula.config, + design, + code: design, + version: pkg.version, + name: 'unice', + inject: { + ...Ursula.config.inject, + front: 'ursulaFront', + back: 'ursulaBack', + gusset: 'ursulaGusset', + }, + hide: ['ursulaBack', 'ursulaFront', 'ursulaGusset'], + parts: [], + optionalMeasurements: ['crossSeam','crossSeamFront'], + measurements: ['waist', 'seat', 'waistToSeat', 'waistToUpperLeg','hips','waistToHips'], + optionGroups: { + ...Ursula.config.optionGroups, + fit: [ + 'fabricStretchX', + 'fabricStretchY', + 'adjustStretch', + 'elasticStretch', + 'useCrossSeam', + 'gussetWidth', + 'gussetLength' + ], + }, + options: { + ...Ursula.options, + gussetShift: 0.015, // fraction of seat circumference - could be an advanced option? + gussetWidth: { pct: 7.2, min: 2, max: 12 }, // Gusset width in relation to waist-to-upperleg + fabricStretchX: { pct: 15, min: 0, max: 100 }, // horizontal stretch (range set wide for beta testing) + fabricStretchY: {pct: 0, min: 0, max: 100 }, // vertical stretch (range set wide for beta testing) + rise: { pct: 60, min: 30, max: 100 }, // extending rise beyond 100% would require adapting paths.sideLeft! + legOpening: { pct: 45, min: 5, max: 85 }, + // booleans + useCrossSeam: { bool: true }, + adjustStretch: {bool: true}, // to not stretch fabric to the limits + } +} + +//delete config.options.fabricStretch + +export default config + diff --git a/packages/unice/example/.babelrc b/packages/unice/example/.babelrc new file mode 100644 index 00000000000..6e3090a4956 --- /dev/null +++ b/packages/unice/example/.babelrc @@ -0,0 +1,10 @@ +{ + "plugins": [ + ["prismjs", { + "languages": ["javascript", "css", "markup"], + "plugins": ["line-numbers"], + "theme": "twilight", + "css": true + }] + ] +} diff --git a/packages/unice/example/README.md b/packages/unice/example/README.md new file mode 100644 index 00000000000..73d3153ee6f --- /dev/null +++ b/packages/unice/example/README.md @@ -0,0 +1,96 @@ +

+Freesewing logo +
+FreeSewing v2 +

+

A JavaScript library for made-to-measure sewing patterns

+

Follow @freesewing_org on Twitter + Chat with us on Gitter + Become a FreeSewing Patron + Follow @freesewing_org on Twitter + +

+ +# unice example + +This project was bootstrapped with [Create Freesewing Pattern](https://en.freesewing.dev/create-freesewing-pattern): + +```js +npm init freesewing-pattern +``` + +This example folder is part of the local development environment. +It is **not** part of the pattern's source code. + +To run this example, follow these steps: + + - In the folder above this one, run: `yarn start` (or `npm start`) + - Then, in new terminal, run the same command in this folder: `yarn start` (or `npm start`) + +This will spin up the development environment, similar to [our online demo](https://unice.freesewing.dev/). + +## About FreeSewing πŸ€” + +Where the world of makers and developers collide, that's where you'll find FreeSewing. + +Our [core library](https://freesewing.dev/en/freesewing) is a *batteries-included* toolbox +for parametric design of sewing patterns. It's a modular system (check our list +of [plugins](https://freesewing.dev/en/plugins) and getting started is as simple as: + +```bash +npm init freesewing-pattern +``` + +The [getting started] section on [freesewing.dev](https://freesewing.dev/) is a good +entrypoint to our documentation, but you'll find a lot more there, including +our [API documentation](https://freesewing.dev/en/freesewing/api), +as well as [examples](https://freesewing.dev/en/freesewing/examples), +and [best practices](https://freesewing.dev/en/do). + +If you're a maker, checkout [freesewing.org](https://freesewing/) where you can generate +our sewing patterns adapted to your measurements. + +## Support FreeSewing: Become a patron πŸ₯° + +FreeSewing is an open source project run by a community, +and financially supported by our patrons. + +If you feel what we do is worthwhile, you too +should [become a patron](https://freesewing.org/patrons/join). + +## Links πŸ‘©β€πŸ’» + + - πŸ’» Makers website: [freesewing.org](https://freesewing.org) + - πŸ’» Developers website: [freesewing.dev](https://freesewing.org) + - πŸ’¬ Chat: [gitter.im/freesewing](https://gitter.im/freesewing/freesewing) + - 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org) + - πŸ“· Instagram: [@freesewing_org](https://instagram.com/freesewing_org) + +## License: MIT πŸ€“ + +Β© [Joost De Cock](https://github.com/joostdecock). +See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details. + +## Where to get help 🀯 + +Our [chatroom on Gitter](https://gitter.im) is the best place to ask questions, +share your feedback, or just hang out. + +If you want to report a problem, please [create an issue](https://github.com/freesewing/freesewing/issues/new). + diff --git a/packages/unice/example/netlify.toml b/packages/unice/example/netlify.toml new file mode 100644 index 00000000000..cfd34cb43db --- /dev/null +++ b/packages/unice/example/netlify.toml @@ -0,0 +1,9 @@ +[build] + base = "packages/unice/example" + publish = "build" + command = "npm run build" + +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 diff --git a/packages/unice/example/package.json b/packages/unice/example/package.json new file mode 100644 index 00000000000..77774ed36a3 --- /dev/null +++ b/packages/unice/example/package.json @@ -0,0 +1,56 @@ +{ + "name": "unice", + "homepage": "https://unice.freesewing.dev/", + "version": "", + "private": true, + "dependencies": { + "@fontsource/permanent-marker": "latest", + "@fontsource/roboto-mono": "latest", + "@fontsource/ubuntu": "latest", + "@freesewing/components": "latest", + "@freesewing/core": "latest", + "@freesewing/css-theme": "latest", + "@freesewing/i18n": "latest", + "@freesewing/models": "latest", + "@freesewing/mui-theme": "latest", + "@freesewing/pattern-info": "latest", + "@freesewing/plugin-bundle": "latest", + "@freesewing/plugin-theme": "latest", + "@freesewing/plugin-i18n": "latest", + "@freesewing/plugin-svgattr": "latest", + "@freesewing/utils": "latest", + "@material-ui/core": "^4.11.4", + "@material-ui/icons": "^4.11.2", + "@material-ui/lab": "^v4.0.0-alpha.57", + "prismjs": "1.25.0", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-intl": "^5.18.0", + "react-scripts": "^4.0.3", + "react-error-overlay": "6.0.9", + "file-saver": "^2.0.5", + "react-markdown": "6.0.2", + "source-map-explorer": "^2.5.2" + }, + "scripts": { + "analyze": "source-map-explorer 'build/static/js/*.js'", + "size": "source-map-explorer 'build/static/js/*.js' --tsv --no-root", + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": "react-app" + }, + "browserslist": [ + "defaults" + ], + "devDependencies": { + "babel-plugin-prismjs": "2.0.1", + "react-error-overlay": "6.0.9" + }, + "resolutions": { + "react-error-overlay": "6.0.9" + } +} diff --git a/packages/unice/example/public/favicon.ico b/packages/unice/example/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..95061a260f10f9f0fb6464069a6d65df8dc8a471 GIT binary patch literal 12053 zcmZQzU}Ruq00Bk@1&0563=Con3=EwCe(tgbC?LeQ2nsxfK}sMrrE6L9$cQ!&TshX)29^&uC!fvqkJK9 zLAyhI<7ZYjju^#)tp`GxrgMKezW?O;FCrE(3z+?`yZx}M{FU}gGv~;W^?mp6`ajTY zlxOu)_+kC=zxkt?6(1{)d@Gs46zQK}-)P5V&b>#&AUL7%fK;O{lQoN02gA&TO!Mz* zeb{}VsPR2Z8pj^h4?PF&GF|7G!+TW8_tRe1Zz35A0l}Kx({!W%t(>95vUin(ZevVi z8IwBaotFDwyB%gelibe9bNv0o-UG_h)IP>B?PZk{`yrE7IFpz0yU^4Cu}dQHx*I$m zWH>COxSYZFH^ZghUzajYmPZu2CUEioSWeom;A2j>R~>6xs8@z zpZ@*9(YT#;+wqVOPfZsJKWj2)>%TGMwydO;KZpPBpMpt28_gV^3ZM-IK= zGEy#@b)fT3tGCiQYg6o07luMfq{F)x1;@!)yr=ydidO-Pav&!EqF1~?X*k&UB=FAssSNz~{(tW} zrf%(I)tfM*-9;yi$;L*!Zf5T{KJgzca+6}dYJ@S_>=F8>b;9%i#8z#Sh!b87?c#^@ zrDI~aqqN1=e28SKk$o_6%Srv)1-2*S{$2RZa>MY%;f)_oADPE5n3UwmWv;T{K~bAg z&hOoC`;8A=xHj=0mRrM65y4qsT5|JmFRR+5lTM2tUVg}X{;~Wa{pv4wyVS&V3@*BG z-db)fYuUg5>&wY^ij{LqHm0`7zrOHq&R<5IKf8^7&+E-RK5s`7pOtCqlc!HN8XURt zCcmTZ`PTJ70WChPq9_}00=E}r#~=ATIpj||VfeD34eXtsvsk?NnD zE1qd5GbV7@^nTFi_TXuWSNj=rbW1D`^V$ggZA^>w{|MFYNMv_zez{6svHt~Ey?W!( zJvSw#rYJK{S=-Q|#ckhjo&0qbP&{T{4oFDrd{tv?_KCoF_?XOV*C9s`x&0j z-?LEiWWux_nU#D2HiwonsQkUmzo%1DPx0`vbZsHQbuv8dAH4P7aopR()4##@L22XU z3-ueM;(43i{;+P++$*7{7`dR{RHQrCJ-*|*qg?Uw0|t$=S=ttaR<66#{OQ&KW!vTZ zO|GhaU`wkA(9*HCi&y{P%M>4^IjLh^;L9VQ3?5CCJ3im!^0rTGX%!9Z2c%SIwp4TR zxQD!~O^~rrdAi^9QMThR(S|i2=O2=u{!nnA$PM3_UzW@=kzS$XUscA#_WX-IE1&ee zJv{mwJhzHI7VKLx-*Zo<^WpRI)6(}&^Zm`hpERpf{Kla}qFiTK1z+zHuvz`(NBTx4 zj=DSlEydPcNZ9F6{lR#T%m=5nt}#k7HLMq+5+u39Rv1WRt7q;!FBBp0KxIMR8iuB~ ze|FDUx!1YfpXJrbug)uc!*chDUnrG1Q`hi7i=ooKx|daJO6m7@A=U|vI=h}T-B_3@ zGr5H&obd^#PGTdMYTgoc?SK3C9azzz*_eO9v8z?Df$Kqq-cMfLd*<7o9h!A&^})%E zyZF|Kzc|6AFys6G*%1?*x}>Ppw$kzZ0?8jT*Dy3m{*yl6BogIu`mM#{ z1i|?ZikAwTKddp|tZY!hrQrS`TWm?dW2w0bg52v@AGpO}^IUrcbHYRJ2}~2zk9dhK z3V1BJd9rBze9Z#qx?i(*oNH>H)T-~mwSas1e>Wxh1>0sO2-Y8PXZ#Q@vVnFb`~;aa9CwvR!xfjgo>X`;ZDlU^G>{l9+q?bW=6%-jJg1_l!Y1hp0B z*7To0ta;LD#yLj|hPKTgT$svLtRg%0AD9??TlUy;xumgp9^ z=%qdEWJ%L3Q<(kwoG#p+ zSUcL8Zrpu-G;Il+{Oz+Flp`0EKl#78KVI<6=j}B$VJkDDHZpOvF`Z!BsKOn%WPJeWt z{nwv8+i%y#$^FxA@JpDQ=*XqNu0Vou!n}VwXT7&HcjbCu>Bq*^$8^IxL6JK!Lvii) zU|FpOCf^_B*YDb}hBthFE296=qnBw#W)h##p~IXJPXZWamL)b%tG6?;H@&-PU!&+D zCkX-f2a9z)7PhW=oc}6-anAJr=l3=4e)L&$1y@SfhX&0?@5l*G+_z1lT^`;~5AvVT zTrdClv+?Pe2ImMy7I#J&&P{A$D?TJHIV`ZChhb0pL~jM*u4ODI^A8@bXT1>fAYE)( zz$2x0t_7_Jg3f-wGvWXKx{1X>AMVtDVmfgpMebk$OWlb>B33y?lft^U+QkJk#W`JS zcp4$6a=O($OQumdVu4e;{J~GJQ|7+EP;)+rqmE7F)H4yA-zvMma@*9%EU|jS)SEuz zS!e#nAKz0x9b9@o(bi9TX8Q()>l3d2h;>ZTTE&oms3yWI`Jv|Yhnunm&EL2GjcPIV)(yL{^Y!gEqKoqT%lXML%z9d~FZw{3`xUqDlirKFNAdrf6; zVeGHXyL)qXrp`Hj=gu9TfRgL1_npie7be`Yp{ z?fz6GtD^bRZVf}zVuo1{S}yBe{E`urQYmuNqsf_B6O^U0=+yZ~M<4>w@{^pLnLvZh69|{`v2oqr3D@ ze_uCyOGw-CjZ7SUOcTCu-0my(s-pY%;*FtS4H|1%H|;6-G~vS4|4TJOEPYj1R_wIw z6qvVQ;gc|5<0$SsuN7u4yU@sV!YuOs`YD=xSsx|EB-{O~?u5PJDq~?gEm*NT^xCv# zZFA#?j7&x{)5kM`^PnYzZlaNuC8jllE@v&w12i+HC%W zGsr%ixxD*}pw9;xU(S_x0=_R_w8{Hg-($&Y$Cp1Q&b@a2{S%R|f2E@GUOu)EdtWiV z_xavSjZ71+?>6^2)KM+OTCmHLCBf+0j@jH&KV>&4c}?1R?1M)yQ^pEK&RY3r7ur&#ew{qod%?_?>p{(Y z5r=LOt%g;zE`P9cy7hC@(arl3jz@Z~>2#g-USjb+<{QkX?rnLm@GO01w@|{){#z1@ z1igcnR#e`&J;SQ+K)31NCt=H)uQV>vtzOFzcH3~Z?Y3?23~df8%)UM+Th@Z1I!mVf z>4`08PMkg+JU=^ENbSzm${S9eHxB0S_!eSpB6oA4lAuk~LWWrxb863LYa9t*dbqj! z`Hoxa>Iut3_V{03=35#*(@S*aS~B-F8g14 zkm<@KfeQiikJP?l=jdZPaqY;h{q4dZcs3On#oVx)+WoBfX_BT>&&rzV+`Q_E{FA<< zTw7Kxc&5tw{`^#-f70uXOi!ktb*ka^Tw!q9_4bCN3JcCQEZur1A@#`yCXPPk4~o7@ zCj>Pv-SqNXwD|G@hE2If*Veecb>bBKuyU47d;NrvB~9z&il_c`ZdFXos!#va^Z0ED z!=w%GY|fU)xcSHYsn4IRbJ}#r_SJt{kH=2Yd+#VSSzqc8v->6{jy|Cs0h=4HALiV0 z=!Tcp(eu;Tk58PNCdupZ@3#ua5s&Wql8@cBHXq#`v#i+3>0+Ky=gIgich85_w+?Ji zEIC%X@O{Vmf45aQS442C8<=>qez1KOUwb~YZC8`^PbmQz)`AsnB1uM*8uuyGo7?bK zGN|7=;TFB-k1$8*x!~Dy_4jfd!|$GW|6S3^;LefTbvuvRR>`w-I>efkvT{$=%nN3` zFt1T^2V2;VEeu8*razMkIwuXTLob+eM>g)h&Hdzk+&Am;d&j=Iw6}W-`IIiPSpDh< zo5Jf0fA35Sd17|reY^4pN#~8eVuza7&#<{4(axf9Jag4|JEKh;k2kAFi~PFd_iVrS zq#j3m?fa|;4V=Rg^0zTHEo4}7Vb9`|Pp3&|bsVe=wr}N95MN%RlqUP~!l{faD<;kq z+IjiW^YEI81)HDuLE#S>RF8kBV})s!3Z?^Ku& z>;2j7L+o4Lg~z9_ES}_ECEK_?OYEc59FeChb3QoCdzm8r?0y$7TwTh3g5rZ}XwZb}Q&kJ*=Js5slE z1_-f(f=1|q=n@a6cD@f0mtQz&&09X};jf7ylYE-qSfsxEbK75=;r`ue95Q>;=Py2a zd%Z!`yWD?$i%qhBr0*(R9k#Y-{$1b6vwXa#@+)=yn5ZJ#sI^dMapdN-EB9TLjro_J z5mEa=dPSvIB z!gsxKC}lD){bciF9dpMfv$rZfU5)cLE@0l>VDr1u^Aoe3Tjs+PQ8vj7+-~=aIvA{D zbmrmPq@2i9H*b}-v7zYOIaZH_?kWmT*%xHrq|c|Bbaqe5kJ|Rb3x92U_N6?gwDbJ- zD+L1I%mW!t{WAFc!QR)a{k#7J|HQWS8NmUcs`*W(Xxq=wdT!KzMA}2J)sHc{S7bx^ z$)vq6r$27Xnefg`WAjtZTgM&y{(R*8@pf6|+_`S|o+mhKZusIZ(>&+*PO15B>n=Z6 zNc(%og{z@vpFrlJv_zY!C&TY6O-gEw4V<=Uk<#NicRZ$?&pIRM&cc+y8q_v&*B z+^hjt7a3+~e(l}yLg7yX*Tt-Lb4*zOithIHul%u^rD&q^d{?87Vp3*q@%pT-M?QS! zxz;AyX7%L6`qp5(z&E>^+us}u4PXdK655-=F~5uJuI-$hwR>FE7bxy}ugsg|w;@5f zDwuQW*%qD6mbr@q8M-FDa~CqTn7p>Zq;H{f`#Yw{C96&O7I?;4p6zg6bz(_(FQ2w! z*uxNuHvt9vy>F%M-1|MArGMAV#c#uAy#1u|=Z5ZGsk--?Z7~hE&)#dD@%^$+m7tb) zfxprkzrxj?8b-_uok|bXERUEK6gdB&^2ao-D^s{u|NbtTCu8pNVfJF{vs~=buPSG( z&udLy?%MTX=c&f2EsJjQM&{2J`ZMpo;O_hGb0^7ZG%y|BTUWxwxw=^_g8Mn?u`+S6WN7)fdgk z-p8A^dM%G-@8r+o>}$4dc4(~AS<@sFqned4+00?bI@?24%z}G=oMD{*@A|1nA2RN4 z;*p(uELzh$iPdN8jQ7STN)>PR`8Jn!b;SHHDirwh;9J4NhiBcg@(<}`i%iPQ;Jn7$ zRK)Y|Ht+J=D;Io`;(1shuI{uc8nV*_JAB&HuwW;}6e|a!lO$a>3^r z;uA%S*4t0kSm3{=%0l4ioy&)kW^(^OlQ%0yaQBSlt2bxJSpDQUS)_c?#GSd#I)^K& z>9XTOmS<%;L{k>kBt` z^Id$d9%ap(ZOEN6OT@ueJS3nlskuvhcg6N;oEkeWx3b&z*ab*!z5gcV*2DCuNE7Y5 zP50Pjb+R~w61B?NxZ0UASosbt;5@1B;aBwfwuIn;^4Uv&Fxo^NwoP0&{buH|#1~>I z*H#zUIhE_H{OpVN2x)B9J;1dfcGAlEb%#Txj6BV5**9>#3pe;$RoVNR{eSD_ZAr>P zOX9y5U)=fAv+M(FJmZ#afgO{xDxB1PjUL2t-1z;sQKnM=x}o&b?f#lp1?+Y$nPQSn zm+ZeJPI~{dJG`r}y`F19=d#(kyEa~0HC4PYo1byKdEu<p#zS*dXeV>m0p7;X(A~3j#N{xHr1JKHsye?Cq_YwcEN}HFI`t zaM}9qlj5SwVS*)Ae|BEhb!v{^U9ilLyVrPvkDKg~WBzVk>Gcz=WOyfQ3MFzovHwkB z@O|=5Omiu#OQ!AmBGx4@R~IsUYb&?$c>ldmKKJ@bYwKO*lS`gO`%Icurf`10&Bw;71=Bz#*&l>NoRtpTdnV>lN z$Ntl$y(X29RaZ=n@A`e7%h&65)RH7ON6rxU6X|XYqK+XSmM${oepILU>4N0%d#k_S zJNiuK$n>{fCzQ82|Gvxfxj5b;`aH6_GZ$|5 zKD)w&y}?oH{QLJRR-b$w-rsaQVC7=8>5$ToS+*B0q-_qfzOkfhLDQz4zZX1sVzyey ztNVRM!h$VY+q`2W7x8XrZ`dKB&mys^Gp><8 zuCMa4UL>I$&*i*8V|2TV563XL5+^fvW5FR-fG))#hvSCoS^d)cof2--A=0eEU_BdFxr5PMj`3r=(Q# zLlc{o{buYhKbFl=V_($st=V}+NnML5L+;|c5)E7=u{yF=Cl`ac6 zd})$TtvFe&RK}Z;GD+MZx^!D(Qmxq`u7n*2zb9YI`~6QNZ2!bl7xiP$J^tlU%6aU_ z7t<`HnWrx7XREL= zT+6#=S9Iq7FCBZ5gE!Dla@85pZ7r&~Iua<4wyu|`?+Rl%zJa?JkC1@A3`scn*g(YhYEaXnd=IwjR zw(obS!XXXS@+&c0Hg5Yp_wb`bwe8<+t~}C8`R)}ep~||Ue_7|Dh7QdJGd};%`d3zV z=-GC?*{rD3Ry1Q$>j}&GSp_0b6`uWTY|Q!->F0in8CS;Bh=`kOwq2i1sh-ZgidC>)42MI;FI@J4l`?9Hdz=?oVQvkB1E~@@0yg1 z?^VYmJALO~`Ekc>$(OK$#x>lB#HZfeapGCEos{{j>^<)d^=>Y{rqOzDL*n5J{%)ea z2amj2ain#&dH%Y4#S0F*%DIU=S>86~mS2bF^GW-6OY&V=_T;@^%l`z4pSyWJSe&?D zIJNO&rCQ5xhfQX}6E^L&KAC&J_xq%^6Sf51 zTPU^UYl!KL9@e(Fx2G-^vX~X~9co(mlwajp#l~jVe}csU4NDgKcg82g&p6-e((s;< z-7)r4`S-`?Zd_i#Ab05R{U6``n?fthogRD=yV1N_=-%#LjieyIwf7TPdCDhz(vt0{ zKEC!N>&@TmD;*f`YnzCP+zj}A;N=&scfH!CM? z1uS?jFS3EcVcIfIcUGsltLS@lS6Yd{Z z*%HEaY+3IT^~0A9ZmxHci7H(^v-$F0W);<`2a+PV?>lm4T9#R^lk1<@`$Dbur{kQK z$RGKpG6JCuK3A_REb@9VMJ1crY=OxS?mv<1o>m^Q;#u-RevKio_Cw#eHJ($~9yz)7 zX5*$6N7`cfPd|*FaU|a2fKL02w+!(+d;Twzej35Q-ov-PrMXaOon*el%>7*Lk0J{E z?O2x@3wb@x+rWKt%16Zy$viGQzT}9^_JUd&E3e3mGZpC9{|hu4LBMlIB{e zmAUHC^cWe2M87oIUk99|+imwV=RRbASQTOWHqptc|bPkULayd ztz$$KOY0?`a~E%^%t{JpG%3Ak{=q89`?C1?JyO@^+4vmy$oBnp`_eL&4kiPx@AqHq z_h>%K)y(w5>tC%yOLwZo!vG!C0F~1PrIUEV`VZ@0=2kBXW#?KTXZUz-Qn+?;P<{}H z`{qq`pPr^SEnxU&lCorF&40lQalaqeMJ5Iag+ILS{?P7}wBgogb((>9x+i*XFmULa zG4GpoK}OEetwqf1CagZuY0rQCg8#%7CX(U(*C&X7lwpZ_cY61OCA)=W`f3I4U77pm zs^X8Ce7X%fF^!Wdzw;}6S@^L+?2wP<^_(revvvolie2%1SH-Es&OM>jT#|3o^#)G4 zghk$a9y=RfeCx62C+p{}%{jl$w&dkX`aCc_Qu&?R>~czo&OesMUA)UXUTNN7oxNvz z+an!G^>-piHo8B|({FvpxJ3Sb>zwvP0jJD&aop<97+f6A9Tp92Q}TC8c@z1e$0RgP%zfL^P^&oXmv9yKV^JF=xLxF1cpIKNIsUWs2uf z3^-IE?RQb>&rjK!c;`6<$~G1ELIuwC?C4|32`rmA?K|&PnMu>{F-vBZA7uWs)ia~O z((jX}N5D?b!sp6?63U`prYHSm+5#pjS|0ai-5|kqTjqZ}m+R^x{%OHZo@e&2lHSo| z6RvD=q^q#&TMO$(F0Q5ilj2^#n6`P>eeUvI8-DfizLl9I;4S8N)NWSF0>&F#A_cX1 zUcGj%KTx?NY06}?l;*&{+nGYkS3Pt){^$QzuKHPbV%Z-&KRu!3tFYnC{THXms%IaJ z725u%{&B|LU8cVG{mSId_Xc?ui2J%<^;SM5a9hjO?`+ZG&}=E4rqdnD@5NJi-aTgw z?v1r;-1}JPPupIDD@SAQ38C!C_xY7f2- z6~D`o-@w?$cQWwEcdd`=T}$`stvw(fd*=1}%v{NL%?370Kl*L&s@Ogwif<>=;WpM) zSEc9wyXE{|R=oJPbw{+)Yk`|gyH>84-MEwO*V`2daSv{0UE2MvH0B%Eofe)8CwxvE zowcKMzec{?B9bUuhAGlycxQ znv@8+m)huLtHjd#`3VmP$a_IK5lOEra<h7mmvFL*Eq2a} zG55?)ahb*%@*}*-NV~iB{>NK=WtQLfFYGe@GkMX989cmNqI$u9zdkZKF~`Kg_#`jm z?)UX<>LF^}^+DJ7e3uC+oHaG&+C%Pu{Vqh@1-nReCcC?zgPK+0^t>FW^LN6 z|MF{2PR8-P(!IZ~J-J`k5wc9jurgdK?u++@`i(b#h`+tgJZsj!kOd-sH-#Vjy?lBw zs>~^Wzf18xfwKW6|IL(x_=Q^EI#C48}RLA8ba&4bVPGObA8%;s?Q(42J>+r7TH zbv$8tyME{6e;n_s@41?}?=E{gCFpF+r;xc7tA+pEbA6g zxIg)$akA-uJG)75PPs6CQTzLPh3AzCq73~4@89mt{nqk>$4W+3Y_3w}PTG(ynT7j?6u{w6~Aqxmb|}GdZud&&jZ%ztXb(( zRxj&V!&1?bs;?aWxNi2j{f|42Cg?~+$#Nr2y}Y;zW^r!w#T1|%YW}bdEUb&N8`^+!PAHPuIwupzLAr}TA(W3 zub|bi?Zt!HFTTuQ;#a<4;=%L}C2J&SaHRfFIs0U-gR|hhQk$l)dn7c7^}E1>iJSIn zREKr_k4q9-X!J-opmyd@{vD4eHLpI9suo+U+J2yM4NJw64_>=YwSCZMQ?+>S-LJNP zpJ&m8E-r&c4gUSD_4y__Tb;iY@^SBXZ*F1bzc@i{#W~IIMfa=Z;`kqJJl|@5-%tB1 z`;9%{9l6CtMN=2d4V~F}&367)J$`w=|5X{$`RxzOitD(L9 z_gb}G-=^FY`1hXku)hC-{%13EX8bsqBA8)MoBx=Vw>{ z|Nr3nl=eHH)yf=}r!Rb!aYAIJ`8QVAy;pXXX3sN`EBh8=Hly~@J z~XH`lNvm0CREv}ymbSN5U4VYv?IWylr*tef^N~~#ReoHv#oB0j9eXHv1MP4k);;nE=o^VTWCQsR7=E?De zKj$8{)mXHUC5mg$M1?b(dBU5ba(G={U3stcLGInhvetUN@TqS8oF*+h_uD!?KDP0J z!jq%?|EumNT*|z4>gIR08TA!^m3J6saqzgjTz1thg5lgZt385F+mA(NT>aX4IJjQ; zR>{*1%k6JTs|Y{4n$S&B(y|=;j`TAv|5R%qrRx)K51L?wEN|=m7Kx#oxM66Dqq~2b$GU_LDPI@ zxfAPUo_y5))AX&Vbcecp{*tm4@4Q_8hIH*tjlX)aRn#%++G@L9uYAfUTyS1r_SjN( zPJ3bS$uAeUbDp)G&ORJ+NBZ?gH?NnS^;R19y=1udc`@3@Z+-a8^zp~-zHQcZimwit z-w0tTGM=Y-*zXMI^Vtu~9l3Y-Pqz42uEhAl@k#RssgE8zUTzZ5thoNnQ`!8fPNVk5 zlNMPI>UdW*zIf{PBmUGRfj>zuMSRKp_Wdb-a+T-py&rJTmfpa`=Q^{X#A5cWbI>cYH!(Oo@r7oBo zA35=+;{&V4^EpCAvn(^8o}a&Z$FGWgl@*%;Q)h6LUp&qF%)-D^+aci7q63mA>{m#I zFH1UfFkJTIckcsNw&MNuez@)MpJ(daEwgPWr2jXx`7~9pWuMSK#*-I{b?$$xT#|c0DxmyEGwVCYxJo0r*K2>= zEL^bKitX*$ES6Zs2~ymeJ*)y1k)7X{9eAXY{LL+=*|>~j5%Zg?&jmdcZ*W&K3J16c zyi7W*->Cdi@n$t2kNZy#yH&GZtun1Vig+nB-T6 z6mfBJ-8l1H@Q!0d#;V2MAE&;EdD8lFw+H`U{_N#p7TJ@*`xr-ky>D){|XNk72#Xb+d%!hPJ=Sxje!uuWF5 zcq+$zHZ4MC(&-1@DH^BP#F7iFypvAv4!CI%^B}CzdV!0aScTVvRGa%HEjH5+Snt33 z`1w`UHz!i&t3SAKI#{jl^Ru&+${#uYD?D7EGv`XW^NW3rAHsfVBsd=C3wgYkJO1EB zg|w%W=ee(0)2y{%omI#Kt}Xhr+f^2Ib#PRxiris3@;l%0KAYvHnaPdrZ`zA;4sN{8 zq2u!Wu*rXhd0);d25=b(=i4rloE+Fttk_{W`@sGKOy`^1ng2WTT0FK|te0q^(>jxh z`(ezTX-rQ8I2rFV`5k3l5Ivv4QC_7$DX6OW@q`CQn%%8*TdNADi7Ijx%sg*PWTszBgHdG*SUBl-B>y|3pIg`5|OrH?hm%q5XuS6t{d%tVBg~@E?TLHem%q;}f cZ65z;e6+jU{sPb0%b+Fjp00i_>zopr0KR{Z`2YX_ literal 0 HcmV?d00001 diff --git a/packages/unice/example/public/index.html b/packages/unice/example/public/index.html new file mode 100644 index 00000000000..af182fd3cc0 --- /dev/null +++ b/packages/unice/example/public/index.html @@ -0,0 +1,41 @@ + + + + + + + + + + + + unice + + + +
+ + + diff --git a/packages/unice/example/public/layout.css b/packages/unice/example/public/layout.css new file mode 100644 index 00000000000..c62502f9791 --- /dev/null +++ b/packages/unice/example/public/layout.css @@ -0,0 +1 @@ +div.layout-wrapper{width:100%;margin:0;padding:0;background-color:red;background:#f8f9fa;background:linear-gradient(90deg, #f1f3f5 0%, #f1f3f5 25%, #f8f9fa 26%, #f8f9fa 100%)}div.layout-wrapper div.layout{display:flex;max-width:1600px;margin:auto;padding:0;flex-direction:row;flex-wrap:nowrap;justify-content:space-between;background-color:#f8f9fa;min-height:calc(100vh - 64px)}div.layout-wrapper div.layout>aside{width:33%;background:#f1f3f5;border-right:2px solid #dee2e6}div.layout-wrapper div.layout>section{margin:0;padding:1rem}div.layout-wrapper div.layout>section>div.content{max-width:66ch;min-width:340px}div.layout-wrapper div.layout>section>div.content.wide{max-width:100%;margin:auto}.theme-wrapper.dark header{background-color:#1a1d21}.theme-wrapper.dark div.layout-wrapper{background:#f8f9fa;background:linear-gradient(90deg, #1a1d21 0%, #1a1d21 25%, #212529 26%, #212529 100%)}.theme-wrapper.dark div.layout-wrapper div.layout{background-color:#212529}.theme-wrapper.dark div.layout-wrapper div.layout>aside{background-color:#1a1d21;border-right:2px solid #343a40}header a svg{color:#ced4da}header a:first-of-type svg{color:#f8f9fa}header a:hover svg{color:#b197fc}header a span,header button span{color:#ced4da}header a span svg,header button span svg{color:#dee2e6}header a:hover span,header button:hover span{color:#f8f9fa}header a:hover span svg,header button:hover span svg{color:#b197fc}header a,header button{padding:0 1vw !important}@media (min-width: 1200px){div.layout>section{width:63%}}@media (max-width: 1199px) and (min-width: 960px){div.layout>aside{width:298px}div.layout>section{width:calc(100% - 300px - 4rem);max-width:none;margin:0 1rem 0 3rem}}@media (max-width: 959px){div.layout>aside{width:218px}div.layout>section{width:calc(100% - 220px - 4rem);max-width:none;margin:0;padding:0 2rem}div.layout>section div.content{min-width:inherit}}@media (max-width: 599px){div.layout>aside{display:none}div.layout>section{width:calc(100%);margin:0 auto;padding:0 1.5rem;max-width:none}}div.gatsby-highlight{margin-bottom:1rem}@media (max-width: 599px){#mobile-menu{position:fixed;top:0;left:0;width:100%;height:100vh;padding:0 0 1rem;max-width:600px;z-index:-10;transition:opacity 0.25s ease 0s;opacity:0;overflow:scroll}#mobile-menu>ul,#mobile-menu>div{transform:translate(0px, 10px);transition:transform 0.25s ease 0s}.theme-wrapper.show-menu #mobile-menu{opacity:1;z-index:10}.theme-wrapper.show-menu #mobile-menu>div{transform:translate(0px, 0px)}}.theme-wrapper.light div.draft-ui-menu,.theme-wrapper.light div.menu{background:#f1f3f5}.theme-wrapper.dark div.draft-ui-menu,.theme-wrapper.dark div.menu{background:#343a40}.theme-wrapper.show-menu div.menu{opacity:1;z-index:10}.theme-wrapper.show-menu div.menu>div{transform:translate(0px, 0px)}div.spaced-buttons>button{margin:0 0.5rem 0.5rem 0}div.spaced>*{margin:0 0.5rem 0.5rem 0}ul#pre-main-menu{margin:0;padding:0}.boldish{font-weight:500}.freesewing.draft{padding:1rem}li.action{clear:both}li.action span.MuiSwitch-root{float:right}.theme-wrapper.light ul#draft-config li.action.toggle.off,.theme-wrapper.dark ul#draft-config li.action.toggle.off{color:#868e96}.theme-wrapper.light ul#draft-config li.action.toggle.off>span svg,.theme-wrapper.dark ul#draft-config li.action.toggle.off>span svg{color:#868e96}footer{background-color:#1a1d21;color:#adb5bd;padding:3rem 0 6rem}footer a{color:#dee2e6 !important;font-weight:400}footer a:hover{color:#d0bfff !important}footer div.cols{display:flex;flex-direction:row;justify-content:space-between;max-width:1600px;margin:auto;padding:0 1.5rem}footer div.cols>div{min-width:150px;max-width:calc(20% - 4rem);padding:0 2rem 0 0;width:100%}footer ul{text-align:left;font-size:1.1rem;margin:0;padding:0;width:100%}footer ul li:first-of-type{padding:0.35rem 0.75rem}footer ul li{display:block}footer ul li a:hover{text-decoration:none !important}footer ul li.heading{font-weight:bold;border-bottom:3px solid #adb5bd;margin-bottom:0.5rem}@media (min-width: 1200px){footer div.cols>div:last-of-type{min-width:350px}}@media (min-width: 600px) and (max-width: 959px){footer div.cols{flex-wrap:wrap}footer div.cols>div{width:calc(30% - 4rem);padding:0 1rem}}@media (max-width: 599px){footer div.cols{display:block}footer div.cols>div{margin:2rem auto 0;max-width:calc(100% - 4rem)}footer div.cols>div:first-of-type{margin-top:0}} diff --git a/packages/unice/example/public/manifest.json b/packages/unice/example/public/manifest.json new file mode 100644 index 00000000000..578f27ed307 --- /dev/null +++ b/packages/unice/example/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "unice", + "name": "unice", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/packages/unice/example/src/App.js b/packages/unice/example/src/App.js new file mode 100644 index 00000000000..7bb0f0e7112 --- /dev/null +++ b/packages/unice/example/src/App.js @@ -0,0 +1,45 @@ +import React from 'react' +import freesewing from '@freesewing/core' +import Workbench from '@freesewing/components/Workbench' +import '@freesewing/css-theme' +import Pattern from './pattern/src/index.js' +/* + * The following symlink is required to make this import work: + * `root_folder/example/src/pattern => `../../` + * + * Without it, we can't import the pattern as a local file + * since create-react-app does not allow imports outside ./src + * If it's imported as a dependency, webpack will cache the + * build and there will be no hot-reloading of changes + */ + +const App = (props) => { + // You can use this to add translations + /* + let translations = { + JSON: 'JSON', + someOtherString: 'Some other string that needs translation' + } + */ + + // Adds support for loading an external pattern configuration + let recreate = false + if (window) recreate = window.location.pathname.substr(1).split('/') + if (recreate.length === 3 && recreate[0] === 'recreate') { + recreate = { from: recreate[1], id: recreate[2] } + } else { + recreate = false + } + + return ( + + ) +} + +export default App diff --git a/packages/unice/example/src/index.js b/packages/unice/example/src/index.js new file mode 100644 index 00000000000..24aefad45a1 --- /dev/null +++ b/packages/unice/example/src/index.js @@ -0,0 +1,12 @@ +import React from 'react' +import ReactDOM from 'react-dom' +import App from './App' +import * as serviceWorker from './serviceWorker' +import './layout.css' + +ReactDOM.render(, document.getElementById('root')) + +// If you want your app to work offline and load faster, you can change +// unregister() to register() below. Note this comes with some pitfalls. +// Learn more about service workers: http://bit.ly/CRA-PWA +serviceWorker.unregister() diff --git a/packages/unice/example/src/layout.css b/packages/unice/example/src/layout.css new file mode 100644 index 00000000000..a4963e16e55 --- /dev/null +++ b/packages/unice/example/src/layout.css @@ -0,0 +1,273 @@ +* { + box-sizing: border-box; +} +.MuiToolbar-root { + overflow-y: auto; +} +div.layout-wrapper { + width: 100%; + margin: 0; + padding: 0; + background: #f8f9fa; + background: linear-gradient(90deg, #f1f3f5 0%, #f1f3f5 25%, #f8f9fa 26%, #f8f9fa 100%); +} +div.layout-wrapper div.layout { + display: flex; + max-width: 1600px; + margin: auto; + padding: 0; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; + background-color: #f8f9fa; + min-height: calc(100vh - 64px); +} +div.layout-wrapper div.layout > aside { + width: 33%; + background: #f1f3f5; + border-right: 2px solid #dee2e6; +} +div.layout-wrapper div.layout > section { + margin: 0; + padding: 1rem; +} +div.layout-wrapper div.layout > section > div.content { + max-width: 66ch; + min-width: 340px; +} +div.layout-wrapper div.layout > section > div.content.wide { + max-width: 100%; + margin: auto; +} + +.theme-wrapper.dark header { + background-color: #1a1d21; +} + +.theme-wrapper.dark div.layout-wrapper { + background: #f8f9fa; + background: linear-gradient(90deg, #1a1d21 0%, #1a1d21 25%, #212529 26%, #212529 100%); +} +.theme-wrapper.dark div.layout-wrapper div.layout { + background-color: #212529; +} +.theme-wrapper.dark div.layout-wrapper div.layout > aside { + background-color: #1a1d21; + border-right: 2px solid #343a40; +} + +/* monitor */ +@media (min-width: 1200px) { + div.layout > section { + width: 63%; + } +} + +/* slate */ +@media (max-width: 1199px) and (min-width: 960px) { + div.layout > aside { + width: 298px; + } + div.layout > section { + width: calc(100% - 300px - 4rem); + max-width: none; + margin: 0 1rem 0 3rem; + } +} + +/* tablet */ +@media (max-width: 959px) { + div.layout > aside { + width: 218px; + } + div.layout > section { + width: calc(100% - 220px - 4rem); + max-width: none; + margin: 0; + padding: 0 2rem; + } + div.layout > section div.content { + min-width: inherit; + } +} + +/* mobile */ +@media (max-width: 599px) { + div.layout > aside { + display: none; + } + div.layout > section { + width: calc(100%); + margin: 0 auto; + padding: 0 1.5rem; + max-width: none; + } +} + +div.gatsby-highlight { + margin-bottom: 1rem; +} + +@media (max-width: 599px) { + #mobile-menu { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100vh; + padding: 0 0 1rem; + max-width: 600px; + z-index: -10; + transition: opacity 0.25s ease 0s; + opacity: 0; + overflow: scroll; + } + #mobile-menu > ul, + #mobile-menu > div { + transform: translate(0px, 10px); + transition: transform 0.25s ease 0s; + } + .theme-wrapper.show-menu #mobile-menu { + opacity: 1; + z-index: 10; + } + .theme-wrapper.show-menu #mobile-menu > div { + transform: translate(0px, 0px); + } +} + +.theme-wrapper.light div.draft-ui-menu, +.theme-wrapper.light div.menu { + background: #f1f3f5; +} + +.theme-wrapper.dark div.draft-ui-menu, +.theme-wrapper.dark div.menu { + background: #343a40; +} + +.theme-wrapper.show-menu div.menu { + opacity: 1; + z-index: 10; +} +.theme-wrapper.show-menu div.menu > div { + transform: translate(0px, 0px); +} + +div.spaced-buttons > button { + margin: 0 0.5rem 0.5rem 0; +} + +div.spaced > * { + margin: 0 0.5rem 0.5rem 0; +} + +ul#pre-main-menu { + margin: 0; + padding: 0; +} + +.boldish { + font-weight: 500; +} + +.freesewing.draft { + padding: 1rem; +} + +li.action { + clear: both; +} + +li.action span.MuiSwitch-root { + float: right; +} + +.theme-wrapper.light ul#draft-config li.action.toggle.off, +.theme-wrapper.dark ul#draft-config li.action.toggle.off { + color: #868e96; +} +.theme-wrapper.light ul#draft-config li.action.toggle.off > span svg, +.theme-wrapper.dark ul#draft-config li.action.toggle.off > span svg { + color: #868e96; +} + +footer { + background-color: #1a1d21; + color: #adb5bd; + padding: 3rem 0 6rem; +} +footer a { + color: #dee2e6 !important; + font-weight: 400; +} +footer a:hover { + color: #d0bfff !important; +} +footer div.cols { + display: flex; + flex-direction: row; + justify-content: space-between; + max-width: 1600px; + margin: auto; + padding: 0 1.5rem; +} +footer div.cols > div { + min-width: 150px; + max-width: calc(20% - 4rem); + padding: 0 2rem 0 0; + width: 100%; +} +footer ul { + text-align: left; + font-size: 1.1rem; + margin: 0; + padding: 0; + width: 100%; +} +footer ul li:first-of-type { + padding: 0.35rem 0.75rem; +} +footer ul li { + display: block; +} +footer ul li a:hover { + text-decoration: none !important; +} +footer ul li.heading { + font-weight: bold; + border-bottom: 3px solid #adb5bd; + margin-bottom: 0.5rem; +} + +/* XL screens */ +@media (min-width: 1200px) { + footer div.cols > div:last-of-type { + min-width: 350px; + } +} + +/* SM screens */ +@media (min-width: 600px) and (max-width: 959px) { + footer div.cols { + flex-wrap: wrap; + } + footer div.cols > div { + width: calc(30% - 4rem); + padding: 0 1rem; + } +} + +/* XS screens */ +@media (max-width: 599px) { + footer div.cols { + display: block; + } + footer div.cols > div { + margin: 2rem auto 0; + max-width: calc(100% - 4rem); + } + footer div.cols > div:first-of-type { + margin-top: 0; + } +} diff --git a/packages/unice/example/src/pattern b/packages/unice/example/src/pattern new file mode 120000 index 00000000000..6581736d623 --- /dev/null +++ b/packages/unice/example/src/pattern @@ -0,0 +1 @@ +../../ \ No newline at end of file diff --git a/packages/unice/example/src/serviceWorker.js b/packages/unice/example/src/serviceWorker.js new file mode 100644 index 00000000000..4fe923e7795 --- /dev/null +++ b/packages/unice/example/src/serviceWorker.js @@ -0,0 +1,123 @@ +// In production, we register a service worker to serve assets from local cache. + +// This lets the app load faster on subsequent visits in production, and gives +// it offline capabilities. However, it also means that developers (and users) +// will only see deployed updates on the "N+1" visit to a page, since previously +// cached resources are updated in the background. + +// To learn more about the benefits of this model, read https://goo.gl/KwvDNy. +// This link also includes instructions on opting out of this behavior. + +const isLocalhost = Boolean( + window.location.hostname === 'localhost' || + // [::1] is the IPv6 localhost address. + window.location.hostname === '[::1]' || + // 127.0.0.1/8 is considered localhost for IPv4. + window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/) +) + +export function register(config) { + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL(process.env.PUBLIC_URL, window.location) + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 + return + } + + window.addEventListener('load', () => { + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js` + + if (isLocalhost) { + // This is running on localhost. Let's check if a service worker still exists or not. + checkValidServiceWorker(swUrl, config) + + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + 'This web app is being served cache-first by a service ' + + 'worker. To learn more, visit https://goo.gl/SC7cgQ' + ) + }) + } else { + // Is not local host. Just register service worker + registerValidSW(swUrl, config) + } + }) + } +} + +function registerValidSW(swUrl, config) { + navigator.serviceWorker + .register(swUrl) + .then((registration) => { + registration.onupdatefound = () => { + const installingWorker = registration.installing + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the old content will have been purged and + // the fresh content will have been added to the cache. + // It's the perfect time to display a "New content is + // available; please refresh." message in your web app. + console.log('New content is available; please refresh.') + + // Execute callback + if (config.onUpdate) { + config.onUpdate(registration) + } + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.') + + // Execute callback + if (config.onSuccess) { + config.onSuccess(registration) + } + } + } + } + } + }) + .catch((error) => { + console.error('Error during service worker registration:', error) + }) +} + +function checkValidServiceWorker(swUrl, config) { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl) + .then((response) => { + // Ensure service worker exists, and that we really are getting a JS file. + if ( + response.status === 404 || + response.headers.get('content-type').indexOf('javascript') === -1 + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then((registration) => { + registration.unregister().then(() => { + window.location.reload() + }) + }) + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config) + } + }) + .catch(() => { + console.log('No internet connection found. App is running in offline mode.') + }) +} + +export function unregister() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready.then((registration) => { + registration.unregister() + }) + } +} diff --git a/packages/unice/package.json b/packages/unice/package.json new file mode 100644 index 00000000000..e5e100e8fec --- /dev/null +++ b/packages/unice/package.json @@ -0,0 +1,92 @@ +{ + "name": "@freesewing/unice", + "version": "2.20.7", + "description": "A FreeSewing pattern for a basic, highly-customizable underwear pattern", + "author": "Anna Puk (https://github.com/anna-puk)", + "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" + ], + "main": "dist/index.js", + "module": "dist/index.mjs", + "scripts": { + "clean": "rimraf dist", + "build": "rollup -c", + "cibuild_step1": "rollup -c", + "test": "BABEL_ENV=production npx mocha tests/*.test.mjs --require @babel/register", + "pubtest": "npm publish --registry http://localhost:6662", + "pubforce": "npm publish", + "symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -", + "start": "rollup -c -w", + "netlify": "echo \"Not configured yet\"", + "testci": "BABEL_ENV=production npx mocha tests/*.test.mjs --require @babel/register --reporter ../../tests/reporters/terse.js" + }, + "peerDependencies": { + "@freesewing/core": "^2.20.7", + "@freesewing/plugin-bundle": "^2.20.7" + }, + "dependencies": {}, + "devDependencies": { + "react": "^17.0.2", + "react-dom": "^17.0.2", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@freesewing/components": "^2.20.7", + "@freesewing/css-theme": "^2.20.7", + "@freesewing/i18n": "^2.20.7", + "@freesewing/mui-theme": "^2.20.7", + "@freesewing/plugin-bust": "^2.20.7", + "@freesewing/plugin-buttons": "^2.20.7", + "@freesewing/plugin-flip": "^2.20.7", + "@freesewing/utils": "^2.20.7", + "react-scripts": "^5.0.0", + "webpack": "^5.67.0", + "rollup": "^2.66.1", + "@rollup/plugin-babel": "^5.3.0", + "@rollup/plugin-commonjs": "^21.0.1", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-node-resolve": "^13.1.3", + "rollup-plugin-peer-deps-external": "^2.2.4", + "@material-ui/core": "^4.12.3", + "@material-ui/icons": "^4.11.2", + "@material-ui/lab": "^v4.0.0-alpha.60", + "axios": "^0.25.0", + "react-intl": "^5.24.4", + "prop-types": "^15.8.1", + "mocha": "^9.1.1", + "chai": "^4.2.0", + "@babel/register": "^7.10.5" + }, + "files": [ + "dist/*", + "README.md", + "package.json" + ], + "publishConfig": { + "access": "public", + "tag": "latest" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=6" + }, + "rollup": { + "exports": "default" + } +} diff --git a/packages/unice/rollup.config.js b/packages/unice/rollup.config.js new file mode 100644 index 00000000000..83bc5ef0eec --- /dev/null +++ b/packages/unice/rollup.config.js @@ -0,0 +1,29 @@ +import resolve from '@rollup/plugin-node-resolve' +import commonjs from '@rollup/plugin-commonjs' +import json from '@rollup/plugin-json' +import peerDepsExternal from 'rollup-plugin-peer-deps-external' +import { name, version, description, author, license, main, module, rollup } from './package.json' + +const banner = `/**\n * ${name} | v${version}\n * ${description}\n * (c) ${new Date().getFullYear()} ${author}\n * @license ${license}\n */` +const output = [ + { + banner, + file: main, + format: 'cjs', + sourcemap: true, + exports: rollup.exports, + }, +] +if (typeof module !== 'undefined') + output.push({ + banner, + file: module, + format: 'es', + sourcemap: true, + }) + +export default { + input: 'src/index.js', + output, + plugins: [peerDepsExternal(), resolve({ modulesOnly: true }), commonjs(), json()], +} diff --git a/packages/unice/src/back.js b/packages/unice/src/back.js new file mode 100644 index 00000000000..0f97c2b694b --- /dev/null +++ b/packages/unice/src/back.js @@ -0,0 +1,279 @@ +export default function (part) { + const { + options, + Point, + Path, + points, + paths, + measurements, + // Snippet, + // snippets, + store, + utils, + complete, + sa, + paperless, + macro, + } = part.shorthand() + + // Design pattern here + + // Create points +return part + points.backWaistMid = new Point(measurements.seat / 4, 0) + points.backWaistBandLeft = new Point( + store.get('sideSeamWaist').x / options.backToFrontWidth, + store.get('sideSeamWaist').y + ) + points.backLegOpeningLeft = new Point( + store.get('sideSeamHip').x / options.backToFrontWidth, + store.get('sideSeamHip').y + ) + + // back height is given by (estimated) cross seam, minus front and gusset lengths + // this does not account for vertical stretch yet + const backHeight = store.get('crossSeam') - store.get('frontHeight') - options.gussetLength * measurements.seat + + // calculate the actual back height, using yScale above and yScaleReduced below leg opening + const backHeightAbove = store.get('frontHeightAbove') // part above has same height front and back + + let backHeightBelow + backHeightBelow = store.get('yScale')*(backHeight - backHeightAbove/store.get('yScaleReduced')) + + const backHeightReduced = backHeightBelow + backHeightAbove + + points.backGussetLeft = new Point( + measurements.seat / 4 - + ((measurements.waist * options.gussetWidth * store.get('xScale')) / options.gussetRatio) * + options.backToFrontWidth, + backHeightReduced + ) + points.backGussetMid = new Point( + measurements.seat / 4, + backHeightReduced + ) + + points.backGussetRight = points.backGussetLeft.flipX(points.backWaistMid) + points.backLegOpeningRight = points.backLegOpeningLeft.flipX(points.backWaistMid) + points.backWaistBandRight = points.backWaistBandLeft.flipX(points.backWaistMid) + + points.backWaistBandMid = points.backWaistBandLeft + .shiftFractionTowards(points.backWaistBandRight, 0.5) + .shift(270, measurements.waistToUpperLeg * options.backDip) + + /* Middle point for label */ + points.backMidMid = points.backLegOpeningLeft.shiftFractionTowards( + points.backLegOpeningRight, + 0.5 + ) + + // Create control points + + /* Control point for waistband dip */ + points.backWaistBandLeftCp1 = points.backWaistBandMid.shift(0,points.backWaistBandMid.dx(points.backWaistBandLeft) / 3 ) + + /* Flip points to right side */ + points.backWaistBandRightCp1 = points.backWaistBandLeftCp1.flipX(points.backWaistMid) + + // Shape back coverage + + /* Only have to do this on one side */ + points.backLegOpeningCorner = utils.beamsIntersect( + points.backLegOpeningLeft, + points.backLegOpeningLeft.shift(180, points.backGussetLeft.dy(points.backLegOpeningLeft)), + points.backGussetLeft, + points.backGussetLeft.shift(270, points.backGussetLeft.dy(points.backLegOpeningLeft)) + ) + + if (options.backExposure >= 0) { + /* If back exposure is high, like a thong style */ + /* This controls the hip bit */ + points.backLegOpeningLeftCp1 = points.backLegOpeningLeft.shiftFractionTowards( + points.backLegOpeningCorner, + options.backExposure + ) + /* This controls the center bit */ + points.backGussetLeftCp1 = points.backGussetLeft.shiftFractionTowards( + points.backWaistBandMid, + options.backExposure + ) + points.backGussetLeft = points.backGussetLeft.shiftFractionTowards( + points.backGussetMid, + options.backExposure + ) // This narrows the back of the gusset + points.backGussetRight = points.backGussetLeft.flipX(points.backWaistMid) + } else { + /* If back exposure is low and flares out to cover more */ + store.set('adjustedBackExposure',options.backExposure * store.get('adjustedLegOpening')) // flare depends on leg opening + /* This controls the hip bit */ + points.backLegOpeningLeftCp1 = points.backLegOpeningLeft.shift( + -45,store.get('adjustedBackExposure') * points.backWaistBandMid.dx(points.backWaistBandLeft)) + /* This controls the taper to gusset */ + points.backGussetLeftCp1 = points.backGussetLeft.shift(115, store.get('adjustedBackExposure') * points.backWaistBandMid.dx(points.backWaistBandLeft)) + + /* center of the flare and its control points are on a line parallel to the backGussetLeft to backLegOpeningLeft line + * first, define the points on that line */ + points.backFlare = points.backGussetLeft.shiftFractionTowards(points.backLegOpeningLeft, 0.5) + // points.backFlareCp1 = points.backGussetLeft.shiftFractionTowards(points.backLegOpeningLeft, 0.5 - store.get('adjustedBackExposure')) + points.backFlareCp1 = points.backGussetLeft.shiftFractionTowards(points.backLegOpeningLeft, 0.7) + points.backFlareCp2 = points.backGussetLeft.shiftFractionTowards(points.backLegOpeningLeft, 0.3) + /* then shift all three points outward */ + points.backFlareLeft = points.backFlare.shift( + 215,(points.backWaistBandMid.dx(points.backWaistBandLeft)) * store.get('adjustedBackExposure') * 2 ) + points.backFlareLeftCp1 = points.backFlareCp1.shift( + 215,(points.backWaistBandMid.dx(points.backWaistBandLeft)) * store.get('adjustedBackExposure') * 2 ) + points.backFlareLeftCp2 = points.backFlareCp2.shift( + 215,(points.backWaistBandMid.dx(points.backWaistBandLeft)) * store.get('adjustedBackExposure') * 2 ) + + + /* Flip points to the right */ + + points.backFlareRight = points.backFlareLeft.flipX(points.backWaistBandMid) + points.backFlareRightCp1 = points.backFlareLeftCp1.flipX(points.backWaistMid) + points.backFlareRightCp2 = points.backFlareLeftCp2.flipX(points.backWaistMid) + } + + /* Flip points to the right */ + + points.backLegOpeningRightCp1 = points.backLegOpeningLeftCp1.flipX(points.backWaistMid) + points.backGussetRightCp1 = points.backGussetLeftCp1.flipX(points.backWaistMid) + + // Draw paths + + if (options.backExposure >= 0) { + paths.seam = new Path() + .move(points.backWaistBandMid) + .curve(points.backWaistBandLeftCp1, points.backWaistBandLeft, points.backWaistBandLeft) // Waist band dip + .line(points.backLegOpeningLeft) + .curve(points.backLegOpeningLeftCp1, points.backGussetLeftCp1, points.backGussetLeft) + .line(points.backGussetMid) + .line(points.backGussetRight) + .curve(points.backGussetRightCp1, points.backLegOpeningRightCp1, points.backLegOpeningRight) + .line(points.backWaistBandRight) + .curve(points.backWaistBandRight, points.backWaistBandRightCp1, points.backWaistBandMid) // Waist band dip + .close() + .attr('class', 'fabric') + } else { + paths.seam = new Path() + .move(points.backWaistBandMid) + .curve(points.backWaistBandLeftCp1, points.backWaistBandLeft, points.backWaistBandLeft) // Waist band dip + .line(points.backLegOpeningLeft) + .curve(points.backLegOpeningLeftCp1, points.backFlareLeftCp1, points.backFlareLeft) + .curve(points.backFlareLeftCp2, points.backGussetLeftCp1, points.backGussetLeft) + .line(points.backGussetMid) + .line(points.backGussetRight) + .curve(points.backGussetRightCp1, points.backFlareRightCp2, points.backFlareRight) + .curve(points.backFlareRightCp1, points.backLegOpeningRightCp1, points.backLegOpeningRight) + .line(points.backWaistBandRight) + .curve(points.backWaistBandRight, points.backWaistBandRightCp1, points.backWaistBandMid) // Waist band dip + .close() + .attr('class', 'fabric') + } + + // Store points for use in other parts + + /* Store gusset points for use in gusset */ + + store.set('backGussetLeft', points.backGussetLeft) + store.set('backGussetRight', points.backGussetRight) + + /* Store lengths for use in elastic */ + + if (options.backExposure >= 0) { + store.set( + 'backLegOpeningLength', + new Path() + .move(points.backGussetRight) + .curve(points.backGussetRightCp1, points.backLegOpeningRightCp1, points.backLegOpeningRight) + .length() + ) + } else { + store.set( + 'backLegOpeningLength', + new Path() + .move(points.backGussetRight) + .curve(points.backGussetRightCp1, points.backFlareRightCp2, points.backFlareRight) + .curve(points.backFlareRightCp1, points.backLegOpeningRightCp1, points.backLegOpeningRight) + .length() + ) + } + + store.set( + 'backWaistBandLength', + new Path() + .move(points.backWaistBandRight) + .curve(points.backWaistBandRightCp1, points.backWaistBandLeftCp1, points.backWaistBandLeft) + .length() + ) + + // Complete? + if (complete) { + if (sa) { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } + } + + macro('title', { + at: points.backMidMid, + nr: 2, + title: 'back', + }) + + macro('grainline', { + from: points.backGussetMid, + to: points.backGussetMid.shiftFractionTowards(points.backWaistBandMid, 0.4), + }) + + points.scaleboxAnchor = points.scalebox = points.backMidMid.shift(90, -50) + macro('miniscale', { at: points.scalebox }) + + // Paperless? + if (paperless) { + macro('hd', { + from: points.backWaistBandRight, + to: points.backWaistBandLeft, + y: points.backWaistBandRight.y + sa - 15, + }) + macro('hd', { + from: points.backLegOpeningRight, + to: points.backLegOpeningLeft, + y: points.backLegOpeningRight.y + sa - 15, + }) + macro('hd', { + from: points.backGussetLeft, + to: points.backGussetRight, + y: points.backGussetLeft.y + sa + 15, + }) + macro('vd', { + from: points.backWaistBandMid, + to: points.backGussetMid, + x: points.backWaistBandMid.x + sa + 15, + }) + if (options.backExposure >= 0) { + macro('pd', { + path: new Path() + .move(points.backGussetRight) + .curve( + points.backGussetRightCp1, + points.backLegOpeningRightCp1, + points.backLegOpeningRight + ), + d: 15, + }) + } else { + macro('pd', { + path: new Path() + .move(points.backGussetRight) + .curve(points.backGussetRightCp1, points.backFlareRightCp2, points.backFlareRight) + .curve( + points.backFlareRightCp1, + points.backLegOpeningRightCp1, + points.backLegOpeningRight + ), + d: 15, + }) + } + } + + return part +} diff --git a/packages/unice/src/front.js b/packages/unice/src/front.js new file mode 100644 index 00000000000..23ed639aa3f --- /dev/null +++ b/packages/unice/src/front.js @@ -0,0 +1,289 @@ +export default function (part) { + let { + options, + Point, + Path, + points, + paths, + measurements, + // Snippet, + // snippets, + store, + utils, + complete, + sa, + paperless, + macro, + } = part.shorthand() + // Stretch utility method + + // Use stretch inputs to calculate four different scale factors: horizontal/vertical and 'regular'/'reduced', depending on direction of the tension + // xScale: for parts that go across the body (= stretched horizontally) + // xScaleReduced: parts that are not under (horizontal) tension, e.g. the gusset + // yScale: for parts which are stretched vertically but not horizontally (anything below leg opening) + // yScaleReduced: parts which are already under horizontal stretch, which limits vertical stretch + + if (options.adjustStretch) { // roughly 15% of stretch is reserved for comfort + // horizontal: first, 'regular' stretch (for parts that go across the body) + if (options.fabricStretchX < 0.30) { + // subtract 15, but never go below 0 + store.set('xScale', utils.stretchToScale(Math.max(0 , options.fabricStretchX - 0.15))) + } else { + store.set('xScale', utils.stretchToScale(options.fabricStretchX / 2)) + // rough approximation of rule of thumb quoted in Sanne's July 29, 2021 showcase + } + // use half of whatever the regular stretch is (no util available, convert from stretch to fraction manually + store.set('xScaleReduced',(1 + store.get('xScale'))/2) + + // vertical: + if (options.fabricStretchY < 0.30) { + // subtract 15, but never go below 0 + store.set('yScale', utils.stretchToScale(Math.max(0 , options.fabricStretchY - 0.15))) + } else { + store.set('yScale', utils.stretchToScale(options.fabricStretchY / 2)) + // rough approximation of rule of thumb quoted in Sanne's July 29, 2021 showcase + } + // reduced vertical stretch calculated below, same as for non-adjusted case + } else { + // in order: regular, then reduced horizontal stretch, followed by regular vertical stretch + store.set('xScale', utils.stretchToScale(options.fabricStretchX)) + store.set('xScaleReduced', utils.stretchToScale(options.fabricStretchX / 2)) + store.set('yScale', utils.stretchToScale(options.fabricStretchY)) + } + if (options.fabricStretchY < 0.20) { + store.set('yScaleReduced',1) + } else { + // reduced yScale gradually increases from equivalent of stretch 0 to 5%, then cuts off (uses third-order polynomial) + // function to approximate Sanne's guidelines given in Discord (roughly 2.5% for stretch 30-40%, 5% above that) + store.set('yScaleReduced', utils.stretchToScale(Math.min( 0.05, 6.25 * Math.pow(options.fabricStretchY - 0.20, 3)))) + } + + // // temporarily overrule yScale and yScaleReduced + // store.set('yScale',1) + // store.set('yScaleReduced',1) + + + // // Design pattern here + + // determine height of front part: use cross seam (and cross seam front) if selected and available + // NOTE: neither crossSeam not frontHeight are adjusted for (vertical) stretch + if (options.useCrossSeam && measurements.crossSeam) { + store.set('crossSeam',measurements.crossSeam) + } else { // use original approximation: front and back are roughly waistToUpperLeg high, plus gusset length + store.set('crossSeam',measurements.waistToUpperLeg * (1 + options.backToFrontLength) + options.gussetLength * measurements.seat) + } + // optionally use crossSeamFront to determine relative length of front and back + // this does not account for vertical stretch yet + if (options.useCrossSeam && measurements.crossSeamFront) { // subtract half the gusset length from cross seam front, and an additional 3.5% of the seat circumference to move the gusset upward (to match commercial panties) + store.set('frontHeight',measurements.crossSeamFront - measurements.seat*(0.5*options.gussetLength + options.gussetShift)) + } else { // subtract gusset length, divide by roughly 2 + store.set('frontHeight',(store.get('crossSeam') - options.gussetLength * measurements.seat)/(1 + options.backToFrontLength)) + } + + + // Create points + + // side seam is on a line from upper leg to seat to hips (optional?) to waist + points.frontWaistMid = new Point(measurements.seat / 4, 0) + points.frontWaistLeft = new Point( + measurements.seat / 4 - (measurements.waist / 4) * store.get('xScale'), + 0 + ) + points.frontSeatLeft = new Point( + measurements.seat / 4 - (measurements.seat / 4) * store.get('xScale'), + measurements.waistToSeat * store.get('yScaleReduced') + ) + points.frontUpperLegLeft = new Point( + measurements.seat / 4 - (measurements.seat / 4) * store.get('xScale'), // assume same circ. as seat + measurements.waistToUpperLeg * store.get('yScaleReduced') + ) + points.frontHipLeft = new Point( + measurements.seat / 4 - (measurements.hips / 4) * store.get('xScale'), + measurements.waistToHips * store.get('yScaleReduced') + ) + + // use these points to define an invisible path + paths.sideLeft = new Path() + .move(points.frontUpperLegLeft) + .line(points.frontSeatLeft) + .line(points.frontHipLeft) + .line(points.frontWaistLeft) + .setRender(false) // only show when debugging + + /* Waist band is somewhere on the sideLeft path */ + points.frontWaistBandLeft = paths.sideLeft.shiftFractionAlong(options.rise) + points.frontWaistBandRight = points.frontWaistBandLeft.flipX(points.frontWaistMid) + points.frontWaistBandMid = points.frontWaistBandLeft + .shiftFractionTowards(points.frontWaistBandRight, 0.5) + .shift(270, measurements.waistToUpperLeg * options.frontDip) /* Waist band dip */ + + /* Leg opening is also on the sideLeft path, and cannot be higher than rise */ + /* Minimum side seam length is defined as 3.5% of the sideLeft path (which is at least waistToUpperLeg long) */ + store.set('adjustedLegOpening',Math.min(options.legOpening,options.rise - 0.035)) // TODO: account for rise having a different domain + + points.frontLegOpeningLeft = paths.sideLeft.shiftFractionAlong(store.get('adjustedLegOpening')) + points.frontLegOpeningRight = points.frontLegOpeningLeft.flipX(points.frontWaistMid) // Waist band low point + + // calculate the actual front height, using yScale above and yScaleReduced below leg opening + store.set('frontHeightAbove',points.frontWaistLeft.dy(points.frontLegOpeningLeft)) + + var frontHeightBelow + frontHeightBelow = store.get('yScale')*(store.get('frontHeight') - store.get('frontHeightAbove')/store.get('yScaleReduced')) + + var frontHeightReduced + frontHeightReduced = frontHeightBelow + store.get('frontHeightAbove') + + console.log({fabricStretchY: options.fabricStretchY, storedYScale: store.get('yScale'), storedYScaleReduced: store.get('yScaleReduced'), frontHeight: store.get('frontHeight'), frontHeightReduced: frontHeightReduced}) + + // gusset width uses modified xScale (barely stretches) and depends on waistToUpperLeg - least sensitive to girth + points.frontGussetLeft = new Point( + measurements.seat / 4 - (measurements.waistToSeat * options.gussetWidth * store.get('xScaleReduced')) * 2.2, + frontHeightReduced + ) + points.frontGussetMid = new Point(measurements.seat / 4, frontHeightReduced) + + /* Flip points to right side */ + points.frontGussetRight = points.frontGussetLeft.flipX(points.frontWaistMid) + points.frontHipRight = points.frontSeatLeft.flipX(points.frontWaistMid) + points.frontWaistRight = points.frontWaistLeft.flipX(points.frontWaistMid) + + /* Middle point for label */ + points.frontMidMid = points.frontLegOpeningLeft.shiftFractionTowards( + points.frontLegOpeningRight, + 0.5 + ) + + // Create control points + + /* Control points for leg opening curves */ + points.frontLegOpeningLeftCp1 = points.frontLegOpeningLeft.shift( + 180, + points.frontGussetLeft.dy(points.frontLegOpeningLeft) / 3 + ) + + /* Control point above gusset moves higher as taperToGusset (= front exposure) increases, but is limited by both the leg opening (allow minimal arching only) and the rise (leg opening must not intersect the waist band) */ + points.frontGussetLeftCp1 = points.frontGussetLeft + .shift(270, Math.max(Math.max(points.frontGussetLeft.dy(points.frontWaistMid) * options.taperToGusset / 2,points.frontGussetLeft.dy(points.frontLegOpeningLeft) * 2),points.frontGussetLeft.dy(points.frontWaistBandMid))) + + /* Control point for waistband dip */ + points.frontWaistBandLeftCp1 = points.frontWaistBandMid.shift(0,points.frontWaistBandMid.dx(points.frontWaistBandLeft) / 3 ) + + + /* Flip control points to right side */ + points.frontGussetRightCp1 = points.frontGussetLeftCp1.flipX(points.frontWaistMid) + points.frontLegOpeningRightCp1 = points.frontLegOpeningLeftCp1.flipX(points.frontWaistMid) + points.frontWaistBandRightCp1 = points.frontWaistBandLeftCp1.flipX(points.frontWaistMid) + + // Draw paths + + paths.seam = new Path() + .move(points.frontWaistBandMid) + .curve(points.frontWaistBandLeftCp1, points.frontWaistBandLeft, points.frontWaistBandLeft) // Waist band dip + .line(points.frontLegOpeningLeft) + .curve(points.frontLegOpeningLeftCp1, points.frontGussetLeftCp1, points.frontGussetLeft) + .line(points.frontGussetMid) + .line(points.frontGussetRight) + .curve(points.frontGussetRightCp1, points.frontLegOpeningRightCp1, points.frontLegOpeningRight) + .line(points.frontWaistBandRight) + .curve(points.frontWaistBandRight, points.frontWaistBandRightCp1, points.frontWaistBandMid) // Waist band dip + .close() + .attr('class', 'fabric') + + // Store points for use in other parts + + /* Store side seam points for use in back */ + + store.set('sideSeamWaist', points.frontWaistBandLeft) + store.set('sideSeamHip', points.frontLegOpeningLeft) + + /* Store gusset points for use in gusset */ + + store.set('frontGussetLeft', points.frontGussetLeft) + store.set('frontGussetRight', points.frontGussetRight) + store.set('frontGussetMid', points.frontGussetMid) + + /* Store lengths for use in elastic */ + + store.set( + 'frontLegOpeningLength', + new Path() + .move(points.frontGussetRight) + .curve( + points.frontGussetRightCp1, + points.frontLegOpeningRightCp1, + points.frontLegOpeningRight + ) + .length() + ) + store.set( + 'frontWaistBandLength', + new Path() + .move(points.frontWaistBandRight) + .curve(points.frontWaistBandRightCp1, points.frontWaistBandLeftCp1, points.frontWaistBandLeft) + .length() + ) + + // Complete? + if (complete) { + if (sa) { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } + } + + macro('title', { + at: points.frontMidMid, + nr: 1, + title: 'front', + }) + + macro('grainline', { + from: points.frontGussetMid, + to: points.frontGussetMid.shiftFractionTowards(points.frontWaistBandMid, 0.5), + }) + + // Paperless? + if (paperless) { + macro('hd', { + from: points.frontWaistBandRight, + to: points.frontWaistBandLeft, + y: points.frontWaistBandRight.y + sa - 15, + }) + macro('hd', { + from: points.frontLegOpeningRight, + to: points.frontLegOpeningLeft, + y: points.frontLegOpeningRight.y + sa - 15, + }) + macro('hd', { + from: points.frontGussetLeft, + to: points.frontGussetRight, + y: points.frontGussetLeft.y + sa + 15, + }) + macro('vd', { + from: points.frontWaistBandMid, + to: points.frontGussetMid, + x: points.frontWaistBandMid.x + sa + 15, + }) + macro('ld', { + from: points.frontWaistBandLeft, + to: points.frontLegOpeningLeft, + d: points.frontWaistBandLeft.y + sa - 15, + }) + macro('pd', { + path: new Path() + .move(points.frontGussetRight) + .curve( + points.frontGussetRightCp1, + points.frontLegOpeningRightCp1, + points.frontLegOpeningRight + ), + d: 15, + }) + /* macro('vd', { + from: points.frontWaistBandLeft, + to: points.frontWaistBandMid, + x: points.frontWaistBandMid.x + sa + 15, + }) */ + } + + return part +} diff --git a/packages/unice/src/gusset.js b/packages/unice/src/gusset.js new file mode 100644 index 00000000000..8b1a9a37b31 --- /dev/null +++ b/packages/unice/src/gusset.js @@ -0,0 +1,82 @@ +export default function (part) { + let { options, Point, Path, points, paths, measurements, store, complete, sa, paperless, macro } = + part.shorthand() +return part + var yScaleDoubleLayer + yScaleDoubleLayer = (1 + store.get('yScale'))/2 // double layer of fabric stretches half as much + + // Create points + points.frontGussetLeft = new Point(store.get('frontGussetLeft').x, 0) + points.backGussetLeft = new Point( + store.get('backGussetLeft').x, + measurements.seat * options.gussetLength * yScaleDoubleLayer + ) + points.frontGussetRight = new Point(store.get('frontGussetRight').x, 0) + points.backGussetRight = new Point( + store.get('backGussetRight').x, + measurements.seat * options.gussetLength * yScaleDoubleLayer + ) + + // Create control points + points.gussetCp1 = points.frontGussetLeft + .shiftFractionTowards(points.backGussetLeft, 0.5) + .shift(180, points.frontGussetRight.x / -15) + + // Flip points to right side + points.gussetCp2 = points.gussetCp1.flipX(store.get('frontGussetMid')) + + // Create point for title + points.frontMidMid = points.gussetCp1.shiftFractionTowards(points.gussetCp2, 0.5) + + /* Store lengths for use in elastic */ + store.set( + 'gussetSideLength', + new Path() + .move(points.backGussetRight) + .curve(points.backGussetRight, points.gussetCp2, points.frontGussetRight) + .length() + ) + + // Draw paths + paths.seam = new Path() + .move(points.frontGussetLeft) + .curve(points.gussetCp1, points.backGussetLeft, points.backGussetLeft) + .line(points.backGussetRight) + .curve(points.backGussetRight, points.gussetCp2, points.frontGussetRight) + .line(points.frontGussetLeft) // Without this, doesn't generate seam allowance + .close() + .attr('class', 'fabric') + + // Complete? + if (complete) { + if (sa) { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } + macro('title', { + at: points.frontMidMid, + nr: 3, + title: 'gusset', + }) + } + + // Paperless? + if (paperless) { + macro('hd', { + from: points.frontGussetLeft, + to: points.frontGussetRight, + y: points.frontGussetLeft.y + sa + 15, + }) + macro('hd', { + from: points.backGussetLeft, + to: points.backGussetRight, + y: points.backGussetLeft.y + sa + 15, + }) + macro('vd', { + from: points.frontGussetRight, + to: points.backGussetRight, + x: points.frontGussetRight.x + sa + 15, + }) + } + + return part +} diff --git a/packages/unice/src/index.js b/packages/unice/src/index.js new file mode 100644 index 00000000000..7d195798bf9 --- /dev/null +++ b/packages/unice/src/index.js @@ -0,0 +1,29 @@ +import freesewing from '@freesewing/core' +import Ursula from '@freesewing/ursula' +import plugins from '@freesewing/plugin-bundle' +import config from '../config' +import draftFront from './front' +import draftBack from './back' +import draftGusset from './gusset' + +// Create new design +const Pattern = new freesewing.Design(config, plugins) + +// Attache Ursula parts that we will extend +for (const name of ['Back', 'Front', 'Gusset']) { + Pattern.prototype[`draftUrsula${name}`] = function (part) { + return new Ursula(this.settings)[`draft${name}`](part) + } +} + +// Attach Ursula part that we'll use as-is +Pattern.prototype.draftElastic = function (part) { + return new Ursula(this.settings).draftElastic(part) +} + +// Attach our own draft methods to the prototype +Pattern.prototype.draftFront = draftFront +Pattern.prototype.draftBack = draftBack +Pattern.prototype.draftGusset = draftGusset + +export default Pattern From e30831e6265683edfcea498268ae32192471c606 Mon Sep 17 00:00:00 2001 From: bobgeorgethe3rd Date: Wed, 20 Apr 2022 16:07:16 +0100 Subject: [PATCH 002/158] Holmes Config Update Not sure when toAbs: was added but this was missed so needed changing otherwise the snap does no function properly. Changes - headEase option now uses toAbs rather than pctBasedOn As far as I am aware the other snap option visorWidth is still functioning correctly but if I need to change it please let me know --- packages/holmes/config/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/holmes/config/index.js b/packages/holmes/config/index.js index 723081ad7f7..b19b0767400 100644 --- a/packages/holmes/config/index.js +++ b/packages/holmes/config/index.js @@ -38,7 +38,7 @@ export default { metric: [6, 13, 19, 25, 32, 38, 44, 50], imperial: [6.35, 12.7, 19.05, 25.4, 31.75, 38.1, 44.45, 50.8], }, - ...pctBasedOn('head'), + toAbs: (pct, { measurements }) => measurements.head * pct, }, lengthRatio: { pct: 55, min: 40, max: 60 }, gores: { count: 6, min: 4, max: 20 }, From c9515762219657576fc5abcb61bb7e3d4427a82b Mon Sep 17 00:00:00 2001 From: bobgeorgethe3rd Date: Wed, 20 Apr 2022 16:10:44 +0100 Subject: [PATCH 003/158] Bee Config toAbs() Again same thing as Holmes Changes - neckTieWidth changed to toAbs() - bandTieWidth changed to toAbs() --- packages/bee/config/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/bee/config/index.js b/packages/bee/config/index.js index dd4bf2ccc97..f76b16a4227 100644 --- a/packages/bee/config/index.js +++ b/packages/bee/config/index.js @@ -114,7 +114,7 @@ export default { metric: [6, 13, 19, 25, 32, 38], imperial: [6.35, 12.7, 19.05, 25.4, 31.75, 38.1], }, - ...pctBasedOn('bustSpan'), + toAbs: (pct, { measurements }) => measurements.bustSpan * pct, }, neckTieLength: { pct: 80, min: 70, max: 100 }, neckTieEnds: { dflt: 'straight', list: ['straight', 'pointed'] }, @@ -128,7 +128,7 @@ export default { metric: [6, 13, 19, 25, 32, 38], imperial: [6.35, 12.7, 19.05, 25.4, 31.75, 38.1], }, - ...pctBasedOn('hpsToWaistFront'), + toAbs: (pct, { measurements }) => measurements.hpsToWaistFront * pct, }, bandTieLength: { pct: 35, min: 30, max: 50 }, bandTieEnds: { dflt: 'straight', list: ['straight', 'pointed'] }, From 6187cc1e1ada5c9fdb14dab88d7114d25eab3bbd Mon Sep 17 00:00:00 2001 From: bobgeorgethe3rd Date: Wed, 20 Apr 2022 23:22:28 +0100 Subject: [PATCH 004/158] Ear one seam path Also realised that the seam path for the ear was in too parts for the render. Won't changed the draft just simply makes the one. And oversight from when I split in two and just forgot to make a path to stitch them back together. Changes - og paths.seam has become paths.saBase - paths.hem changed to paths.hemBase - saBase and hemBase setRender to false Additions - paths.seam joining paths.hemBase and saBase --- packages/holmes/src/ear.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/holmes/src/ear.js b/packages/holmes/src/ear.js index 53c6d2a4dfc..840ab5a5e7f 100644 --- a/packages/holmes/src/ear.js +++ b/packages/holmes/src/ear.js @@ -26,11 +26,14 @@ export default function (part) { points.bottomFlipped = points.bottom.flipX() points.bottomC = points.bottom.shift(90, points.bottom.y - points.bottom.x) points.bottomCFlipped = points.bottomC.flipX() - paths.seam = new Path() + paths.saBase = new Path() .move(points.bottom) .curve(points.bottomC, points.topC, points.top) .curve(points.topCFlipped, points.bottomCFlipped, points.bottomFlipped) - paths.hem = new Path().move(points.bottomFlipped).line(points.bottom) + .setRender(false) + paths.hemBase = new Path().move(points.bottomFlipped).line(points.bottom) + .setRender(false) + paths.seam = paths.saBase.join(paths.hem).close() // Complete? if (complete) { macro('grainline', { from: points.top, to: new Point(0, points.bottom.y) }) @@ -45,9 +48,9 @@ export default function (part) { snippets.buttonhole = new Snippet('buttonhole-start', points.buttonhole).attr('data-scale', 2) } if (sa) { - paths.sa = paths.seam + paths.sa = paths.saBase .offset(sa) - .join(paths.hem.offset(sa * 2)) + .join(paths.hemBase.offset(sa * 2)) .attr('class', 'fabric sa') .close() } From 8a40a6c253fa15937b469307cb4fcff61aa5a9df Mon Sep 17 00:00:00 2001 From: bobgeorgethe3rd Date: Wed, 20 Apr 2022 23:22:50 +0100 Subject: [PATCH 005/158] Update ear.js --- packages/holmes/src/ear.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/holmes/src/ear.js b/packages/holmes/src/ear.js index 840ab5a5e7f..e4e486b82d6 100644 --- a/packages/holmes/src/ear.js +++ b/packages/holmes/src/ear.js @@ -33,7 +33,7 @@ export default function (part) { .setRender(false) paths.hemBase = new Path().move(points.bottomFlipped).line(points.bottom) .setRender(false) - paths.seam = paths.saBase.join(paths.hem).close() + paths.seam = paths.saBase.join(paths.hemBase).close() // Complete? if (complete) { macro('grainline', { from: points.top, to: new Point(0, points.bottom.y) }) From 4a69ae7097c8653e842a23057bcace5aadd20dfb Mon Sep 17 00:00:00 2001 From: bobgeorgethe3rd Date: Mon, 25 Apr 2022 15:03:25 +0100 Subject: [PATCH 006/158] neatening seam allowances visor seam allowance was a mess after spliiting this now uses best practices such as counter clockwise paths. --- packages/holmes/src/visor.js | 48 +++++++++++++++++------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/packages/holmes/src/visor.js b/packages/holmes/src/visor.js index b9029e055e6..39798a9224b 100644 --- a/packages/holmes/src/visor.js +++ b/packages/holmes/src/visor.js @@ -46,38 +46,34 @@ export default function (part) { ) points.ex1CFlipped = points.ex1C.flipX() points.ex2CFlipped = points.ex2C.flipX() - - paths.seam = new Path() - .move(points.in2Flipped) - .curve(points.in2CFlipped, points.in1CFlipped, points.in1) - .curve(points.in1C, points.in2C, points.in2) - .curve(points.ex2C, points.ex1C, points.ex1) - .curve(points.ex1CFlipped, points.ex2CFlipped, points.in2Flipped) - .close() + +paths.saInner = new Path () +.move(points.in2) +.curve(points.in2C, points.in1C, points.in1) +.curve(points.in1CFlipped, points.in2CFlipped, points.in2Flipped) +.setRender(false) + +paths.saOuter = new Path() +.move(points.in2Flipped) +.curve(points.ex2CFlipped, points.ex1CFlipped, points.ex1) +.curve(points.ex1C, points.ex2C, points.in2) +.setRender(false) + +paths.seam = paths.saOuter.join(paths.saInner).close() // Complete? if (complete) { macro('grainline', { from: points.in1, to: points.ex1 }) macro('title', { at: points.ex1.shift(45, 20), nr: 2, title: 'visor', scale: 0.4 }) if (sa) { - paths.saInner = new Path() - .move(points.in2Flipped) - .curve(points.in2CFlipped, points.in1CFlipped, points.in1) - .curve(points.in1C, points.in2C, points.in2) - .offset(sa * -2) - .attr('class', 'fabric sa') - points.sa1 = new Point(points.in2Flipped.x - sa, paths.saInner.start().y) - points.sa2 = new Point(points.in2.x + sa, paths.saInner.start().y) - paths.sa = new Path() - .move(points.in2) - .curve(points.ex2C, points.ex1C, points.ex1) - .curve(points.ex1CFlipped, points.ex2CFlipped, points.in2Flipped) - .offset(sa * -1) - .line(points.sa1) - .join(paths.saInner) - .line(points.sa2) - .close() - .attr('class', 'fabric sa') + points.sa1 = new Point(points.in2.x + sa, paths.saInner.offset(sa*2).start().y) + points.sa2 = points.sa1.flipX(points.in1) + paths.sa = paths.saOuter.offset(sa) + .line(points.sa1) + .join(paths .saInner.offset(sa * 2)) + .line(points.sa2) + .close() + .attr('class', 'fabric sa') } // Paperless? From 026e0fa650b98a235a478793526bd14b1fdbc215 Mon Sep 17 00:00:00 2001 From: bobgeorgethe3rd Date: Mon, 2 May 2022 22:57:51 +0100 Subject: [PATCH 007/158] remove redundant pctBasedon import --- packages/bee/config/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/bee/config/index.js b/packages/bee/config/index.js index f76b16a4227..a6a387be57b 100644 --- a/packages/bee/config/index.js +++ b/packages/bee/config/index.js @@ -1,6 +1,5 @@ import pkg from '../package.json' import freesewing from '@freesewing/core' -const { pctBasedOn } = freesewing export default { name: 'bee', From 69f7621594a98194c4ce3a2faab624656c4cb046 Mon Sep 17 00:00:00 2001 From: bobgeorgethe3rd Date: Mon, 2 May 2022 23:05:12 +0100 Subject: [PATCH 008/158] removed defunct import trying to get it to no longer be x --- packages/bee/config/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/bee/config/index.js b/packages/bee/config/index.js index a6a387be57b..a3146fdeab7 100644 --- a/packages/bee/config/index.js +++ b/packages/bee/config/index.js @@ -1,5 +1,4 @@ import pkg from '../package.json' -import freesewing from '@freesewing/core' export default { name: 'bee', From c68f8d71b77df624e331f61cf9eab866e65aa7fc Mon Sep 17 00:00:00 2001 From: woutervdub Date: Tue, 7 Jun 2022 17:14:51 -0700 Subject: [PATCH 009/158] New FS version --- packages/hi/CHANGELOG.md | 51 ++++ packages/hi/README.md | 253 +++++++++++++++++++ packages/hi/config/index.js | 30 +++ packages/hi/package.json | 92 +++++++ packages/hi/rollup.config.js | 29 +++ packages/hi/src/aboveMouth.js | 114 +++++++++ packages/hi/src/belly.js | 202 +++++++++++++++ packages/hi/src/body.js | 459 ++++++++++++++++++++++++++++++++++ packages/hi/src/bottomFin.js | 131 ++++++++++ packages/hi/src/index.js | 23 ++ packages/hi/src/mouth.js | 94 +++++++ packages/hi/src/tail.js | 93 +++++++ packages/hi/src/topFin.js | 105 ++++++++ 13 files changed, 1676 insertions(+) create mode 100644 packages/hi/CHANGELOG.md create mode 100644 packages/hi/README.md create mode 100644 packages/hi/config/index.js create mode 100644 packages/hi/package.json create mode 100644 packages/hi/rollup.config.js create mode 100644 packages/hi/src/aboveMouth.js create mode 100644 packages/hi/src/belly.js create mode 100644 packages/hi/src/body.js create mode 100644 packages/hi/src/bottomFin.js create mode 100644 packages/hi/src/index.js create mode 100644 packages/hi/src/mouth.js create mode 100644 packages/hi/src/tail.js create mode 100644 packages/hi/src/topFin.js diff --git a/packages/hi/CHANGELOG.md b/packages/hi/CHANGELOG.md new file mode 100644 index 00000000000..a215f923908 --- /dev/null +++ b/packages/hi/CHANGELOG.md @@ -0,0 +1,51 @@ +# Change log for: @freesewing/benjamin + + +## 2.20.0 (2022-01-24) + +### Changed + + - Switched to default import for version from package.json + +## 2.16.1 (2021-05-30) + +### Changed + + - Changed `department` setting in config in line with new grouping + +## 2.8.1 (2020-08-16) + +### Fixed + + - Fixed issue with (length of) band + +## 2.8.0 (2020-08-10) + +### Fixed + + - Fix for incorrect length of the ribbon + +## 2.7.0 (2020-07-12) + +### Changed + + - Removed `Circumference` suffix from measurement names + +## 2.0.2 (2019-09-06) + +### Fixed + + - Added bandLength option to fit optiongroup (it was missing) + +## 2.0.0 (2019-08-25) + +### Added + + - Initial release + + +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. + diff --git a/packages/hi/README.md b/packages/hi/README.md new file mode 100644 index 00000000000..7665c3d9d70 --- /dev/null +++ b/packages/hi/README.md @@ -0,0 +1,253 @@ +![FreeSewing](https://static.freesewing.org/banner.png) +

@freesewing/benjamin on NPM + License: MIT + Code quality on DeepScan + Open issues tagged pkg:benjamin + All Contributors +

Follow @freesewing_org on Twitter + Chat with us on Discord + Become a FreeSewing Patron + Follow @freesewing_org on Twitter +

+ +# @freesewing/benjamin + +A FreeSewing pattern for a bow tie + + + +## What am I looking at? πŸ€” + +This repository is our *monorepo* +holding [all our NPM packages](https://freesewing.dev/reference/packages/). + +This folder holds: @freesewing/benjamin + +## About FreeSewing πŸ’€ + +Where the world of makers and developers collide, that's where you'll find FreeSewing. + +If you're a maker, checkout [freesewing.org](https://freesewing.org/) where you can generate +our sewing patterns adapted to your measurements. + +If you're a developer, our documentation is on [freesewing.dev](https://freesewing.dev/). +Our [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox +for parametric design of sewing patterns. But we also provide a range +of [plugins](https://freesewing.dev/reference/plugins/) that further extend the +functionality of the platform. + +If you have NodeJS installed, you can try it right now by running: + +```bash +npx create-freesewing-pattern +``` + +Or, consult our getting started guides +for [Linux](https://freesewing.dev/tutorials/getting-started-linux/), +[MacOS](https://freesewing.dev/tutorials/getting-started-mac/), +or [Windows](https://freesewing.dev/tutorials/getting-started-windows/). + +We also have a [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) that +walks you through your first parametric design, +and [a friendly community](https://freesewing.org/community/where/) with +people who can help you when you get stuck. + +## Support FreeSewing: Become a patron πŸ₯° + +FreeSewing is an open source project run by a community, +and financially supported by our patrons. + +If you feel what we do is worthwhile, and you can spend a few coind without +hardship, then you should [join us and become a patron](https://freesewing.org/community/join). + +## Links πŸ‘©β€πŸ’» + + - πŸ’» Makers website: [freesewing.org](https://freesewing.org) + - πŸ’» Developers website: [freesewing.dev](https://freesewing.dev) + - πŸ’¬ Chat: On Discord via [discord.freesewing.org](https://discord.freesewing.org/) + - βœ… Todo list/Kanban board: On Github via [todo.freesewing.org](https://todo.freesewing.org/) + - 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org) + - πŸ“· Instagram: [@freesewing_org](https://instagram.com/freesewing_org) + +## License: MIT πŸ€“ + +Β© [Joost De Cock](https://github.com/joostdecock). +See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details. + +## Where to get help 🀯 + +Our [chatrooms on Discord](https://chat.freesewing.org/) are the best place to ask questions, +share your feedback, or just hang out. + +If you want to report a problem, please [create an issue](https://github.com/freesewing/freesewing/issues/new). + + + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Adam Tomkins

πŸ“–

Alexandre Ignjatovic

πŸ’»

AlfaLyr

πŸ’» πŸ”Œ 🎨

Andrew James

πŸ“–

Anneke

πŸ“– 🌍

Annie Kao

πŸ“–

Anternative

πŸ“–

Anthony

πŸ’¬

Cameron Dubas

πŸ“–

Carsten Biebricher

πŸ“–

Cathy Zoller

πŸ“–

Chantal Lapointe

🌍

Damien PIQUET

πŸ’»

Darigov Research

πŸ“– πŸ€”

Elena FdR

πŸ“– πŸ“

Emmanuel Nyachoke

πŸ’» πŸ“–

EvEkSwed

🌍

Fantastik-Maman

🌍

Forrest O.

πŸ“–

FrΓ©dΓ©ric

🌍

Glenn Matthews

πŸ“–

Igor Couto

πŸ›

Ikko Ashimine

πŸ“–

Irapeke

🌍

Jacek Sawoszczuk

πŸ“–

Jason Williams

πŸ“–

Jeremy Jackson

πŸ’»

Joebidido

🌍

Joost De Cock

🚧

Josh Essman

πŸ“–

Kake

πŸ“–

Kapunahele Wong

πŸ“–

Karen

πŸ“– πŸ“‹

Katie McGinley

πŸ“–

Kieran Klaassen

πŸ’»

Kittycatou

🌍

Kris

πŸ“–

Kristin Ruben

πŸ’»

Loudepeuter

🌍

Lucian

πŸ“‹

Marcus

🌍

Martin Tribo

πŸ“–

Nadege Michel

⚠️ πŸ“–

Natalia

πŸ’» 🎨 πŸ“

Nathan Yergler

πŸ“–

Nick Dower

πŸ“– πŸ’» πŸ›

Patrick Forringer

πŸ”Œ

Paul

πŸ“– πŸ“ 🌍

Phillip Thelen

πŸ’»

Pixieish

πŸ“–

Prof. dr. Sorcha NΓ­ Dhubhghaill

πŸ“–

Quentin FELIX

πŸ’» 🎨

Rik Hekker

πŸ›

Sam Livingston-Gray

πŸ“–

Sanne

πŸ’» πŸ“–

Sara Latorre

🌍

SeaZeeZee

πŸ“– πŸ’»

Slylele

πŸ“– 🌍

Soazillon

🌍

SoneaTheBest

🌍

Stefan Sydow

🌍 πŸ“– πŸ’»

TrΓ­ona

πŸ“–

Unmutual

πŸ“–

Wouter van Wageningen

πŸ’» 🎨 πŸ”§

amysews

πŸ“–

beautifulsummermoon

🌍

berce

πŸ“–

biou

πŸ’»

bobgeorgethe3rd

πŸ’» πŸ“– 🎨

brmlyklr

πŸ“–

chri5b

πŸ’» ⚠️

dingcycle

🌍

drowned-in-books

πŸ’¬

econo202

πŸ“–

ericamattos

🌍

fightingrabbit

πŸ’»

gaylyndie

πŸ“–

grimlokason

πŸ’»

hellgy

🎨

jackseye

πŸ“–

marckiesel

🌍

mesil

πŸ›

starfetch

πŸ’» πŸ“– 🌍 🎨

ttimearl

πŸ–‹

tuesgloomsday

πŸ“–

valadaptive

πŸ’»

viocky

🌍

woolishboy

πŸ’»

yc

🌍
+ + + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! + diff --git a/packages/hi/config/index.js b/packages/hi/config/index.js new file mode 100644 index 00000000000..0a4d8ac4e3b --- /dev/null +++ b/packages/hi/config/index.js @@ -0,0 +1,30 @@ +import { version } from '../package.json' + +export default { + name: 'hi', + version: version, + design: 'Wouter Van Wageningen', + code: 'Wouter Van Wageningen', + department: 'accessories', + type: 'pattern', + difficulty: 4, + optionGroups: { + style: ['size','nosePointiness','aggressive'], + }, + measurements: ['neck'], + parts: ['body','tail','aboveMouth','belly','topFin','bottomFin','mouth'], + dependencies: { + tail: 'body', + aboveMouth: ['body','mouth'], + topFin: 'body', + belly: ['body','aboveMouth'], + bottomFin: ['body','belly','aboveMouth'], + }, + inject: {}, + hide: [], + options: { + nosePointiness: {pct: 0, min: -5,max: +10}, + aggressive: {bool: false}, + size: {pct: 33, min: 5, max: 500 }, + }, +} diff --git a/packages/hi/package.json b/packages/hi/package.json new file mode 100644 index 00000000000..c63547672e3 --- /dev/null +++ b/packages/hi/package.json @@ -0,0 +1,92 @@ +{ + "name": "@freesewing/hi", + "version": "2.20.8", + "description": "A FreeSewing pattern for a shark", + "author": "woutervdub (https://github.com/woutervdub)", + "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" + ], + "main": "dist/index.js", + "module": "dist/index.mjs", + "scripts": { + "clean": "rimraf dist", + "build": "rollup -c", + "cibuild_step1": "rollup -c", + "test": "BABEL_ENV=production npx mocha tests/*.test.mjs --require @babel/register", + "pubtest": "npm publish --registry http://localhost:6662", + "pubforce": "npm publish", + "symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -", + "start": "rollup -c -w", + "netlify": "echo \"Not configured yet\"", + "testci": "BABEL_ENV=production npx mocha tests/*.test.mjs --require @babel/register --reporter ../../tests/reporters/terse.js" + }, + "peerDependencies": { + "@freesewing/core": "^2.20.8", + "@freesewing/plugin-bundle": "^2.20.8" + }, + "dependencies": {}, + "devDependencies": { + "react": "^17.0.2", + "react-dom": "^17.0.2", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@freesewing/components": "^2.20.8", + "@freesewing/css-theme": "^2.20.8", + "@freesewing/i18n": "^2.20.8", + "@freesewing/mui-theme": "^2.20.8", + "@freesewing/plugin-bust": "^2.20.8", + "@freesewing/plugin-buttons": "^2.20.8", + "@freesewing/plugin-flip": "^2.20.8", + "@freesewing/utils": "^2.20.8", + "react-scripts": "^5.0.0", + "webpack": "^5.67.0", + "rollup": "^2.66.1", + "@rollup/plugin-babel": "^5.3.0", + "@rollup/plugin-commonjs": "^21.0.1", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-node-resolve": "^13.1.3", + "rollup-plugin-peer-deps-external": "^2.2.4", + "@material-ui/core": "^4.12.3", + "@material-ui/icons": "^4.11.2", + "@material-ui/lab": "^v4.0.0-alpha.60", + "axios": "^0.25.0", + "react-intl": "^5.24.4", + "prop-types": "^15.8.1", + "mocha": "^9.1.1", + "chai": "^4.2.0", + "@babel/register": "^7.10.5" + }, + "files": [ + "dist/*", + "README.md", + "package.json" + ], + "publishConfig": { + "access": "public", + "tag": "latest" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=6" + }, + "rollup": { + "exports": "default" + } +} diff --git a/packages/hi/rollup.config.js b/packages/hi/rollup.config.js new file mode 100644 index 00000000000..83bc5ef0eec --- /dev/null +++ b/packages/hi/rollup.config.js @@ -0,0 +1,29 @@ +import resolve from '@rollup/plugin-node-resolve' +import commonjs from '@rollup/plugin-commonjs' +import json from '@rollup/plugin-json' +import peerDepsExternal from 'rollup-plugin-peer-deps-external' +import { name, version, description, author, license, main, module, rollup } from './package.json' + +const banner = `/**\n * ${name} | v${version}\n * ${description}\n * (c) ${new Date().getFullYear()} ${author}\n * @license ${license}\n */` +const output = [ + { + banner, + file: main, + format: 'cjs', + sourcemap: true, + exports: rollup.exports, + }, +] +if (typeof module !== 'undefined') + output.push({ + banner, + file: module, + format: 'es', + sourcemap: true, + }) + +export default { + input: 'src/index.js', + output, + plugins: [peerDepsExternal(), resolve({ modulesOnly: true }), commonjs(), json()], +} diff --git a/packages/hi/src/aboveMouth.js b/packages/hi/src/aboveMouth.js new file mode 100644 index 00000000000..43dbd3ec183 --- /dev/null +++ b/packages/hi/src/aboveMouth.js @@ -0,0 +1,114 @@ +export default function (part) { + let { + store, + sa, + Point, + points, + Path, + paths, + Snippet, + snippets, + options, + measurements, + complete, + paperless, + macro, + } = part.shorthand() + + + let aboveMouth01_02d = 266.7238454769277 * options.size + let aboveMouth01_02a = 353.4089695458119 + let aboveMouth02_03d = 28.348200101593726 * options.size + let aboveMouth02_03a = 233.13495309848912 + let aboveMouth01_04d = 57.858419828059574 * options.size + let aboveMouth01_04a = 208.91023166349467 + let aboveMouth01cp1d = 62.927189989701574 * options.size + let aboveMouth01cp1a = 298.7196048714283 + let aboveMouth02cp2d = 169.53367533325053 * options.size + let aboveMouth02cp2a = 195.1209034747764 + let aboveMouth03cp1d = 172.36585117998288 * options.size + let aboveMouth03cp1a = 197.87876803095696 + let aboveMouth04cp2d = 66.94005927693816 * options.size + let aboveMouth04cp2a = 308.8121959753343 + + + let faceTopLength = store.get('faceTopLength') + + let diff = 0 + let iteration = 0 + do { + points.aboveMouth01 = new Point(0, 0) + points.aboveMouth02 = points.aboveMouth01.shift(aboveMouth01_02a, aboveMouth01_02d) + points.aboveMouth03 = points.aboveMouth02.shift(aboveMouth02_03a, aboveMouth02_03d) + points.aboveMouth04 = points.aboveMouth01.shift(aboveMouth01_04a, aboveMouth01_04d) + + points.aboveMouth01cp1 = points.aboveMouth01.shift(aboveMouth01cp1a, aboveMouth01cp1d) + points.aboveMouth02cp2 = points.aboveMouth02.shift(aboveMouth02cp2a, aboveMouth02cp2d) + points.aboveMouth03cp1 = points.aboveMouth03.shift(aboveMouth03cp1a, aboveMouth03cp1d) + points.aboveMouth04cp2 = points.aboveMouth04.shift(aboveMouth04cp2a, aboveMouth04cp2d) + diff = + faceTopLength - + new Path() + .move(points.aboveMouth03) + .curve(points.aboveMouth03cp1, points.aboveMouth04cp2, points.aboveMouth04) + .length() + + aboveMouth01_02d = aboveMouth01_02d + diff + aboveMouth01_04d = aboveMouth01_04d + diff + iteration++ + } while ((diff < -1 || diff > 1) && iteration < 100) + + console.log({ iteration: iteration }) + + paths.seam = new Path() + .move(points.aboveMouth01) + .line(points.aboveMouth04) + .curve(points.aboveMouth04cp2, points.aboveMouth03cp1, points.aboveMouth03) + .line(points.aboveMouth02) + .curve(points.aboveMouth02cp2, points.aboveMouth01cp1, points.aboveMouth01) + .close() + + console.log({ faceTopLength1: store.get('faceTopLength') }) + console.log({ + faceTopLength2: new Path() + .move(points.aboveMouth03) + .curve(points.aboveMouth03cp1, points.aboveMouth04cp2, points.aboveMouth04) + .length(), + }) + + store.set( + 'aboveMouthTopLength', + new Path() + .move(points.aboveMouth03) + .curve(points.aboveMouth03cp1, points.aboveMouth04cp2, points.aboveMouth04) + .length() + ) + store.set( + 'aboveMouthBottomLength', + new Path() + .move(points.aboveMouth01) + .curve(points.aboveMouth01cp1, points.aboveMouth02cp2, points.aboveMouth02) + .length() + ) + store.set('aboveMouthFinLength', points.aboveMouth02.dist(points.aboveMouth03)) + console.log({ aboveMouthFinLength: store.get('aboveMouthFinLength') }) + + console.log({ mouthTopLength: store.get('mouthTopLength') }) + + points.aboveMouthSnippet = new Path() + .move(points.aboveMouth01) + .curve(points.aboveMouth01cp1, points.aboveMouth02cp2, points.aboveMouth02) + .shiftAlong(store.get('mouthTopLength')) + console.log({ aboveMouthSnippet: points.aboveMouthSnippet }) + + snippets.mouth = new Snippet('bnotch', points.aboveMouthSnippet) + + // Complete? + if (complete) { + if (sa) { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } + } + + return part +} diff --git a/packages/hi/src/belly.js b/packages/hi/src/belly.js new file mode 100644 index 00000000000..5c0f23f65cb --- /dev/null +++ b/packages/hi/src/belly.js @@ -0,0 +1,202 @@ +export default function (part) { + let { + store, + sa, + Point, + points, + Path, + paths, + Snippet, + snippets, + options, + measurements, + complete, + paperless, + macro, + } = part.shorthand() + + let belly01_02d = 224.8451041 * options.size + let belly02_03d = 108.1988389 * options.size + let belly03_04d = 216.7485605 * options.size + let belly04_05d = 164.7592153 * options.size + let belly01_10d = 129.2449198 * options.size + let belly01_02a = 25.7020193 + let belly02_03a = 2.2164353 + let belly03_04a = 338.0869319 + + let belly04_05a = 198.1877729 + let belly01_10a = 163.4959859 + let belly10_05d = 231.4386252 * options.size + let belly10_05a = 0 + + let belly01cp1d = 65.65512143 * options.size + let belly01cp2d = 38.20949996 * options.size + let belly02cp1d = 37.73513423 * options.size + let belly02cp2d = 118.64531230 * options.size + let belly03cp1d = 54.50254779 * options.size + let belly03cp2d = 40.68278830 * options.size + let belly04cp1d = 52.08589469 * options.size + let belly04cp2d = 62.46560129 * options.size + let belly05cp1d = 48.20828587 * options.size + // let belly05cp2d = 48.20828587 * options.size + let belly05cp2d = 68 * options.size + let belly10cp1d = 45.42602302 * options.size + // let belly10cp2d = 45.42602302 * options.size + let belly10cp2d = 65.42602302 * options.size + + let belly01cp1a = 60.1172330 + let belly01cp2a = 327.4394109 + let belly02cp1a = 331.7898702 + let belly02cp2a = 182.9449647 + let belly03cp1a = 349.8613970 + let belly03cp2a = 200.1533738 + let belly04cp1a = 204.8857575 + let belly04cp2a = 145.9357065 + // let belly05cp1a = 8.1545383 + let belly05cp1a = 8.1545383 + // let belly05cp2a = 8.1545383 + let belly05cp2a = 5 + let belly10cp1a = 169.9644604 + let belly10cp2a = 175.9644604 + + points.belly10 = new Point(0, 0) + points.belly01 = points.belly10.shift(belly01_10a, belly01_10d) + points.belly02 = points.belly01.shift(belly01_02a, belly01_02d) + points.belly03 = points.belly02.shift(belly02_03a, belly02_03d) + points.belly04 = points.belly03.shift(belly03_04a, belly03_04d) + points.belly05 = points.belly10.shift(belly10_05a, belly10_05d) + points.belly01cp1 = points.belly01.shift(belly01cp1a, belly01cp1d) + points.belly02cp1 = points.belly02.shift(belly02cp1a, belly02cp1d) + points.belly03cp1 = points.belly03.shift(belly03cp1a, belly03cp1d) + points.belly04cp1 = points.belly04.shift(belly04cp1a, belly04cp1d) + points.belly05cp1 = points.belly05.shift(belly05cp1a, belly05cp1d) + points.belly01cp2 = points.belly01.shift(belly01cp2a, belly01cp2d) + points.belly02cp2 = points.belly02.shift(belly02cp2a, belly02cp2d) + points.belly03cp2 = points.belly03.shift(belly03cp2a, belly03cp2d) + points.belly04cp2 = points.belly04.shift(belly04cp2a, belly04cp2d) + points.belly05cp2 = points.belly05.shift(belly05cp2a, belly05cp2d) + points.belly10cp1 = points.belly10.shift(belly10cp2a, belly10cp2d) + + console.log({ belly10_05d: points.belly10.dist(points.belly05) }) + + let mouthPartLength = + store.get('aboveMouthBottomLength') - + store.get('mouthTopLength') + + store.get('mouthBottomLength') + + console.log({ calc: mouthPartLength }) + console.log({ + actual: new Path() + .move(points.belly01) + .curve(points.belly01cp1, points.belly02cp2, points.belly02) + .length(), + }) + + let diff = 0 + let iteration = 0 + do { + points.belly01.x -= diff + points.belly01cp1.x -= diff + points.belly01cp2.x -= diff + + iteration++ + diff = + mouthPartLength - + new Path() + .move(points.belly01) + .curve(points.belly01cp1, points.belly02cp2, points.belly02) + .length() + } while ((diff < -1 || diff > 1) && iteration < 100) + + let bellyTailLength = store.get('bellyTailLength') + console.log({ bellyTailLength: store.get('bellyTailLength') }) + console.log({ + first: new Path() + .move(points.belly03) + .curve(points.belly03cp1, points.belly04cp2, points.belly04) + .length(), + }) + + diff = 0 + iteration = 0 + do { + points.belly04.x -= diff + points.belly04cp1.x -= diff + points.belly04cp2.x -= diff + points.belly05.x -= diff + points.belly05cp2.x -= diff + + iteration++ + diff = + bellyTailLength - + new Path() + .move(points.belly03) + .curve(points.belly03cp1, points.belly04cp2, points.belly04) + .length() + } while ((diff < -1 || diff > 1) && iteration < 100) + + console.log({ + actual: new Path() + .move(points.belly03) + .curve(points.belly03cp1, points.belly04cp2, points.belly04) + .length(), + }) + + points.belly05cp1 = points.belly05cp2.flipY() + points.belly06 = points.belly04.flipY() + points.belly06cp1 = points.belly04cp2.flipY() + points.belly06cp2 = points.belly04cp1.flipY() + points.belly07 = points.belly03.flipY() + points.belly07cp1 = points.belly03cp2.flipY() + points.belly07cp2 = points.belly03cp1.flipY() + points.belly08 = points.belly02.flipY() + points.belly08cp1 = points.belly02cp2.flipY() + points.belly08cp2 = points.belly02cp1.flipY() + points.belly09 = points.belly01.flipY() + points.belly09cp1 = points.belly01cp2.flipY() + points.belly09cp2 = points.belly01cp1.flipY() + points.belly10cp2 = points.belly10cp1.flipY() + + paths.seam = new Path() + .move(points.belly01) + .curve(points.belly01cp2, points.belly10cp1, points.belly10) + .curve(points.belly10cp2, points.belly09cp1, points.belly09) + .curve(points.belly09cp2, points.belly08cp1, points.belly08) + .curve(points.belly08cp2, points.belly07cp1, points.belly07) + .curve(points.belly07cp2, points.belly06cp1, points.belly06) + .curve(points.belly06cp2, points.belly05cp1, points.belly05) + .curve(points.belly05cp2, points.belly04cp1, points.belly04) + .curve(points.belly04cp2, points.belly03cp1, points.belly03) + .curve(points.belly03cp2, points.belly02cp1, points.belly02) + .curve(points.belly02cp2, points.belly01cp1, points.belly01) + .close() + + store.set( + 'bellyFinLength', + new Path() + .move(points.belly02) + .curve(points.belly02cp1, points.belly03cp2, points.belly03) + .length() + ) + console.log({ bellyFinLength: store.get('bellyFinLength') }) + + points.bellyMouthSnippet1 = new Path() + .move(points.belly01) + .curve(points.belly01cp1, points.belly02cp2, points.belly02) + .shiftAlong(store.get('mouthBottomLength')) + points.bellyMouthSnippet2 = points.bellyMouthSnippet1.flipY() + + console.log({ aboveMouthSnippet: points.aboveMouthSnippet }) + + snippets.mouth1 = new Snippet('bnotch', points.bellyMouthSnippet1) + snippets.mouth2 = new Snippet('bnotch', points.bellyMouthSnippet2) + + // Complete? + if (complete) { + if (sa) { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } + } + + return part +} diff --git a/packages/hi/src/body.js b/packages/hi/src/body.js new file mode 100644 index 00000000000..32f01e8d83a --- /dev/null +++ b/packages/hi/src/body.js @@ -0,0 +1,459 @@ +export default function (part) { + let { + store, + sa, + Point, + points, + Path, + paths, + Snippet, + snippets, + options, + measurements, + complete, + paperless, + macro, + } = part.shorthand() + + + let body01_02d = 117.67274991262845 * options.size + let body02_03d = 124.91298035032229 * options.size + // let body02_03d = body01_02d + let body03_04d = 255.92397474640785 * options.size + let body04_05d = 201.01260719168837 * options.size + let body05_06d = 134.89080971660005 * options.size + let body06_07d = 49.03860703568160 * options.size + let body07_08d = 225.86340480918992 * options.size + let body08_09d = 66.84760000179512 * options.size + let body09_10d = 40.72782003741420 * options.size + let body10_11d = 23.78799421977402 * options.size + let body11_12d = 57.68530918700182 * options.size + let body12_13d = 98.06623978209830 * options.size + let body13_14d = 91.32736600274856 * options.size + let body14_15d = 295.10977066828880 * options.size + let body15_16d = 209.42633350581770 * options.size + let body16_17d = 152.51537318250902 * options.size + let body17_18d = 255.15294373571314 * options.size + let body18_19d = 71.90453921693678 * options.size + let body19_01d = 61.33021195137026 * options.size + + let body01cp1d = 42.13103487929059 * options.size + body01cp1d = 32.13103487929059 * options.size + let body01cp2d = 23.72518967258217 * options.size + let body02cp1d = 44.99353642469105 * options.size + let body02cp2d = 42.33568754608812 * options.size + let body03cp1d = 62.59332758369697 * options.size + let body03cp2d = 40.89285869195256 * options.size + let body04cp1d = 176.21501525125487 * options.size + let body04cp2d = 130.11389715553065 * options.size + let body05cp1d = 29.56689479806765 * options.size + let body05cp2d = 104.66860665930352 * options.size + let body06cp1d = 8.03497915367552 * options.size + let body06cp2d = 34.57808908832297 * options.size + let body07cp1d = 89.11908088619404 * options.size + let body07cp2d = 25.54827831772624 * options.size + let body08cp1d = 41.24120086757895 * options.size + let body08cp2d = 158.23693200387828 * options.size + let body09cp1d = 4.87663090668135 * options.size + let body09cp2d = 25.76988630165065 * options.size + let body10cp1d = 4.13950105689086 * options.size + let body10cp2d = 13.27508493381490 * options.size + let body11cp1d = 17.66659910678904 * options.size + let body11cp2d = 17.66533107530116 * options.size + let body12cp1d = 14.46914569005365 * options.size + let body12cp2d = 39.51915145850176 * options.size + let body13cp1d = 35.66832366400192 * options.size + let body13cp2d = 48.53828530139895 * options.size + let body14cp1d = 77.26036056089820 * options.size + let body14cp2d = 37.42741381661305 * options.size + let body15cp1d = 74.89746640634775 * options.size + let body15cp2d = 101.16048880857042 * options.size + let body16cp1d = 36.21092864039804 * options.size + let body16cp2d = 63.69410844026312 * options.size + let body17cp1d = 97.90988675818191 * options.size + let body17cp2d = 62.08991689477443 * options.size + let body18cp1d = 22.74982929606286 * options.size + let body18cp2d = 16.57960183478481 * options.size + let body19cp1d = 23.95674278778315 * options.size + let body19cp2d = 24.49741270011998 * options.size + + let eyeBigDist = 180.18315182058507 *options.size + let eyeSmallDist = 2.3629811679317316 *options.size + + let gillLength = 41.01907104018812 *options.size + +/* + let body01_02a = 350.1382392835908 + let body02_03a = 219.2280235992150 + let body03_04a = 339.6914424367389 + let body04_05a = 327.5949161262267 + let body05_06a = 308.0581973147166 + let body06_07a = 73.6604388249373 + let body07_08a = 45.7462208380377 + let body08_09a = 337.5894682731302 + let body09_10a = 305.1280145118106 + let body10_11a = 62.0485099186233 + let body11_12a = 31.5926663325278 + let body12_13a = 351.3547159587854 + let body13_14a = 65.2915054300727 + let body14_15a = 146.7578208812976 + let body15_16a = 179.0692249048048 + let body16_17a = 173.6138831920282 + let body17_18a = 182.5463896677164 + let body18_19a = 168.3450180715549 + let body19_01a = 239.6348252240278 + + let body01cp1a = 341.5263465356924 + let body01cp2a = 75.6503959063636 + let body02cp1a = 211.9535499171619 + let body02cp2a = 179.4884199670842 + let body03cp1a = 322.8538439425170 + let body03cp2a = 45.3745027878966 + let body04cp1a = 349.1071045662215 + let body04cp2a = 170.7775897297436 + let body05cp1a = 285.1596014648055 + let body05cp2a = 108.5890112443549 + let body06cp1a = 41.1852543570561 + let body06cp2a = 164.1413220186340 + let body07cp1a = 87.2041495377715 + let body07cp2a = 267.0316498407170 + let body08cp1a = 357.4386948546150 + let body08cp2a = 178.5040422857397 + let body09cp1a = 299.4140745661390 + let body09cp2a = 119.4139505554426 + let body10cp1a = 39.0878163024596 + let body10cp2a = 131.9955535201102 + let body11cp1a = 71.2799386715762 + let body11cp2a = 251.2819695388968 + let body12cp1a = 355.0877186628186 + let body12cp2a = 175.0877829918719 + let body13cp1a = 80.2392635965701 + let body13cp2a = 171.4909473733658 + let body14cp1a = 140.9298470364624 + let body14cp2a = 236.9514886304476 + let body15cp1a = 202.5529871921231 + let body15cp2a = 333.1212843908838 + let body16cp1a = 193.8904149121820 + let body16cp2a = 321.0219904969430 + let body17cp1a = 191.0428733832995 + let body17cp2a = 318.4852423703768 + let body18cp1a = 176.9688130385547 + let body18cp2a = 358.1542838646098 + let body19cp1a = 231.3360831292815 + let body19cp2a = 338.5586388459373 + + let eyeBigAngle = 4.84999368439876 + let eyeSmallAngle = 331.26569123319354 + + let gillAngle = 283.9416746517148 +*/ + + let body01_02a = 170.1382393 +let body02_03a = 39.2280236 +let body03_04a = 159.6914424 +let body04_05a = 147.5949161 +let body05_06a = 128.0581973 +let body06_07a = 253.6604388 +let body07_08a = 225.7462208 +let body08_09a = 157.5894683 +let body09_10a = 125.1280145 +let body10_11a = 242.0485099 +let body11_12a = 211.5926663 +let body12_13a = 171.354716 +let body13_14a = 245.2915054 +let body14_15a = 326.7578209 +let body15_16a = 359.0692249 +let body16_17a = 353.6138832 +let body17_18a = 2.546389668 +let body18_19a = 348.3450181 +let body19_01a = 59.63482522 + +let body01cp1a = 161.5263465 +let body01cp2a = 255.6503959 +let body02cp1a = 31.95354992 +//let body02cp2a = 359.48842 +// let body02cp2a = 2.48842 +let body02cp2a = 10 + +let body03cp1a = 142.8538439 +let body03cp2a = 225.3745028 +let body04cp1a = 169.1071046 +let body04cp2a = 350.7775897 +let body05cp1a = 105.1596015 +let body05cp2a = 288.5890112 +let body06cp1a = 221.1852544 +let body06cp2a = 344.141322 +let body07cp1a = 267.2041495 +let body07cp2a = 87.03164984 +let body08cp1a = 177.4386949 +let body08cp2a = 358.5040423 +let body09cp1a = 119.4140746 +let body09cp2a = 299.4139506 +let body10cp1a = 219.0878163 +let body10cp2a = 311.9955535 +let body11cp1a = 251.2799387 +let body11cp2a = 71.28196954 +let body12cp1a = 175.0877187 +let body12cp2a = 355.087783 +let body13cp1a = 260.2392636 +let body13cp2a = 351.4909474 +let body14cp1a = 320.929847 +let body14cp2a = 56.95148863 +let body15cp1a = 22.55298719 +let body15cp2a = 153.1212844 +let body16cp1a = 13.89041491 +let body16cp2a = 141.0219905 +let body17cp1a = 11.04287338 +let body17cp2a = 138.4852424 +let body18cp1a = 356.968813 +let body18cp2a = 178.1542839 +let body19cp1a = 51.33608313 +let body19cp2a = 158.5586388 + +let eyeBigAngle = 184.8499937 +let eyeSmallAngle = 151.2656912 + +let gillAngle = 103.9416747 + + points.body01 = new Point(0, 0) + points.body02 = points.body01.shift(body01_02a, body01_02d) + points.body03 = points.body02.shift(body02_03a, body02_03d) + points.body04 = points.body03.shift(body03_04a, body03_04d) + points.body05 = points.body04.shift(body04_05a, body04_05d) + points.body06 = points.body05.shift(body05_06a, body05_06d) + points.body07 = points.body06.shift(body06_07a, body06_07d) + points.body08 = points.body07.shift(body07_08a, body07_08d) + points.body09 = points.body08.shift(body08_09a, body08_09d) + points.body10 = points.body09.shift(body09_10a, body09_10d) + points.body11 = points.body10.shift(body10_11a, body10_11d) + points.body12 = points.body11.shift(body11_12a, body11_12d) + points.body13 = points.body12.shift(body12_13a, body12_13d) + points.body14 = points.body13.shift(body13_14a, body13_14d) + points.body15 = points.body14.shift(body14_15a, body14_15d) + points.body16 = points.body15.shift(body15_16a, body15_16d) + points.body17 = points.body16.shift(body16_17a, body16_17d) + points.body18 = points.body17.shift(body17_18a, body17_18d) + points.body19 = points.body18.shift(body18_19a, body18_19d) + + points.body01cp1 = points.body01.shift(body01cp1a, body01cp1d) + points.body02cp1 = points.body02.shift(body02cp1a, body02cp1d) + points.body03cp1 = points.body03.shift(body03cp1a, body03cp1d) + points.body04cp1 = points.body04.shift(body04cp1a, body04cp1d) + points.body05cp1 = points.body05.shift(body05cp1a, body05cp1d) + points.body06cp1 = points.body06.shift(body06cp1a, body06cp1d) + points.body07cp1 = points.body07.shift(body07cp1a, body07cp1d) + points.body08cp1 = points.body08.shift(body08cp1a, body08cp1d) + points.body09cp1 = points.body09.shift(body09cp1a, body09cp1d) + points.body10cp1 = points.body10.shift(body10cp1a, body10cp1d) + points.body11cp1 = points.body11.shift(body11cp1a, body11cp1d) + points.body12cp1 = points.body12.shift(body12cp1a, body12cp1d) + points.body13cp1 = points.body13.shift(body13cp1a, body13cp1d) + points.body14cp1 = points.body14.shift(body14cp1a, body14cp1d) + points.body15cp1 = points.body15.shift(body15cp1a, body15cp1d) + points.body16cp1 = points.body16.shift(body16cp1a, body16cp1d) + points.body17cp1 = points.body17.shift(body17cp1a, body17cp1d) + points.body18cp1 = points.body18.shift(body18cp1a, body18cp1d) + points.body19cp1 = points.body19.shift(body19cp1a, body19cp1d) + + points.body01cp2 = points.body01.shift(body01cp2a, body01cp2d) + points.body02cp2 = points.body02.shift(body02cp2a, body02cp2d) + points.body03cp2 = points.body03.shift(body03cp2a, body03cp2d) + points.body04cp2 = points.body04.shift(body04cp2a, body04cp2d) + points.body05cp2 = points.body05.shift(body05cp2a, body05cp2d) + points.body06cp2 = points.body06.shift(body06cp2a, body06cp2d) + points.body07cp2 = points.body07.shift(body07cp2a, body07cp2d) + points.body08cp2 = points.body08.shift(body08cp2a, body08cp2d) + points.body09cp2 = points.body09.shift(body09cp2a, body09cp2d) + points.body10cp2 = points.body10.shift(body10cp2a, body10cp2d) + points.body11cp2 = points.body11.shift(body11cp2a, body11cp2d) + points.body12cp2 = points.body12.shift(body12cp2a, body12cp2d) + points.body13cp2 = points.body13.shift(body13cp2a, body13cp2d) + points.body14cp2 = points.body14.shift(body14cp2a, body14cp2d) + points.body15cp2 = points.body15.shift(body15cp2a, body15cp2d) + points.body16cp2 = points.body16.shift(body16cp2a, body16cp2d) + points.body17cp2 = points.body17.shift(body17cp2a, body17cp2d) + points.body18cp2 = points.body18.shift(body18cp2a, body18cp2d) + points.body19cp2 = points.body19.shift(body19cp2a, body19cp2d) + + //Adjust dart point: + points.body02 = points.body01.shift(body01_02a - 1.7, body01_02d) + + // Front dart adjustments: + points.body01cp2 = points.body01.shift( + points.body01.angle(points.body19) + + (points.body19.angle(points.body01) - points.body19.angle(points.body19cp1)), + body01cp2d + ) + body01cp1a = Math.min( + points.body01.angle(points.body01cp2) + 90 * (-1 + options.nosePointiness), + points.body01.angle(points.body02) - 5 + ) + console.log({pointiness: options.nosePointiness}) + console.log({pointiness_a: points.body01.angle(points.body01cp2)}) + console.log({pointiness_a: points.body01.angle(points.body01cp2) +90 * (-1 + options.nosePointiness)}) + console.log({pointiness_m: points.body01.angle(points.body02) - 5}) + + points.body01cp1 = points.body01.shift(body01cp1a, body01cp1d) + + // Make both sides of the dart equal: + points.body03 = points.body02.shift(body02_03a, body01_02d) + + points.body02cp1 = points.body02.shift( + points.body02.angle(points.body03) - + (points.body02.angle(points.body02cp2) - points.body02.angle(points.body01)), + body02cp2d + ) + points.body03cp2 = points.body03.shift( + points.body03.angle(points.body02) + + (points.body01.angle(points.body02) - points.body01.angle(points.body01cp1)), + body01cp1d + ) + + // Nose adjustment: + points.body03cp1 = points.body03.shift( + body03cp1a + Math.max(-10, 50 * options.nosePointiness), + body03cp1d + ) + + // Tail adjustment: + console.log(points.body13.angle(points.body13cp1) - points.body13.angle(points.body14)) + console.log(points.body14.angle(points.body13) - points.body14.angle(points.body14cp2)) + + let tailCpAngle = + (points.body13.angle(points.body13cp1) - + points.body13.angle(points.body14) + + (points.body14.angle(points.body13) - points.body14.angle(points.body14cp2))) / + 2 + points.body14cp2 = points.body14.shift( + points.body14.angle(points.body13) - tailCpAngle, + body13cp1d + ) + points.body13cp1 = points.body13.shift( + points.body13.angle(points.body14) + tailCpAngle, + body13cp1d + ) + + points.eyeBig = points.body01.shift( eyeBigAngle, eyeBigDist ) + points.eyeSmall = points.eyeBig.shift( eyeSmallAngle, eyeSmallDist *(-2+(options.aggressive ? 0 : 1))) + + let c = 0.55191502449351 + let eyeBigX = 18.7757 * options.size + let eyeBigY = 11.6262 * options.size + points.eyeBigT = points.eyeBig.shift(90, eyeBigY / 2) + points.eyeBigB = points.eyeBig.shift(270, eyeBigY / 2).shift( + 0, + options.aggressive ? eyeBigX / 3 : 0 + ) + points.eyeBigR = points.eyeBig.shift(0, eyeBigX / 2).shift( + 270, + options.aggressive ? eyeBigY / 3 : 0 + ) + points.eyeBigL = points.eyeBig.shift(180, eyeBigX / 2) + points.eyeBigTcp1 = points.eyeBigT.shift(0, (eyeBigY / 2) * c) + points.eyeBigTcp2 = points.eyeBigT.shift(180, (eyeBigY / 2) * c) + points.eyeBigBcp1 = points.eyeBigB.shift(180, (eyeBigY / 2) * c) + points.eyeBigBcp2 = points.eyeBigB.shift(0, (eyeBigY / 2) * c) + points.eyeBigRcp1 = points.eyeBigR.shift(270, (eyeBigX / (options.aggressive ? 3 : 2)) * c) + points.eyeBigRcp2 = points.eyeBigR.shift(90, (eyeBigX / 2) * c) + points.eyeBigLcp1 = points.eyeBigL.shift(90, (eyeBigX / 2) * c) + points.eyeBigLcp2 = points.eyeBigL.shift(270, (eyeBigX / 2) * c) + + paths.eyeBig = new Path() + .move(points.eyeBigT) + .curve(points.eyeBigTcp2, points.eyeBigLcp1, points.eyeBigL) + .curve(points.eyeBigLcp2, points.eyeBigBcp1, points.eyeBigB) + .curve(points.eyeBigBcp2, points.eyeBigRcp1, points.eyeBigR) + .curve(points.eyeBigRcp2, points.eyeBigTcp1, points.eyeBigT) + + let eyeSmallX = 1.87089 * options.size *((options.aggressive ? 1.5 : 1)) + let eyeSmallY = 1.5368 * options.size *((options.aggressive ? 1.5 : 1)) + points.eyeSmallT = points.eyeSmall.shift(270, eyeSmallY / 2) + points.eyeSmallB = points.eyeSmall.shift(90, eyeSmallY / 2) + points.eyeSmallR = points.eyeSmall.shift(0, eyeSmallX / 2) + points.eyeSmallL = points.eyeSmall.shift(180, eyeSmallX / 2) + points.eyeSmallTcp1 = points.eyeSmallT.shift(0, (eyeSmallY / 2) * c) + points.eyeSmallTcp2 = points.eyeSmallT.shift(180, (eyeSmallY / 2) * c) + points.eyeSmallBcp1 = points.eyeSmallB.shift(180, (eyeSmallY / 2) * c) + points.eyeSmallBcp2 = points.eyeSmallB.shift(0, (eyeSmallY / 2) * c) + points.eyeSmallRcp1 = points.eyeSmallR.shift(270, (eyeSmallX / 2) * c) + points.eyeSmallRcp2 = points.eyeSmallR.shift(90, (eyeSmallX / 2) * c) + points.eyeSmallLcp1 = points.eyeSmallL.shift(90, (eyeSmallX / 2) * c) + points.eyeSmallLcp2 = points.eyeSmallL.shift(270, (eyeSmallX / 2) * c) + + paths.eyeSmall = new Path() + .move(points.eyeSmallT) + .curve(points.eyeSmallTcp2, points.eyeSmallLcp1, points.eyeSmallL) + .curve(points.eyeSmallLcp2, points.eyeSmallBcp1, points.eyeSmallB) + .curve(points.eyeSmallBcp2, points.eyeSmallRcp1, points.eyeSmallR) + .curve(points.eyeSmallRcp2, points.eyeSmallTcp1, points.eyeSmallT) + + paths.seam = new Path() + .move(points.body01) + .curve(points.body01cp1, points.body02cp2, points.body02) + .curve(points.body02cp1, points.body03cp2, points.body03) + .curve(points.body03cp1, points.body04cp2, points.body04) + .curve(points.body04cp1, points.body05cp2, points.body05) + .curve(points.body05cp1, points.body06cp2, points.body06) + .curve(points.body06cp1, points.body07cp2, points.body07) + .curve(points.body07cp1, points.body08cp2, points.body08) + .curve(points.body08cp1, points.body09cp2, points.body09) + .curve(points.body09cp1, points.body10cp2, points.body10) + .curve(points.body10cp1, points.body11cp2, points.body11) + .curve(points.body11cp1, points.body12cp2, points.body12) + .curve(points.body12cp1, points.body13cp2, points.body13) + .curve(points.body13cp1, points.body14cp2, points.body14) + .curve(points.body14cp1, points.body15cp2, points.body15) + .curve(points.body15cp1, points.body16cp2, points.body16) + .curve(points.body16cp1, points.body17cp2, points.body17) + .curve(points.body17cp1, points.body18cp2, points.body18) + .curve(points.body18cp1, points.body19cp2, points.body19) + .curve(points.body19cp1, points.body01cp2, points.body01) + + + let gillPath = new Path() + .move(points.body17) + .curve(points.body17cp1, points.body18cp2, points.body18) + points.gill1s = gillPath.shiftFractionAlong(0.018) + points.gill2s = gillPath.shiftFractionAlong(0.08 * 1 + 0.018) + points.gill3s = gillPath.shiftFractionAlong(0.08 * 2 + 0.018) + points.gill4s = gillPath.shiftFractionAlong(0.08 * 3 + 0.018) + points.gill5s = gillPath.shiftFractionAlong(0.08 * 4 + 0.018) + points.gill1e = points.gill1s.shift(gillAngle, gillLength *(1 +(0 * 0.08))) + points.gill2e = points.gill2s.shift(gillAngle, gillLength *(1 +(1 * 0.08))) + points.gill3e = points.gill3s.shift(gillAngle, gillLength *(1 +(2 * 0.08))) + points.gill4e = points.gill4s.shift(gillAngle, gillLength *(1 +(3 * 0.08))) + points.gill5e = points.gill5s.shift(gillAngle, gillLength *(1 +(4 * 0.08))) + + paths.gill1 = new Path().move(points.gill1s).line(points.gill1e) + paths.gill2 = new Path().move(points.gill2s).line(points.gill2e) + paths.gill3 = new Path().move(points.gill3s).line(points.gill3e) + paths.gill4 = new Path().move(points.gill4s).line(points.gill4e) + paths.gill5 = new Path().move(points.gill5s).line(points.gill5e) + + store.set( 'tailWidth', points.body13.dist( points.body14 ) ) + store.set( 'tailCpAngle', points.body13.angle(points.body13cp1) - points.body13.angle(points.body14) ) + store.set( 'tailCpDist', body13cp1d ) + + store.set( 'topFinOpening', points.body16.dist( points.body17 )) + store.set( 'topFinOpeningLength', (new Path().move(points.body16).curve(points.body16cp1, points.body17cp2, points.body17)).length()) + + store.set( 'faceTopLength', (new Path().move(points.body17).curve(points.body17cp1, points.body18cp2, points.body18).curve(points.body18cp1, points.body19cp2, points.body19)).length()) + + store.set( 'bellyLength', (new Path().move(points.body17).curve(points.body17cp1, points.body18cp2, points.body18).curve(points.body18cp1, points.body19cp2, points.body19)).length()) + store.set( 'bellyTailLength', (new Path().move(points.body15).curve(points.body15cp1, points.body16cp2, points.body16)).length()) + + // Complete? + if (complete) { + if( sa ) { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } + + macro('ld', { + from: points.body13, + to: points.body01, + d: -5, + }) + } + + return part +} diff --git a/packages/hi/src/bottomFin.js b/packages/hi/src/bottomFin.js new file mode 100644 index 00000000000..4e6562b7e0b --- /dev/null +++ b/packages/hi/src/bottomFin.js @@ -0,0 +1,131 @@ +export default function (part) { + let { + store, + sa, + Point, + points, + Path, + paths, + Snippet, + snippets, + options, + measurements, + complete, + paperless, + macro, + } = part.shorthand() + + + let bottomFin01_02d = 250.63638754690027 * options.size + let bottomFin01_02a = 119.34849371430543 + let bottomFin01_03d = 137.70322741678933 * options.size + let bottomFin01_03a = 175.11970494988498 + let bottomFin01cp1d = 133.21819413653674 * options.size + let bottomFin01cp2d = 51.94197687805115 * options.size + let bottomFin01cp1a = 95.20910872095476 + let bottomFin01cp2a = 158.66090918215986 + let bottomFin02cp1d = 29.25974733588791 * options.size + let bottomFin02cp2d = 31.28292571739416 * options.size + let bottomFin02cp1a = 208.55316756249104 + let bottomFin02cp2a = 28.113642612639804 + let bottomFin03cp1d = 53.31550082293142 * options.size + let bottomFin03cp2d = 177.65809391356197 * options.size + let bottomFin03cp1a = 9.79694130335566 + let bottomFin03cp2a = 80.81868300891519 + + let finLength = store.get('aboveMouthFinLength') + store.get('bellyFinLength') + let finCircumference = store.get('topFinCircumference') + + console.log({ bellyFinLength: store.get('bellyFinLength') }) + console.log({ finCircumference: store.get('topFinCircumference') }) + + let diff = 0 + let iteration = 0 + do { + points.bottomFin01 = new Point(0, 0) + points.bottomFin02 = points.bottomFin01.shift(bottomFin01_02a, bottomFin01_02d) + points.bottomFin03 = points.bottomFin01.shift(bottomFin01_03a, bottomFin01_03d) + + points.bottomFin01cp1 = points.bottomFin01.shift(bottomFin01cp1a, bottomFin01cp1d) + points.bottomFin01cp2 = points.bottomFin01.shift(bottomFin01cp2a, bottomFin01cp2d) + points.bottomFin02cp1 = points.bottomFin02.shift(bottomFin02cp1a, bottomFin02cp1d) + points.bottomFin02cp2 = points.bottomFin02.shift(bottomFin02cp2a, bottomFin02cp2d) + points.bottomFin03cp1 = points.bottomFin03.shift(bottomFin03cp1a, bottomFin03cp1d) + points.bottomFin03cp2 = points.bottomFin03.shift(bottomFin03cp2a, bottomFin03cp2d) + diff = + finLength - + new Path() + .move(points.bottomFin03) + .curve(points.bottomFin03cp1, points.bottomFin01cp2, points.bottomFin01) + .length() + + bottomFin01_03d = bottomFin01_03d + diff + iteration++ + } while ((diff < -1 || diff > 1) && iteration < 100) + console.log({ iteration1: iteration }) + + diff = 0 + iteration = 0 + do { + points.bottomFin01 = new Point(0, 0) + points.bottomFin02 = points.bottomFin01.shift(bottomFin01_02a, bottomFin01_02d) + points.bottomFin03 = points.bottomFin01.shift(bottomFin01_03a, bottomFin01_03d) + + points.bottomFin01cp1 = points.bottomFin01.shift(bottomFin01cp1a, bottomFin01cp1d) + points.bottomFin01cp2 = points.bottomFin01.shift(bottomFin01cp2a, bottomFin01cp2d) + points.bottomFin02cp1 = points.bottomFin02.shift(bottomFin02cp1a, bottomFin02cp1d) + points.bottomFin02cp2 = points.bottomFin02.shift(bottomFin02cp2a, bottomFin02cp2d) + points.bottomFin03cp1 = points.bottomFin03.shift(bottomFin03cp1a, bottomFin03cp1d) + points.bottomFin03cp2 = points.bottomFin03.shift(bottomFin03cp2a, bottomFin03cp2d) + diff = + finCircumference - + new Path() + .move(points.bottomFin01) + .curve(points.bottomFin01cp1, points.bottomFin02cp2, points.bottomFin02) + .curve(points.bottomFin02cp1, points.bottomFin03cp2, points.bottomFin03) + .length() + + bottomFin01_02d = bottomFin01_02d + diff + iteration++ + } while ((diff < -1 || diff > 1) && iteration < 100) + + console.log({ iteration2: iteration }) + + console.log({ finLength: finLength }) + console.log({ + actual: new Path() + .move(points.bottomFin03) + .curve(points.bottomFin03cp1, points.bottomFin01cp2, points.bottomFin01) + .length(), + }) + + paths.seam = new Path() + .move(points.bottomFin01) + .curve(points.bottomFin01cp1, points.bottomFin02cp2, points.bottomFin02) + .curve(points.bottomFin02cp1, points.bottomFin03cp2, points.bottomFin03) + .curve(points.bottomFin03cp1, points.bottomFin01cp2, points.bottomFin01) + .close() + + console.log({ + bottomFinCirc: new Path() + .move(points.bottomFin01) + .curve(points.bottomFin01cp1, points.bottomFin02cp2, points.bottomFin02) + .curve(points.bottomFin02cp1, points.bottomFin03cp2, points.bottomFin03) + .length(), + }) + + points.bottomFinSnippet = new Path() + .move(points.bottomFin01) + .curve(points.bottomFin01cp2, points.bottomFin03cp1, points.bottomFin03) + .shiftAlong(store.get('aboveMouthFinLength')) + snippets.bottomFin = new Snippet('bnotch', points.bottomFinSnippet) + + // Complete? + if (complete) { + if (sa) { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } + } + + return part +} diff --git a/packages/hi/src/index.js b/packages/hi/src/index.js new file mode 100644 index 00000000000..e52e69247f1 --- /dev/null +++ b/packages/hi/src/index.js @@ -0,0 +1,23 @@ +import freesewing from '@freesewing/core' +import plugins from '@freesewing/plugin-bundle' +import config from '../config' +import draftBody from './body' +import draftTail from './tail' +import draftMouth from './mouth' +import draftAboveMouth from './aboveMouth' +import draftBelly from './belly' +import draftTopFin from './topFin' +import draftBottomFin from './bottomFin' + +// Create design +const Pattern = new freesewing.Design(config, plugins) + +Pattern.prototype.draftBody = draftBody +Pattern.prototype.draftTail = draftTail +Pattern.prototype.draftMouth = draftMouth +Pattern.prototype.draftAboveMouth = draftAboveMouth +Pattern.prototype.draftBelly = draftBelly +Pattern.prototype.draftTopFin = draftTopFin +Pattern.prototype.draftBottomFin = draftBottomFin + +export default Pattern diff --git a/packages/hi/src/mouth.js b/packages/hi/src/mouth.js new file mode 100644 index 00000000000..6699a243e1b --- /dev/null +++ b/packages/hi/src/mouth.js @@ -0,0 +1,94 @@ +export default function (part) { + let { + store, + sa, + Point, + points, + Path, + paths, + Snippet, + snippets, + options, + measurements, + complete, + paperless, + macro, + } = part.shorthand() + + let mouth01_02d = 141.93684055893488 * options.size + let mouth01_02a = 312.8254216093024 + let mouth01_03d = 42.496 * options.size + let mouth01_03a = 270 + let mouth01cp1d = 38.6204 * options.size + let mouth01cp1a = 0 + let mouth02cp1d = 59.58739935676417 * options.size + let mouth02cp2d = 73.53520117766728 * options.size + let mouth02cp1a = 128.07726051101747 + let mouth02cp2a = 95.21339058299296 + let mouth03cp2d = 33.142 * options.size + let mouth03cp2a = 0 + + points.mouth01 = new Point(0, 0) + points.mouth02 = points.mouth01.shift(mouth01_02a, mouth01_02d) + points.mouth03 = points.mouth01.shift(mouth01_03a, mouth01_03d) + + points.mouth01cp1 = points.mouth01.shift(mouth01cp1a, mouth01cp1d) + points.mouth02cp1 = points.mouth02.shift(mouth02cp1a, mouth02cp1d) + points.mouth02cp2 = points.mouth02.shift(mouth02cp2a, mouth02cp2d) + points.mouth03cp2 = points.mouth03.shift(mouth03cp2a, mouth03cp2d) + + points.mouth04 = points.mouth02.flipX() + + points.mouth01cp2 = points.mouth01cp1.flipX() + points.mouth04cp2 = points.mouth02cp1.flipX() + points.mouth04cp1 = points.mouth02cp2.flipX() + points.mouth03cp1 = points.mouth03cp2.flipX() + + console.log({ mouth01_02d: points.mouth01.dist(points.mouth02) }) + console.log({ mouth01_02a: points.mouth01.angle(points.mouth02) }) + console.log({ mouth01_03d: points.mouth01.dist(points.mouth03) }) + console.log({ mouth01_03a: points.mouth01.angle(points.mouth03) }) + + console.log({ mouth01cp1d: points.mouth01.dist(points.mouth01cp1) }) + console.log({ mouth01cp1a: points.mouth01.angle(points.mouth01cp1) }) + console.log({ mouth02cp1d: points.mouth02.dist(points.mouth02cp1) }) + console.log({ mouth02cp2d: points.mouth02.dist(points.mouth02cp2) }) + console.log({ mouth02cp1a: points.mouth02.angle(points.mouth02cp1) }) + console.log({ mouth02cp2a: points.mouth02.angle(points.mouth02cp2) }) + console.log({ mouth03cp2d: points.mouth03.dist(points.mouth03cp2) }) + console.log({ mouth03cp2a: points.mouth03.angle(points.mouth03cp2) }) + + paths.seam = new Path() + .move(points.mouth01) + .curve(points.mouth01cp2, points.mouth04cp1, points.mouth04) + .curve(points.mouth04cp2, points.mouth03cp1, points.mouth03) + .curve(points.mouth03cp2, points.mouth02cp1, points.mouth02) + .curve(points.mouth02cp2, points.mouth01cp1, points.mouth01) + + store.set( + 'mouthTopLength', + new Path() + .move(points.mouth01) + .curve(points.mouth01cp1, points.mouth02cp2, points.mouth02) + .length() + ) + store.set( + 'mouthBottomLength', + new Path() + .move(points.mouth03) + .curve(points.mouth03cp1, points.mouth04cp2, points.mouth04) + .length() + ) + + snippets.mouthMidTop = new Snippet('bnotch', points.mouth01) + snippets.mouthMidBottom = new Snippet('bnotch', points.mouth03) + + // Complete? + if (complete) { + if (sa) { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } + } + + return part +} diff --git a/packages/hi/src/tail.js b/packages/hi/src/tail.js new file mode 100644 index 00000000000..37af71f3e15 --- /dev/null +++ b/packages/hi/src/tail.js @@ -0,0 +1,93 @@ +export default function (part) { + let { + store, + sa, + Point, + points, + Path, + paths, + Snippet, + snippets, + options, + measurements, + complete, + paperless, + macro, + } = part.shorthand() + + + let tail01_02d = 192.0129724628 * options.size + let tail01_02a = 53.242955551234914 + let tail01_03d = 115.38057785000036 * options.size + let tail01_03a = 106.95066736265407 + let tail01_04d = 230.05210782342334 * options.size + let tail01_04a = 138.66344842617497 + let tail01_05d = 95.12771141996424 * options.size + let tail01_05a = 173.38284569091573 + let tail01cp1d = 156.52907796955816 * options.size + let tail01cp2d = 33.33694275124821 * options.size + let tail01cp1a = 40.69161792982998 + let tail01cp2a = 150.8191939475001 + let tail02cp1d = 20.1307852802616 * options.size + let tail02cp2d = 26.418081118809575 * options.size + let tail02cp1a = 129.66709301725697 + let tail02cp2a = 303.9168409570558 + let tail03cp1d = 41.577 * options.size + let tail03cp2d = 41.575999999999965 * options.size + let tail03cp1a = 180 + let tail03cp2a = -0 + let tail04cp1d = 18.83137554720844 * options.size + let tail04cp2d = 18.830271479721173 * options.size + let tail04cp1a = 218.47354143777738 + let tail04cp2a = 38.483984913053284 + let tail05cp1d = 38.59528397356339 * options.size + let tail05cp2d = 126.7372982195849 * options.size + let tail05cp1a = 14.169822482118544 + let tail05cp2a = 128.3396902984 + + points.tail01 = new Point(0, 0) + points.tail02 = points.tail01.shift(tail01_02a, tail01_02d) + points.tail03 = points.tail01.shift(tail01_03a, tail01_03d) + points.tail04 = points.tail01.shift(tail01_04a, tail01_04d) + points.tail05 = points.tail01.shift(tail01_05a, tail01_05d) + + points.tail01cp1 = points.tail01.shift(tail01cp1a, tail01cp1d) + points.tail01cp2 = points.tail01.shift(tail01cp2a, tail01cp2d) + points.tail02cp1 = points.tail02.shift(tail02cp1a, tail02cp1d) + points.tail02cp2 = points.tail02.shift(tail02cp2a, tail02cp2d) + points.tail03cp1 = points.tail03.shift(tail03cp1a, tail03cp1d) + points.tail03cp2 = points.tail03.shift(tail03cp2a, tail03cp2d) + points.tail04cp1 = points.tail04.shift(tail04cp1a, tail04cp1d) + points.tail04cp2 = points.tail04.shift(tail04cp2a, tail04cp2d) + points.tail05cp1 = points.tail05.shift(tail05cp1a, tail05cp1d) + points.tail05cp2 = points.tail05.shift(tail05cp2a, tail05cp2d) + + // Adjust tail opening: + points.tail05 = points.tail01.shift(points.tail01.angle(points.tail05), store.get('tailWidth')) + points.tail01cp2 = points.tail01.shift( + points.tail01.angle(points.tail05) - store.get('tailCpAngle'), + store.get('tailCpDist') + ) + points.tail05cp1 = points.tail05.shift( + points.tail05.angle(points.tail01) + store.get('tailCpAngle'), + store.get('tailCpDist') + ) + + paths.seam = new Path() + .move(points.tail01) + .curve(points.tail01cp1, points.tail02cp2, points.tail02) + .curve(points.tail02cp1, points.tail03cp2, points.tail03) + .curve(points.tail03cp1, points.tail04cp2, points.tail04) + .curve(points.tail04cp1, points.tail05cp2, points.tail05) + .curve(points.tail05cp1, points.tail01cp2, points.tail01) + .close() + + // Complete? + if (complete) { + if (sa) { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } + } + + return part +} diff --git a/packages/hi/src/topFin.js b/packages/hi/src/topFin.js new file mode 100644 index 00000000000..6ae745d1da4 --- /dev/null +++ b/packages/hi/src/topFin.js @@ -0,0 +1,105 @@ +export default function (part) { + let { + store, + sa, + Point, + points, + Path, + paths, + Snippet, + snippets, + options, + measurements, + complete, + paperless, + macro, + } = part.shorthand() + + + let topFinOpening = store.get('topFinOpening') + let topFinOpeningLength = store.get('topFinOpeningLength') + + let topFin01_02d = 256.9537569065251 * options.size + let topFin01_02a = 325.46697637215823 + let topFin01_03d = 149.5416276819869 * options.size + let topFin01_03a = 275.4353725228365 + let topFin01cp1d = 178.52481158058 * options.size + let topFin01cp2d = 27.240286624072077 * options.size + let topFin01cp1a = 346.31732410079576 + let topFin01cp2a = 254.05347154462484 + let topFin02cp1d = 25.871054481794893 * options.size + let topFin02cp2d = 12.154549189501026 * options.size + let topFin02cp1a = 236.80010054081936 + let topFin02cp2a = 56.66685795767527 + let topFin03cp1d = 39.024661651837555 * options.size + let topFin03cp2d = 76.08965682877273 * options.size + let topFin03cp1a = 113.40393219481112 + let topFin03cp2a = 22.511206474810457 + + let diff = 0 + let iteration = 0 + do { + points.topFin01 = new Point(0, 0) + points.topFin02 = points.topFin01.shift(topFin01_02a, topFin01_02d) + points.topFin03 = points.topFin01.shift(topFin01_03a, topFinOpening) // topFin01_03d + + points.topFin01cp1 = points.topFin01.shift(topFin01cp1a, topFin01cp1d) + points.topFin01cp2 = points.topFin01.shift(topFin01cp2a, topFin01cp2d) + points.topFin02cp1 = points.topFin02.shift(topFin02cp1a, topFin02cp1d) + points.topFin02cp2 = points.topFin02.shift(topFin02cp2a, topFin02cp2d) + points.topFin03cp1 = points.topFin03.shift(topFin03cp1a, topFin03cp1d) + points.topFin03cp2 = points.topFin03.shift(topFin03cp2a, topFin03cp2d) + diff = + topFinOpeningLength - + new Path() + .move(points.topFin03) + .curve(points.topFin03cp1, points.topFin01cp2, points.topFin01) + .length() + + topFinOpening = topFinOpening + diff + iteration++ + } while ((diff < -1 || diff > 1) && iteration < 100) + + console.log({ iteration: iteration }) + + paths.seam = new Path() + .move(points.topFin01) + .curve(points.topFin01cp2, points.topFin03cp1, points.topFin03) + .curve(points.topFin03cp2, points.topFin02cp1, points.topFin02) + .curve(points.topFin02cp2, points.topFin01cp1, points.topFin01) + .close() + + console.log({ topFinLength1: store.get('topFinOpeningLength') }) + console.log({ + topFinLength2: new Path() + .move(points.topFin03) + .curve(points.topFin03cp1, points.topFin01cp2, points.topFin01) + .length(), + }) + + store.set( + 'topFinCircumference', + new Path() + .move(points.topFin01) + .curve(points.topFin01cp1, points.topFin02cp2, points.topFin02) + .curve(points.topFin02cp1, points.topFin03cp2, points.topFin03) + .length() + ) + + console.log({ + topFinCirc: new Path() + .move(points.topFin01) + .curve(points.topFin01cp1, points.topFin02cp2, points.topFin02) + .curve(points.topFin02cp1, points.topFin03cp2, points.topFin03) + .length(), + }) + + // Complete? + if (complete) { + if (sa) { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } + } + + return part +} From e358f863c1a1174f274a1c7598c81364608c3269 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Jun 2022 04:31:24 +0000 Subject: [PATCH 010/158] build(deps): bump @fontsource/roboto-mono from 4.5.5 to 4.5.7 Bumps [@fontsource/roboto-mono](https://github.com/fontsource/fontsource/tree/HEAD/fonts/google/roboto-mono) from 4.5.5 to 4.5.7. - [Release notes](https://github.com/fontsource/fontsource/releases) - [Changelog](https://github.com/fontsource/fontsource/blob/main/CHANGELOG.md) - [Commits](https://github.com/fontsource/fontsource/commits/HEAD/fonts/google/roboto-mono) --- updated-dependencies: - dependency-name: "@fontsource/roboto-mono" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4beb12c5431..425471458e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1781,9 +1781,9 @@ integrity sha512-cchGDCcOap7Yy/18HiufgNxSgYKa/cbNyn63uQmNDf45mdOki9RK1X55Q1Mq/GimPbvac8bfxDGqAPYCTtMvuQ== "@fontsource/roboto-mono@latest": - version "4.5.5" - resolved "https://registry.yarnpkg.com/@fontsource/roboto-mono/-/roboto-mono-4.5.5.tgz#cf80fc625d4fabe82ecb3661be19026e46c674cf" - integrity sha512-krIslwmFMjDHtbSVKZLC6+PM6dOvw26OTm7rE7CrniJ4q5Lbfffx67RAlDI3ee0LsG6gIJd/JXBeUm+RgUsPqg== + version "4.5.7" + resolved "https://registry.yarnpkg.com/@fontsource/roboto-mono/-/roboto-mono-4.5.7.tgz#69a89b679ab962ea3591438f35833b09f0f8980f" + integrity sha512-1uBjM95BEz7zJlmmnpNAM5afMvIxx0wqr86eA76vRqZw8OF5wmsRqYfF3caHuVarBH9/AGN7t9h+3UXK8fjq/Q== "@fontsource/ubuntu@latest": version "4.5.9" From 1d6d43a7e254c4e4c70a375fcabf30cb4e0ce62b Mon Sep 17 00:00:00 2001 From: woutervdub Date: Wed, 8 Jun 2022 07:50:05 -0700 Subject: [PATCH 011/158] Now with Teeth! --- packages/hi/config/index.js | 3 +- packages/hi/src/belly.js | 23 ++++++----- packages/hi/src/body.js | 7 +++- packages/hi/src/index.js | 4 ++ packages/hi/src/lowerTeeth.js | 62 ++++++++++++++++++++++++++++ packages/hi/src/mouth.js | 25 ++++++++++-- packages/hi/src/tail.js | 5 +++ packages/hi/src/teeth.js | 37 +++++++++++++++++ packages/hi/src/upperTeeth.js | 77 +++++++++++++++++++++++++++++++++++ 9 files changed, 227 insertions(+), 16 deletions(-) create mode 100644 packages/hi/src/lowerTeeth.js create mode 100644 packages/hi/src/teeth.js create mode 100644 packages/hi/src/upperTeeth.js diff --git a/packages/hi/config/index.js b/packages/hi/config/index.js index 0a4d8ac4e3b..54805c9a07a 100644 --- a/packages/hi/config/index.js +++ b/packages/hi/config/index.js @@ -12,13 +12,14 @@ export default { style: ['size','nosePointiness','aggressive'], }, measurements: ['neck'], - parts: ['body','tail','aboveMouth','belly','topFin','bottomFin','mouth'], + parts: ['body','tail','aboveMouth','belly','topFin','bottomFin','mouth','lowerTeeth','upperTeeth'], dependencies: { tail: 'body', aboveMouth: ['body','mouth'], topFin: 'body', belly: ['body','aboveMouth'], bottomFin: ['body','belly','aboveMouth'], + mouth: ['lowerTeeth', 'upperTeeth'], }, inject: {}, hide: [], diff --git a/packages/hi/src/belly.js b/packages/hi/src/belly.js index 5c0f23f65cb..bd06f5ca257 100644 --- a/packages/hi/src/belly.js +++ b/packages/hi/src/belly.js @@ -120,11 +120,11 @@ export default function (part) { diff = 0 iteration = 0 do { - points.belly04.x -= diff - points.belly04cp1.x -= diff - points.belly04cp2.x -= diff - points.belly05.x -= diff - points.belly05cp2.x -= diff + points.belly04.x += diff + points.belly04cp1.x += diff + points.belly04cp2.x += diff + points.belly05.x += diff + points.belly05cp2.x += diff iteration++ diff = @@ -133,14 +133,15 @@ export default function (part) { .move(points.belly03) .curve(points.belly03cp1, points.belly04cp2, points.belly04) .length() + + console.log({ + actual: new Path() + .move(points.belly03) + .curve(points.belly03cp1, points.belly04cp2, points.belly04) + .length(), + }) } while ((diff < -1 || diff > 1) && iteration < 100) - console.log({ - actual: new Path() - .move(points.belly03) - .curve(points.belly03cp1, points.belly04cp2, points.belly04) - .length(), - }) points.belly05cp1 = points.belly05cp2.flipY() points.belly06 = points.belly04.flipY() diff --git a/packages/hi/src/body.js b/packages/hi/src/body.js index 32f01e8d83a..113a5dd9e04 100644 --- a/packages/hi/src/body.js +++ b/packages/hi/src/body.js @@ -171,7 +171,7 @@ let body19_01a = 59.63482522 let body01cp1a = 161.5263465 let body01cp2a = 255.6503959 let body02cp1a = 31.95354992 -//let body02cp2a = 359.48842 +// let body02cp2a = 359.48842 // let body02cp2a = 2.48842 let body02cp2a = 10 @@ -444,6 +444,11 @@ let gillAngle = 103.9416747 // Complete? if (complete) { + points.bodyTailSnippet = new Path() + .move(points.body13) + .curve(points.body13cp1, points.body14cp2, points.body14) + .shiftFractionAlong(0.25) + snippets.bodyTail = new Snippet('bnotch', points.bodyTailSnippet) if( sa ) { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } diff --git a/packages/hi/src/index.js b/packages/hi/src/index.js index e52e69247f1..176322d9374 100644 --- a/packages/hi/src/index.js +++ b/packages/hi/src/index.js @@ -8,6 +8,8 @@ import draftAboveMouth from './aboveMouth' import draftBelly from './belly' import draftTopFin from './topFin' import draftBottomFin from './bottomFin' +import draftLowerTeeth from './lowerTeeth' +import draftUpperTeeth from './upperTeeth' // Create design const Pattern = new freesewing.Design(config, plugins) @@ -19,5 +21,7 @@ Pattern.prototype.draftAboveMouth = draftAboveMouth Pattern.prototype.draftBelly = draftBelly Pattern.prototype.draftTopFin = draftTopFin Pattern.prototype.draftBottomFin = draftBottomFin +Pattern.prototype.draftLowerTeeth = draftLowerTeeth +Pattern.prototype.draftUpperTeeth = draftUpperTeeth export default Pattern diff --git a/packages/hi/src/lowerTeeth.js b/packages/hi/src/lowerTeeth.js new file mode 100644 index 00000000000..620e8f7f532 --- /dev/null +++ b/packages/hi/src/lowerTeeth.js @@ -0,0 +1,62 @@ +import { createTeeth } from './teeth.js' + +export default function (part) { + let { + store, + sa, + Point, + points, + Path, + paths, + Snippet, + snippets, + options, + measurements, + complete, + paperless, + macro, + } = part.shorthand() + + let lowerTeeth01_02d = 75.74338717643937 * options.size + let lowerTeeth01_02a = 25.414236606099728 + 180 + let lowerTeeth02cp1d = 47.74891452755759 * options.size + let lowerTeeth02cp1a = 42.59332849750379 + let lowerTeeth01cp2d = 17.774046078481962 * options.size + let lowerTeeth01cp2a = 180 + + points.lowerTeeth01 = new Point(0, 0) + points.lowerTeeth02 = points.lowerTeeth01.shift(lowerTeeth01_02a, lowerTeeth01_02d) + points.lowerTeeth01cp2 = points.lowerTeeth01.shift(lowerTeeth01cp2a, lowerTeeth01cp2d) + points.lowerTeeth02cp1 = points.lowerTeeth02.shift(lowerTeeth02cp1a, lowerTeeth02cp1d) + points.lowerTeeth03 = points.lowerTeeth02.flipX() + points.lowerTeeth01cp1 = points.lowerTeeth01cp2.flipX() + points.lowerTeeth03cp2 = points.lowerTeeth02cp1.flipX() + + paths.seam = new Path() + .move(points.lowerTeeth02) + .curve(points.lowerTeeth02cp1, points.lowerTeeth01cp2, points.lowerTeeth01) + .curve(points.lowerTeeth01cp1, points.lowerTeeth03cp2, points.lowerTeeth03) + + store.set('lowerTeethLength', paths.seam.length()) + + paths.teeth = new Path().move(paths.seam.start()) + + createTeeth(paths.seam, 16 * options.size, 8 * options.size, 10, options.aggressive, paths.teeth) + + // Complete? + if (complete) { + snippets.lowerTeeth = new Snippet('bnotch', points.lowerTeeth01) + + if (sa) { + let pSA = paths.seam.offset(sa) + paths.sa = new Path() + .move(paths.seam.start()) + .line(pSA.start()) + .join(pSA) + .line(paths.seam.end()) + .attr('class', 'fabric sa') + } + } + + return part +} diff --git a/packages/hi/src/mouth.js b/packages/hi/src/mouth.js index 6699a243e1b..66e4388bc71 100644 --- a/packages/hi/src/mouth.js +++ b/packages/hi/src/mouth.js @@ -80,11 +80,30 @@ export default function (part) { .length() ) - snippets.mouthMidTop = new Snippet('bnotch', points.mouth01) - snippets.mouthMidBottom = new Snippet('bnotch', points.mouth03) - // Complete? if (complete) { + points.mouthUpperTeeth1 = new Path() + .move(points.mouth01) + .curve(points.mouth01cp1, points.mouth02cp2, points.mouth02) + .shiftAlong(store.get('upperTeethLength') / 2) + points.mouthUpperTeeth2 = new Path() + .move(points.mouth01) + .curve(points.mouth01cp2, points.mouth04cp1, points.mouth04) + .shiftAlong(store.get('upperTeethLength') / 2) + snippets.mouthUpperTeeth1 = new Snippet('bnotch', points.mouthUpperTeeth1) + snippets.mouthUpperTeeth2 = new Snippet('bnotch', points.mouthUpperTeeth2) + points.mouthlowerTeeth1 = new Path() + .move(points.mouth03) + .curve(points.mouth03cp1, points.mouth04cp2, points.mouth04) + .shiftAlong(store.get('lowerTeethLength') / 2) + points.mouthlowerTeeth2 = new Path() + .move(points.mouth03) + .curve(points.mouth03cp2, points.mouth02cp1, points.mouth02) + .shiftAlong(store.get('lowerTeethLength') / 2) + snippets.mouthlowerTeeth1 = new Snippet('bnotch', points.mouthlowerTeeth1) + snippets.mouthlowerTeeth2 = new Snippet('bnotch', points.mouthlowerTeeth2) + snippets.mouthMidTop = new Snippet('bnotch', points.mouth01) + snippets.mouthMidBottom = new Snippet('bnotch', points.mouth03) if (sa) { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } diff --git a/packages/hi/src/tail.js b/packages/hi/src/tail.js index 37af71f3e15..daefabd1ec4 100644 --- a/packages/hi/src/tail.js +++ b/packages/hi/src/tail.js @@ -84,6 +84,11 @@ export default function (part) { // Complete? if (complete) { + points.tailSnippet = new Path() + .move(points.tail01) + .curve(points.tail01cp2, points.tail05cp1, points.tail05) + .shiftFractionAlong(0.25) + snippets.tail = new Snippet('bnotch', points.tailSnippet) if (sa) { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } diff --git a/packages/hi/src/teeth.js b/packages/hi/src/teeth.js new file mode 100644 index 00000000000..af50f6553f8 --- /dev/null +++ b/packages/hi/src/teeth.js @@ -0,0 +1,37 @@ +export function createTeeth(path, largeTeeth, smallTeeth, numberOfTeeth, aggressive, newPath) { + let c = 0.55191502449351 + + let pLength = path.length() + let stepLength = pLength / numberOfTeeth + + let teethStep = (largeTeeth - smallTeeth) / (numberOfTeeth / 2 - 1) + let teethDirection = 1 + + let teethSize = smallTeeth + for (var i = 0; i < numberOfTeeth; i++) { + if (i == numberOfTeeth / 2) teethDirection = 0 + if (i > numberOfTeeth / 2) teethDirection = -1 + + teethSize += teethStep * teethDirection + let startP = path.shiftAlong(stepLength * i) + let midP = path.shiftAlong(stepLength * (i + 0.5)) + let endP = path.shiftAlong(stepLength * (i + 1)) + let midPangle = midP.angle(path.shiftAlong(stepLength * (i + 0.5) + 0.1)) + 90 + midP = midP.shift(midPangle, teethSize) + let startPcp = startP.shift( + startP.angle(path.shiftAlong(stepLength * i + 0.1)) + 90, + teethSize * c + ) + let endPcp = endP.shift( + endP.angle(path.shiftAlong(stepLength * (i + 1) - 0.1)) - 90, + teethSize * c + ) + let midPcp1 = midP.shift(midPangle - 90, stepLength * c * (aggressive ? 0.05 : 0.7)) + let midPcp2 = midP.shift(midPangle + 90, stepLength * c * (aggressive ? 0.05 : 0.7)) + + newPath.curve(startPcp, midPcp2, midP) + newPath.curve(midPcp1, endPcp, endP) + } + + return +} diff --git a/packages/hi/src/upperTeeth.js b/packages/hi/src/upperTeeth.js new file mode 100644 index 00000000000..6042cfd3573 --- /dev/null +++ b/packages/hi/src/upperTeeth.js @@ -0,0 +1,77 @@ +import { createTeeth } from './teeth.js' + +export default function (part) { + let { + store, + sa, + Point, + points, + Path, + paths, + Snippet, + snippets, + options, + measurements, + complete, + paperless, + macro, + } = part.shorthand() + + points.upperTeeth01 = new Point(149.3, 278.667) + points.upperTeeth01cp1 = new Point(197.492, 209.499) + points.upperTeeth02cp2 = new Point(239.637, 204.963) + points.upperTeeth02 = new Point(257.968, 204.963) + points.upperTeeth02cp1 = new Point(275.166, 204.773) + points.upperTeeth03cp2 = new Point(323.357, 210.254) + points.upperTeeth03 = new Point(366.26, 279.236) + + console.log({ upperTeeth01_02d: points.upperTeeth01.dist(points.upperTeeth02) }) + console.log({ upperTeeth01_02a: points.upperTeeth01.angle(points.upperTeeth02) }) + + console.log({ upperTeeth01cp1d: points.upperTeeth01.dist(points.upperTeeth01cp1) }) + console.log({ upperTeeth01cp1a: points.upperTeeth01.angle(points.upperTeeth01cp1) }) + console.log({ upperTeeth02cp2d: points.upperTeeth02.dist(points.upperTeeth02cp2) }) + console.log({ upperTeeth02cp2a: points.upperTeeth02.angle(points.upperTeeth02cp2) }) + + let upperTeeth01_02d = 131.305041182736 * options.size + let upperTeeth01_02a = 34.147056946748805 + 180 + let upperTeeth02cp1d = 84.30113337316406 * options.size + let upperTeeth02cp1a = 55.1335930733262 + let upperTeeth01cp2d = 18.331000000000017 * options.size + let upperTeeth01cp2a = 180 + + points.upperTeeth01 = new Point(0, 0) + points.upperTeeth02 = points.upperTeeth01.shift(upperTeeth01_02a, upperTeeth01_02d) + points.upperTeeth01cp2 = points.upperTeeth01.shift(upperTeeth01cp2a, upperTeeth01cp2d) + points.upperTeeth02cp1 = points.upperTeeth02.shift(upperTeeth02cp1a, upperTeeth02cp1d) + points.upperTeeth03 = points.upperTeeth02.flipX() + points.upperTeeth01cp1 = points.upperTeeth01cp2.flipX() + points.upperTeeth03cp2 = points.upperTeeth02cp1.flipX() + + paths.seam = new Path() + .move(points.upperTeeth02) + .curve(points.upperTeeth02cp1, points.upperTeeth01cp2, points.upperTeeth01) + .curve(points.upperTeeth01cp1, points.upperTeeth03cp2, points.upperTeeth03) + + store.set('upperTeethLength', paths.seam.length()) + + paths.teeth = new Path().move(paths.seam.start()) + + createTeeth(paths.seam, 18 * options.size, 9 * options.size, 15, options.aggressive, paths.teeth) + + // Complete? + if (complete) { + snippets.upperTeeth = new Snippet('bnotch', points.upperTeeth01) + if (sa) { + let pSA = paths.seam.offset(sa) + paths.sa = new Path() + .move(paths.seam.start()) + .line(pSA.start()) + .join(pSA) + .line(paths.seam.end()) + .attr('class', 'fabric sa') + } + } + + return part +} From 2442c61ae4e376d9af11b1cbf7e45adc30ba49cf Mon Sep 17 00:00:00 2001 From: woutervdub Date: Wed, 8 Jun 2022 13:36:23 -0700 Subject: [PATCH 012/158] added hungry option --- packages/hi/config/index.js | 5 +- packages/hi/src/aboveMouth.js | 32 +-- packages/hi/src/belly.js | 53 ++--- packages/hi/src/body.js | 433 +++++++++++++++++++++------------- packages/hi/src/bottomFin.js | 36 +-- packages/hi/src/mouth.js | 16 +- packages/hi/src/topFin.js | 22 +- packages/hi/src/upperTeeth.js | 16 -- 8 files changed, 314 insertions(+), 299 deletions(-) diff --git a/packages/hi/config/index.js b/packages/hi/config/index.js index 54805c9a07a..f5efc7af7e7 100644 --- a/packages/hi/config/index.js +++ b/packages/hi/config/index.js @@ -9,7 +9,7 @@ export default { type: 'pattern', difficulty: 4, optionGroups: { - style: ['size','nosePointiness','aggressive'], + style: ['size','hungry','nosePointiness','aggressive'], }, measurements: ['neck'], parts: ['body','tail','aboveMouth','belly','topFin','bottomFin','mouth','lowerTeeth','upperTeeth'], @@ -24,8 +24,9 @@ export default { inject: {}, hide: [], options: { + size: {pct: 100, min: 5, max: 500 }, + hungry: {pct: 50, min: 0, max: 100 }, nosePointiness: {pct: 0, min: -5,max: +10}, aggressive: {bool: false}, - size: {pct: 33, min: 5, max: 500 }, }, } diff --git a/packages/hi/src/aboveMouth.js b/packages/hi/src/aboveMouth.js index 43dbd3ec183..f078c7b20da 100644 --- a/packages/hi/src/aboveMouth.js +++ b/packages/hi/src/aboveMouth.js @@ -15,7 +15,6 @@ export default function (part) { macro, } = part.shorthand() - let aboveMouth01_02d = 266.7238454769277 * options.size let aboveMouth01_02a = 353.4089695458119 let aboveMouth02_03d = 28.348200101593726 * options.size @@ -30,7 +29,6 @@ export default function (part) { let aboveMouth03cp1a = 197.87876803095696 let aboveMouth04cp2d = 66.94005927693816 * options.size let aboveMouth04cp2a = 308.8121959753343 - let faceTopLength = store.get('faceTopLength') @@ -46,6 +44,7 @@ export default function (part) { points.aboveMouth02cp2 = points.aboveMouth02.shift(aboveMouth02cp2a, aboveMouth02cp2d) points.aboveMouth03cp1 = points.aboveMouth03.shift(aboveMouth03cp1a, aboveMouth03cp1d) points.aboveMouth04cp2 = points.aboveMouth04.shift(aboveMouth04cp2a, aboveMouth04cp2d) + diff = faceTopLength - new Path() @@ -58,8 +57,6 @@ export default function (part) { iteration++ } while ((diff < -1 || diff > 1) && iteration < 100) - console.log({ iteration: iteration }) - paths.seam = new Path() .move(points.aboveMouth01) .line(points.aboveMouth04) @@ -68,14 +65,6 @@ export default function (part) { .curve(points.aboveMouth02cp2, points.aboveMouth01cp1, points.aboveMouth01) .close() - console.log({ faceTopLength1: store.get('faceTopLength') }) - console.log({ - faceTopLength2: new Path() - .move(points.aboveMouth03) - .curve(points.aboveMouth03cp1, points.aboveMouth04cp2, points.aboveMouth04) - .length(), - }) - store.set( 'aboveMouthTopLength', new Path() @@ -91,20 +80,15 @@ export default function (part) { .length() ) store.set('aboveMouthFinLength', points.aboveMouth02.dist(points.aboveMouth03)) - console.log({ aboveMouthFinLength: store.get('aboveMouthFinLength') }) - - console.log({ mouthTopLength: store.get('mouthTopLength') }) - - points.aboveMouthSnippet = new Path() - .move(points.aboveMouth01) - .curve(points.aboveMouth01cp1, points.aboveMouth02cp2, points.aboveMouth02) - .shiftAlong(store.get('mouthTopLength')) - console.log({ aboveMouthSnippet: points.aboveMouthSnippet }) - - snippets.mouth = new Snippet('bnotch', points.aboveMouthSnippet) - + // Complete? if (complete) { + points.aboveMouthSnippet = new Path() + .move(points.aboveMouth01) + .curve(points.aboveMouth01cp1, points.aboveMouth02cp2, points.aboveMouth02) + .shiftAlong(store.get('mouthTopLength')) + snippets.mouth = new Snippet('bnotch', points.aboveMouthSnippet) + if (sa) { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } diff --git a/packages/hi/src/belly.js b/packages/hi/src/belly.js index bd06f5ca257..69026aa003f 100644 --- a/packages/hi/src/belly.js +++ b/packages/hi/src/belly.js @@ -65,6 +65,12 @@ export default function (part) { points.belly03 = points.belly02.shift(belly02_03a, belly02_03d) points.belly04 = points.belly03.shift(belly03_04a, belly03_04d) points.belly05 = points.belly10.shift(belly10_05a, belly10_05d) + + points.belly01.y = points.belly01.y *(1.1 -(options.hungry /5)) + points.belly02.y = points.belly02.y *(1.1 -(options.hungry /5)) + points.belly03.y = points.belly03.y *(1.1 -(options.hungry /5)) + points.belly04.y = points.belly04.y *(1.1 -(options.hungry /5)) + points.belly01cp1 = points.belly01.shift(belly01cp1a, belly01cp1d) points.belly02cp1 = points.belly02.shift(belly02cp1a, belly02cp1d) points.belly03cp1 = points.belly03.shift(belly03cp1a, belly03cp1d) @@ -77,21 +83,11 @@ export default function (part) { points.belly05cp2 = points.belly05.shift(belly05cp2a, belly05cp2d) points.belly10cp1 = points.belly10.shift(belly10cp2a, belly10cp2d) - console.log({ belly10_05d: points.belly10.dist(points.belly05) }) - let mouthPartLength = store.get('aboveMouthBottomLength') - store.get('mouthTopLength') + store.get('mouthBottomLength') - console.log({ calc: mouthPartLength }) - console.log({ - actual: new Path() - .move(points.belly01) - .curve(points.belly01cp1, points.belly02cp2, points.belly02) - .length(), - }) - let diff = 0 let iteration = 0 do { @@ -109,13 +105,6 @@ export default function (part) { } while ((diff < -1 || diff > 1) && iteration < 100) let bellyTailLength = store.get('bellyTailLength') - console.log({ bellyTailLength: store.get('bellyTailLength') }) - console.log({ - first: new Path() - .move(points.belly03) - .curve(points.belly03cp1, points.belly04cp2, points.belly04) - .length(), - }) diff = 0 iteration = 0 @@ -134,15 +123,8 @@ export default function (part) { .curve(points.belly03cp1, points.belly04cp2, points.belly04) .length() - console.log({ - actual: new Path() - .move(points.belly03) - .curve(points.belly03cp1, points.belly04cp2, points.belly04) - .length(), - }) } while ((diff < -1 || diff > 1) && iteration < 100) - points.belly05cp1 = points.belly05cp2.flipY() points.belly06 = points.belly04.flipY() points.belly06cp1 = points.belly04cp2.flipY() @@ -179,23 +161,20 @@ export default function (part) { .curve(points.belly02cp1, points.belly03cp2, points.belly03) .length() ) - console.log({ bellyFinLength: store.get('bellyFinLength') }) - - points.bellyMouthSnippet1 = new Path() - .move(points.belly01) - .curve(points.belly01cp1, points.belly02cp2, points.belly02) - .shiftAlong(store.get('mouthBottomLength')) - points.bellyMouthSnippet2 = points.bellyMouthSnippet1.flipY() - - console.log({ aboveMouthSnippet: points.aboveMouthSnippet }) - - snippets.mouth1 = new Snippet('bnotch', points.bellyMouthSnippet1) - snippets.mouth2 = new Snippet('bnotch', points.bellyMouthSnippet2) // Complete? if (complete) { + points.bellyMouthSnippet1 = new Path() + .move(points.belly01) + .curve(points.belly01cp1, points.belly02cp2, points.belly02) + .shiftAlong(store.get('mouthBottomLength')) + points.bellyMouthSnippet2 = points.bellyMouthSnippet1.flipY() + + snippets.mouth1 = new Snippet('bnotch', points.bellyMouthSnippet1) + snippets.mouth2 = new Snippet('bnotch', points.bellyMouthSnippet2) + if (sa) { - paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + paths.sa = paths.seam.offset(sa).trim().attr('class', 'fabric sa') } } diff --git a/packages/hi/src/body.js b/packages/hi/src/body.js index 113a5dd9e04..3de4dd5c93a 100644 --- a/packages/hi/src/body.js +++ b/packages/hi/src/body.js @@ -13,76 +13,76 @@ export default function (part) { complete, paperless, macro, + utils, } = part.shorthand() - let body01_02d = 117.67274991262845 * options.size let body02_03d = 124.91298035032229 * options.size // let body02_03d = body01_02d let body03_04d = 255.92397474640785 * options.size let body04_05d = 201.01260719168837 * options.size let body05_06d = 134.89080971660005 * options.size - let body06_07d = 49.03860703568160 * options.size + let body06_07d = 49.0386070356816 * options.size let body07_08d = 225.86340480918992 * options.size - let body08_09d = 66.84760000179512 * options.size - let body09_10d = 40.72782003741420 * options.size - let body10_11d = 23.78799421977402 * options.size - let body11_12d = 57.68530918700182 * options.size - let body12_13d = 98.06623978209830 * options.size - let body13_14d = 91.32736600274856 * options.size - let body14_15d = 295.10977066828880 * options.size - let body15_16d = 209.42633350581770 * options.size + let body08_09d = 66.84760000179512 * options.size + let body09_10d = 40.7278200374142 * options.size + let body10_11d = 23.78799421977402 * options.size + let body11_12d = 57.68530918700182 * options.size + let body12_13d = 98.0662397820983 * options.size + let body13_14d = 91.32736600274856 * options.size + let body14_15d = 295.1097706682888 * options.size + let body15_16d = 209.4263335058177 * options.size let body16_17d = 152.51537318250902 * options.size let body17_18d = 255.15294373571314 * options.size - let body18_19d = 71.90453921693678 * options.size - let body19_01d = 61.33021195137026 * options.size + let body18_19d = 71.90453921693678 * options.size + let body19_01d = 61.33021195137026 * options.size - let body01cp1d = 42.13103487929059 * options.size - body01cp1d = 32.13103487929059 * options.size - let body01cp2d = 23.72518967258217 * options.size - let body02cp1d = 44.99353642469105 * options.size - let body02cp2d = 42.33568754608812 * options.size - let body03cp1d = 62.59332758369697 * options.size - let body03cp2d = 40.89285869195256 * options.size + let body01cp1d = 42.13103487929059 * options.size + body01cp1d = 32.13103487929059 * options.size + let body01cp2d = 23.72518967258217 * options.size + let body02cp1d = 44.99353642469105 * options.size + let body02cp2d = 42.33568754608812 * options.size + let body03cp1d = 62.59332758369697 * options.size + let body03cp2d = 40.89285869195256 * options.size let body04cp1d = 176.21501525125487 * options.size let body04cp2d = 130.11389715553065 * options.size - let body05cp1d = 29.56689479806765 * options.size + let body05cp1d = 29.56689479806765 * options.size let body05cp2d = 104.66860665930352 * options.size - let body06cp1d = 8.03497915367552 * options.size - let body06cp2d = 34.57808908832297 * options.size - let body07cp1d = 89.11908088619404 * options.size - let body07cp2d = 25.54827831772624 * options.size - let body08cp1d = 41.24120086757895 * options.size + let body06cp1d = 8.03497915367552 * options.size + let body06cp2d = 34.57808908832297 * options.size + let body07cp1d = 89.11908088619404 * options.size + let body07cp2d = 25.54827831772624 * options.size + let body08cp1d = 41.24120086757895 * options.size let body08cp2d = 158.23693200387828 * options.size - let body09cp1d = 4.87663090668135 * options.size - let body09cp2d = 25.76988630165065 * options.size - let body10cp1d = 4.13950105689086 * options.size - let body10cp2d = 13.27508493381490 * options.size - let body11cp1d = 17.66659910678904 * options.size - let body11cp2d = 17.66533107530116 * options.size - let body12cp1d = 14.46914569005365 * options.size - let body12cp2d = 39.51915145850176 * options.size - let body13cp1d = 35.66832366400192 * options.size - let body13cp2d = 48.53828530139895 * options.size - let body14cp1d = 77.26036056089820 * options.size - let body14cp2d = 37.42741381661305 * options.size - let body15cp1d = 74.89746640634775 * options.size + let body09cp1d = 4.87663090668135 * options.size + let body09cp2d = 25.76988630165065 * options.size + let body10cp1d = 4.13950105689086 * options.size + let body10cp2d = 13.2750849338149 * options.size + let body11cp1d = 17.66659910678904 * options.size + let body11cp2d = 17.66533107530116 * options.size + let body12cp1d = 14.46914569005365 * options.size + let body12cp2d = 39.51915145850176 * options.size + let body13cp1d = 35.66832366400192 * options.size + let body13cp2d = 48.53828530139895 * options.size + let body14cp1d = 77.2603605608982 * options.size + let body14cp2d = 37.42741381661305 * options.size + let body15cp1d = 74.89746640634775 * options.size let body15cp2d = 101.16048880857042 * options.size - let body16cp1d = 36.21092864039804 * options.size - let body16cp2d = 63.69410844026312 * options.size - let body17cp1d = 97.90988675818191 * options.size - let body17cp2d = 62.08991689477443 * options.size - let body18cp1d = 22.74982929606286 * options.size - let body18cp2d = 16.57960183478481 * options.size - let body19cp1d = 23.95674278778315 * options.size - let body19cp2d = 24.49741270011998 * options.size + let body16cp1d = 36.21092864039804 * options.size + let body16cp2d = 63.69410844026312 * options.size + let body17cp1d = 97.90988675818191 * options.size + let body17cp2d = 62.08991689477443 * options.size + let body18cp1d = 22.74982929606286 * options.size + let body18cp2d = 16.57960183478481 * options.size + let body19cp1d = 23.95674278778315 * options.size + let body19cp2d = 24.49741270011998 * options.size - let eyeBigDist = 180.18315182058507 *options.size - let eyeSmallDist = 2.3629811679317316 *options.size + let eyeBigDist = 180.18315182058507 * options.size + let eyeSmallDist = 2.3629811679317316 * options.size - let gillLength = 41.01907104018812 *options.size + let gillLength = 41.01907104018812 * options.size -/* + /* let body01_02a = 350.1382392835908 let body02_03a = 219.2280235992150 let body03_04a = 339.6914424367389 @@ -149,71 +149,71 @@ export default function (part) { */ let body01_02a = 170.1382393 -let body02_03a = 39.2280236 -let body03_04a = 159.6914424 -let body04_05a = 147.5949161 -let body05_06a = 128.0581973 -let body06_07a = 253.6604388 -let body07_08a = 225.7462208 -let body08_09a = 157.5894683 -let body09_10a = 125.1280145 -let body10_11a = 242.0485099 -let body11_12a = 211.5926663 -let body12_13a = 171.354716 -let body13_14a = 245.2915054 -let body14_15a = 326.7578209 -let body15_16a = 359.0692249 -let body16_17a = 353.6138832 -let body17_18a = 2.546389668 -let body18_19a = 348.3450181 -let body19_01a = 59.63482522 + let body02_03a = 39.2280236 + let body03_04a = 159.6914424 + let body04_05a = 147.5949161 + let body05_06a = 128.0581973 + let body06_07a = 253.6604388 + let body07_08a = 225.7462208 + let body08_09a = 157.5894683 + let body09_10a = 125.1280145 + let body10_11a = 242.0485099 + let body11_12a = 211.5926663 + let body12_13a = 171.354716 + let body13_14a = 245.2915054 + let body14_15a = 326.7578209 + let body15_16a = 359.0692249 + let body16_17a = 353.6138832 + let body17_18a = 2.546389668 + let body18_19a = 348.3450181 + let body19_01a = 59.63482522 -let body01cp1a = 161.5263465 -let body01cp2a = 255.6503959 -let body02cp1a = 31.95354992 -// let body02cp2a = 359.48842 -// let body02cp2a = 2.48842 -let body02cp2a = 10 + let body01cp1a = 161.5263465 + let body01cp2a = 255.6503959 + let body02cp1a = 31.95354992 + // let body02cp2a = 359.48842 + // let body02cp2a = 2.48842 + let body02cp2a = 10 -let body03cp1a = 142.8538439 -let body03cp2a = 225.3745028 -let body04cp1a = 169.1071046 -let body04cp2a = 350.7775897 -let body05cp1a = 105.1596015 -let body05cp2a = 288.5890112 -let body06cp1a = 221.1852544 -let body06cp2a = 344.141322 -let body07cp1a = 267.2041495 -let body07cp2a = 87.03164984 -let body08cp1a = 177.4386949 -let body08cp2a = 358.5040423 -let body09cp1a = 119.4140746 -let body09cp2a = 299.4139506 -let body10cp1a = 219.0878163 -let body10cp2a = 311.9955535 -let body11cp1a = 251.2799387 -let body11cp2a = 71.28196954 -let body12cp1a = 175.0877187 -let body12cp2a = 355.087783 -let body13cp1a = 260.2392636 -let body13cp2a = 351.4909474 -let body14cp1a = 320.929847 -let body14cp2a = 56.95148863 -let body15cp1a = 22.55298719 -let body15cp2a = 153.1212844 -let body16cp1a = 13.89041491 -let body16cp2a = 141.0219905 -let body17cp1a = 11.04287338 -let body17cp2a = 138.4852424 -let body18cp1a = 356.968813 -let body18cp2a = 178.1542839 -let body19cp1a = 51.33608313 -let body19cp2a = 158.5586388 + let body03cp1a = 142.8538439 + let body03cp2a = 225.3745028 + let body04cp1a = 169.1071046 + let body04cp2a = 350.7775897 + let body05cp1a = 105.1596015 + let body05cp2a = 288.5890112 + let body06cp1a = 221.1852544 + let body06cp2a = 344.141322 + let body07cp1a = 267.2041495 + let body07cp2a = 87.03164984 + let body08cp1a = 177.4386949 + let body08cp2a = 358.5040423 + let body09cp1a = 119.4140746 + let body09cp2a = 299.4139506 + let body10cp1a = 219.0878163 + let body10cp2a = 311.9955535 + let body11cp1a = 251.2799387 + let body11cp2a = 71.28196954 + let body12cp1a = 175.0877187 + let body12cp2a = 355.087783 + let body13cp1a = 260.2392636 + let body13cp2a = 351.4909474 + let body14cp1a = 320.929847 + let body14cp2a = 56.95148863 + let body15cp1a = 22.55298719 + let body15cp2a = 153.1212844 + let body16cp1a = 13.89041491 + let body16cp2a = 141.0219905 + let body17cp1a = 11.04287338 + let body17cp2a = 138.4852424 + let body18cp1a = 356.968813 + let body18cp2a = 178.1542839 + let body19cp1a = 51.33608313 + let body19cp2a = 158.5586388 -let eyeBigAngle = 184.8499937 -let eyeSmallAngle = 151.2656912 + let eyeBigAngle = 184.8499937 + let eyeSmallAngle = 151.2656912 -let gillAngle = 103.9416747 + let gillAngle = 103.9416747 points.body01 = new Point(0, 0) points.body02 = points.body01.shift(body01_02a, body01_02d) @@ -288,10 +288,6 @@ let gillAngle = 103.9416747 points.body01.angle(points.body01cp2) + 90 * (-1 + options.nosePointiness), points.body01.angle(points.body02) - 5 ) - console.log({pointiness: options.nosePointiness}) - console.log({pointiness_a: points.body01.angle(points.body01cp2)}) - console.log({pointiness_a: points.body01.angle(points.body01cp2) +90 * (-1 + options.nosePointiness)}) - console.log({pointiness_m: points.body01.angle(points.body02) - 5}) points.body01cp1 = points.body01.shift(body01cp1a, body01cp1d) @@ -316,9 +312,6 @@ let gillAngle = 103.9416747 ) // Tail adjustment: - console.log(points.body13.angle(points.body13cp1) - points.body13.angle(points.body14)) - console.log(points.body14.angle(points.body13) - points.body14.angle(points.body14cp2)) - let tailCpAngle = (points.body13.angle(points.body13cp1) - points.body13.angle(points.body14) + @@ -333,21 +326,25 @@ let gillAngle = 103.9416747 body13cp1d ) - points.eyeBig = points.body01.shift( eyeBigAngle, eyeBigDist ) - points.eyeSmall = points.eyeBig.shift( eyeSmallAngle, eyeSmallDist *(-2+(options.aggressive ? 0 : 1))) + points.eyeBig = points.body01.shift(eyeBigAngle, eyeBigDist) + points.eyeSmall = points.eyeBig.shift( + eyeSmallAngle, + eyeSmallDist * (-2 + (options.aggressive ? 0 : 1)) + ) + + // Feeding: + let c = 0.55191502449351 let eyeBigX = 18.7757 * options.size let eyeBigY = 11.6262 * options.size points.eyeBigT = points.eyeBig.shift(90, eyeBigY / 2) - points.eyeBigB = points.eyeBig.shift(270, eyeBigY / 2).shift( - 0, - options.aggressive ? eyeBigX / 3 : 0 - ) - points.eyeBigR = points.eyeBig.shift(0, eyeBigX / 2).shift( - 270, - options.aggressive ? eyeBigY / 3 : 0 - ) + points.eyeBigB = points.eyeBig + .shift(270, eyeBigY / 2) + .shift(0, options.aggressive ? eyeBigX / 3 : 0) + points.eyeBigR = points.eyeBig + .shift(0, eyeBigX / 2) + .shift(270, options.aggressive ? eyeBigY / 3 : 0) points.eyeBigL = points.eyeBig.shift(180, eyeBigX / 2) points.eyeBigTcp1 = points.eyeBigT.shift(0, (eyeBigY / 2) * c) points.eyeBigTcp2 = points.eyeBigT.shift(180, (eyeBigY / 2) * c) @@ -365,8 +362,8 @@ let gillAngle = 103.9416747 .curve(points.eyeBigBcp2, points.eyeBigRcp1, points.eyeBigR) .curve(points.eyeBigRcp2, points.eyeBigTcp1, points.eyeBigT) - let eyeSmallX = 1.87089 * options.size *((options.aggressive ? 1.5 : 1)) - let eyeSmallY = 1.5368 * options.size *((options.aggressive ? 1.5 : 1)) + let eyeSmallX = 1.87089 * options.size * (options.aggressive ? 1.5 : 1) + let eyeSmallY = 1.5368 * options.size * (options.aggressive ? 1.5 : 1) points.eyeSmallT = points.eyeSmall.shift(270, eyeSmallY / 2) points.eyeSmallB = points.eyeSmall.shift(90, eyeSmallY / 2) points.eyeSmallR = points.eyeSmall.shift(0, eyeSmallX / 2) @@ -408,48 +405,72 @@ let gillAngle = 103.9416747 .curve(points.body17cp1, points.body18cp2, points.body18) .curve(points.body18cp1, points.body19cp2, points.body19) .curve(points.body19cp1, points.body01cp2, points.body01) + .close() - let gillPath = new Path() .move(points.body17) .curve(points.body17cp1, points.body18cp2, points.body18) - points.gill1s = gillPath.shiftFractionAlong(0.018) - points.gill2s = gillPath.shiftFractionAlong(0.08 * 1 + 0.018) - points.gill3s = gillPath.shiftFractionAlong(0.08 * 2 + 0.018) - points.gill4s = gillPath.shiftFractionAlong(0.08 * 3 + 0.018) - points.gill5s = gillPath.shiftFractionAlong(0.08 * 4 + 0.018) - points.gill1e = points.gill1s.shift(gillAngle, gillLength *(1 +(0 * 0.08))) - points.gill2e = points.gill2s.shift(gillAngle, gillLength *(1 +(1 * 0.08))) - points.gill3e = points.gill3s.shift(gillAngle, gillLength *(1 +(2 * 0.08))) - points.gill4e = points.gill4s.shift(gillAngle, gillLength *(1 +(3 * 0.08))) - points.gill5e = points.gill5s.shift(gillAngle, gillLength *(1 +(4 * 0.08))) + points.gill1start = gillPath.shiftFractionAlong(0.018) + points.gill2start = gillPath.shiftFractionAlong(0.08 * 1 + 0.018) + points.gill3start = gillPath.shiftFractionAlong(0.08 * 2 + 0.018) + points.gill4start = gillPath.shiftFractionAlong(0.08 * 3 + 0.018) + points.gill5start = gillPath.shiftFractionAlong(0.08 * 4 + 0.018) + points.gill1end = points.gill1start.shift(gillAngle, gillLength * (1 + 0 * 0.08)) + points.gill2end = points.gill2start.shift(gillAngle, gillLength * (1 + 1 * 0.08)) + points.gill3end = points.gill3start.shift(gillAngle, gillLength * (1 + 2 * 0.08)) + points.gill4end = points.gill4start.shift(gillAngle, gillLength * (1 + 3 * 0.08)) + points.gill5end = points.gill5start.shift(gillAngle, gillLength * (1 + 4 * 0.08)) - paths.gill1 = new Path().move(points.gill1s).line(points.gill1e) - paths.gill2 = new Path().move(points.gill2s).line(points.gill2e) - paths.gill3 = new Path().move(points.gill3s).line(points.gill3e) - paths.gill4 = new Path().move(points.gill4s).line(points.gill4e) - paths.gill5 = new Path().move(points.gill5s).line(points.gill5e) + paths.gill1 = new Path().move(points.gill1start).line(points.gill1end) + paths.gill2 = new Path().move(points.gill2start).line(points.gill2end) + paths.gill3 = new Path().move(points.gill3start).line(points.gill3end) + paths.gill4 = new Path().move(points.gill4start).line(points.gill4end) + paths.gill5 = new Path().move(points.gill5start).line(points.gill5end) - store.set( 'tailWidth', points.body13.dist( points.body14 ) ) - store.set( 'tailCpAngle', points.body13.angle(points.body13cp1) - points.body13.angle(points.body14) ) - store.set( 'tailCpDist', body13cp1d ) + store.set('tailWidth', points.body13.dist(points.body14)) + store.set( + 'tailCpAngle', + points.body13.angle(points.body13cp1) - points.body13.angle(points.body14) + ) + store.set('tailCpDist', body13cp1d) - store.set( 'topFinOpening', points.body16.dist( points.body17 )) - store.set( 'topFinOpeningLength', (new Path().move(points.body16).curve(points.body16cp1, points.body17cp2, points.body17)).length()) + store.set('topFinOpening', points.body16.dist(points.body17)) + store.set( + 'topFinOpeningLength', + new Path().move(points.body16).curve(points.body16cp1, points.body17cp2, points.body17).length() + ) - store.set( 'faceTopLength', (new Path().move(points.body17).curve(points.body17cp1, points.body18cp2, points.body18).curve(points.body18cp1, points.body19cp2, points.body19)).length()) + store.set( + 'faceTopLength', + new Path() + .move(points.body17) + .curve(points.body17cp1, points.body18cp2, points.body18) + .curve(points.body18cp1, points.body19cp2, points.body19) + .length() + ) - store.set( 'bellyLength', (new Path().move(points.body17).curve(points.body17cp1, points.body18cp2, points.body18).curve(points.body18cp1, points.body19cp2, points.body19)).length()) - store.set( 'bellyTailLength', (new Path().move(points.body15).curve(points.body15cp1, points.body16cp2, points.body16)).length()) + store.set( + 'bellyLength', + new Path() + .move(points.body17) + .curve(points.body17cp1, points.body18cp2, points.body18) + .curve(points.body18cp1, points.body19cp2, points.body19) + .length() + ) + store.set( + 'bellyTailLength', + new Path().move(points.body15).curve(points.body15cp1, points.body16cp2, points.body16).length() + ) // Complete? if (complete) { points.bodyTailSnippet = new Path() - .move(points.body13) - .curve(points.body13cp1, points.body14cp2, points.body14) - .shiftFractionAlong(0.25) + .move(points.body13) + .curve(points.body13cp1, points.body14cp2, points.body14) + .shiftFractionAlong(0.25) snippets.bodyTail = new Snippet('bnotch', points.bodyTailSnippet) - if( sa ) { + if (sa) { + // paths.sa = paths.seam.offset(sa).trim().attr('class', 'fabric sa') paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } @@ -458,6 +479,102 @@ let gillAngle = 103.9416747 to: points.body01, d: -5, }) + + points.titleAnchor = points.body04.shiftFractionTowards( points.body17, 0.4 ) + points.logoAnchor = points.body06.shiftFractionTowards( points.body16, 0.6 ) + + if( options.size < 0.35 ) { + points.scaleboxAnchor = new Point( points.body06.x -60 -sa, points.body11.y -35 -sa ) + } else { + points.scaleboxAnchor = points.titleAnchor.shiftFractionTowards( points.body14, 0.5 ) + } + snippets.logo = new Snippet('logo', points.logoAnchor).attr( 'data-scale', options.size > 1 ? 1 : options.size ) + + macro('title', { + at: points.titleAnchor, + nr: 1, + title: 'body', + scale: options.size, + }) + + if (paperless) { + macro('hd', { + from: points.body14, + to: points.body15, + y: points.body19.y +sa +10, + }) + macro('hd', { + from: points.body15, + to: points.body16, + y: points.body19.y +sa +10, + }) + macro('hd', { + from: points.body16, + to: points.body17, + y: points.body19.y +sa +10, + }) + macro('hd', { + from: points.body17, + to: points.body19, + y: points.body19.y +sa +10, + }) + macro('hd', { + from: points.body19, + to: points.body01, + y: points.body19.y +sa +10, + }) + macro('hd', { + from: points.gill1start, + to: points.gill5start, + y: points.body19.y +sa +20, + }) + + macro('hd', { + from: points.body14, + to: points.body13, + y: points.body06.y -sa -5, + }) + macro('hd', { + from: points.body13, + to: points.body10, + y: points.body06.y -sa -5, + }) + macro('hd', { + from: points.body10, + to: points.body06, + y: points.body06.y -sa -5, + }) + points.finCurve = utils.beamsIntersect( points.body05, points.body05cp2, points.body04, points.body04cp1 ) + macro('hd', { + from: points.body06, + to: points.finCurve, + y: points.body06.y -sa -5, + }) + macro('hd', { + from: points.finCurve, + to: points.body03, + y: points.body06.y -sa -5, + }) + macro('hd', { + from: points.body03, + to: points.body01, + y: points.body06.y -sa -5, + }) + macro('hd', { + from: points.body02, + to: points.body03, + y: points.body06.y -sa +10, + }) + macro('hd', { + from: points.body02, + to: points.body01, + y: points.body06.y -sa +20, + }) + + + } else { + macro('scalebox', { at: points.scaleboxAnchor }) + } } return part diff --git a/packages/hi/src/bottomFin.js b/packages/hi/src/bottomFin.js index 4e6562b7e0b..b1e5e504278 100644 --- a/packages/hi/src/bottomFin.js +++ b/packages/hi/src/bottomFin.js @@ -15,7 +15,6 @@ export default function (part) { macro, } = part.shorthand() - let bottomFin01_02d = 250.63638754690027 * options.size let bottomFin01_02a = 119.34849371430543 let bottomFin01_03d = 137.70322741678933 * options.size @@ -36,9 +35,6 @@ export default function (part) { let finLength = store.get('aboveMouthFinLength') + store.get('bellyFinLength') let finCircumference = store.get('topFinCircumference') - console.log({ bellyFinLength: store.get('bellyFinLength') }) - console.log({ finCircumference: store.get('topFinCircumference') }) - let diff = 0 let iteration = 0 do { @@ -52,6 +48,7 @@ export default function (part) { points.bottomFin02cp2 = points.bottomFin02.shift(bottomFin02cp2a, bottomFin02cp2d) points.bottomFin03cp1 = points.bottomFin03.shift(bottomFin03cp1a, bottomFin03cp1d) points.bottomFin03cp2 = points.bottomFin03.shift(bottomFin03cp2a, bottomFin03cp2d) + diff = finLength - new Path() @@ -77,6 +74,7 @@ export default function (part) { points.bottomFin02cp2 = points.bottomFin02.shift(bottomFin02cp2a, bottomFin02cp2d) points.bottomFin03cp1 = points.bottomFin03.shift(bottomFin03cp1a, bottomFin03cp1d) points.bottomFin03cp2 = points.bottomFin03.shift(bottomFin03cp2a, bottomFin03cp2d) + diff = finCircumference - new Path() @@ -89,16 +87,6 @@ export default function (part) { iteration++ } while ((diff < -1 || diff > 1) && iteration < 100) - console.log({ iteration2: iteration }) - - console.log({ finLength: finLength }) - console.log({ - actual: new Path() - .move(points.bottomFin03) - .curve(points.bottomFin03cp1, points.bottomFin01cp2, points.bottomFin01) - .length(), - }) - paths.seam = new Path() .move(points.bottomFin01) .curve(points.bottomFin01cp1, points.bottomFin02cp2, points.bottomFin02) @@ -106,22 +94,14 @@ export default function (part) { .curve(points.bottomFin03cp1, points.bottomFin01cp2, points.bottomFin01) .close() - console.log({ - bottomFinCirc: new Path() - .move(points.bottomFin01) - .curve(points.bottomFin01cp1, points.bottomFin02cp2, points.bottomFin02) - .curve(points.bottomFin02cp1, points.bottomFin03cp2, points.bottomFin03) - .length(), - }) - - points.bottomFinSnippet = new Path() - .move(points.bottomFin01) - .curve(points.bottomFin01cp2, points.bottomFin03cp1, points.bottomFin03) - .shiftAlong(store.get('aboveMouthFinLength')) - snippets.bottomFin = new Snippet('bnotch', points.bottomFinSnippet) - // Complete? if (complete) { + points.bottomFinSnippet = new Path() + .move(points.bottomFin01) + .curve(points.bottomFin01cp2, points.bottomFin03cp1, points.bottomFin03) + .shiftAlong(store.get('aboveMouthFinLength')) + snippets.bottomFin = new Snippet('bnotch', points.bottomFinSnippet) + if (sa) { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } diff --git a/packages/hi/src/mouth.js b/packages/hi/src/mouth.js index 66e4388bc71..ed6538b9b8a 100644 --- a/packages/hi/src/mouth.js +++ b/packages/hi/src/mouth.js @@ -44,26 +44,13 @@ export default function (part) { points.mouth04cp1 = points.mouth02cp2.flipX() points.mouth03cp1 = points.mouth03cp2.flipX() - console.log({ mouth01_02d: points.mouth01.dist(points.mouth02) }) - console.log({ mouth01_02a: points.mouth01.angle(points.mouth02) }) - console.log({ mouth01_03d: points.mouth01.dist(points.mouth03) }) - console.log({ mouth01_03a: points.mouth01.angle(points.mouth03) }) - - console.log({ mouth01cp1d: points.mouth01.dist(points.mouth01cp1) }) - console.log({ mouth01cp1a: points.mouth01.angle(points.mouth01cp1) }) - console.log({ mouth02cp1d: points.mouth02.dist(points.mouth02cp1) }) - console.log({ mouth02cp2d: points.mouth02.dist(points.mouth02cp2) }) - console.log({ mouth02cp1a: points.mouth02.angle(points.mouth02cp1) }) - console.log({ mouth02cp2a: points.mouth02.angle(points.mouth02cp2) }) - console.log({ mouth03cp2d: points.mouth03.dist(points.mouth03cp2) }) - console.log({ mouth03cp2a: points.mouth03.angle(points.mouth03cp2) }) - paths.seam = new Path() .move(points.mouth01) .curve(points.mouth01cp2, points.mouth04cp1, points.mouth04) .curve(points.mouth04cp2, points.mouth03cp1, points.mouth03) .curve(points.mouth03cp2, points.mouth02cp1, points.mouth02) .curve(points.mouth02cp2, points.mouth01cp1, points.mouth01) + .close() store.set( 'mouthTopLength', @@ -104,6 +91,7 @@ export default function (part) { snippets.mouthlowerTeeth2 = new Snippet('bnotch', points.mouthlowerTeeth2) snippets.mouthMidTop = new Snippet('bnotch', points.mouth01) snippets.mouthMidBottom = new Snippet('bnotch', points.mouth03) + if (sa) { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } diff --git a/packages/hi/src/topFin.js b/packages/hi/src/topFin.js index 6ae745d1da4..0840a661bc5 100644 --- a/packages/hi/src/topFin.js +++ b/packages/hi/src/topFin.js @@ -15,7 +15,6 @@ export default function (part) { macro, } = part.shorthand() - let topFinOpening = store.get('topFinOpening') let topFinOpeningLength = store.get('topFinOpeningLength') @@ -49,6 +48,7 @@ export default function (part) { points.topFin02cp2 = points.topFin02.shift(topFin02cp2a, topFin02cp2d) points.topFin03cp1 = points.topFin03.shift(topFin03cp1a, topFin03cp1d) points.topFin03cp2 = points.topFin03.shift(topFin03cp2a, topFin03cp2d) + diff = topFinOpeningLength - new Path() @@ -60,23 +60,13 @@ export default function (part) { iteration++ } while ((diff < -1 || diff > 1) && iteration < 100) - console.log({ iteration: iteration }) - - paths.seam = new Path() + paths.seam = new Path() .move(points.topFin01) .curve(points.topFin01cp2, points.topFin03cp1, points.topFin03) .curve(points.topFin03cp2, points.topFin02cp1, points.topFin02) .curve(points.topFin02cp2, points.topFin01cp1, points.topFin01) .close() - console.log({ topFinLength1: store.get('topFinOpeningLength') }) - console.log({ - topFinLength2: new Path() - .move(points.topFin03) - .curve(points.topFin03cp1, points.topFin01cp2, points.topFin01) - .length(), - }) - store.set( 'topFinCircumference', new Path() @@ -86,14 +76,6 @@ export default function (part) { .length() ) - console.log({ - topFinCirc: new Path() - .move(points.topFin01) - .curve(points.topFin01cp1, points.topFin02cp2, points.topFin02) - .curve(points.topFin02cp1, points.topFin03cp2, points.topFin03) - .length(), - }) - // Complete? if (complete) { if (sa) { diff --git a/packages/hi/src/upperTeeth.js b/packages/hi/src/upperTeeth.js index 6042cfd3573..623feacd6ec 100644 --- a/packages/hi/src/upperTeeth.js +++ b/packages/hi/src/upperTeeth.js @@ -17,22 +17,6 @@ export default function (part) { macro, } = part.shorthand() - points.upperTeeth01 = new Point(149.3, 278.667) - points.upperTeeth01cp1 = new Point(197.492, 209.499) - points.upperTeeth02cp2 = new Point(239.637, 204.963) - points.upperTeeth02 = new Point(257.968, 204.963) - points.upperTeeth02cp1 = new Point(275.166, 204.773) - points.upperTeeth03cp2 = new Point(323.357, 210.254) - points.upperTeeth03 = new Point(366.26, 279.236) - - console.log({ upperTeeth01_02d: points.upperTeeth01.dist(points.upperTeeth02) }) - console.log({ upperTeeth01_02a: points.upperTeeth01.angle(points.upperTeeth02) }) - - console.log({ upperTeeth01cp1d: points.upperTeeth01.dist(points.upperTeeth01cp1) }) - console.log({ upperTeeth01cp1a: points.upperTeeth01.angle(points.upperTeeth01cp1) }) - console.log({ upperTeeth02cp2d: points.upperTeeth02.dist(points.upperTeeth02cp2) }) - console.log({ upperTeeth02cp2a: points.upperTeeth02.angle(points.upperTeeth02cp2) }) - let upperTeeth01_02d = 131.305041182736 * options.size let upperTeeth01_02a = 34.147056946748805 + 180 let upperTeeth02cp1d = 84.30113337316406 * options.size From 499ee57f3192e92633b60f4a32936421a9ea7c71 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Wed, 8 Jun 2022 20:16:21 -0700 Subject: [PATCH 013/158] more paperless --- packages/hi/src/aboveMouth.js | 80 +++++++++++++- packages/hi/src/belly.js | 189 ++++++++++++++++++++++++++++------ packages/hi/src/body.js | 152 +++++++++++++++++++++------ packages/hi/src/lowerTeeth.js | 42 ++++++++ packages/hi/src/mouth.js | 37 +++++++ packages/hi/src/tail.js | 101 +++++++++++++++++- packages/hi/src/upperTeeth.js | 43 ++++++++ 7 files changed, 574 insertions(+), 70 deletions(-) diff --git a/packages/hi/src/aboveMouth.js b/packages/hi/src/aboveMouth.js index f078c7b20da..c2f5637e9c2 100644 --- a/packages/hi/src/aboveMouth.js +++ b/packages/hi/src/aboveMouth.js @@ -29,7 +29,7 @@ export default function (part) { let aboveMouth03cp1a = 197.87876803095696 let aboveMouth04cp2d = 66.94005927693816 * options.size let aboveMouth04cp2a = 308.8121959753343 - + let faceTopLength = store.get('faceTopLength') let diff = 0 @@ -44,7 +44,7 @@ export default function (part) { points.aboveMouth02cp2 = points.aboveMouth02.shift(aboveMouth02cp2a, aboveMouth02cp2d) points.aboveMouth03cp1 = points.aboveMouth03.shift(aboveMouth03cp1a, aboveMouth03cp1d) points.aboveMouth04cp2 = points.aboveMouth04.shift(aboveMouth04cp2a, aboveMouth04cp2d) - + diff = faceTopLength - new Path() @@ -80,7 +80,7 @@ export default function (part) { .length() ) store.set('aboveMouthFinLength', points.aboveMouth02.dist(points.aboveMouth03)) - + // Complete? if (complete) { points.aboveMouthSnippet = new Path() @@ -89,6 +89,80 @@ export default function (part) { .shiftAlong(store.get('mouthTopLength')) snippets.mouth = new Snippet('bnotch', points.aboveMouthSnippet) + points.titleAnchor = points.aboveMouth04.shiftFractionTowards(points.aboveMouth01cp1, 0.5) + points.logoAnchor = points.aboveMouth01cp1.shiftFractionTowards(points.aboveMouth02cp2, 0.5) + + snippets.logo = new Snippet('logo', points.logoAnchor).attr( + 'data-scale', + (options.size > 1 ? 1 : options.size) / 4 + ) + + macro('title', { + at: points.titleAnchor, + nr: 5, + title: 'aboveMouth', + scale: options.size / 2, + }) + + if (paperless) { + macro('hd', { + from: points.aboveMouth04, + to: points.aboveMouth01, + y: points.aboveMouth01.y - sa - 10, + }) + macro('hd', { + from: points.aboveMouth01, + to: points.aboveMouth02, + y: points.aboveMouth01.y - sa - 10, + }) + macro('hd', { + from: points.aboveMouthSnippet, + to: points.aboveMouth02, + y: points.aboveMouth01.y, + }) + macro('vd', { + from: points.aboveMouth04, + to: points.aboveMouth01, + x: points.aboveMouth04.x - sa - 15, + noStartMarker: true, + noEndMarker: true, + }) + points.aboveMouthBottom = paths.seam.edge('bottom') + points.aboveMouthTop = new Path() + .move(points.aboveMouth01) + .curve(points.aboveMouth01cp1, points.aboveMouth02cp2, points.aboveMouth02) + .edge('bottom') + + macro('vd', { + from: points.aboveMouthBottom, + to: points.aboveMouth04, + x: points.aboveMouth04.x - sa - 15, + noStartMarker: true, + noEndMarker: true, + }) + macro('vd', { + from: points.aboveMouthBottom, + to: points.aboveMouthTop, + x: points.aboveMouth04.x - sa, + noStartMarker: true, + noEndMarker: true, + }) + macro('vd', { + from: points.aboveMouth02, + to: points.aboveMouth03, + x: points.aboveMouth02.x + sa + 10, + noStartMarker: true, + noEndMarker: true, + }) + macro('vd', { + from: points.aboveMouth03, + to: points.aboveMouthBottom, + x: points.aboveMouth02.x + sa + 10, + noStartMarker: true, + noEndMarker: true, + }) + } + if (sa) { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } diff --git a/packages/hi/src/belly.js b/packages/hi/src/belly.js index 69026aa003f..9a146739b55 100644 --- a/packages/hi/src/belly.js +++ b/packages/hi/src/belly.js @@ -20,42 +20,42 @@ export default function (part) { let belly03_04d = 216.7485605 * options.size let belly04_05d = 164.7592153 * options.size let belly01_10d = 129.2449198 * options.size - let belly01_02a = 25.7020193 - let belly02_03a = 2.2164353 + let belly01_02a = 25.7020193 + let belly02_03a = 2.2164353 let belly03_04a = 338.0869319 let belly04_05a = 198.1877729 let belly01_10a = 163.4959859 let belly10_05d = 231.4386252 * options.size - let belly10_05a = 0 + let belly10_05a = 0 - let belly01cp1d = 65.65512143 * options.size - let belly01cp2d = 38.20949996 * options.size - let belly02cp1d = 37.73513423 * options.size - let belly02cp2d = 118.64531230 * options.size - let belly03cp1d = 54.50254779 * options.size - let belly03cp2d = 40.68278830 * options.size - let belly04cp1d = 52.08589469 * options.size - let belly04cp2d = 62.46560129 * options.size - let belly05cp1d = 48.20828587 * options.size + let belly01cp1d = 65.65512143 * options.size + let belly01cp2d = 38.20949996 * options.size + let belly02cp1d = 37.73513423 * options.size + let belly02cp2d = 118.6453123 * options.size + let belly03cp1d = 54.50254779 * options.size + let belly03cp2d = 40.6827883 * options.size + let belly04cp1d = 52.08589469 * options.size + let belly04cp2d = 62.46560129 * options.size + let belly05cp1d = 48.20828587 * options.size // let belly05cp2d = 48.20828587 * options.size - let belly05cp2d = 68 * options.size - let belly10cp1d = 45.42602302 * options.size + let belly05cp2d = 68 * options.size + let belly10cp1d = 45.42602302 * options.size // let belly10cp2d = 45.42602302 * options.size - let belly10cp2d = 65.42602302 * options.size + let belly10cp2d = 65.42602302 * options.size - let belly01cp1a = 60.1172330 + let belly01cp1a = 60.117233 let belly01cp2a = 327.4394109 let belly02cp1a = 331.7898702 let belly02cp2a = 182.9449647 - let belly03cp1a = 349.8613970 + let belly03cp1a = 349.861397 let belly03cp2a = 200.1533738 let belly04cp1a = 204.8857575 let belly04cp2a = 145.9357065 // let belly05cp1a = 8.1545383 - let belly05cp1a = 8.1545383 + let belly05cp1a = 8.1545383 // let belly05cp2a = 8.1545383 - let belly05cp2a = 5 + let belly05cp2a = 5 let belly10cp1a = 169.9644604 let belly10cp2a = 175.9644604 @@ -66,10 +66,10 @@ export default function (part) { points.belly04 = points.belly03.shift(belly03_04a, belly03_04d) points.belly05 = points.belly10.shift(belly10_05a, belly10_05d) - points.belly01.y = points.belly01.y *(1.1 -(options.hungry /5)) - points.belly02.y = points.belly02.y *(1.1 -(options.hungry /5)) - points.belly03.y = points.belly03.y *(1.1 -(options.hungry /5)) - points.belly04.y = points.belly04.y *(1.1 -(options.hungry /5)) + points.belly01.y = points.belly01.y * (1.1 - options.hungry / 5) + points.belly02.y = points.belly02.y * (1.1 - options.hungry / 5) + points.belly03.y = points.belly03.y * (1.1 - options.hungry / 5) + points.belly04.y = points.belly04.y * (1.1 - options.hungry / 5) points.belly01cp1 = points.belly01.shift(belly01cp1a, belly01cp1d) points.belly02cp1 = points.belly02.shift(belly02cp1a, belly02cp1d) @@ -122,7 +122,6 @@ export default function (part) { .move(points.belly03) .curve(points.belly03cp1, points.belly04cp2, points.belly04) .length() - } while ((diff < -1 || diff > 1) && iteration < 100) points.belly05cp1 = points.belly05cp2.flipY() @@ -140,19 +139,28 @@ export default function (part) { points.belly09cp2 = points.belly01cp1.flipY() points.belly10cp2 = points.belly10cp1.flipY() + paths.top = new Path() + .move(points.belly04) + .curve(points.belly04cp2, points.belly03cp1, points.belly03) + .curve(points.belly03cp2, points.belly02cp1, points.belly02) + .curve(points.belly02cp2, points.belly01cp1, points.belly01) + .setRender(false) + paths.bottom = new Path() + .move(points.belly09) + .curve(points.belly09cp2, points.belly08cp1, points.belly08) + .curve(points.belly08cp2, points.belly07cp1, points.belly07) + .curve(points.belly07cp2, points.belly06cp1, points.belly06) + .setRender(false) paths.seam = new Path() .move(points.belly01) .curve(points.belly01cp2, points.belly10cp1, points.belly10) .curve(points.belly10cp2, points.belly09cp1, points.belly09) - .curve(points.belly09cp2, points.belly08cp1, points.belly08) - .curve(points.belly08cp2, points.belly07cp1, points.belly07) - .curve(points.belly07cp2, points.belly06cp1, points.belly06) + .join(paths.bottom) .curve(points.belly06cp2, points.belly05cp1, points.belly05) .curve(points.belly05cp2, points.belly04cp1, points.belly04) - .curve(points.belly04cp2, points.belly03cp1, points.belly03) - .curve(points.belly03cp2, points.belly02cp1, points.belly02) - .curve(points.belly02cp2, points.belly01cp1, points.belly01) + .join(paths.top) .close() + .setRender(true) store.set( 'bellyFinLength', @@ -169,12 +177,127 @@ export default function (part) { .curve(points.belly01cp1, points.belly02cp2, points.belly02) .shiftAlong(store.get('mouthBottomLength')) points.bellyMouthSnippet2 = points.bellyMouthSnippet1.flipY() - + snippets.mouth1 = new Snippet('bnotch', points.bellyMouthSnippet1) snippets.mouth2 = new Snippet('bnotch', points.bellyMouthSnippet2) - + + if (paperless) { + macro('hd', { + from: points.belly01, + to: points.belly10, + y: points.belly01.y, + }) + macro('hd', { + from: points.belly05, + to: points.belly04, + y: points.belly04.y, + }) + macro('hd', { + from: points.belly10, + to: points.belly05, + y: (points.belly04.y + points.belly01.y) / 2, + }) + macro('hd', { + from: points.belly01, + to: points.belly02, + y: points.belly02.y - sa - 10, + }) + macro('hd', { + from: points.belly02, + to: points.belly03, + y: points.belly02.y - sa - 10, + }) + macro('hd', { + from: points.belly03, + to: points.belly04, + y: points.belly02.y - sa - 10, + }) + macro('hd', { + from: points.bellyMouthSnippet1, + to: points.belly02, + y: points.bellyMouthSnippet1.y, + }) + + macro('vd', { + from: points.belly03, + to: points.belly05, + x: points.belly03.x, + }) + macro('vd', { + from: points.belly05, + to: points.belly07, + x: points.belly03.x, + }) + macro('vd', { + from: points.belly10, + to: points.belly02, + x: points.belly02.x, + }) + macro('vd', { + from: points.belly08, + to: points.belly10, + x: points.belly02.x, + }) + macro('vd', { + from: points.belly10, + to: points.belly01, + x: points.belly01.x - sa - 10, + }) + macro('vd', { + from: points.belly09, + to: points.belly10, + x: points.belly01.x - sa - 10, + }) + macro('vd', { + from: points.belly09, + to: points.belly08, + x: points.belly01.x - sa - 10, + }) + macro('vd', { + from: points.belly02, + to: points.belly01, + x: points.belly01.x - sa - 10, + }) + macro('vd', { + from: points.belly05, + to: points.belly06, + x: points.belly04.x + sa + 10, + }) + macro('vd', { + from: points.belly04, + to: points.belly05, + x: points.belly04.x + sa + 10, + }) + macro('vd', { + from: points.belly06, + to: points.belly07, + x: points.belly04.x + sa + 10, + }) + macro('vd', { + from: points.belly03, + to: points.belly04, + x: points.belly04.x + sa + 10, + }) + + points.titleAnchor = points.belly02.shiftFractionTowards(points.belly07, 0.5) + } else { + points.titleAnchor = points.belly03.shiftFractionTowards(points.belly07, 0.5) + points.logoAnchor = points.belly02.shiftFractionTowards(points.belly08, 0.5) + + snippets.logo = new Snippet('logo', points.logoAnchor).attr( + 'data-scale', + options.size > 1 ? 1 : options.size + ) + } + macro('title', { + at: points.titleAnchor, + nr: 2, + title: 'belly', + scale: options.size, + }) + if (sa) { - paths.sa = paths.seam.offset(sa).trim().attr('class', 'fabric sa') + paths.sa = paths.bottom.join(paths.top).close().offset(sa).attr('class', 'fabric sa') } } diff --git a/packages/hi/src/body.js b/packages/hi/src/body.js index 3de4dd5c93a..a7a6c8e733c 100644 --- a/packages/hi/src/body.js +++ b/packages/hi/src/body.js @@ -329,12 +329,11 @@ export default function (part) { points.eyeBig = points.body01.shift(eyeBigAngle, eyeBigDist) points.eyeSmall = points.eyeBig.shift( eyeSmallAngle, - eyeSmallDist * (-2 + (options.aggressive ? 0 : 1)) + eyeSmallDist * (-0.5 + (options.aggressive ? 0 : 1)) ) // Feeding: - let c = 0.55191502449351 let eyeBigX = 18.7757 * options.size let eyeBigY = 11.6262 * options.size @@ -384,10 +383,8 @@ export default function (part) { .curve(points.eyeSmallBcp2, points.eyeSmallRcp1, points.eyeSmallR) .curve(points.eyeSmallRcp2, points.eyeSmallTcp1, points.eyeSmallT) - paths.seam = new Path() - .move(points.body01) - .curve(points.body01cp1, points.body02cp2, points.body02) - .curve(points.body02cp1, points.body03cp2, points.body03) + paths.allButDart = new Path() + .move(points.body03) .curve(points.body03cp1, points.body04cp2, points.body04) .curve(points.body04cp1, points.body05cp2, points.body05) .curve(points.body05cp1, points.body06cp2, points.body06) @@ -405,7 +402,15 @@ export default function (part) { .curve(points.body17cp1, points.body18cp2, points.body18) .curve(points.body18cp1, points.body19cp2, points.body19) .curve(points.body19cp1, points.body01cp2, points.body01) + .setRender(false) + + paths.seam = new Path() + .move(points.body01) + .curve(points.body01cp1, points.body02cp2, points.body02) + .curve(points.body02cp1, points.body03cp2, points.body03) + .join(paths.allButDart) .close() + .setRender(true) let gillPath = new Path() .move(points.body17) @@ -471,7 +476,7 @@ export default function (part) { snippets.bodyTail = new Snippet('bnotch', points.bodyTailSnippet) if (sa) { // paths.sa = paths.seam.offset(sa).trim().attr('class', 'fabric sa') - paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + paths.sa = paths.allButDart.close().offset(sa).attr('class', 'fabric sa') } macro('ld', { @@ -480,15 +485,18 @@ export default function (part) { d: -5, }) - points.titleAnchor = points.body04.shiftFractionTowards( points.body17, 0.4 ) - points.logoAnchor = points.body06.shiftFractionTowards( points.body16, 0.6 ) - - if( options.size < 0.35 ) { - points.scaleboxAnchor = new Point( points.body06.x -60 -sa, points.body11.y -35 -sa ) + points.titleAnchor = points.body04.shiftFractionTowards(points.body17, 0.4) + points.logoAnchor = points.body06.shiftFractionTowards(points.body16, 0.6) + + if (options.size < 0.35) { + points.scaleboxAnchor = new Point(points.body06.x - 60 - sa, points.body11.y - 35 - sa) } else { - points.scaleboxAnchor = points.titleAnchor.shiftFractionTowards( points.body14, 0.5 ) + points.scaleboxAnchor = points.titleAnchor.shiftFractionTowards(points.body14, 0.5) } - snippets.logo = new Snippet('logo', points.logoAnchor).attr( 'data-scale', options.size > 1 ? 1 : options.size ) + snippets.logo = new Snippet('logo', points.logoAnchor).attr( + 'data-scale', + options.size > 1 ? 1 : options.size + ) macro('title', { at: points.titleAnchor, @@ -501,77 +509,161 @@ export default function (part) { macro('hd', { from: points.body14, to: points.body15, - y: points.body19.y +sa +10, + y: points.body19.y + sa + 10, }) macro('hd', { from: points.body15, to: points.body16, - y: points.body19.y +sa +10, + y: points.body19.y + sa + 10, }) macro('hd', { from: points.body16, to: points.body17, - y: points.body19.y +sa +10, + y: points.body19.y + sa + 10, }) macro('hd', { from: points.body17, to: points.body19, - y: points.body19.y +sa +10, + y: points.body19.y + sa + 10, }) macro('hd', { from: points.body19, to: points.body01, - y: points.body19.y +sa +10, + y: points.body19.y + sa + 10, + noStartMarker: true, + noEndMarker: true, }) macro('hd', { from: points.gill1start, to: points.gill5start, - y: points.body19.y +sa +20, + y: points.body19.y + sa + 20, + }) + macro('hd', { + from: points.eyeBig, + to: points.body19, + y: points.body19.y + sa + 20, + }) + macro('hd', { + from: points.eyeBigL, + to: points.eyeBigR, + y: points.eyeBigT.y - 10, + noStartMarker: true, + noEndMarker: true, }) macro('hd', { from: points.body14, to: points.body13, - y: points.body06.y -sa -5, + y: points.body06.y - sa - 5, }) macro('hd', { from: points.body13, to: points.body10, - y: points.body06.y -sa -5, + y: points.body06.y - sa - 5, }) macro('hd', { from: points.body10, to: points.body06, - y: points.body06.y -sa -5, + y: points.body06.y - sa - 5, }) - points.finCurve = utils.beamsIntersect( points.body05, points.body05cp2, points.body04, points.body04cp1 ) + points.finCurve = utils.beamsIntersect( + points.body05, + points.body05cp2, + points.body04, + points.body04cp1 + ) macro('hd', { from: points.body06, to: points.finCurve, - y: points.body06.y -sa -5, + y: points.body06.y - sa - 5, }) macro('hd', { from: points.finCurve, to: points.body03, - y: points.body06.y -sa -5, + y: points.body06.y - sa - 5, }) macro('hd', { from: points.body03, to: points.body01, - y: points.body06.y -sa -5, + y: points.body06.y - sa - 5, + noStartMarker: true, + noEndMarker: true, }) macro('hd', { from: points.body02, to: points.body03, - y: points.body06.y -sa +10, + y: points.body06.y - sa + 10, }) macro('hd', { from: points.body02, to: points.body01, - y: points.body06.y -sa +20, + y: points.body06.y - sa + 20, }) - + macro('vd', { + from: points.body19, + to: points.body14, + x: points.body14.x - sa - 10, + }) + macro('vd', { + from: points.body15, + to: points.body14, + x: points.body14.x - sa - 20, + }) + macro('vd', { + from: points.body14, + to: points.body13, + x: points.body14.x - sa - 20, + }) + macro('vd', { + from: points.body14, + to: points.body10, + x: points.body14.x - sa - 30, + }) + macro('vd', { + from: points.body14, + to: points.body08, + x: points.body14.x - sa - 10, + }) + macro('vd', { + from: points.body10, + to: points.body06, + x: points.body14.x - sa - 30, + }) + macro('vd', { + from: points.body01, + to: points.body19, + x: points.body01.x + sa + 10, + }) + macro('vd', { + from: points.body02, + to: points.body19, + x: points.body01.x + sa + 20, + }) + macro('vd', { + from: points.body03, + to: points.body01, + x: points.body01.x + sa + 10, + }) + macro('vd', { + from: points.finCurve, + to: points.body02, + x: points.body01.x + sa + 20, + }) + macro('vd', { + from: points.body06, + to: points.finCurve, + x: points.body01.x + sa + 20, + }) + if (options.size > 0.4) { + macro('vd', { + from: points.gill5end, + to: points.gill5start, + x: points.gill5start.x + 5, + noStartMarker: true, + noEndMarker: true, + }) + } } else { macro('scalebox', { at: points.scaleboxAnchor }) } diff --git a/packages/hi/src/lowerTeeth.js b/packages/hi/src/lowerTeeth.js index 620e8f7f532..55d6998600a 100644 --- a/packages/hi/src/lowerTeeth.js +++ b/packages/hi/src/lowerTeeth.js @@ -47,6 +47,48 @@ export default function (part) { if (complete) { snippets.lowerTeeth = new Snippet('bnotch', points.lowerTeeth01) + points.titleAnchor = points.lowerTeeth02.shiftFractionTowards(points.lowerTeeth03, 0.5).shiftFractionTowards(points.lowerTeeth01, 0.5) + + macro('title', { + at: points.titleAnchor, + nr: 7, + title: 'lowerTeeth', + scale: options.size / 2, + }) + + if (paperless) { + macro('hd', { + from: points.lowerTeeth01, + to: points.lowerTeeth03, + y: points.lowerTeeth02.y + sa + 10, + noStartMarker: true, + noEndMarker: true, + }) + macro('hd', { + from: points.lowerTeeth02, + to: points.lowerTeeth01, + y: points.lowerTeeth02.y + sa + 10, + noStartMarker: true, + noEndMarker: true, + }) + macro('vd', { + from: points.lowerTeeth02, + to: points.lowerTeeth01, + x: points.lowerTeeth02.x - sa - 10, + noStartMarker: true, + noEndMarker: true, + }) + console.log({path:paths.teeth}) + console.log({point:paths.teeth.edge('top')}) + macro('vd', { + from: points.lowerTeeth01, + to: paths.teeth.edge('top'), + x: points.lowerTeeth02.x - sa - 10, + noStartMarker: true, + noEndMarker: true, + }) + } + if (sa) { let pSA = paths.seam.offset(sa) paths.sa = new Path() diff --git a/packages/hi/src/mouth.js b/packages/hi/src/mouth.js index ed6538b9b8a..a8f19cc62eb 100644 --- a/packages/hi/src/mouth.js +++ b/packages/hi/src/mouth.js @@ -92,6 +92,43 @@ export default function (part) { snippets.mouthMidTop = new Snippet('bnotch', points.mouth01) snippets.mouthMidBottom = new Snippet('bnotch', points.mouth03) + points.titleAnchor = points.mouth01.shiftFractionTowards(points.mouth02, 0.23) + points.logoAnchor = points.mouth01.shiftFractionTowards(points.mouth04, 0.3) + + snippets.logo = new Snippet('logo', points.logoAnchor).attr( + 'data-scale', + (options.size > 1 ? 1 : options.size) / 2 + ) + + macro('title', { + at: points.titleAnchor, + nr: 4, + title: 'mouth', + scale: options.size / 2, + }) + + if (paperless) { + macro('hd', { + from: points.mouth03, + to: points.mouth02, + y: points.mouth02.y + sa + 10, + }) + macro('hd', { + from: points.mouth04, + to: points.mouth03, + y: points.mouth02.y + sa + 10, + }) + macro('vd', { + from: points.mouth04, + to: points.mouth03, + x: points.mouth04.x - sa - 10, + }) + macro('vd', { + from: points.mouth03, + to: points.mouth01, + x: points.mouth04.x - sa - 10, + }) + } if (sa) { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } diff --git a/packages/hi/src/tail.js b/packages/hi/src/tail.js index daefabd1ec4..6c8446b8653 100644 --- a/packages/hi/src/tail.js +++ b/packages/hi/src/tail.js @@ -15,7 +15,6 @@ export default function (part) { macro, } = part.shorthand() - let tail01_02d = 192.0129724628 * options.size let tail01_02a = 53.242955551234914 let tail01_03d = 115.38057785000036 * options.size @@ -85,10 +84,104 @@ export default function (part) { // Complete? if (complete) { points.tailSnippet = new Path() - .move(points.tail01) - .curve(points.tail01cp2, points.tail05cp1, points.tail05) - .shiftFractionAlong(0.25) + .move(points.tail01) + .curve(points.tail01cp2, points.tail05cp1, points.tail05) + .shiftFractionAlong(0.25) snippets.tail = new Snippet('bnotch', points.tailSnippet) + + points.titleAnchor = points.tail03.shiftFractionTowards(points.tail01, 0.4) + points.logoAnchor = points.tail03.shiftFractionTowards(points.tail05, 0.5) + + snippets.logo = new Snippet('logo', points.logoAnchor).attr( + 'data-scale', + options.size > 1 ? 1 : options.size + ) + + macro('title', { + at: points.titleAnchor, + nr: 3, + title: 'tail', + scale: options.size, + }) + + if (paperless) { + points.tailLeft = new Path() + .move(points.tail03) + .curve(points.tail03cp1, points.tail04cp2, points.tail04) + .curve(points.tail04cp1, points.tail05cp2, points.tail05) + .edge('left') + points.tailRight = new Path() + .move(points.tail01) + .curve(points.tail01cp1, points.tail02cp2, points.tail02) + .curve(points.tail02cp1, points.tail03cp2, points.tail03) + .edge('right') + points.tailTopLeft = new Path() + .move(points.tail03) + .curve(points.tail03cp1, points.tail04cp2, points.tail04) + .curve(points.tail04cp1, points.tail05cp2, points.tail05) + .edge('top') + points.tailTopRight = new Path() + .move(points.tail01) + .curve(points.tail01cp1, points.tail02cp2, points.tail02) + .curve(points.tail02cp1, points.tail03cp2, points.tail03) + .edge('top') + macro('hd', { + from: points.tailLeft, + to: points.tail05, + y: points.tail01.y + sa + 10, + }) + macro('hd', { + from: points.tail05, + to: points.tail01, + y: points.tail01.y + sa + 10, + }) + macro('hd', { + from: points.tail01, + to: points.tailRight, + y: points.tail01.y + sa + 10, + }) + macro('hd', { + from: points.tailLeft, + to: points.tail03, + y: points.tailTopLeft.y - sa - 10, + }) + macro('hd', { + from: points.tail03, + to: points.tailRight, + y: points.tailTopRight.y - sa - 10, + }) + macro('vd', { + from: points.tailTopLeft, + to: points.tail03, + x: points.tail03.x - 20, + }) + macro('vd', { + from: points.tail05, + to: points.tailTopLeft, + x: points.tailLeft.x - sa - 20, + }) + macro('vd', { + from: points.tailTopRight, + to: points.tail01, + x: points.tailRight.x + sa + 20, + }) + macro('vd', { + from: points.tail01, + to: points.tailTopRight, + x: points.tail03.x + 20, + }) + macro('vd', { + from: points.tail03, + to: points.tail01, + x: points.tail01.x + 20, + }) + macro('vd', { + from: points.tail05, + to: points.tail03, + x: points.tail05.x - 20, + }) + } + if (sa) { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } diff --git a/packages/hi/src/upperTeeth.js b/packages/hi/src/upperTeeth.js index 623feacd6ec..0f9eba37be7 100644 --- a/packages/hi/src/upperTeeth.js +++ b/packages/hi/src/upperTeeth.js @@ -46,6 +46,49 @@ export default function (part) { // Complete? if (complete) { snippets.upperTeeth = new Snippet('bnotch', points.upperTeeth01) + + points.titleAnchor = points.upperTeeth02.shiftFractionTowards(points.upperTeeth03, 0.5).shiftFractionTowards(points.upperTeeth01, 0.5) + + macro('title', { + at: points.titleAnchor, + nr: 6, + title: 'upperTeeth', + scale: options.size / 2, + }) + + if (paperless) { + macro('hd', { + from: points.upperTeeth01, + to: points.upperTeeth03, + y: points.upperTeeth02.y + sa + 10, + noStartMarker: true, + noEndMarker: true, + }) + macro('hd', { + from: points.upperTeeth02, + to: points.upperTeeth01, + y: points.upperTeeth02.y + sa + 10, + noStartMarker: true, + noEndMarker: true, + }) + macro('vd', { + from: points.upperTeeth02, + to: points.upperTeeth01, + x: points.upperTeeth02.x - sa - 10, + noStartMarker: true, + noEndMarker: true, + }) + console.log({path:paths.teeth}) + console.log({point:paths.teeth.edge('top')}) + macro('vd', { + from: points.upperTeeth01, + to: paths.teeth.edge('top'), + x: points.upperTeeth02.x - sa - 10, + noStartMarker: true, + noEndMarker: true, + }) + } + if (sa) { let pSA = paths.seam.offset(sa) paths.sa = new Path() From bfc40fcbf5d24f653d750b5badd8426ef0dfd844 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Jun 2022 04:04:36 +0000 Subject: [PATCH 014/158] build(deps): bump mongoose from 6.3.2 to 6.3.6 Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.3.2 to 6.3.6. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/6.3.2...6.3.6) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4beb12c5431..1c851a76671 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18899,15 +18899,15 @@ mongoose-long@^0.3.2: integrity sha512-5gTjPH6HUmtNhamv8MPwExWo01Z4d9CT5njZlupqqbmxzMXTbDOgCuP/jnK+9SV0Fs7nuyYlXv7pJ/nA2pAAuA== "mongoose@3.8.* || >=4", mongoose@^6.1.8: - version "6.3.2" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.3.2.tgz#7cac2d11119896c8235ce03ae65c322257435142" - integrity sha512-4SEa8ynhJYkGMMbx6KOZ5kJz6qhKIYM8nAGufGq3xh+gNrKP3QwthNfc0X4DvTKhE0DQLMS1/Oy3cMl0AXm5RQ== + version "6.3.6" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.3.6.tgz#a0e0fa3f87a78d390d9d286ac3f5f16a0c7c776f" + integrity sha512-/Cixfo+bA32EHQ5Y7sxMj5ZOXFiAFlvA3X4mFruUET9OsbJZfstg4n2FzxovX8Q7EcoQ7Ry1bnOp9AeXtodF7w== dependencies: bson "^4.6.2" kareem "2.3.5" mongodb "4.5.0" mpath "0.9.0" - mquery "4.0.2" + mquery "4.0.3" ms "2.1.3" sift "16.0.0" @@ -19004,10 +19004,10 @@ mquery@3.2.5: safe-buffer "5.1.2" sliced "1.0.1" -mquery@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.2.tgz#a13add5ecd7c2e5a67e0f814b3c7acdfb6772804" - integrity sha512-oAVF0Nil1mT3rxty6Zln4YiD6x6QsUWYz927jZzjMxOK2aqmhEz5JQ7xmrKK7xRFA2dwV+YaOpKU/S+vfNqKxA== +mquery@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.3.tgz#4d15f938e6247d773a942c912d9748bd1965f89d" + integrity sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA== dependencies: debug "4.x" From 7e9dab5e1b91586aa1b69d56e893907a2da9fb46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Jun 2022 04:44:27 +0000 Subject: [PATCH 015/158] build(deps): bump netlify-cli from 10.3.3 to 10.5.0 Bumps [netlify-cli](https://github.com/netlify/cli) from 10.3.3 to 10.5.0. - [Release notes](https://github.com/netlify/cli/releases) - [Changelog](https://github.com/netlify/cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/netlify/cli/compare/v10.3.3...v10.5.0) --- updated-dependencies: - dependency-name: netlify-cli dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- yarn.lock | 92 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 82 insertions(+), 10 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4beb12c5431..95de1cd7436 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3470,10 +3470,10 @@ resolved "https://registry.yarnpkg.com/@netlify/open-api/-/open-api-2.8.0.tgz#e59537ae9aa8342c2aa64952d42e5e089c8422f4" integrity sha512-lfNB/QYDgaP07pwm/nWEaWPvRAAGyhxvJqNzvxMijc7A4uwquMjlbYve8yYyd0LJXPwgBpGobwiQj5RA76xzUQ== -"@netlify/plugins-list@^6.25.0": - version "6.26.0" - resolved "https://registry.yarnpkg.com/@netlify/plugins-list/-/plugins-list-6.26.0.tgz#0ada946622fdc4b1eb7d17fe5e2cda927c7cabfb" - integrity sha512-Hl3wCMMLo4En9nW0y+lHWXmxAHqCI01ItT4hQrClsMmImi3rHwHC7Gd3DpNfsqLXZhK1bmcWYxq06N/uwwtihA== +"@netlify/plugins-list@^6.25.0", "@netlify/plugins-list@^6.27.0": + version "6.27.0" + resolved "https://registry.yarnpkg.com/@netlify/plugins-list/-/plugins-list-6.27.0.tgz#c44d92cab92c2faa08ca6b5136e384669cd14c37" + integrity sha512-fTmgFDxkTgrABYk0XwIgYO7r424JEWoEYHieRNLBIbyOuHiM0FArevNy0/dMi2/Ymxgs44NYrTJUoeZkIn5tdg== "@netlify/run-utils@^4.0.0": version "4.0.0" @@ -3520,7 +3520,7 @@ unixify "^1.0.0" yargs "^16.0.0" -"@netlify/zip-it-and-ship-it@5.9.2", "@netlify/zip-it-and-ship-it@^5.9.2": +"@netlify/zip-it-and-ship-it@5.9.2": version "5.9.2" resolved "https://registry.yarnpkg.com/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.9.2.tgz#b8dca0886950183b17fa5837a63083f3003d88bc" integrity sha512-a86fQwRg9fwgf8jaMLod5oeFnGHZG2xzepKSwakxgr/X7T2U4GIewYmFENZ3pZNiU75YJOiunnizxHhzzPep5w== @@ -3557,6 +3557,43 @@ unixify "^1.0.0" yargs "^16.0.0" +"@netlify/zip-it-and-ship-it@^5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.10.0.tgz#ec97d92da788318a42499e147d19c2707b7856cd" + integrity sha512-A8CyBm5fvrSObAMOfu62+ycfYlxhdrG/Gf9OF9bg2eWXY+BtQWG7OUnmg/QPykhU3uVNXFrX7psQ5kBa04/x5w== + dependencies: + "@babel/parser" "7.16.8" + "@netlify/esbuild" "0.14.25" + "@vercel/nft" "^0.19.0" + archiver "^5.3.0" + common-path-prefix "^3.0.0" + cp-file "^9.0.0" + del "^6.0.0" + elf-cam "^0.1.1" + end-of-stream "^1.4.4" + es-module-lexer "^0.10.0" + execa "^5.0.0" + filter-obj "^2.0.1" + find-up "^5.0.0" + glob "^8.0.3" + is-builtin-module "^3.1.0" + junk "^3.1.0" + locate-path "^6.0.0" + merge-options "^3.0.4" + minimatch "^5.0.0" + normalize-path "^3.0.0" + p-map "^4.0.0" + path-exists "^4.0.0" + precinct "^9.0.1" + read-package-json-fast "^2.0.2" + require-package-name "^2.0.1" + resolve "^2.0.0-next.1" + semver "^7.0.0" + tmp-promise "^3.0.2" + toml "^3.0.0" + unixify "^1.0.0" + yargs "^17.0.0" + "@next/env@12.1.6": version "12.1.6" resolved "https://registry.yarnpkg.com/@next/env/-/env-12.1.6.tgz#5f44823a78335355f00f1687cfc4f1dafa3eca08" @@ -5190,6 +5227,23 @@ resolve-from "^5.0.0" rollup-pluginutils "^2.8.2" +"@vercel/nft@^0.19.0": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@vercel/nft/-/nft-0.19.1.tgz#dcd3c20d7ef14d2050244e7d5edcfecc7303dd46" + integrity sha512-klR5oN7S3WJsZz0r6Xsq7o8YlFEyU3/00VmlpZzIPVFzKfbcEjXo/sVR5lQBUqNKuOzhcbxaFtzW9aOyHjmPYA== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.5" + acorn "^8.6.0" + bindings "^1.4.0" + estree-walker "2.0.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + micromatch "^4.0.2" + node-gyp-build "^4.2.2" + node-pre-gyp "^0.13.0" + resolve-from "^5.0.0" + rollup-pluginutils "^2.8.2" + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -13134,6 +13188,17 @@ glob@^7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + global-cache-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-cache-dir/-/global-cache-dir-2.0.0.tgz#6912dc449279d1505753c0e3d08ef63fb3e686a1" @@ -18535,6 +18600,13 @@ minimatch@^4.0.0: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" @@ -19183,17 +19255,17 @@ nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== netlify-cli@^10.3.3: - version "10.3.3" - resolved "https://registry.yarnpkg.com/netlify-cli/-/netlify-cli-10.3.3.tgz#781826eb8acfe941b922c4263ba76312e31f3944" - integrity sha512-XPPqrO1u4mHi2MxEjlcESXxRw0tbjf+IbeC05AKCjfciwzBM8/rkc8jlPmKfYKSBVP3LF3LZvbxfhqYI/3ZWvQ== + version "10.5.0" + resolved "https://registry.yarnpkg.com/netlify-cli/-/netlify-cli-10.5.0.tgz#f18300e4f7823589cfe032de259a0b2bc82ed943" + integrity sha512-MMM/1RWUExl07bMGqVRhEURMhHu1WO8XrkzfIirSSf78vZHallSr5HdcwZvrizieTeumn8WSOnuwajFMji0Ptw== dependencies: "@netlify/build" "^27.1.3" "@netlify/config" "^18.0.1" "@netlify/edge-bundler" "^1.2.0" "@netlify/framework-info" "^9.0.2" "@netlify/local-functions-proxy" "^1.1.1" - "@netlify/plugins-list" "^6.25.0" - "@netlify/zip-it-and-ship-it" "^5.9.2" + "@netlify/plugins-list" "^6.27.0" + "@netlify/zip-it-and-ship-it" "^5.10.0" "@octokit/rest" "^18.0.0" "@sindresorhus/slugify" "^1.1.0" ansi-escapes "^5.0.0" From e7422a1b8e6391be4421e5c0a359c700cbcf8223 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Thu, 9 Jun 2022 08:44:43 -0700 Subject: [PATCH 016/158] All paperless done --- packages/hi/src/bottomFin.js | 65 +++++++++++++++++++++++++++++++++++ packages/hi/src/lowerTeeth.js | 2 +- packages/hi/src/topFin.js | 61 ++++++++++++++++++++++++++++++++ packages/hi/src/upperTeeth.js | 2 +- 4 files changed, 128 insertions(+), 2 deletions(-) diff --git a/packages/hi/src/bottomFin.js b/packages/hi/src/bottomFin.js index b1e5e504278..dbd03ca5c3b 100644 --- a/packages/hi/src/bottomFin.js +++ b/packages/hi/src/bottomFin.js @@ -102,6 +102,71 @@ export default function (part) { .shiftAlong(store.get('aboveMouthFinLength')) snippets.bottomFin = new Snippet('bnotch', points.bottomFinSnippet) + points.titleAnchor = points.bottomFin02.shiftFractionTowards(points.bottomFin01, 0.4) + points.logoAnchor = points.titleAnchor.shiftFractionTowards(points.bottomFin03, 0.5) + + snippets.logo = new Snippet('logo', points.logoAnchor).attr( + 'data-scale', + options.size > 1 ? 1 : (options.size /2) + ) + + macro('title', { + at: points.titleAnchor, + nr: 6, + title: 'bottomFin', + scale: options.size, + }) + + if (paperless) { + points.bottomFinTop = paths.seam.edge('top') + let tempPath = new Path() + .move(points.bottomFin03) + .curve(points.bottomFin03cp2, points.bottomFin02cp1, points.bottomFin02) + let tempPoint = tempPath.shiftFractionAlong(0.8) + points.bottomFinInsideLeft = tempPath.split(tempPoint)[0].edge('right') + tempPath = new Path() + .move(points.bottomFin01) + .curve(points.bottomFin01cp2, points.bottomFin03cp1, points.bottomFin03) + points.bottomFinInsideBottom = tempPath.edge('top') + + macro('hd', { + from: points.bottomFin03, + to: points.bottomFin01, + y: points.bottomFin01.y + sa + 10, + }) + macro('hd', { + from: points.bottomFin03, + to: points.bottomFinTop, + y: points.bottomFinTop.y - sa - 10, + noStartMarker: true, + noEndMarker: true, + }) + macro('hd', { + from: points.bottomFin03, + to: points.bottomFinInsideLeft, + y: points.bottomFin03.y + sa + 10, + noStartMarker: true, + noEndMarker: true, + }) + macro('vd', { + from: points.bottomFin03, + to: points.bottomFinTop, + x: points.bottomFin03.x - sa - 10, + }) + macro('vd', { + from: points.bottomFinTop, + to: points.bottomFin01, + x: points.bottomFin01.x +sa + 20, + }) + macro('vd', { + from: points.bottomFinInsideBottom, + to: points.bottomFin01, + x: points.bottomFin01.x +sa + 10, + noStartMarker: true, + noEndMarker: true, + }) + } + if (sa) { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } diff --git a/packages/hi/src/lowerTeeth.js b/packages/hi/src/lowerTeeth.js index 55d6998600a..d4155ba0292 100644 --- a/packages/hi/src/lowerTeeth.js +++ b/packages/hi/src/lowerTeeth.js @@ -51,7 +51,7 @@ export default function (part) { macro('title', { at: points.titleAnchor, - nr: 7, + nr: 9, title: 'lowerTeeth', scale: options.size / 2, }) diff --git a/packages/hi/src/topFin.js b/packages/hi/src/topFin.js index 0840a661bc5..be9122d4a84 100644 --- a/packages/hi/src/topFin.js +++ b/packages/hi/src/topFin.js @@ -78,6 +78,67 @@ export default function (part) { // Complete? if (complete) { + + points.titleAnchor = points.topFin01.shiftFractionTowards(points.topFin02, 0.4) + points.logoAnchor = points.titleAnchor.shiftFractionTowards(points.topFin03, 0.5) + + snippets.logo = new Snippet('logo', points.logoAnchor).attr( + 'data-scale', + options.size > 1 ? 1 : (options.size /2) + ) + + macro('title', { + at: points.titleAnchor, + nr: 7, + title: 'topFin', + scale: options.size, + }) + + if (paperless) { + points.topFinLeft = paths.seam.edge('left') + let tempPath = new Path() + .move(points.topFin02) + .curve(points.topFin02cp1, points.topFin03cp2, points.topFin03) + points.topFinInsideTop = tempPath.edge('top') + let tempPoint = tempPath.shiftFractionAlong(0.5) + points.topFinInsideBottom = tempPath.split(tempPoint)[0].edge('bottom') + + macro('hd', { + from: points.topFin01, + to: points.topFin03, + y: points.topFin01.y - sa - 10, + noStartMarker: true, + noEndMarker: true, + }) + macro('hd', { + from: points.topFin03, + to: paths.seam.edge('right'), + y: points.topFin03.y + sa + 10, + }) + macro('hd', { + from: points.topFinLeft, + to: points.topFin03, + y: points.topFin03.y + sa + 10, + noStartMarker: true, + noEndMarker: true, + }) + macro('vd', { + from: points.topFin03, + to: points.topFin01, + x: points.topFinLeft.x - sa - 10, + }) + macro('vd', { + from: points.topFin01, + to: points.topFinInsideBottom, + x: points.topFin02.x +sa + 10, + }) + macro('vd', { + from: points.topFinInsideTop, + to: points.topFin01, + x: points.topFinLeft.x -sa - 20, + }) + } + if (sa) { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } diff --git a/packages/hi/src/upperTeeth.js b/packages/hi/src/upperTeeth.js index 0f9eba37be7..3de158b8919 100644 --- a/packages/hi/src/upperTeeth.js +++ b/packages/hi/src/upperTeeth.js @@ -51,7 +51,7 @@ export default function (part) { macro('title', { at: points.titleAnchor, - nr: 6, + nr: 8, title: 'upperTeeth', scale: options.size / 2, }) From 8174b40972a076ee52cd067a5131264f585c9f82 Mon Sep 17 00:00:00 2001 From: Joost De Cock Date: Thu, 9 Jun 2022 18:11:26 +0200 Subject: [PATCH 017/158] chore(example): Cleaned up example --- packages/examples/src/path_noop.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/examples/src/path_noop.js b/packages/examples/src/path_noop.js index 3fa76cd3eba..4697520f64d 100644 --- a/packages/examples/src/path_noop.js +++ b/packages/examples/src/path_noop.js @@ -1,5 +1,5 @@ export default (part) => { - let { Point, points, Path, paths, Snippet, snippets } = part.shorthand() + const { Point, points, Path, paths } = part.shorthand() points.left = new Point(10,10) points.dartLeft = new Point(40, 10) From 5888ccfbc70d861a6ffc6524dffdb493da2f06a5 Mon Sep 17 00:00:00 2001 From: Joost De Cock Date: Thu, 9 Jun 2022 19:33:27 +0200 Subject: [PATCH 018/158] feat(shared): Let images break out to fill the screen on mobile --- packages/freesewing.org/pages/[...mdxslug].js | 6 ++--- packages/freesewing.org/pages/blog/[slug].js | 19 ++++++++------ packages/freesewing.org/pages/blog/index.js | 2 +- .../freesewing.org/pages/showcase/[slug].js | 6 ++--- .../components/breadcrumbs.js | 4 +-- .../components/{modal.js => lightbox.js} | 12 ++++----- .../components/mdx/figure.js | 25 +++++++++---------- .../components/wrappers/img.js | 7 ++++++ packages/freesewing.shared/styles/globals.css | 2 +- 9 files changed, 46 insertions(+), 37 deletions(-) rename packages/freesewing.shared/components/{modal.js => lightbox.js} (70%) create mode 100644 packages/freesewing.shared/components/wrappers/img.js diff --git a/packages/freesewing.org/pages/[...mdxslug].js b/packages/freesewing.org/pages/[...mdxslug].js index e034090a680..e52f90bbeb9 100644 --- a/packages/freesewing.org/pages/[...mdxslug].js +++ b/packages/freesewing.org/pages/[...mdxslug].js @@ -39,13 +39,13 @@ const MdxPage = props => { -
+
{props.toc && ( -
+
)} -
+
diff --git a/packages/freesewing.org/pages/blog/[slug].js b/packages/freesewing.org/pages/blog/[slug].js index 88433dfd731..8f082e1b7b2 100644 --- a/packages/freesewing.org/pages/blog/[slug].js +++ b/packages/freesewing.org/pages/blog/[slug].js @@ -5,7 +5,8 @@ import MdxWrapper from 'shared/components/wrappers/mdx' import mdxCompiler from 'shared/mdx/compiler' import Markdown from 'react-markdown' import Head from 'next/head' -import Modal from 'shared/components/modal.js' +import Lightbox from 'shared/components/lightbox.js' +import ImageWrapper from 'shared/components/wrappers/img.js' import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import { strapiHost } from 'shared/config/freesewing.mjs' import { strapiImage } from 'shared/utils.js' @@ -82,17 +83,19 @@ const PostPage = ({ post, author }) => {
- - {post.caption} + + + {post.caption} +
- +
diff --git a/packages/freesewing.org/pages/blog/index.js b/packages/freesewing.org/pages/blog/index.js index 08ec569b083..df59cdbdb3e 100644 --- a/packages/freesewing.org/pages/blog/index.js +++ b/packages/freesewing.org/pages/blog/index.js @@ -62,7 +62,7 @@ const BlogIndexPage = (props) => { return ( -
+
{props.posts.map(post => ) }
diff --git a/packages/freesewing.org/pages/showcase/[slug].js b/packages/freesewing.org/pages/showcase/[slug].js index e7743d936c4..df25be8131d 100644 --- a/packages/freesewing.org/pages/showcase/[slug].js +++ b/packages/freesewing.org/pages/showcase/[slug].js @@ -6,7 +6,7 @@ import mdxCompiler from 'shared/mdx/compiler' import Markdown from 'react-markdown' import Head from 'next/head' import PageLink from 'shared/components/page-link.js' -import Modal from 'shared/components/modal.js' +import Lightbox from 'shared/components/lightbox.js' import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import { strapiHost } from 'shared/config/freesewing.mjs' import { strapiImage } from 'shared/utils.js' @@ -82,7 +82,7 @@ const PostPage = ({ post, maker }) => {
- + {post.caption} { className="text-center mb-8 prose m-auto" dangerouslySetInnerHTML={{__html: post.caption}} /> - +
diff --git a/packages/freesewing.shared/components/breadcrumbs.js b/packages/freesewing.shared/components/breadcrumbs.js index e211c897644..c2d962b496c 100644 --- a/packages/freesewing.shared/components/breadcrumbs.js +++ b/packages/freesewing.shared/components/breadcrumbs.js @@ -1,13 +1,13 @@ import React from 'react' import Link from 'next/link' -import Logo from 'shared/components/logos/freesewing.js' +import FreeSewingIcon from 'shared/components/icons/freesewing.js' const Breadcrumbs = ({ crumbs=[], title }) => (
  • - +
  • diff --git a/packages/freesewing.shared/components/modal.js b/packages/freesewing.shared/components/lightbox.js similarity index 70% rename from packages/freesewing.shared/components/modal.js rename to packages/freesewing.shared/components/lightbox.js index eea6366202c..dab7fd8c1ab 100644 --- a/packages/freesewing.shared/components/modal.js +++ b/packages/freesewing.shared/components/lightbox.js @@ -1,15 +1,15 @@ import { useState } from 'react' -const Modal = ({ cancel, children }) => { +const Lightbox = ({ cancel, children }) => { - const [ modal, setModal ] = useState(false) + const [ box, setBox ] = useState(false) - if (modal) return ( + if (box) return (
    setModal(false)}> + `} onClick={() => setBox(false)}>
    { return (
    setModal(!modal)} + onClick={() => setBox(!box)} className="hover:cursor-zoom-in" >{children}
    ) } -export default Modal +export default Lightbox diff --git a/packages/freesewing.shared/components/mdx/figure.js b/packages/freesewing.shared/components/mdx/figure.js index f9e2b31db0c..425af8dc4f3 100644 --- a/packages/freesewing.shared/components/mdx/figure.js +++ b/packages/freesewing.shared/components/mdx/figure.js @@ -1,5 +1,6 @@ import Popout from 'shared/components/popout' -import Modal from 'shared/components/modal' +import Lightbox from 'shared/components/lightbox' +import ImageWrapper from 'shared/components/wrappers/img.js' const Figure = props => { @@ -11,17 +12,15 @@ const Figure = props => { return (
    - - {props?.alt + + + {props?.alt + {title ?
    {title}
    : ( @@ -31,7 +30,7 @@ const Figure = props => { ) } -
    +
    ) } diff --git a/packages/freesewing.shared/components/wrappers/img.js b/packages/freesewing.shared/components/wrappers/img.js new file mode 100644 index 00000000000..705442cbc0a --- /dev/null +++ b/packages/freesewing.shared/components/wrappers/img.js @@ -0,0 +1,7 @@ +/* Breaks image out of its parent container to fill the screen on mobile */ +const ImageWrapper = ({ children }) => ( +
    {children}
    +) + +export default ImageWrapper + diff --git a/packages/freesewing.shared/styles/globals.css b/packages/freesewing.shared/styles/globals.css index 3cf9a3748ef..e8f83f9679e 100644 --- a/packages/freesewing.shared/styles/globals.css +++ b/packages/freesewing.shared/styles/globals.css @@ -235,7 +235,7 @@ } } -/* modal */ +/* Lightbox */ .lightbox img { max-width: calc(100vw - 6rem); max-height: calc(100vh - 6rem); From f9ff0ab04dee3d17e0579caf0e22c57a5b6fce67 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Thu, 9 Jun 2022 13:16:56 -0700 Subject: [PATCH 019/158] Last adjustments to Paperless --- packages/hi/src/bottomFin.js | 37 ++++++++++++++++++++++++------------ packages/hi/src/topFin.js | 25 +++++++++++++++--------- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/packages/hi/src/bottomFin.js b/packages/hi/src/bottomFin.js index dbd03ca5c3b..15df6947468 100644 --- a/packages/hi/src/bottomFin.js +++ b/packages/hi/src/bottomFin.js @@ -132,21 +132,28 @@ export default function (part) { macro('hd', { from: points.bottomFin03, to: points.bottomFin01, - y: points.bottomFin01.y + sa + 10, + y: points.bottomFin01.y + sa + 20, }) macro('hd', { - from: points.bottomFin03, - to: points.bottomFinTop, + from: points.bottomFinTop, + to: points.bottomFin01, y: points.bottomFinTop.y - sa - 10, - noStartMarker: true, - noEndMarker: true, + // id: 'smallTop', + // noStartMarker: true, + // noEndMarker: true, + }) + macro('hd', { + from: points.bottomFinInsideLeft, + to: points.bottomFin01, + y: points.bottomFin03.y + sa + 20, + // id: 'smallBottom', + // noStartMarker: true, + // noEndMarker: true, }) macro('hd', { from: points.bottomFin03, - to: points.bottomFinInsideLeft, + to: points.bottomFinSnippet, y: points.bottomFin03.y + sa + 10, - noStartMarker: true, - noEndMarker: true, }) macro('vd', { from: points.bottomFin03, @@ -159,12 +166,18 @@ export default function (part) { x: points.bottomFin01.x +sa + 20, }) macro('vd', { - from: points.bottomFinInsideBottom, - to: points.bottomFin01, + from: points.bottomFinTop, + to: points.bottomFinInsideBottom, x: points.bottomFin01.x +sa + 10, - noStartMarker: true, - noEndMarker: true, + // id: 'smallRight', + // noStartMarker: true, + // noEndMarker: true, }) + // if( options.size < 1.5 ) { + // paths.smallTop.attr('data-text-class', 'text-xs') + // paths.smallBottom.attr('data-text-class', 'text-xs') + // paths.smallRight.attr('data-text-class', 'text-xs') + // } } if (sa) { diff --git a/packages/hi/src/topFin.js b/packages/hi/src/topFin.js index be9122d4a84..560f3566423 100644 --- a/packages/hi/src/topFin.js +++ b/packages/hi/src/topFin.js @@ -102,25 +102,28 @@ export default function (part) { points.topFinInsideTop = tempPath.edge('top') let tempPoint = tempPath.shiftFractionAlong(0.5) points.topFinInsideBottom = tempPath.split(tempPoint)[0].edge('bottom') + points.topFinRight = paths.seam.edge('right') macro('hd', { from: points.topFin01, - to: points.topFin03, + to: points.topFinRight, y: points.topFin01.y - sa - 10, - noStartMarker: true, - noEndMarker: true, + // id: 'smallTop', + // noStartMarker: true, + // noEndMarker: true, }) macro('hd', { from: points.topFin03, - to: paths.seam.edge('right'), - y: points.topFin03.y + sa + 10, + to: points.topFinRight, + y: points.topFin03.y + sa + 20, }) macro('hd', { from: points.topFinLeft, - to: points.topFin03, + to: points.topFinRight, y: points.topFin03.y + sa + 10, - noStartMarker: true, - noEndMarker: true, + // id: 'smallBottom', + // noStartMarker: true, + // noEndMarker: true, }) macro('vd', { from: points.topFin03, @@ -137,7 +140,11 @@ export default function (part) { to: points.topFin01, x: points.topFinLeft.x -sa - 20, }) - } + } + // if( options.size < 1.5 ) { + // paths.smallTop.attr('data-text-class', 'text-xs') + // paths.smallBottom.attr('data-text-class', 'text-xs') + // } if (sa) { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') From 6493753d60780bbc678bbe96bf9f6642b246f2bb Mon Sep 17 00:00:00 2001 From: woutervdub Date: Thu, 9 Jun 2022 13:19:57 -0700 Subject: [PATCH 020/158] Documentation Hi --- config/descriptions.yaml | 1 + config/exceptions.yaml | 2 ++ markdown/org/docs/patterns/hi/cutting/en.md | 14 ++++++++++++ markdown/org/docs/patterns/hi/en.md | 5 +++++ markdown/org/docs/patterns/hi/fabric/en.md | 19 ++++++++++++++++ .../org/docs/patterns/hi/measurements/en.md | 5 +++++ markdown/org/docs/patterns/hi/needs/en.md | 12 ++++++++++ .../docs/patterns/hi/options/aggressive/en.md | 6 +++++ markdown/org/docs/patterns/hi/options/en.md | 5 +++++ .../org/docs/patterns/hi/options/hungry/en.md | 6 +++++ .../patterns/hi/options/nosePointiness/en.md | 6 +++++ .../org/docs/patterns/hi/options/size/en.md | 6 +++++ packages/hi/CHANGELOG.md | 2 +- packages/hi/README.md | 22 +++++++++---------- 14 files changed, 99 insertions(+), 12 deletions(-) create mode 100644 markdown/org/docs/patterns/hi/cutting/en.md create mode 100644 markdown/org/docs/patterns/hi/en.md create mode 100644 markdown/org/docs/patterns/hi/fabric/en.md create mode 100644 markdown/org/docs/patterns/hi/measurements/en.md create mode 100644 markdown/org/docs/patterns/hi/needs/en.md create mode 100644 markdown/org/docs/patterns/hi/options/aggressive/en.md create mode 100644 markdown/org/docs/patterns/hi/options/en.md create mode 100644 markdown/org/docs/patterns/hi/options/hungry/en.md create mode 100644 markdown/org/docs/patterns/hi/options/nosePointiness/en.md create mode 100644 markdown/org/docs/patterns/hi/options/size/en.md diff --git a/config/descriptions.yaml b/config/descriptions.yaml index c70d9ceea3b..98209cccad6 100644 --- a/config/descriptions.yaml +++ b/config/descriptions.yaml @@ -26,6 +26,7 @@ freesewing.lab: 'FreeSewing website to test various patterns' freesewing.org: 'FreeSewing website' freesewing.shared: 'Shared code and React components for different websites' gatsby-remark-jargon: 'A gatsby-transformer-remark sub-plugin for jargon terms' +hi: 'A FreeSewing pattern for a shark plush toy' holmes: 'A FreeSewing pattern for a Sherlock Holmes hat' hortensia: 'A FreeSewing pattern for a handbag' huey: 'A FreeSewing pattern for a zip-up hoodie' diff --git a/config/exceptions.yaml b/config/exceptions.yaml index 0693a54c241..9203689bf88 100644 --- a/config/exceptions.yaml +++ b/config/exceptions.yaml @@ -99,6 +99,8 @@ packageJson: private: true freesewing.org: private: true + hi: + author: woutervdub (https://github.com/woutervdub) holmes: author: AlfaLyr (https://github.com/alfalyr) i18n: diff --git a/markdown/org/docs/patterns/hi/cutting/en.md b/markdown/org/docs/patterns/hi/cutting/en.md new file mode 100644 index 00000000000..75e5239d2b5 --- /dev/null +++ b/markdown/org/docs/patterns/hi/cutting/en.md @@ -0,0 +1,14 @@ +--- +title: "Hi shark plush toy: Cutting Instructions" +--- + +- **Main fabric** + - Cut **2 Body (color 1)** + - Cut **1 Belly (color 2)** + - Cut **2 Tail (color 1)** + - Cut **1 Mouth (color 3)** + - Cut **2 Above Mouth (color 2)** + - Cut **2 Top Fin (color 1)** + - Cut **2 Bottom Fin (color 1)** + - Cut **1 Upper Teeth (fabric 2)** + - Cut **1 Lower Teeth (fabric 2)** diff --git a/markdown/org/docs/patterns/hi/en.md b/markdown/org/docs/patterns/hi/en.md new file mode 100644 index 00000000000..a82acb3f955 --- /dev/null +++ b/markdown/org/docs/patterns/hi/en.md @@ -0,0 +1,5 @@ +--- +title: "Hi shark plush toy" +--- + + diff --git a/markdown/org/docs/patterns/hi/fabric/en.md b/markdown/org/docs/patterns/hi/fabric/en.md new file mode 100644 index 00000000000..1b8e7f7c165 --- /dev/null +++ b/markdown/org/docs/patterns/hi/fabric/en.md @@ -0,0 +1,19 @@ +--- +title: "Hi shark plush toy: Fabric Options" +--- + +This plush toy is intended to have two different coloured fabrics, one for +the upper body, and one for the belly. The mouth should probably have its +own colour fabric. Most plush toys have some sort of a faux fur fabric. + +Fabrics with a two-way stretch work better than wovens. The stretch should +be perpendicular to the grainline. + +## Teeth + +The teeth have untreated ends, so should be made from a fabric that does +not unravel. + +## Stuffing + +Since this is a pluch toy, it wil need to be stuffed with material. \ No newline at end of file diff --git a/markdown/org/docs/patterns/hi/measurements/en.md b/markdown/org/docs/patterns/hi/measurements/en.md new file mode 100644 index 00000000000..01f880d9bff --- /dev/null +++ b/markdown/org/docs/patterns/hi/measurements/en.md @@ -0,0 +1,5 @@ +--- +title: "Hi shark plush toy: Required Measurements" +--- + + diff --git a/markdown/org/docs/patterns/hi/needs/en.md b/markdown/org/docs/patterns/hi/needs/en.md new file mode 100644 index 00000000000..87dbb0364ea --- /dev/null +++ b/markdown/org/docs/patterns/hi/needs/en.md @@ -0,0 +1,12 @@ +--- +title: "Hi shark plush toy: What You Need" +--- + +To make Hi, you will need the following: + +- Basic sewing supplies +- About 1 meters of a suitable fabric in color 1 (body) +- About 0.5 meters of a suitable fabric in color 2 (belly) +- Small piece for the mouth +- Suitable, unraveling, fabric for the teeth +- Stuffing diff --git a/markdown/org/docs/patterns/hi/options/aggressive/en.md b/markdown/org/docs/patterns/hi/options/aggressive/en.md new file mode 100644 index 00000000000..bdcd7ed48ac --- /dev/null +++ b/markdown/org/docs/patterns/hi/options/aggressive/en.md @@ -0,0 +1,6 @@ +--- +title: "Aggressive" +--- + +Your Hi can come in the default sweet form, or in a more aggressive +version with more authentic teeth, and a mean look. \ No newline at end of file diff --git a/markdown/org/docs/patterns/hi/options/en.md b/markdown/org/docs/patterns/hi/options/en.md new file mode 100644 index 00000000000..e51f491e2e5 --- /dev/null +++ b/markdown/org/docs/patterns/hi/options/en.md @@ -0,0 +1,5 @@ +--- +title: "Hi shark plush toy: Design Options" +--- + + diff --git a/markdown/org/docs/patterns/hi/options/hungry/en.md b/markdown/org/docs/patterns/hi/options/hungry/en.md new file mode 100644 index 00000000000..d6113cf916e --- /dev/null +++ b/markdown/org/docs/patterns/hi/options/hungry/en.md @@ -0,0 +1,6 @@ +--- +title: "Hungry" +--- + +This setting determins how long it has been since your Hi has had +something to eat. More hungry results in a leaner shark. \ No newline at end of file diff --git a/markdown/org/docs/patterns/hi/options/nosePointiness/en.md b/markdown/org/docs/patterns/hi/options/nosePointiness/en.md new file mode 100644 index 00000000000..c506908f6b2 --- /dev/null +++ b/markdown/org/docs/patterns/hi/options/nosePointiness/en.md @@ -0,0 +1,6 @@ +--- +title: "Pointiness of the nose" +--- + +The shark can be made with a more blunt, or sharper nose, +depending on your preference. diff --git a/markdown/org/docs/patterns/hi/options/size/en.md b/markdown/org/docs/patterns/hi/options/size/en.md new file mode 100644 index 00000000000..b6e71a255f4 --- /dev/null +++ b/markdown/org/docs/patterns/hi/options/size/en.md @@ -0,0 +1,6 @@ +--- +title: "Size" +--- + +Hi can be made in different sizes. The default is about a meter in length. +This is a percentage of this default length. diff --git a/packages/hi/CHANGELOG.md b/packages/hi/CHANGELOG.md index a215f923908..b2481c24aa4 100644 --- a/packages/hi/CHANGELOG.md +++ b/packages/hi/CHANGELOG.md @@ -1,4 +1,4 @@ -# Change log for: @freesewing/benjamin +# Change log for: @freesewing/hi ## 2.20.0 (2022-01-24) diff --git a/packages/hi/README.md b/packages/hi/README.md index 7665c3d9d70..7e30cc2b420 100644 --- a/packages/hi/README.md +++ b/packages/hi/README.md @@ -1,13 +1,13 @@ ![FreeSewing](https://static.freesewing.org/banner.png)

    @freesewing/benjamin on NPM + href="https://www.npmjs.com/package/@freesewing/hi" + title="@freesewing/hi on NPM" + >@freesewing/hi on NPM License: MIT Code quality on DeepScan Open issues tagged pkg:benjamin + href="https://github.com/freesewing/freesewing/issues?q=is%3Aissue+is%3Aopen+label%3Apkg%3Ahi" + title="Open issues tagged pkg:hi" + >Open issues tagged pkg:hi

    -# @freesewing/benjamin +# @freesewing/hi A FreeSewing pattern for a bow tie @@ -57,7 +57,7 @@ A FreeSewing pattern for a bow tie This repository is our *monorepo* holding [all our NPM packages](https://freesewing.dev/reference/packages/). -This folder holds: @freesewing/benjamin +This folder holds: @freesewing/hi ## About FreeSewing πŸ’€ From d86ac78a896a696c0d0ab2738f1fd195e1f829be Mon Sep 17 00:00:00 2001 From: woutervdub Date: Thu, 9 Jun 2022 13:21:36 -0700 Subject: [PATCH 021/158] Documentation (missed one) --- .../org/docs/patterns/hi/instructions/en.md | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 markdown/org/docs/patterns/hi/instructions/en.md diff --git a/markdown/org/docs/patterns/hi/instructions/en.md b/markdown/org/docs/patterns/hi/instructions/en.md new file mode 100644 index 00000000000..2a35a9615db --- /dev/null +++ b/markdown/org/docs/patterns/hi/instructions/en.md @@ -0,0 +1,41 @@ +--- +title: "Hi shark plush toy: Sewing Instructions" +--- + +## Notes and tips + +When you're using fabric with some stretch in it, it is a good idea +to stabilize the seams that go along the whole body, and between +the body and the belly, with some stabilizing ribbon. + +### Body + +Sew the darts on the front of the body closed. Trim away any excess fabric. +Sew the tail pieces to the body, matching the notches. +Sew the topFin pieces to the body. +Sew both parts together, leaving an area below the tail open for stuffing +the shark later. + +### Belly + +Sew the two aboveMouth pieces together along the larger straight side. +Sew the teeth to the mouth, matching notches. +Sew the darts on the belly, trim away any excess fabric. +Sew the aboveMouth pieces to the mouth, matching notches. +Sew all of this to the belly piece, matching notches. +Sew the bottomFin pieces to the belly, matching notches. + +### Completing + +Sew the belly to the body, matching the front, back, and fins. + +### Filling + +Fill the plush toy with stuffing through the opening you left +in the tail. Make sure to fill the tail and fins well before +adding too much stuffing in the body itself. + +Close the toy by hand stitching. + + + From aaf4ec66c5c2ae491326657aa6cb8aab741fe407 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Thu, 9 Jun 2022 16:04:18 -0700 Subject: [PATCH 022/158] Grainline --- packages/hi/config/index.js | 2 +- packages/hi/src/belly.js | 7 +++++++ packages/hi/src/body.js | 6 ++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/hi/config/index.js b/packages/hi/config/index.js index f5efc7af7e7..97627fa8d64 100644 --- a/packages/hi/config/index.js +++ b/packages/hi/config/index.js @@ -11,7 +11,7 @@ export default { optionGroups: { style: ['size','hungry','nosePointiness','aggressive'], }, - measurements: ['neck'], + measurements: [], parts: ['body','tail','aboveMouth','belly','topFin','bottomFin','mouth','lowerTeeth','upperTeeth'], dependencies: { tail: 'body', diff --git a/packages/hi/src/belly.js b/packages/hi/src/belly.js index 9a146739b55..2a2de84cffe 100644 --- a/packages/hi/src/belly.js +++ b/packages/hi/src/belly.js @@ -181,6 +181,13 @@ export default function (part) { snippets.mouth1 = new Snippet('bnotch', points.bellyMouthSnippet1) snippets.mouth2 = new Snippet('bnotch', points.bellyMouthSnippet2) + points.grainlineFrom = new Point( points.belly10.x, points.belly02.y *.7 ) + points.grainlineTo = new Point( points.belly05.x, points.belly02.y *.7 ) + macro("grainline", { + from: points.grainlineFrom, + to: points.grainlineTo, + }) + if (paperless) { macro('hd', { from: points.belly01, diff --git a/packages/hi/src/body.js b/packages/hi/src/body.js index a7a6c8e733c..be597f095d6 100644 --- a/packages/hi/src/body.js +++ b/packages/hi/src/body.js @@ -485,6 +485,12 @@ export default function (part) { d: -5, }) + points.grainlineFrom = points.body13.shiftFractionTowards(points.body03,0.5) + macro("grainline", { + from: points.grainlineFrom, + to: points.body03, + }) + points.titleAnchor = points.body04.shiftFractionTowards(points.body17, 0.4) points.logoAnchor = points.body06.shiftFractionTowards(points.body16, 0.6) From f40bd3cb19ea26fa10e98c139396672a9d24b7ad Mon Sep 17 00:00:00 2001 From: Joost De Cock Date: Fri, 10 Jun 2022 09:25:27 +0200 Subject: [PATCH 023/158] wip(org): Reduce footer logos on mobile --- packages/freesewing.org/components/footer.js | 6 +++--- packages/freesewing.org/pages/typography.js | 2 +- packages/freesewing.shared/components/popout.js | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/freesewing.org/components/footer.js b/packages/freesewing.org/components/footer.js index 0fcf3d9d197..6fe3910d72d 100644 --- a/packages/freesewing.org/components/footer.js +++ b/packages/freesewing.org/components/footer.js @@ -169,15 +169,15 @@ const Footer = ({ app, full=false }) => { {/* First col - CC & MIT */}
    -
    +
    - +

    {translations.cc[app.locale]}

    - +

    {translations.mit[app.locale]}

    diff --git a/packages/freesewing.org/pages/typography.js b/packages/freesewing.org/pages/typography.js index 49140ad1373..6c3be98d910 100644 --- a/packages/freesewing.org/pages/typography.js +++ b/packages/freesewing.org/pages/typography.js @@ -1,5 +1,5 @@ import { useEffect } from 'react' -import Page from 'shared/components/wrappers/page.js' +import Page from 'site/components/wrappers/page.js' import useApp from 'site/hooks/useApp.js' import Popout from 'shared/components/popout.js' diff --git a/packages/freesewing.shared/components/popout.js b/packages/freesewing.shared/components/popout.js index 30b9d1b8be0..652d579c787 100644 --- a/packages/freesewing.shared/components/popout.js +++ b/packages/freesewing.shared/components/popout.js @@ -41,7 +41,7 @@ const Popout = (props) => { return props.compact ? ( -
    +
    {
    ) : ( -
    +
    { {type === 'comment' && <> by {props.by}}
    - {!props?.noHide && ( + {props?.hideable && (