1
0
Fork 0

add plugin-cutlist to plugin-annotations

This commit is contained in:
Enoch Riese 2023-04-15 17:09:29 -04:00
parent 04bab16cbd
commit adbc817863
27 changed files with 229 additions and 513 deletions

View file

@ -78,7 +78,6 @@ body:
- plugins/plugin-bundle - plugins/plugin-bundle
- plugins/plugin-bust - plugins/plugin-bust
- plugins/plugin-buttons - plugins/plugin-buttons
- plugins/plugin-cutlist
- plugins/plugin-cutonfold - plugins/plugin-cutonfold
- plugins/plugin-dimension - plugins/plugin-dimension
- plugins/plugin-flip - plugins/plugin-flip

View file

@ -12,7 +12,6 @@ labelPRBasedOnFilePath:
":electric_plug: plugin-annotations": [ plugins/plugin-annotations/* ] ":electric_plug: plugin-annotations": [ plugins/plugin-annotations/* ]
":electric_plug: plugin-bundle": [ plugins/plugin-bundle/* ] ":electric_plug: plugin-bundle": [ plugins/plugin-bundle/* ]
":electric_plug: plugin-bust": [ plugins/plugin-bust/* ] ":electric_plug: plugin-bust": [ plugins/plugin-bust/* ]
":electric_plug: plugin-cutlist": [ plugins/plugin-cutlist/* ]
":electric_plug: plugin-flip": [ plugins/plugin-flip/* ] ":electric_plug: plugin-flip": [ plugins/plugin-flip/* ]
":electric_plug: plugin-gore": [ plugins/plugin-gore/* ] ":electric_plug: plugin-gore": [ plugins/plugin-gore/* ]
":electric_plug: plugin-i18n": [ plugins/plugin-i18n/* ] ":electric_plug: plugin-i18n": [ plugins/plugin-i18n/* ]

View file

@ -2,7 +2,6 @@
"plugin-annotations": "A FreeSewing plugin that provides pattern annotations", "plugin-annotations": "A FreeSewing plugin that provides pattern annotations",
"plugin-bundle": "An umbrella package of 8 essential FreeSewing build-time plugins", "plugin-bundle": "An umbrella package of 8 essential FreeSewing build-time plugins",
"plugin-bust": "A FreeSewing plugin that helps with bust-adjusting menswear patterns", "plugin-bust": "A FreeSewing plugin that helps with bust-adjusting menswear patterns",
"plugin-cutlist": "A FreeSewing plugin to store data regarding a pattern's cutlist",
"plugin-flip": "A FreeSewing plugin to flip parts horizontally", "plugin-flip": "A FreeSewing plugin to flip parts horizontally",
"plugin-gore": "A FreeSewing plugin to generate gores for a semi-sphere or dome", "plugin-gore": "A FreeSewing plugin to generate gores for a semi-sphere or dome",
"plugin-i18n": "A FreeSewing plugin for pattern translation", "plugin-i18n": "A FreeSewing plugin for pattern translation",

View file

@ -1,10 +1,10 @@
import { back } from './back.mjs' import { back } from './back.mjs'
import { pluginCutlist } from '@freesewing/plugin-cutlist' import { pluginAnnotations } from '@freesewing/plugin-annotations'
export const frontSideDart = { export const frontSideDart = {
name: 'bella.frontSideDart', name: 'bella.frontSideDart',
after: back, after: back,
plugins: [pluginCutlist], plugins: [pluginAnnotations],
draft: ({ draft: ({
store, store,
sa, sa,

View file

@ -1,7 +1,7 @@
import { back as bentBack } from '@freesewing/bent' import { back as bentBack } from '@freesewing/bent'
import { calculateRatios } from './shared.mjs' import { calculateRatios } from './shared.mjs'
import { hidePresets } from '@freesewing/core' import { hidePresets } from '@freesewing/core'
import { pluginCutlist } from '@freesewing/plugin-cutlist' import { pluginAnnotations } from '@freesewing/plugin-annotations'
function draftCarltonBack({ function draftCarltonBack({
paperless, paperless,
@ -250,6 +250,6 @@ export const back = {
waistEase: { pct: 14, min: 8, max: 25, menu: 'fit' }, waistEase: { pct: 14, min: 8, max: 25, menu: 'fit' },
seatEase: { pct: 14, min: 8, max: 25, menu: 'fit' }, seatEase: { pct: 14, min: 8, max: 25, menu: 'fit' },
}, },
plugins: [pluginCutlist], plugins: [pluginAnnotations],
draft: draftCarltonBack, draft: draftCarltonBack,
} }

View file

@ -1,7 +1,7 @@
import { front as bentFront } from '@freesewing/bent' import { front as bentFront } from '@freesewing/bent'
import { calculateRatios } from './shared.mjs' import { calculateRatios } from './shared.mjs'
import { hidePresets } from '@freesewing/core' import { hidePresets } from '@freesewing/core'
import { pluginCutlist } from '@freesewing/plugin-cutlist' import { pluginAnnotations } from '@freesewing/plugin-annotations'
function draftCarltonFront({ function draftCarltonFront({
paperless, paperless,
@ -506,6 +506,6 @@ export const front = {
seatEase: { pct: 14, min: 8, max: 25, menu: 'fit' }, seatEase: { pct: 14, min: 8, max: 25, menu: 'fit' },
innerPocketWeltHeight: { pct: 3.5, min: 2.5, max: 5, menu: 'pockets' }, innerPocketWeltHeight: { pct: 3.5, min: 2.5, max: 5, menu: 'pockets' },
}, },
plugins: [pluginCutlist], plugins: [pluginAnnotations],
draft: draftCarltonFront, draft: draftCarltonFront,
} }

View file

@ -1,6 +1,6 @@
import { topSleeve as bentTopSleeve } from '@freesewing/bent' import { topSleeve as bentTopSleeve } from '@freesewing/bent'
import { front as bentFront } from '@freesewing/bent' import { front as bentFront } from '@freesewing/bent'
import { pluginCutlist } from '@freesewing/plugin-cutlist' import { pluginAnnotations } from '@freesewing/plugin-annotations'
function draftCarltonTopSleeve({ function draftCarltonTopSleeve({
paperless, paperless,
@ -184,6 +184,6 @@ export const topSleeve = {
sleevecapHeight: { pct: 45, min: 40, max: 60, menu: 'advanced' }, sleevecapHeight: { pct: 45, min: 40, max: 60, menu: 'advanced' },
sleevecapEase: { pct: 1, min: 0, max: 10, menu: 'advanced' }, sleevecapEase: { pct: 1, min: 0, max: 10, menu: 'advanced' },
}, },
plugins: [pluginCutlist], plugins: [pluginAnnotations],
draft: draftCarltonTopSleeve, draft: draftCarltonTopSleeve,
} }

View file

@ -1,6 +1,6 @@
import { underSleeve as bentUnderSleeve } from '@freesewing/bent' import { underSleeve as bentUnderSleeve } from '@freesewing/bent'
import { front as bentFront } from '@freesewing/bent' import { front as bentFront } from '@freesewing/bent'
import { pluginCutlist } from '@freesewing/plugin-cutlist' import { pluginAnnotations } from '@freesewing/plugin-annotations'
function draftCarltonUnderSleeve({ function draftCarltonUnderSleeve({
paperless, paperless,
@ -163,6 +163,6 @@ export const underSleeve = {
sleevecapHeight: { pct: 45, min: 40, max: 60, menu: 'advanced' }, sleevecapHeight: { pct: 45, min: 40, max: 60, menu: 'advanced' },
sleevecapEase: { pct: 1, min: 0, max: 10, menu: 'advanced' }, sleevecapEase: { pct: 1, min: 0, max: 10, menu: 'advanced' },
}, },
plugins: [pluginCutlist], plugins: [pluginAnnotations],
draft: draftCarltonUnderSleeve, draft: draftCarltonUnderSleeve,
} }

View file

@ -2,9 +2,9 @@
title: "Include Cutting Instructions" title: "Include Cutting Instructions"
--- ---
To include cutting instructions with your part, use the [cutlist plugin](/reference/plugins/cutlist) to add the [`cutlist.addCut` method](/reference/plugins/cutlist#addcut) to your part's [`store`](/reference/api/store/extend) To include cutting instructions with your part, use the [annotations plugin](/reference/plugins/annotations) to add the [`cutlist.addCut` method](/reference/plugins/cutlist#addcut) to your part's [`store`](/reference/api/store/extend)
<Tip>When you use the cutlist plugin, the [grainline plugin](/reference/plugins/grainline) and the [cut on fold plugin](/reference/plugins/cutonfold) will automatically add grain and fold information to the cutting instructions </Tip> <Tip>The [grainline macro](/reference/macros/grainline) and the [cutonfold macro](/reference/macros/cutonfold) will automatically add grain and fold information to the cutting instructions </Tip>
<Tip>These cutting instructions get used by the [title macro](/reference/macros/title), so be sure to add them before adding your part's title. </Tip> <Tip>These cutting instructions get used by the [title macro](/reference/macros/title), so be sure to add them before adding your part's title. </Tip>
@ -44,11 +44,11 @@ You can use any `string` you want for your material, but here are some standard
For simple cutting instructions, you can rely on the default method parameters For simple cutting instructions, you can rely on the default method parameters
```js ```js
import {pluginCutlist} from '@freesewing/plugin-cutlist' import { pluginAnnotations } from '@freesewing/plugin-cutlist'
const part = { const part = {
name: 'example.front', name: 'example.front',
plugins: [pluginCutlist], plugins: [pluginAnnotations],
draft: ({part, store}) => { draft: ({part, store}) => {
// add instructions to cut two mirrored from main fabric // add instructions to cut two mirrored from main fabric
store.cutlist.addCut() store.cutlist.addCut()
@ -64,11 +64,11 @@ For many designs, you'll want more than just "Cut 2 mirrored from Main Fabric"
You can override the default values to specify different materials, number of pieces to cut, and whether they should be mirrored or identical You can override the default values to specify different materials, number of pieces to cut, and whether they should be mirrored or identical
```js ```js
import {pluginCutlist} from '@freesewing/plugin-cutlist' import { pluginAnnotations } from '@freesewing/plugin-cutlist'
const part = { const part = {
name: 'example.front', name: 'example.front',
plugins: [pluginCutlist], plugins: [pluginAnnotations],
draft: ({part, store}) => { draft: ({part, store}) => {
// add instructions to cut three identical from lining // add instructions to cut three identical from lining
store.cutlist.addCut({cut: 3, material: 'lining', identical: true}) store.cutlist.addCut({cut: 3, material: 'lining', identical: true})
@ -80,11 +80,11 @@ const part = {
You can add as many sets of instructions as you need You can add as many sets of instructions as you need
```js ```js
import {pluginCutlist} from '@freesewing/plugin-cutlist' import { pluginAnnotations } from '@freesewing/plugin-cutlist'
const part = { const part = {
name: 'example.front', name: 'example.front',
plugins: [pluginCutlist], plugins: [pluginAnnotations],
draft: ({part, store}) => { draft: ({part, store}) => {
// add instructions to cut four mirrored from main fabric // add instructions to cut four mirrored from main fabric
store.cutlist.addCut({cut: 4}) store.cutlist.addCut({cut: 4})
@ -100,12 +100,11 @@ const part = {
Sometimes you want some pieces cut on the fold and others cut as halves to seam together. Sometimes you want some pieces cut on the fold and others cut as halves to seam together.
```js ```js
import {pluginCutlist} from '@freesewing/plugin-cutlist' import { pluginAnnotations } from '@freesewing/plugin-cutlist'
import {pluginCutonfold} from '@freesewing/plugin-cutonfold'
const part = { const part = {
name: 'example.front', name: 'example.front',
plugins: [pluginCutlist, pluginCutonfold], plugins: [pluginAnnotations],
draft: ({part, points, Point, macro, store}) => { draft: ({part, points, Point, macro, store}) => {
// set the cut on fold line // set the cut on fold line
points.p1 = new Point(0, 0) points.p1 = new Point(0, 0)
@ -127,12 +126,11 @@ const part = {
You set the grainline on a piece, but you also need some to be cut on the bias You set the grainline on a piece, but you also need some to be cut on the bias
```js ```js
import {pluginCutlist} from '@freesewing/plugin-cutlist' import { pluginAnnotations } from '@freesewing/plugin-cutlist'
import {pluginGrainline} from '@freesewing/plugin-grainline'
const part = { const part = {
name: 'example.front', name: 'example.front',
plugins: [pluginCutlist, pluginGrainline], plugins: [pluginAnnotations],
draft: ({part, points, Point, macro, store}) => { draft: ({part, points, Point, macro, store}) => {
// set the cut on fold line // set the cut on fold line
points.p1 = new Point(0, 0) points.p1 = new Point(0, 0)

View file

@ -24,6 +24,7 @@ The annotations plugin provides the following macros:
- [bartackFractionAlong](/reference/macros/bartackfractionalong) - [bartackFractionAlong](/reference/macros/bartackfractionalong)
- [crossbox](/reference/macros/crossbox) - [crossbox](/reference/macros/crossbox)
- [cutonfold](/reference/macros/cutonfold) - [cutonfold](/reference/macros/cutonfold)
- [grainline](/reference/macros/grainline)
- [hd](/reference/macros/hd) - [hd](/reference/macros/hd)
- [ld](/reference/macros/ld) - [ld](/reference/macros/ld)
- [rmad](/reference/macros/rmad) - [rmad](/reference/macros/rmad)
@ -35,6 +36,11 @@ The annotations plugin provides the following macros:
- [title](/reference/macros/title) - [title](/reference/macros/title)
- [vd](/reference/macros/vd) - [vd](/reference/macros/vd)
The annotations plugin also provides [methods to the Store for adding cutting instructions](#methods)
<Tip> For an in-depth look at how to add cutting instructions to your part, see our [cutlist how-to](/howtos/design/cutlist) </Tip>
## Installation ## Installation
```sh ```sh
@ -54,6 +60,160 @@ import { annotationsPlugin } from '@freesewing/plugin-banner'
import { pluginAnnotations } from '@freesewing/plugin-banner' import { pluginAnnotations } from '@freesewing/plugin-banner'
``` ```
## Methods
### store.cutlist.addCut
The `store.cutlist.addCut()` method will add a set of cutting instructions for the part
#### Signature
```js
store.cutlist.addCut(Object so)
````
Pass an object to the `store.cutlist.addCut` method with any of the following keys; any you don't provide will be filled with the defaults:
| Key | Type | Default | Description |
| :-- | :--- | :------ | :---------- |
| cut | Number\|false | 2 | the number of pieces to cut from the specified material. Pass `false` to clear all cutting instructions for the material |
| material | String | 'fabric' | the translation key of the material to cut from |
| identical | Boolean | false | should even numbers of pieces be cut in the same direction? false for mirrored |
| bias | Boolean | false | should the pieces in these cutting instructions be cut on the bias |
| ignoreOnFold | Boolean | false | should these cutting instructions ignore any cutOnFold information set by the part |
<Note>
<details>
<summary> You can use any `string` you want for your material, but here are some standard ones we have translation for </summary>
<div>
| Key | Translation |
|:--|:--|
| fabric | Main Fabric |
| lining | Lining |
| canvas | Canvas |
| lmhCanavas | Light to Medium Hair Canvas |
| heavyCanvas | Heavyweight Hair Canvas |
| interfacing | Interfacing |
| plastic | Plastic |
| ribbing | Ribbing |
</div>
</details>
</Note>
#### Example
```js
import {pluginCutlist} from '@freesewing/plugin-cutlist'
const part = {
name: 'example.front',
plugins: [pluginCutlist],
draft: ({part, store}) => {
// add instructions to cut two from main fabric
store.cutlist.addCut()
// add instructions to cut four on the biad from lining
store.cutlist.addCut({cut: 4, material: 'lining', bias: true, })
return part
}
}
```
You can also add multiple sets of cutting instructions for the same material
```js
import {pluginCutlist} from '@freesewing/plugin-cutlist'
const part = {
name: 'example.front',
plugins: [pluginCutlist],
draft: ({part, store}) => {
// add instructions to 1 from lining
store.cutlist.addCut({cut: 1, material: 'lining'})
// add instructions to cut 1 on the bias from lining
store.cutlist.addCut({cut: 1, material: 'lining', bias: true, })
return part
}
}
```
### store.cutlist.removeCut
The `store.cutlist.removeCut()` method will remove cutting instructions from the part
#### Signature
```js
store.cutlist.removeCut(String material)
```
#### Example
```js
import {pluginCutlist} from '@freesewing/plugin-cutlist'
const part = {
name: 'example.front',
plugins: [pluginCutlist],
draft: ({part, store}) => {
// remove all cutting instructions for all materials
store.cutlist.removeCut()
// remove cutting instructions for just one material
store.cutlist.removeCut('fabric')
return part
}
}
```
### store.cutlist.setGrain
The `store.cutlist.setGrain()` method will record the angle of the grainline annotation. This method is called internally by [`plugin-grainline`](/reference/plugins/grainline) to store information for cutting layout tools. You shouldn't have to call it, but it's there if you need it.
#### Signature
```js
store.cutlist.setGrain(Number grainAngle)
```
#### Example
```js
import {pluginCutlist} from '@freesewing/plugin-cutlist'
const part = {
name: 'example.front',
plugins: [pluginCutlist],
draft: ({part, store}) => {
// set the grainline angle
store.cutlist.setGrain(0)
return part
}
}
```
### store.cutlist.setCutOnFold
The `store.cutlist.setCutOnFold()` method will record the points that make up the cut on fold line. This method is called internally by [`plugin-cutonfold`](/reference/plugins/cutonfold) to store information for cutting layout tools. You shouldn't have to call it, but it's there if you need it.
#### Signature
```js
store.cutlist.setCutOnFold(Point p1, Point p2)
```
#### Example
```js
import {pluginCutlist} from '@freesewing/plugin-cutlist'
const part = {
name: 'example.front',
plugins: [pluginCutlist],
draft: ({part, points, Point, store}) => {
// set the cut on fold line
points.p1 = new Point(0, 0)
points.p2 = new Point(0, 10)
store.cutlist.setCutOnFold(points.p1, points.p2)
return part
}
}
```
## Notes ## Notes
The annotations plugin is part of our [plugin-bundle](/reference/plugins/bundle) The annotations plugin is part of our [plugin-bundle](/reference/plugins/bundle)

View file

@ -8,20 +8,12 @@ commonly used FreeSewing time plugins in one handy package.
Specifically, loading this plugin will have the same effect as loading these Specifically, loading this plugin will have the same effect as loading these
plugins individually: plugins individually:
- [plugin-banner](/reference/plugins/banner) : Add repeating text to your patterns
- [plugin-bartack](/reference/plugins/bartack) : Add bartacks to your patterns - [plugin-annotations](/reference/plugins/annotations)
- [plugin-buttons](/reference/plugins/buttons) : Add buttons, buttonholes, and snaps to your patterns
- [plugin-cutonfold](/reference/plugins/cutonfold) : Add cut-on-fold indicators to your patterns
- [plugin-dimension](/reference/plugins/dimension) : Add dimensions to your (paperless) patterns
- [plugin-grainline](/reference/plugins/grainline) : Add grainline indicators to your patterns
- [plugin-logo](/reference/plugins/logo) : Add a FreeSewing logo to your patterns
- [plugin-measurements](/reference/plugins/measurements) : Make extra, calculated measurements available to your patterns - [plugin-measurements](/reference/plugins/measurements) : Make extra, calculated measurements available to your patterns
- [plugin-mirror](/reference/plugins/mirror) : Mirror points and paths in your patterns - [plugin-mirror](/reference/plugins/mirror) : Mirror points and paths in your patterns
- [plugin-notches](/reference/plugins/notches) : Add notches to your patterns
- [plugin-scalebox](/reference/plugins/scalebox) : Add scaleboxes to your pattern parts
- [plugin-round](/reference/plugins/round) : Create rounded corners in your patterns - [plugin-round](/reference/plugins/round) : Create rounded corners in your patterns
- [plugin-sprinkle](/reference/plugins/sprinkle) : Add multiple snippets to your patterns - [plugin-sprinkle](/reference/plugins/sprinkle) : Add multiple snippets to your patterns
- [plugin-title](/reference/plugins/title) : Add pretty titles to your pattern parts
## Installation ## Installation

View file

@ -45,7 +45,7 @@
"@freesewing/plugin-bundle": "$$ tag $$" "@freesewing/plugin-bundle": "$$ tag $$"
}, },
"devDependencies": { "devDependencies": {
"@freesewing/plugin-cutlist": "$$ tag $$", "@freesewing/plugin-annotations": "$$ tag $$",
"@freesewing/plugin-flip": "$$ tag $$", "@freesewing/plugin-flip": "$$ tag $$",
"@freesewing/plugin-svgattr": "$$ tag $$", "@freesewing/plugin-svgattr": "$$ tag $$",
"@freesewing/plugin-theme": "$$ tag $$", "@freesewing/plugin-theme": "$$ tag $$",

View file

@ -1,17 +1,14 @@
import { name, version } from '../data.mjs' export const cutlistStores = [
['cutlist.addCut', addCut],
['cutlist.removeCut', removeCut],
['cutlist.setGrain', setGrain],
['cutlist.setCutOnFold', setCutOnFold],
['cutlist.getCutFabrics', getCutFabrics],
]
export const plugin = { export const cutlistHooks = {
name, prePartDraft: [
version, function (pattern) {
store: [
['cutlist.addCut', addCut],
['cutlist.removeCut', removeCut],
['cutlist.setGrain', setGrain],
['cutlist.setCutOnFold', setCutOnFold],
['cutlist.getCutFabrics', getCutFabrics],
],
hooks: {
prePartDraft: (pattern) => {
const injectedPart = pattern.config.inject[pattern.activePart] const injectedPart = pattern.config.inject[pattern.activePart]
if (!injectedPart) return if (!injectedPart) return
@ -19,13 +16,9 @@ export const plugin = {
const injectedCutlist = store.get(['cutlist', injectedPart], {}) const injectedCutlist = store.get(['cutlist', injectedPart], {})
store.set(['cutlist', pattern.activePart], { ...injectedCutlist }) store.set(['cutlist', pattern.activePart], { ...injectedCutlist })
}, },
}, ],
} }
// More specifically named exports
export const cutlistPlugin = plugin
export const pluginCutlist = plugin
/** /**
* Add a set of cutting instructions for the part * Add a set of cutting instructions for the part
* @param {Store} store the Store * @param {Store} store the Store

View file

@ -24,10 +24,8 @@ export const cutonfoldMacros = {
delete points.cutonfoldVia1 delete points.cutonfoldVia1
delete points.cutonfoldVia2 delete points.cutonfoldVia2
delete paths.cutonfoldCutonfold delete paths.cutonfoldCutonfold
// setCutOnFold relies on plugin-cutlist
if (typeof store.cutlist?.setCutOnFold === 'function') { store.cutlist.setCutOnFold(false) // Restore default
store.cutlist.setCutOnFold(false) // Restore default
}
return true return true
} }
so = { so = {
@ -36,10 +34,11 @@ export const cutonfoldMacros = {
prefix: 'cutonfold', prefix: 'cutonfold',
...so, ...so,
} }
if (typeof store.cutlist?.setCutOnFold === 'function') {
store.cutlist.setCutOnFold(so.from, so.to) // store in cutlist
if (so.grainline) store.cutlist.setGrain(so.from.angle(so.to)) store.cutlist.setCutOnFold(so.from, so.to)
} if (so.grainline) store.cutlist.setGrain(so.from.angle(so.to))
if (complete) { if (complete) {
points[so.prefix + 'From'] = so.from.shiftFractionTowards(so.to, so.margin / 100) points[so.prefix + 'From'] = so.from.shiftFractionTowards(so.to, so.margin / 100)
points[so.prefix + 'To'] = so.to.shiftFractionTowards(so.from, so.margin / 100) points[so.prefix + 'To'] = so.to.shiftFractionTowards(so.from, so.margin / 100)

View file

@ -29,10 +29,10 @@ export const grainlineMacros = {
...dflts, ...dflts,
...so, ...so,
} }
// setGrain relies on plugin-cutlist
if (typeof store.cutlist?.setGrain === 'function') { // store in cutlist
store.cutlist.setGrain(so.from.angle(so.to)) store.cutlist.setGrain(so.from.angle(so.to))
}
if (complete) { if (complete) {
points.grainlineFrom = so.from.shiftFractionTowards(so.to, 0.05) points.grainlineFrom = so.from.shiftFractionTowards(so.to, 0.05)
points.grainlineTo = so.to.shiftFractionTowards(so.from, 0.05) points.grainlineTo = so.to.shiftFractionTowards(so.from, 0.05)

View file

@ -8,6 +8,7 @@ import { bannerMacros } from './banner.mjs'
import { bannerboxMacros } from './bannerbox.mjs' import { bannerboxMacros } from './bannerbox.mjs'
import { bartackMacros } from './bartack.mjs' import { bartackMacros } from './bartack.mjs'
import { crossboxMacros } from './crossbox.mjs' import { crossboxMacros } from './crossbox.mjs'
import { cutlistStores, cutlistHooks } from './cutlist.mjs'
import { scaleboxMacros } from './scalebox.mjs' import { scaleboxMacros } from './scalebox.mjs'
import { titleMacros } from './title.mjs' import { titleMacros } from './title.mjs'
// Hooks and Macros // Hooks and Macros
@ -31,6 +32,7 @@ export const plugin = {
...pleatHooks.preRender, ...pleatHooks.preRender,
...sewtogetherHooks.preRender, ...sewtogetherHooks.preRender,
], ],
prePartDraft: [...cutlistHooks.prePartDraft],
}, },
macros: { macros: {
...bannerMacros, ...bannerMacros,
@ -45,6 +47,7 @@ export const plugin = {
...sewtogetherMacros, ...sewtogetherMacros,
...titleMacros, ...titleMacros,
}, },
store: [...cutlistStores],
} }
export const annotationsPlugin = plugin export const annotationsPlugin = plugin

View file

@ -1,6 +1,6 @@
import chai from 'chai' import chai from 'chai'
import { Design } from '@freesewing/core' import { Design } from '@freesewing/core'
import { plugin } from '../src/index.mjs' import { annotationsPlugin } from '../src/index.mjs'
const expect = chai.expect const expect = chai.expect
@ -14,7 +14,7 @@ describe('Cutlist Plugin Tests', () => {
return part return part
}, },
plugins: [plugin], plugins: [annotationsPlugin],
} }
const Test = new Design({ parts: [part] }) const Test = new Design({ parts: [part] })
const pattern = new Test() const pattern = new Test()
@ -23,6 +23,7 @@ describe('Cutlist Plugin Tests', () => {
expect(methods.removeCut).to.be.a('function') expect(methods.removeCut).to.be.a('function')
expect(methods.setGrain).to.be.a('function') expect(methods.setGrain).to.be.a('function')
expect(methods.setCutOnFold).to.be.a('function') expect(methods.setCutOnFold).to.be.a('function')
expect(methods.getCutFabrics).to.be.a('function')
}) })
it('Should handle addCut() with defaults', () => { it('Should handle addCut() with defaults', () => {
@ -33,7 +34,7 @@ describe('Cutlist Plugin Tests', () => {
return part return part
}, },
plugins: [plugin], plugins: [annotationsPlugin],
} }
const Test = new Design({ parts: [part] }) const Test = new Design({ parts: [part] })
const pattern = new Test() const pattern = new Test()
@ -55,7 +56,7 @@ describe('Cutlist Plugin Tests', () => {
return part return part
}, },
plugins: [plugin], plugins: [annotationsPlugin],
} }
const Test = new Design({ parts: [part] }) const Test = new Design({ parts: [part] })
const pattern = new Test() const pattern = new Test()
@ -79,7 +80,7 @@ describe('Cutlist Plugin Tests', () => {
return part return part
}, },
plugins: [plugin], plugins: [annotationsPlugin],
} }
const Test = new Design({ parts: [part] }) const Test = new Design({ parts: [part] })
const pattern = new Test() const pattern = new Test()
@ -97,7 +98,7 @@ describe('Cutlist Plugin Tests', () => {
return part return part
}, },
plugins: [plugin], plugins: [annotationsPlugin],
} }
const Test = new Design({ parts: [part] }) const Test = new Design({ parts: [part] })
const pattern = new Test() const pattern = new Test()
@ -116,7 +117,7 @@ describe('Cutlist Plugin Tests', () => {
return part return part
}, },
plugins: [plugin], plugins: [annotationsPlugin],
} }
const Test = new Design({ parts: [part] }) const Test = new Design({ parts: [part] })
const pattern = new Test() const pattern = new Test()
@ -132,7 +133,7 @@ describe('Cutlist Plugin Tests', () => {
return part return part
}, },
plugins: [plugin], plugins: [annotationsPlugin],
} }
const Test = new Design({ parts: [part] }) const Test = new Design({ parts: [part] })
const pattern = new Test() const pattern = new Test()
@ -149,7 +150,7 @@ describe('Cutlist Plugin Tests', () => {
return part return part
}, },
plugins: [plugin], plugins: [annotationsPlugin],
} }
const Test = new Design({ parts: [part] }) const Test = new Design({ parts: [part] })
const pattern = new Test() const pattern = new Test()
@ -169,7 +170,7 @@ describe('Cutlist Plugin Tests', () => {
return part return part
}, },
plugins: [plugin], plugins: [annotationsPlugin],
} }
const Test = new Design({ parts: [part] }) const Test = new Design({ parts: [part] })
const pattern = new Test() const pattern = new Test()
@ -193,7 +194,7 @@ describe('Cutlist Plugin Tests', () => {
return part return part
}, },
plugins: [plugin], plugins: [annotationsPlugin],
} }
const Test = new Design({ parts: [part] }) const Test = new Design({ parts: [part] })
const pattern = new Test() const pattern = new Test()

View file

@ -4,7 +4,6 @@ import { measurementsPlugin } from '../../plugin-measurements/src/index.mjs'
import { mirrorPlugin } from '../../plugin-mirror/src/index.mjs' import { mirrorPlugin } from '../../plugin-mirror/src/index.mjs'
import { roundPlugin } from '../../plugin-round/src/index.mjs' import { roundPlugin } from '../../plugin-round/src/index.mjs'
import { sprinklePlugin } from '../../plugin-sprinkle/src/index.mjs' import { sprinklePlugin } from '../../plugin-sprinkle/src/index.mjs'
import { pluginCutlist } from '../../plugin-cutlist/src/index.mjs'
import { name, version } from '../data.mjs' import { name, version } from '../data.mjs'
const bundledPlugins = [ const bundledPlugins = [
@ -13,7 +12,6 @@ const bundledPlugins = [
mirrorPlugin, mirrorPlugin,
roundPlugin, roundPlugin,
sprinklePlugin, sprinklePlugin,
pluginCutlist,
] ]
const hooks = {} const hooks = {}

View file

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

View file

@ -1,301 +0,0 @@
![FreeSewing](https://static.freesewing.org/banner.png)
<p align='center'><a
href="https://www.npmjs.com/package/@freesewing/plugin-cutlist"
title="@freesewing/plugin-cutlist on NPM"
><img src="https://img.shields.io/npm/v/@freesewing/plugin-cutlist.svg"
alt="@freesewing/plugin-cutlist on NPM"/>
</a><a
href="https://opensource.org/licenses/MIT"
title="License: MIT"
><img src="https://img.shields.io/npm/l/@freesewing/plugin-cutlist.svg?label=License"
alt="License: MIT"/>
</a><a
href="https://deepscan.io/dashboard#view=project&tid=2114&pid=2993&bid=23256"
title="Code quality on DeepScan"
><img src="https://deepscan.io/api/teams/2114/projects/2993/branches/23256/badge/grade.svg"
alt="Code quality on DeepScan"/>
</a><a
href="https://github.com/freesewing/freesewing/issues?q=is%3Aissue+is%3Aopen+label%3Apkg%3Aplugin-cutlist"
title="Open issues tagged pkg:plugin-cutlist"
><img src="https://img.shields.io/github/issues/freesewing/freesewing/pkg:plugin-cutlist.svg?label=Issues"
alt="Open issues tagged pkg:plugin-cutlist"/>
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-107-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"
title="Follow @freesewing_org on Twitter"
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Follow%20us-blue.svg?logo=twitter&logoColor=white&logoWidth=15"
alt="Follow @freesewing_org on Twitter"/>
</a><a
href="https://chat.freesewing.org"
title="Chat with us on Discord"
><img src="https://img.shields.io/discord/698854858052075530?label=Chat%20on%20Discord"
alt="Chat with us on Discord"/>
</a><a
href="https://freesewing.org/patrons/join"
title="Become a FreeSewing Patron"
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Support%20us-blueviolet.svg?logo=cash-app&logoColor=white&logoWidth=15"
alt="Become a FreeSewing Patron"/>
</a><a
href="https://instagram.com/freesewing_org"
title="Follow @freesewing_org on Twitter"
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Follow%20us-E4405F.svg?logo=instagram&logoColor=white&logoWidth=15"
alt="Follow @freesewing_org on Twitter"/>
</a></p>
# @freesewing/plugin-cutlist
A FreeSewing plugin to store data regarding a pattern&#39;s cutlist
> #### Note: Version 3 is a work in progress
>
> We are working on a new major version (v3) but it is not ready for prime-time.
> For production use, please refer to our v2 packages (the `latest` on NPM)
> or [the `v2` branch in our monorepo](https://github.com/freesewing/freesewing/tree/v2).
>
> We the `main` branch and `next` packages on NPM holds v3 code. But it's alpha for now.
## What am I looking at? 🤔
This repository is our *monorepo* holding all our NPM designs, plugins, other NPM packages, and (web)sites.
This folder holds: @freesewing/plugin-cutlist
If you're not entirely sure what to do or how to start, type this command:
```
npm run tips
```
> If you don't want to set up a dev environment, you can run it in your browser:
>
> [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/#<entire-url-of-your-fork` into a browser
> to start up a browser-based dev environment of your own.
## About FreeSewing 💀
Where the world of makers and developers collide, that's where you'll find FreeSewing.
If you're a maker, checkout [freesewing.org](https://freesewing.org/) where you can generate
our sewing patterns adapted to your measurements.
If you're a developer, our documentation is on [freesewing.dev](https://freesewing.dev/).
Our [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
for parametric design of sewing patterns. But we also provide a range
of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
functionality of the platform.
If you have NodeJS installed, you can try it right now by running:
```bash
npx create-freesewing-pattern
```
Or, consult our getting started guides
for [Linux](https://freesewing.dev/tutorials/getting-started-linux/),
[MacOS](https://freesewing.dev/tutorials/getting-started-mac/),
or [Windows](https://freesewing.dev/tutorials/getting-started-windows/).
We also have a [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) that
walks you through your first parametric design,
and [a friendly community](https://freesewing.org/community/where/) with
people who can help you when you get stuck.
## Support FreeSewing: Become a patron 🥰
FreeSewing is an open source project run by a community,
and financially supported by our patrons.
If you feel what we do is worthwhile, and you can spend a few coind without
hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
## Links 👩‍💻
- 💻 Makers website: [freesewing.org](https://freesewing.org)
- 💻 Developers website: [freesewing.dev](https://freesewing.dev)
- 💬 Chat: On Discord via [discord.freesewing.org](https://discord.freesewing.org/)
- ✅ Todo list/Kanban board: On Github via [todo.freesewing.org](https://todo.freesewing.org/)
- 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org)
- 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
## License: MIT 🤓
© [Joost De Cock](https://github.com/joostdecock).
See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details.
## Where to get help 🤯
Our [chatrooms on Discord](https://chat.freesewing.org/) are the best place to ask questions,
share your feedback, or just hang out.
If you want to report a problem, please [create an issue](https://github.com/freesewing/freesewing/issues/new).
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://adamrtomkins.github.io/"><img src="https://avatars.githubusercontent.com/u/5709603?v=4?s=100" width="100px;" alt="Adam Tomkins"/><br /><sub><b>Adam Tomkins</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=AdamRTomkins" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://polymerisation-des-concepts.fr/"><img src="https://avatars.githubusercontent.com/u/365999?v=4?s=100" width="100px;" alt="Alexandre Ignjatovic"/><br /><sub><b>Alexandre Ignjatovic</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=bankair" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AlfaLyr"><img src="https://avatars.githubusercontent.com/u/39273729?v=4?s=100" width="100px;" alt="AlfaLyr"/><br /><sub><b>AlfaLyr</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=AlfaLyr" title="Code">💻</a> <a href="#plugin-AlfaLyr" title="Plugin/utility libraries">🔌</a> <a href="#design-AlfaLyr" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://thelettereph.com"><img src="https://avatars.githubusercontent.com/u/357684?v=4?s=100" width="100px;" alt="Andrew James"/><br /><sub><b>Andrew James</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=ephphatha" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/annekecaramin"><img src="https://avatars.githubusercontent.com/u/38046191?v=4?s=100" width="100px;" alt="Anneke"/><br /><sub><b>Anneke</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=annekecaramin" title="Documentation">📖</a> <a href="#translation-annekecaramin" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/anniekao"><img src="https://avatars.githubusercontent.com/u/1550506?v=4?s=100" width="100px;" alt="Annie Kao"/><br /><sub><b>Annie Kao</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=anniekao" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Anternative"><img src="https://avatars.githubusercontent.com/u/81079850?v=4?s=100" width="100px;" alt="Anternative"/><br /><sub><b>Anternative</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Anternative" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Quiltmaster"><img src="https://avatars.githubusercontent.com/u/71795777?v=4?s=100" width="100px;" alt="Anthony"/><br /><sub><b>Anthony</b></sub></a><br /><a href="#question-Quiltmaster" title="Answering Questions">💬</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arigrayzel"><img src="https://avatars.githubusercontent.com/u/33040950?v=4?s=100" width="100px;" alt="Ari Grayzel-student"/><br /><sub><b>Ari Grayzel-student</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=arigrayzel" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Bart-PXL"><img src="https://avatars.githubusercontent.com/u/45118788?v=4?s=100" width="100px;" alt="Bart"/><br /><sub><b>Bart</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Bart-PXL" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BenJamesBen"><img src="https://avatars.githubusercontent.com/u/109869956?v=4?s=100" width="100px;" alt="BenJamesBen"/><br /><sub><b>BenJamesBen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=BenJamesBen" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=BenJamesBen" title="Documentation">📖</a> <a href="https://github.com/freesewing/freesewing/issues?q=author%3ABenJamesBen" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/camerondubas"><img src="https://avatars.githubusercontent.com/u/6216460?v=4?s=100" width="100px;" alt="Cameron Dubas"/><br /><sub><b>Cameron Dubas</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=camerondubas" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cabi"><img src="https://avatars.githubusercontent.com/u/2596253?v=4?s=100" width="100px;" alt="Carsten Biebricher"/><br /><sub><b>Carsten Biebricher</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=cabi" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cathyzoller"><img src="https://avatars.githubusercontent.com/u/2120275?v=4?s=100" width="100px;" alt="Cathy Zoller"/><br /><sub><b>Cathy Zoller</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=cathyzoller" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Chantalbijoux"><img src="https://avatars.githubusercontent.com/u/39673694?v=4?s=100" width="100px;" alt="Chantal Lapointe"/><br /><sub><b>Chantal Lapointe</b></sub></a><br /><a href="#translation-Chantalbijoux" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dpiquet"><img src="https://avatars.githubusercontent.com/u/4688628?v=4?s=100" width="100px;" alt="Damien PIQUET"/><br /><sub><b>Damien PIQUET</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=dpiquet" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.darigovresearch.com/"><img src="https://avatars.githubusercontent.com/u/30328618?v=4?s=100" width="100px;" alt="Darigov Research"/><br /><sub><b>Darigov Research</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=darigovresearch" title="Documentation">📖</a> <a href="#ideas-darigovresearch" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/clegganator259"><img src="https://avatars.githubusercontent.com/u/3974250?v=4?s=100" width="100px;" alt="David Clegg"/><br /><sub><b>David Clegg</b></sub></a><br /><a href="#design-clegganator259" title="Design">🎨</a> <a href="https://github.com/freesewing/freesewing/commits?author=clegganator259" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ElenaFdR"><img src="https://avatars.githubusercontent.com/u/5113815?v=4?s=100" width="100px;" alt="Elena FdR"/><br /><sub><b>Elena FdR</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=ElenaFdR" title="Documentation">📖</a> <a href="#blog-ElenaFdR" title="Blogposts">📝</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://emmanuelnyachoke.com/"><img src="https://avatars.githubusercontent.com/u/1908926?v=4?s=100" width="100px;" alt="Emmanuel Nyachoke"/><br /><sub><b>Emmanuel Nyachoke</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=enyachoke" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=enyachoke" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://enochriese.com"><img src="https://avatars.githubusercontent.com/u/5298929?v=4?s=100" width="100px;" alt="Enoch Riese"/><br /><sub><b>Enoch Riese</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=eriese" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/EvEkSwed"><img src="https://avatars.githubusercontent.com/u/39723451?v=4?s=100" width="100px;" alt="EvEkSwed"/><br /><sub><b>EvEkSwed</b></sub></a><br /><a href="#translation-EvEkSwed" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fantastik-Maman"><img src="https://avatars.githubusercontent.com/u/39785382?v=4?s=100" width="100px;" alt="Fantastik-Maman"/><br /><sub><b>Fantastik-Maman</b></sub></a><br /><a href="#translation-Fantastik-Maman" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.forresto.com/"><img src="https://avatars.githubusercontent.com/u/395307?v=4?s=100" width="100px;" alt="Forrest O."/><br /><sub><b>Forrest O.</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=forresto" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fmatray"><img src="https://avatars.githubusercontent.com/u/8267716?v=4?s=100" width="100px;" alt="Frédéric"/><br /><sub><b>Frédéric</b></sub></a><br /><a href="#translation-fmatray" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/glennfmatthews/"><img src="https://avatars.githubusercontent.com/u/5603551?v=4?s=100" width="100px;" alt="Glenn Matthews"/><br /><sub><b>Glenn Matthews</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=glennmatthews" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://greg.technology/"><img src="https://avatars.githubusercontent.com/u/1017304?v=4?s=100" width="100px;" alt="Greg Sadetsky"/><br /><sub><b>Greg Sadetsky</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=gregsadetsky" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://kirby.zone"><img src="https://avatars.githubusercontent.com/u/75245963?v=4?s=100" width="100px;" alt="Igor Couto"/><br /><sub><b>Igor Couto</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3Aiocouto" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://bandism.net/"><img src="https://avatars.githubusercontent.com/u/22633385?v=4?s=100" width="100px;" alt="Ikko Ashimine"/><br /><sub><b>Ikko Ashimine</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=eltociear" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Irapeke"><img src="https://avatars.githubusercontent.com/u/39604334?v=4?s=100" width="100px;" alt="Irapeke"/><br /><sub><b>Irapeke</b></sub></a><br /><a href="#translation-Irapeke" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jsawo"><img src="https://avatars.githubusercontent.com/u/1294706?v=4?s=100" width="100px;" alt="Jacek Sawoszczuk"/><br /><sub><b>Jacek Sawoszczuk</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jsawo" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jgfichte"><img src="https://avatars.githubusercontent.com/u/1787162?v=4?s=100" width="100px;" alt="Jason Williams"/><br /><sub><b>Jason Williams</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jgfichte" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jejacks0n"><img src="https://avatars.githubusercontent.com/u/13765?v=4?s=100" width="100px;" alt="Jeremy Jackson"/><br /><sub><b>Jeremy Jackson</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jejacks0n" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://jeroenhoek.nl"><img src="https://avatars.githubusercontent.com/u/683699?v=4?s=100" width="100px;" alt="Jeroen Hoek"/><br /><sub><b>Jeroen Hoek</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jdhoek" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joeschofield0"><img src="https://avatars.githubusercontent.com/u/47668691?v=4?s=100" width="100px;" alt="Joe Schofield"/><br /><sub><b>Joe Schofield</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=joeschofield0" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Joebidido"><img src="https://avatars.githubusercontent.com/u/39796210?v=4?s=100" width="100px;" alt="Joebidido"/><br /><sub><b>Joebidido</b></sub></a><br /><a href="#translation-Joebidido" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://joost.at/"><img src="https://avatars.githubusercontent.com/u/1708494?v=4?s=100" width="100px;" alt="Joost De Cock"/><br /><sub><b>Joost De Cock</b></sub></a><br /><a href="#maintenance-joostdecock" title="Maintenance">🚧</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joshessman"><img src="https://avatars.githubusercontent.com/u/9941074?v=4?s=100" width="100px;" alt="Josh Essman"/><br /><sub><b>Josh Essman</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=joshessman" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.earth.li/~kake/"><img src="https://avatars.githubusercontent.com/u/1956810?v=4?s=100" width="100px;" alt="Kake"/><br /><sub><b>Kake</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=KakeLP" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/kapunahele"><img src="https://avatars.githubusercontent.com/u/4116963?v=4?s=100" width="100px;" alt="Kapunahele Wong"/><br /><sub><b>Kapunahele Wong</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=kapunahelewong" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/tangerineshark"><img src="https://avatars.githubusercontent.com/u/70777269?v=4?s=100" width="100px;" alt="Karen"/><br /><sub><b>Karen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=tangerineshark" title="Documentation">📖</a> <a href="#eventOrganizing-tangerineshark" title="Event Organizing">📋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mcgnly"><img src="https://avatars.githubusercontent.com/u/5653631?v=4?s=100" width="100px;" alt="Katie McGinley"/><br /><sub><b>Katie McGinley</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=mcgnly" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://www.kieranklaassen.com/"><img src="https://avatars.githubusercontent.com/u/209089?v=4?s=100" width="100px;" alt="Kieran Klaassen"/><br /><sub><b>Kieran Klaassen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=kieranklaassen" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Kittycatou"><img src="https://avatars.githubusercontent.com/u/48165583?v=4?s=100" width="100px;" alt="Kittycatou"/><br /><sub><b>Kittycatou</b></sub></a><br /><a href="#translation-Kittycatou" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.krishoward.org/"><img src="https://avatars.githubusercontent.com/u/5946286?v=4?s=100" width="100px;" alt="Kris"/><br /><sub><b>Kris</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=web-goddess" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kristinruben"><img src="https://avatars.githubusercontent.com/u/17237479?v=4?s=100" width="100px;" alt="Kristin Ruben"/><br /><sub><b>Kristin Ruben</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=kristinruben" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Loudepeuter"><img src="https://avatars.githubusercontent.com/u/38081954?v=4?s=100" width="100px;" alt="Loudepeuter"/><br /><sub><b>Loudepeuter</b></sub></a><br /><a href="#translation-Loudepeuter" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lucibytes"><img src="https://avatars.githubusercontent.com/u/77203781?v=4?s=100" width="100px;" alt="Lucian"/><br /><sub><b>Lucian</b></sub></a><br /><a href="#eventOrganizing-lucibytes" title="Event Organizing">📋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/luizfzs"><img src="https://avatars.githubusercontent.com/u/6039675?v=4?s=100" width="100px;" alt="Luiz Saggioro"/><br /><sub><b>Luiz Saggioro</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=luizfzs" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MA-TATAS"><img src="https://avatars.githubusercontent.com/u/125549564?v=4?s=100" width="100px;" alt="MA-TATAS"/><br /><sub><b>MA-TATAS</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=MA-TATAS" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/manufakturedelweiss"><img src="https://avatars.githubusercontent.com/u/38063391?v=4?s=100" width="100px;" alt="Marcus"/><br /><sub><b>Marcus</b></sub></a><br /><a href="#translation-manufakturedelweiss" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/martintribo"><img src="https://avatars.githubusercontent.com/u/1613442?v=4?s=100" width="100px;" alt="Martin Tribo"/><br /><sub><b>Martin Tribo</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=martintribo" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nadege"><img src="https://avatars.githubusercontent.com/u/3792171?v=4?s=100" width="100px;" alt="Nadege Michel"/><br /><sub><b>Nadege Michel</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nadege" title="Tests">⚠️</a> <a href="https://github.com/freesewing/freesewing/commits?author=nadege" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nataliasayang"><img src="https://avatars.githubusercontent.com/u/48160791?v=4?s=100" width="100px;" alt="Natalia"/><br /><sub><b>Natalia</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nataliasayang" title="Code">💻</a> <a href="#design-nataliasayang" title="Design">🎨</a> <a href="#blog-nataliasayang" title="Blogposts">📝</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://yergler.net/"><img src="https://avatars.githubusercontent.com/u/510875?v=4?s=100" width="100px;" alt="Nathan Yergler"/><br /><sub><b>Nathan Yergler</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nyergler" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nicholasdower"><img src="https://avatars.githubusercontent.com/u/9117775?v=4?s=100" width="100px;" alt="Nick Dower"/><br /><sub><b>Nick Dower</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nicholasdower" title="Documentation">📖</a> <a href="https://github.com/freesewing/freesewing/commits?author=nicholasdower" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/issues?q=author%3Anicholasdower" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nchilada"><img src="https://avatars.githubusercontent.com/u/692925?v=4?s=100" width="100px;" alt="Nikhil Chelliah"/><br /><sub><b>Nikhil Chelliah</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nchilada" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/OysteinHoiby"><img src="https://avatars.githubusercontent.com/u/49735055?v=4?s=100" width="100px;" alt="OysteinHoiby"/><br /><sub><b>OysteinHoiby</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=OysteinHoiby" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://pat.forringer.com/"><img src="https://avatars.githubusercontent.com/u/136456?v=4?s=100" width="100px;" alt="Patrick Forringer"/><br /><sub><b>Patrick Forringer</b></sub></a><br /><a href="#plugin-destos" title="Plugin/utility libraries">🔌</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://pd75.github.io/"><img src="https://avatars.githubusercontent.com/u/10294795?v=4?s=100" width="100px;" alt="Paul"/><br /><sub><b>Paul</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=PD75" title="Documentation">📖</a> <a href="#blog-PD75" title="Blogposts">📝</a> <a href="#translation-PD75" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/phillipthelen"><img src="https://avatars.githubusercontent.com/u/298062?v=4?s=100" width="100px;" alt="Phillip Thelen"/><br /><sub><b>Phillip Thelen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=phillipthelen" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Pixieish"><img src="https://avatars.githubusercontent.com/u/32991415?v=4?s=100" width="100px;" alt="Pixieish"/><br /><sub><b>Pixieish</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Pixieish" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.uza.be/persoon/prof-dr-sorcha-ni-dhubhghaill"><img src="https://avatars.githubusercontent.com/u/30624634?v=4?s=100" width="100px;" alt="Prof. dr. Sorcha Ní Dhubhghaill"/><br /><sub><b>Prof. dr. Sorcha Ní Dhubhghaill</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=sorchanidhubhghaill" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/QuentinFelix"><img src="https://avatars.githubusercontent.com/u/5288091?v=4?s=100" width="100px;" alt="Quentin FELIX"/><br /><sub><b>Quentin FELIX</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=QuentinFelix" title="Code">💻</a> <a href="#design-QuentinFelix" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/RikHekker"><img src="https://avatars.githubusercontent.com/u/31843274?v=4?s=100" width="100px;" alt="Rik Hekker"/><br /><sub><b>Rik Hekker</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3ARikHekker" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://resume.livingston-gray.com/faq.html"><img src="https://avatars.githubusercontent.com/u/6462?v=4?s=100" width="100px;" alt="Sam Livingston-Gray"/><br /><sub><b>Sam Livingston-Gray</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=geeksam" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sannek"><img src="https://avatars.githubusercontent.com/u/17491062?v=4?s=100" width="100px;" alt="Sanne"/><br /><sub><b>Sanne</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=sannek" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=sannek" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Tyrannogina"><img src="https://avatars.githubusercontent.com/u/19556565?v=4?s=100" width="100px;" alt="Sara Latorre"/><br /><sub><b>Sara Latorre</b></sub></a><br /><a href="#translation-Tyrannogina" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SeaZeeZee"><img src="https://avatars.githubusercontent.com/u/86711383?v=4?s=100" width="100px;" alt="SeaZeeZee"/><br /><sub><b>SeaZeeZee</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=SeaZeeZee" title="Documentation">📖</a> <a href="https://github.com/freesewing/freesewing/commits?author=SeaZeeZee" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SimonbJohnson"><img src="https://avatars.githubusercontent.com/u/2110742?v=4?s=100" width="100px;" alt="SimonbJohnson"/><br /><sub><b>SimonbJohnson</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3ASimonbJohnson" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SirCharlotte"><img src="https://avatars.githubusercontent.com/u/63847870?v=4?s=100" width="100px;" alt="SirCharlotte"/><br /><sub><b>SirCharlotte</b></sub></a><br /><a href="#translation-SirCharlotte" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.instagram.com/celine_mge/"><img src="https://avatars.githubusercontent.com/u/57619777?v=4?s=100" width="100px;" alt="Slylele"/><br /><sub><b>Slylele</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Slylele" title="Documentation">📖</a> <a href="#translation-Slylele" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Soazillon"><img src="https://avatars.githubusercontent.com/u/40845940?v=4?s=100" width="100px;" alt="Soazillon"/><br /><sub><b>Soazillon</b></sub></a><br /><a href="#translation-Soazillon" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SoneaTheBest"><img src="https://avatars.githubusercontent.com/u/64635425?v=4?s=100" width="100px;" alt="SoneaTheBest"/><br /><sub><b>SoneaTheBest</b></sub></a><br /><a href="#translation-SoneaTheBest" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://metafly.info/"><img src="https://avatars.githubusercontent.com/u/961256?v=4?s=100" width="100px;" alt="Stefan Sydow"/><br /><sub><b>Stefan Sydow</b></sub></a><br /><a href="#translation-stsydow" title="Translation">🌍</a> <a href="https://github.com/freesewing/freesewing/commits?author=stsydow" title="Documentation">📖</a> <a href="https://github.com/freesewing/freesewing/commits?author=stsydow" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TriploidTree"><img src="https://avatars.githubusercontent.com/u/4170521?v=4?s=100" width="100px;" alt="Tríona"/><br /><sub><b>Tríona</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=TriploidTree" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/theUnmutual"><img src="https://avatars.githubusercontent.com/u/22374635?v=4?s=100" width="100px;" alt="Unmutual"/><br /><sub><b>Unmutual</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=theUnmutual" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/woutervdub"><img src="https://avatars.githubusercontent.com/u/24414629?v=4?s=100" width="100px;" alt="Wouter van Wageningen"/><br /><sub><b>Wouter van Wageningen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=woutervdub" title="Code">💻</a> <a href="#design-woutervdub" title="Design">🎨</a> <a href="#tool-woutervdub" title="Tools">🔧</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/amysews"><img src="https://avatars.githubusercontent.com/u/25280778?v=4?s=100" width="100px;" alt="amysews"/><br /><sub><b>amysews</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=amysews" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/anna-puk"><img src="https://avatars.githubusercontent.com/u/100537439?v=4?s=100" width="100px;" alt="anna-puk"/><br /><sub><b>anna-puk</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=anna-puk" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/beautifulsummermoon"><img src="https://avatars.githubusercontent.com/u/40396388?v=4?s=100" width="100px;" alt="beautifulsummermoon"/><br /><sub><b>beautifulsummermoon</b></sub></a><br /><a href="#translation-beautifulsummermoon" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/berce"><img src="https://avatars.githubusercontent.com/u/10439709?v=4?s=100" width="100px;" alt="berce"/><br /><sub><b>berce</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=berce" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/biou"><img src="https://avatars.githubusercontent.com/u/1340376?v=4?s=100" width="100px;" alt="biou"/><br /><sub><b>biou</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=biou" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bobgeorgethe3rd"><img src="https://avatars.githubusercontent.com/u/16866285?v=4?s=100" width="100px;" alt="bobgeorgethe3rd"/><br /><sub><b>bobgeorgethe3rd</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=bobgeorgethe3rd" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=bobgeorgethe3rd" title="Documentation">📖</a> <a href="#design-bobgeorgethe3rd" title="Design">🎨</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/brmlyklr"><img src="https://avatars.githubusercontent.com/u/22308713?v=4?s=100" width="100px;" alt="brmlyklr"/><br /><sub><b>brmlyklr</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=brmlyklr" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.chrisbarrett.fr"><img src="https://avatars.githubusercontent.com/u/2373249?v=4?s=100" width="100px;" alt="chri5b"/><br /><sub><b>chri5b</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=chri5b" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=chri5b" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dingcycle"><img src="https://avatars.githubusercontent.com/u/1681985?v=4?s=100" width="100px;" alt="dingcycle"/><br /><sub><b>dingcycle</b></sub></a><br /><a href="#translation-dingcycle" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/drowned-in-books"><img src="https://avatars.githubusercontent.com/u/100040772?v=4?s=100" width="100px;" alt="drowned-in-books"/><br /><sub><b>drowned-in-books</b></sub></a><br /><a href="#question-drowned-in-books" title="Answering Questions">💬</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/econo202"><img src="https://avatars.githubusercontent.com/u/34138153?v=4?s=100" width="100px;" alt="econo202"/><br /><sub><b>econo202</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=econo202" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ericamattos"><img src="https://avatars.githubusercontent.com/u/4341417?v=4?s=100" width="100px;" alt="ericamattos"/><br /><sub><b>ericamattos</b></sub></a><br /><a href="#translation-ericamattos" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fightingrabbit"><img src="https://avatars.githubusercontent.com/u/25751445?v=4?s=100" width="100px;" alt="fightingrabbit"/><br /><sub><b>fightingrabbit</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=fightingrabbit" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DocSpencer77"><img src="https://avatars.githubusercontent.com/u/43393580?v=4?s=100" width="100px;" alt="gaylyndie"/><br /><sub><b>gaylyndie</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=DocSpencer77" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/grimlokason"><img src="https://avatars.githubusercontent.com/u/5112238?v=4?s=100" width="100px;" alt="grimlokason"/><br /><sub><b>grimlokason</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=grimlokason" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://weblog.redisdead.net"><img src="https://avatars.githubusercontent.com/u/6494414?v=4?s=100" width="100px;" alt="hellgy"/><br /><sub><b>hellgy</b></sub></a><br /><a href="#design-hellgy" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jackseye"><img src="https://avatars.githubusercontent.com/u/27834526?v=4?s=100" width="100px;" alt="jackseye"/><br /><sub><b>jackseye</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jackseye" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marckiesel"><img src="https://avatars.githubusercontent.com/u/39653780?v=4?s=100" width="100px;" alt="marckiesel"/><br /><sub><b>marckiesel</b></sub></a><br /><a href="#translation-marckiesel" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marpants"><img src="https://avatars.githubusercontent.com/u/61366665?v=4?s=100" width="100px;" alt="marpants"/><br /><sub><b>marpants</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=marpants" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://tech.lgbt/@mergerg"><img src="https://avatars.githubusercontent.com/u/64447714?v=4?s=100" width="100px;" alt="mergerg"/><br /><sub><b>mergerg</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=raphaelsiz" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mesil"><img src="https://avatars.githubusercontent.com/u/14284175?v=4?s=100" width="100px;" alt="mesil"/><br /><sub><b>mesil</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3Amesil" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/starfetch"><img src="https://avatars.githubusercontent.com/u/80041179?v=4?s=100" width="100px;" alt="starfetch"/><br /><sub><b>starfetch</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=starfetch" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=starfetch" title="Documentation">📖</a> <a href="#translation-starfetch" title="Translation">🌍</a> <a href="#design-starfetch" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/timorl"><img src="https://avatars.githubusercontent.com/u/4363804?v=4?s=100" width="100px;" alt="timorl"/><br /><sub><b>timorl</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=timorl" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ttimearl"><img src="https://avatars.githubusercontent.com/u/77916590?v=4?s=100" width="100px;" alt="ttimearl"/><br /><sub><b>ttimearl</b></sub></a><br /><a href="#content-ttimearl" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/chrisgloom"><img src="https://avatars.githubusercontent.com/u/15905991?v=4?s=100" width="100px;" alt="tuesgloomsday"/><br /><sub><b>tuesgloomsday</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=chrisgloom" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/valadaptive"><img src="https://avatars.githubusercontent.com/u/79560998?v=4?s=100" width="100px;" alt="valadaptive"/><br /><sub><b>valadaptive</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=valadaptive" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/viocky"><img src="https://avatars.githubusercontent.com/u/39279173?v=4?s=100" width="100px;" alt="viocky"/><br /><sub><b>viocky</b></sub></a><br /><a href="#translation-viocky" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/woolishboy"><img src="https://avatars.githubusercontent.com/u/57816321?v=4?s=100" width="100px;" alt="woolishboy"/><br /><sub><b>woolishboy</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=woolishboy" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cloutiy"><img src="https://avatars.githubusercontent.com/u/8433147?v=4?s=100" width="100px;" alt="yc"/><br /><sub><b>yc</b></sub></a><br /><a href="#translation-cloutiy" title="Translation">🌍</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!

View file

@ -1,35 +0,0 @@
/* This script will build the package with esbuild */
import esbuild from 'esbuild'
import pkg from './package.json' assert { type: 'json' }
// Create banner based on package info
const banner = `/**
* ${pkg.name} | v${pkg.version}
* ${pkg.description}
* (c) ${new Date().getFullYear()} ${pkg.author}
* @license ${pkg.license}
*/`
// Shared esbuild options
const options = {
banner: { js: banner },
bundle: true,
entryPoints: ['src/index.mjs'],
format: 'esm',
outfile: 'dist/index.mjs',
external: ['@freesewing'],
metafile: process.env.VERBOSE ? true : false,
minify: process.env.NO_MINIFY ? false : true,
sourcemap: true,
}
// Let esbuild generate the build
const build = async () => {
const result = await esbuild.build(options).catch(() => process.exit(1))
if (process.env.VERBOSE) {
const info = await esbuild.analyzeMetafile(result.metafile)
console.log(info)
}
}
build()

View file

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

View file

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

View file

@ -1,6 +0,0 @@
// This file is auto-generated | Any changes you make will be overwritten.
import { plugin } from '../src/index.mjs'
import { sharedPluginTests } from '../../../tests/plugins/shared.mjs'
// Run shared tests
sharedPluginTests(plugin)

View file

@ -3,7 +3,7 @@ import fileSaver from 'file-saver'
import { themePlugin } from '@freesewing/plugin-theme' import { themePlugin } from '@freesewing/plugin-theme'
import { pluginI18n } from '@freesewing/plugin-i18n' import { pluginI18n } from '@freesewing/plugin-i18n'
import { pagesPlugin, fabricPlugin } from '../layout/plugin-layout-part.mjs' import { pagesPlugin, fabricPlugin } from '../layout/plugin-layout-part.mjs'
import { pluginCutlist } from '@freesewing/plugin-cutlist' import { pluginAnnotations } from '@freesewing/plugin-annotations'
import { cutLayoutPlugin } from '../layout/cut/plugin-cut-layout.mjs' import { cutLayoutPlugin } from '../layout/cut/plugin-cut-layout.mjs'
import { fabricSettingsOrDefault } from '../layout/cut/index.mjs' import { fabricSettingsOrDefault } from '../layout/cut/index.mjs'
import { useFabricLength } from '../layout/cut/settings.mjs' import { useFabricLength } from '../layout/cut/settings.mjs'
@ -39,7 +39,7 @@ const themedPattern = (design, gist, overwrite, format, t) => {
// add the theme and translation to the pattern // add the theme and translation to the pattern
pattern.use(themePlugin, { stripped: format !== 'svg', skipGrid: ['pages'] }) pattern.use(themePlugin, { stripped: format !== 'svg', skipGrid: ['pages'] })
pattern.use(pluginI18n, { t }) pattern.use(pluginI18n, { t })
pattern.use(pluginCutlist) pattern.use(pluginAnnotations)
return pattern return pattern
} }

View file

@ -3,7 +3,7 @@ import { CutLayoutSettings } from './settings.mjs'
import { Draft } from '../draft/index.mjs' import { Draft } from '../draft/index.mjs'
import { fabricPlugin } from '../plugin-layout-part.mjs' import { fabricPlugin } from '../plugin-layout-part.mjs'
import { cutLayoutPlugin } from './plugin-cut-layout.mjs' import { cutLayoutPlugin } from './plugin-cut-layout.mjs'
import { pluginCutlist } from '@freesewing/plugin-cutlist' import { pluginAnnotations } from '@freesewing/plugin-annotations'
import { measurementAsMm } from 'shared/utils.mjs' import { measurementAsMm } from 'shared/utils.mjs'
import { useEffect } from 'react' import { useEffect } from 'react'
import get from 'lodash.get' import get from 'lodash.get'
@ -43,8 +43,8 @@ const useFabricDraft = (gist, design, fabricSettings) => {
draft.use(fabricPlugin(layoutSettings)) draft.use(fabricPlugin(layoutSettings))
// add the cutLayout plugin // add the cutLayout plugin
draft.use(cutLayoutPlugin(fabricSettings.activeFabric, fabricSettings.grainDirection)) draft.use(cutLayoutPlugin(fabricSettings.activeFabric, fabricSettings.grainDirection))
// also, pluginCutlist and pluginFlip are needed // also, pluginAnnotations and pluginFlip are needed
draft.use(pluginCutlist) draft.use(pluginAnnotations)
// draft the pattern // draft the pattern
draft.draft() draft.draft()

View file

@ -64,8 +64,7 @@ export const cutLayoutPlugin = function (material, grainAngle) {
part.attributes.remove('transform') part.attributes.remove('transform')
// if they shouldn't be identical, flip every other piece // if they shouldn't be identical, flip every other piece
const flipped = !instruction.identical && c % 2 === 1 if (!instruction.identical && c % 2 === 1) {
if (flipped) {
part.attributes.add( part.attributes.add(
'transform', 'transform',
grainAngle === 90 ? 'scale(-1, 1)' : 'scale(1, -1)' grainAngle === 90 ? 'scale(-1, 1)' : 'scale(1, -1)'
@ -75,7 +74,6 @@ export const cutLayoutPlugin = function (material, grainAngle) {
macro('handleFoldAndGrain', { macro('handleFoldAndGrain', {
partCutlist, partCutlist,
instruction, instruction,
flipped,
}) })
// combine the transforms // combine the transforms
@ -97,7 +95,7 @@ export const cutLayoutPlugin = function (material, grainAngle) {
macros: { macros: {
...pluginMirror.macros, ...pluginMirror.macros,
// handle mirroring on the fold and rotating to sit along the grain or bias // handle mirroring on the fold and rotating to sit along the grain or bias
handleFoldAndGrain: ({ partCutlist, instruction, flipped }, { points, macro }) => { handleFoldAndGrain: ({ partCutlist, instruction }, { points, macro }) => {
// get the grain angle for the part for this set of instructions // get the grain angle for the part for this set of instructions
const grainSpec = partCutlist.grain const grainSpec = partCutlist.grain
? partCutlist.grain + (instruction.bias ? 45 : 0) ? partCutlist.grain + (instruction.bias ? 45 : 0)