Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Senya Shirt #3762

Open
wants to merge 27 commits into
base: develop
Choose a base branch
from
Open

Senya Shirt #3762

wants to merge 27 commits into from

Conversation

timorl
Copy link
Contributor

@timorl timorl commented Apr 5, 2023

I made this design and it turned out ok, so I want to share it. Unfortunately, I completely don't get how to do anything else than the code (sewing instructions? adding pictures? making it show up somewhere? the last part kinda worked, but produced a huge diff and then I did weird things with it, now I have no idea how to have it work again) or in general make a proper PR, so this is probably useless without some help, sorry. <_<" I'm very willing to put in more work to get this polished, but I would need assistance with that.

Oh, and this was originally done on some slightly older version of develop, I'm not sure it in any way (even after fixing the stuff mentioned above) works on the current one, sorry. >.<

There are some photos of the finished product here.

As a fun aside, with the help of a friend I used Inkscape and a, uh, "manual plotter"(?) to transfer the design onto fabric to avoid having to print a lot. Some details here, more on request if anyone's interested.

Edit: oh, I almost forgot – I am technically using the waist measurement family incorrectly, instead of measuring the waist I measured the thinnest part of the chest. There was no measurement for that (afaik?), so I cheated.

@vercel
Copy link

vercel bot commented Apr 5, 2023

Someone is attempting to deploy a commit to the freesewing Team on Vercel.

A member of the Team first needs to authorize it.

@vercel
Copy link

vercel bot commented Apr 5, 2023

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
freesewing-cms 🔄 Building (Inspect) Dec 31, 2023 0:59am
freesewing-dev ✅ Ready (Inspect) Visit Preview 💬 Add feedback Dec 31, 2023 0:59am
freesewing-org 🔄 Building (Inspect) Dec 31, 2023 0:59am
2 Ignored Deployments
Name Status Preview Comments Updated (UTC)
freesewing-lab ⬜️ Ignored (Inspect) Visit Preview Dec 31, 2023 0:59am
v2-freesewing-dev ⬜️ Ignored (Inspect) Visit Preview Dec 31, 2023 0:59am

Copy link
Contributor

@raphaelsiz raphaelsiz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unable to draft part senya.bottom:  _freesewing_sandy__WEBPACK_IMPORTED_MODULE_0__.draftRingSector) is not a function

There appear to be some issues with drafting your pattern. Have you drafted it in the lab? edit: also yes I forgot but BenJamesBen's reply reminded me, Senya also wasn't in the designs.json so I also had to add it in order for it to even show up at all on the lab

@BenJamesBen
Copy link
Contributor

FYI, to get the Senya design to work in the localhost lab development environment to test it, I had to:

  1. Add in config/software/designs.json:
@@ -237,2 +237,9 @@
     },
+    "senya": {
+      "description": "A FreeSewing pattern for a shirt",
+      "code": ["timorl"],
+      "design": "timorl",
+      "difficulty": 3,
+      "tags": ["tops"]
+    },
     "shin": {
  1. npm run reconfigure
  2. Edit in designs/sandy/src/index.mjs:
@@ -4,0 +5 @@ import { waistband } from './waistband.mjs'
+import { draftRingSector } from './shared.mjs'
@@ -13 +14 @@ const Sandy = new Design({
-export { skirt, waistband, Sandy }
+export { skirt, waistband, draftRingSector, Sandy }

Sandy currently does not export draftRingSector(), so that is an issue that will need to be addressed in Senya (or possibly Sandy).

@codecov
Copy link

codecov bot commented Apr 8, 2023

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 97.15%. Comparing base (8d05c47) to head (c739c09).
Report is 5033 commits behind head on develop.

❗ Current head c739c09 differs from pull request most recent head 7dbcb86. Consider uploading reports for the commit 7dbcb86 to get more accurate results

Additional details and impacted files
@@           Coverage Diff            @@
##           develop    #3762   +/-   ##
========================================
  Coverage    97.14%   97.15%           
========================================
  Files           15       15           
  Lines         4455     4466   +11     
  Branches       534      538    +4     
========================================
+ Hits          4328     4339   +11     
  Misses         123      123           
  Partials         4        4           
Flag Coverage Δ
core 97.15% <ø> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@timorl
Copy link
Contributor Author

timorl commented Apr 8, 2023

Thanks a lot for the help! I now made the PR actually look like a PR, mostly.

Have you drafted it in the lab?

Yup, otherwise I wouldn't have been able to sew it. :D But the standard way of making it work creates a lot of changes I don't understand (npm run reconfigure changes all the readmes Dx) and I didn't want to make a PR with these, so I only submitted the changes in senya/. Now I added all the other necessary stuff, although not everything that run reconfigure adds – why does it even modify all these things?

Sandy currently does not export draftRingSector(), so that is an issue that will need to be addressed in Senya (or possibly Sandy).

Imo it makes sense for such a function to be externally accessible, it's very generic. Ideally it would be in some library both Sandy and Senya use, but I don't know where that would be and I think Sandy exporting it is fine as well, right?

I removed one TODO I forgot about, and added an option because of that.

The remaining problems I don't know what to do about:

  1. My abuse of the waist family of measurements.
  2. back doesn't show one of the measurements I tell it to show (there's even a comment about this in the code). I tried changing the order and it seems that it's always one, but I can influence which one... This suggests I am either hitting some undocumented(?) limit somewhere or just doing something immensely silly.

@BenJamesBen
Copy link
Contributor

BenJamesBen commented Apr 8, 2023

  1. For the measurement, if your design truly uses a measurement that isn't one of the standard FreeSewing ones, I think you should simply create a new measurement name and use it. Using "waist" isn't good because people will use their waist measurements instead of the intended one, and their patterns will not be the correct, intended size.

  2. For the dimensions bug, I found the root cause. Basically, for from: inherited parts, adding dimensions in the new part replaces ones in the old part. You added 1 new dimension in Back, so 1 in Front was overwritten. If you had added 5 dimension in Back, 5 would have been overwritten in Front. It is because the Front dimensions named their paths paths[0], paths[1], paths[2], etc. Back inherited all of these Front paths, but when a dimension is added for Back, it is named paths[0], replacing the existing paths[0]. The same problem is seen with Teagan.

(I'll file the bug for the dimensions bug.)

FYI, until the bug is fixed, a workaround for Senya might be to use an id when setting the Back dimension.
In designs/senya/src/back.mjs:

@@ -81,6 +81,7 @@ function senyaBack({
     // Remove dimensions that are front only
     macro('rmd', { ids: ['frontOnly'] })
     macro('vd', {
+      id: 'backDimension',
       from: points.cbWaist,
       to: points.cbNeck,
       x: points.cbWaist.x - sa - 15,

Another workaround, exploiting how the bug works, would be add the first dimension twice in Front, so the same dimension is contained in paths[0] and paths[1]. Back still overwrites paths[0], but paths[1] remains intact. But, this is not as good a workaround as the first one.

@timorl
Copy link
Contributor Author

timorl commented Apr 8, 2023

  1. I replaced references to the waist with "midriff top", feel free to suggest a better name I already agree this one is terrible. ._. Also, I think this might actually be underbust, but I haven't used it for several reasons:
    1. The instructions suggest to use chest in place of underbust for men, which totally misses the point in this case.
    2. underbust is potentially a tad higher than I would like for this design?
    3. There doesn't seem to be an equivalent family of measurements, so I would have to create these anyway + some information would now be duplicated in the measurements (maybe that's already the case?).
  2. Ooh, nice bug! Now it works, thanks!

Edit: aw damn, adding a new measurement breaks the tests, so apparently requires more work. <_<" I'll look into that, although I would be grateful for pointers.

@raphaelsiz
Copy link
Contributor

Where exactly are you wanting people to measure for this? Like a rib measurement?

@timorl
Copy link
Contributor Author

timorl commented Apr 8, 2023

I was going for "narrowest part of your chest", so yeah. Sorry if I'm messing up some nomenclature, I am a complete amateur. ^^"

@BenJamesBen
Copy link
Contributor

BenJamesBen commented Apr 9, 2023

An alternate way of doing things, instead of having midriff measurements, might be to simply use the underbust or waist measurement (whichever one makes more sense... I don't have a good grasp on this subject).

Then, have an option to adjust the "midriff" line down from the HPS-to-bust bustline or up from the HPS-to-waist waistline. Or, have the option be a percent 0 to 80, with 0 being the waistline and 100% being the bustline (and 80% or whatever representing the underbustline). Unfortunately there is no standard HPS-to-underbust measurement.

And then, have an option to adjust the waist/underbust circumference to represent the calculated midriff circumference.

Otherwise, you will need to document and explain what you mean by the midriff measurement and how it is different than the underbust or waist. I am still unclear about how to find my midriff to take a measurement. What if the narrowest part of my chest is my underbust? What if the narrowest part of my chest is my waist? What happens if someone intends to construct Senya to wear with a tightlaced corset? Would their midriff be located below their navel?

Copy link
Contributor

@BenJamesBen BenJamesBen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've finished my review, but I think we need answers to some questions to be able to proceed.

I tested the actual design in the lab, and it seems okay, with no major issues.

if (complete) {
points.title = new Point(points.armholePitch.x / 2, points.armholePitch.y)
points.logo = points.title.shift(-90, 100)
snippets.logo = new Snippet('logo', points.logo)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This Snippet is causing a floating logo to appear. (Ignore the "JSON". It was inadvertently captured in the screenshot.)
Screenshot 2023-04-08 at 6 45 44 AM

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yuup, removed the whole if, I don't think there was anything of value there.

chestEase: { pct: 12, min: 5, max: 25, menu: 'fit' },
backNeckCutout: { pct: 8, min: 4, max: 12, menu: 'fit' },
// Advanced
acrossBackFactor: { pct: 98, min: 93, max: 100, menu: 'advanced' },
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changing the acrossBackFactor option value doesn't seem to have any effect on the generated pattern?

Armhole Pitch is calculated but doesn't seem to be used?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uh, I even had a comment about this being probably not useful... Anyway, removed this and all the useless things that depended on it.

points.sleeveCp1,
points.sleeveCp2,
Path
).hide()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-calculating paths.bottomAndSide and paths.sleevecap is superfluous because they were already calculated in the inherited Front part. The paths are the same, so they don't need to be re-calculated. The code and imports can be removed.

The only paths that changed and need re-calculating are the shoulder/neck, the full seam, and sa.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, I think this was at least partially an artifact of me not understanding how this whole thing works, removed the unnecessary computations.

from: points.cfNeck,
to: points.cfWaist,
grainline: true,
})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This macro shouldn't needed. A cutonfold macro was already inherited from the Front part.

(There seems to be a bug in the Cutting Layout where the behaviors are different and incorrect both with and without the macro. I'll need to investigate the issue.)

Edit: added: leave it in for now.

With:
Screenshot 2023-04-08 at 7 14 59 AM

Without:
Screenshot 2023-04-08 at 7 15 19 AM

@@ -10,4 +11,4 @@ const Sandy = new Design({
})

// Named exports
export { skirt, waistband, Sandy }
export { skirt, waistband, draftRingSector, Sandy }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we export this method, does it need to get documented? Do we need to involve or inform the designer? Is this the best way to do this? Or, is there a different way we should be accessing the function rather than exporting from Sandy? Copying the code to Senya? Doing something like import { draftRingSector } from '../../sandy/src/shared.mjs' in bottom.mjs?

(I don't know the answers to these questions. I'm hoping that more knowledgable people will provide input.)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

// I don't know the answers either, so below just guesses based on my experience as a software dev; will defer to anyone with a stronger opinion.

  1. It preferably should be documented, but I have no idea where. The function itself is relatively well commented, maybe that is enough?
  2. Probably not, the license lets us do much more with the code if we want to and making one function exported is absolutely tiny. As for politeness, if they are still around they'll see it anyway, and if they aren't they are extremely unlikely to care.
  3. No, having it in a separate "library" (or whatever the equivalent here is) would be best, but I don't have enough understanding of neither javascript nor this codebase to be able to do that properly. ^^"
  4. Copying code sounds much worse than importing it, especially since this is very generic code and it does exactly the desired thing.
  5. I think I tried this form of import and it didn't work (somethingsomethingoutofmodule?), but see my comment above about my lack of JS knowledge. :P


export const base = {
name: 'senya.base',
hide: true,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a new way/API to hide parts. It was implemented just a month ago or so. Please see: https://freesewing.dev/reference/api/part/config/hide

I'm guessing that you'll probably use hide: {self: true}, and hide: 'HIDE_TREE', most often, but i haven't checked all of Senya parts to know if that is so.

This comment applies to other parts.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did the first one for base, the second for front and bottom, nothing for back.

@raphaelsiz
Copy link
Contributor

raphaelsiz commented Apr 9, 2023 via email

@timorl
Copy link
Contributor Author

timorl commented Apr 9, 2023

I think I was vaguely going for something like the Empire waistline, maybe a tad lower. But the discussions above made me lean towards something mostly like what @BenJamesBen describes. I would suggest a solution like:

  1. Unlock the underbust measurement for breastless people – I don't think Senya will work without this (or adding a separate measurement, but that's what we are trying to avoid).
  2. To calculate the HPS-to-midriff-top use the percentage thing @BenJamesBen suggests, although I would suggest going the other way, i.e. the minimum is 20% (which should mean underbust, more or less, right?), 100% is exactly waist. I suggest going this way, since it sort of makes sense to go beyond 100% here (and maybe we want to do that?) while doing this in the other direction would require negatives, which seems ugly. But I'm fine with either approach.
  3. IMO we should have some interpolation strategy for the circumference rather than a separate option – I think a separate option would require too much effort from the user, I for one would have no idea what to input there. Some possible interpolation strategies (but I'm very open to suggestions):
    1. Linear. Simple, but not particularly anatomically correct as far as I can tell.
    2. Use underbust curcumference until 50% (from point 2), then linear – seems to be closer to what anatomically happens, but that is almost exclusively based on my body, so it might be very wrong. :P
    3. Always use the average (perhaps with an option for weighting – is this what you were suggesting by the option @BenJamesBen ?) – the differences will usually not be large enough to matter? (I don't like this option, it seems to ignore some body shapes, but my experience is terribly limited.)

I would be happy to implement 2 & 3, no idea how to do 1 (but I suspect I should be able to figure it out). I will only get to this after we reach some consensus as to how this should work.

@raphaelsiz I'm also among the people whose waist is larger than the narrowest part of their chest, this was even the exact motivation for this separate measurement. :P

@timorl
Copy link
Contributor Author

timorl commented May 1, 2023

I don't like the solution with special-casing 100% – I thought in case of Sandy the "seamless circle" option was present exactly for this usecase. Anyway, because of that I instead limited the percentage here to 90%, which should make this not happen with (almost?) any settings.

I'll write some docs, if this is not merged by when I'm done I'll add them to this PR, otherwise open a separate one. Thanks for the pointer as to where to look for them! Perhaps I'll also try documenting this somewhere in the guide for creating designs.

Copy link
Contributor

@BenJamesBen BenJamesBen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tested the updated PR in the lab, and I believe it is ready to merge for wider testing.

The documentation can be added in a separate PR.

@boring-cyborg boring-cyborg bot added the 📖 documentation Documentation label Jun 29, 2023
@timorl
Copy link
Contributor Author

timorl commented Jun 29, 2023

Yay, I'm back! I added some rudimentary documentation, it's not great but it's something. I have no idea how to test it though (even by looking at it <_<").

Unfortunately this no longer works somehow – when I run yarn lab, go to "Design" and click on the "Senya" button I get a permanent orange spinning circle. I couldn't find any logs to even begin debugging this, so any help would be appreciated.

Side problem: the button there has "Senya.t" and "Senya.d" instead of the title and description. I thought I put these in the correct place, but apparently not, so where should they be?

@timorl
Copy link
Contributor Author

timorl commented Jul 27, 2023

Eh, and now it no longer even compiles... I am completely lost I'm afraid. :/

@joostdecock
Copy link
Member

Eh, and now it no longer even compiles... I am completely lost I'm afraid. :/

Apologies for both the long wait, and for the volatility. As mentioned before, v2 was frozen sometime last year and I've been busy with the v3 release.

Today, not only is v3 out, I have also implemented my preferred solution I mentioned above, which is to put the ring sector functionality into its own plugin.

So now I'd like to revive this effort and land it in our repo and on our website.
@timorl please let me know how you'd like to proceed with this. I see two options:

  • You get this working again
  • I get it working for you

I'm happy to do it, and realistically that will be the faster option.
But if you'd like to carry it over the finish line yourself, that's also fine.

@timorl
Copy link
Contributor Author

timorl commented Oct 25, 2023

Lemme try myself for now, I'll let you know if I hit any more walls. I'm writing this before even properly trying, so it might turn out it will be fast, but maybe I'll manage.

@timorl
Copy link
Contributor Author

timorl commented Oct 29, 2023

Phew, seems to be working although a lot has changed so I might have done some weird things...

Also, I'm not sure if the tag set is correct.

Copy link
Member

@joostdecock joostdecock left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Few small remarks about some of the more recent changes.
Please also provide the (English) translations. Check an existing design (like aaron) for example. (see the i18n folder)

.setClass('fabric')

// Complete pattern?
if (complete) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You no longer have to wrap this in a complete check.
All annotations check themselves whether complete is set yes or no, and if it is not, they don't output anything.

By all annotations I mean everything that comes from plugin-annotations, so title, scalebox, dimensions, snippets, ...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I completely removed these ifs, as I think I don't actually need it for anything beyond the things you mention here. If this is correct, then I'm very glad this is the case. :3

points.scaleboxAnchor = points.scalebox = points.title.shift(90, 100)
macro('scalebox', { at: points.scalebox })

if (sa) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent of hte remark about not needing the if (complete) { } loop above, you should not make SA dependent on complete.

If a user wants a non-complete pattern with SA, we should give it to them.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be irrelevant with the complete check removed, but noted for the future.

}

// Paperless?
if (paperless) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no need to wrap dimensions in a paperless check, dimensions will check themselves if paperless is active, and if not they will not output anything.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed everywhere then.

// Paperless?
if (paperless) {
// Remove dimensions that are front only
macro('rmd', { ids: ['frontOnly'] })
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The rmd macro no longer exists, use this instead:

macro('rmvd', 'frontOnly')

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed as suggested.

x: points.cbWaistline.x - sa - 15,
})
}
log.info('back done!')
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove this log output

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

😿 Done.

x: points.cfWaistline.x - sa - 15,
})
}
log.info('front done!')
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this log output please

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed.

import { front } from './front.mjs'
import { back } from './back.mjs'
import { bottom } from './bottom.mjs'

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You'll need to import and re-export the translations as i18n

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done, although I think I must've missed something, because the translations don't show up in the lab. :/

title: "Senya shirt"
---

<PatternDocs pattern='senya' />
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be:

<DesignDocs design="senya" />

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed.

@@ -0,0 +1,35 @@
---
title: "Sandy circle skirt: Sewing Instructions"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You forgot to update this title :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Whoops, removed any evidence of my misdeeds.

title: "Senya shirt: Required Measurements"
---

<PatternMeasurements pattern='senya' />
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be:

<DesignMeasurements design="senya" />

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed.


macro('sprinkle', {
snippet: 'notch',
on: ['in1Rotated', 'gridAnchor'],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is in1Rotated where you intended the notch to be?

Edit: added: I think that there were some changes to Sandy that changed/renamed some of the points. I think that points.in2 is the new name for the point you want the notch on.

Screenshot 2024-01-19 at 12 02 11 PM


// Paperless?
if (paperless) {
macro('vd', {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think there might be a bug with Sandy's dimensions for non-50% circles.

See: #5859

@@ -16,6 +16,7 @@
*.env
*.sh
*.json
*.local
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was this file accidentally changed and added to this PR? Or, is it something that is needed because sites/sde/env.local was added to the repo?

points.neck = points.hps.shiftFractionTowards(points.shoulder, options.necklineWidth)
points.neckCp2 = points.neck
.shiftTowards(points.shoulder, points.neck.dy(points.cfNeck) * (0.2 + options.necklineBend))
.rotate(-90, points.neck)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is something about the way points.neckCp2 is calculated that causes the neckline curve seam allowance to be misshapen at times.
Screenshot 2024-01-20 at 6 09 43 AM
Screenshot 2024-01-20 at 6 11 07 AM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants