feat: Added plugin-export-dxf
This commit is contained in:
parent
3204273717
commit
e134e940e7
11 changed files with 818 additions and 60 deletions
|
@ -1,62 +1,63 @@
|
||||||
aaron: "A FreeSewing pattern for a A-shirt or tank top"
|
aaron: 'A FreeSewing pattern for a A-shirt or tank top'
|
||||||
benjamin: "A FreeSewing pattern for a bow tie"
|
benjamin: 'A FreeSewing pattern for a bow tie'
|
||||||
bent: "A FreeSewing pattern for a menswear body block with a two-part sleeve"
|
bent: 'A FreeSewing pattern for a menswear body block with a two-part sleeve'
|
||||||
breanna: "A FreeSewing pattern for a basic body block for womenswear"
|
breanna: 'A FreeSewing pattern for a basic body block for womenswear'
|
||||||
brian: "A FreeSewing pattern for a basic body block for menswear"
|
brian: 'A FreeSewing pattern for a basic body block for menswear'
|
||||||
bruce: "A FreeSewing pattern for boxer briefs"
|
bruce: 'A FreeSewing pattern for boxer briefs'
|
||||||
carlita: "A FreeSewing pattern for Sherlock Holmes cosplay; Or just a nice long coat"
|
carlita: 'A FreeSewing pattern for Sherlock Holmes cosplay; Or just a nice long coat'
|
||||||
carlton: "A FreeSewing pattern for Sherlock Holmes cosplay; Or just a nice long coat"
|
carlton: 'A FreeSewing pattern for Sherlock Holmes cosplay; Or just a nice long coat'
|
||||||
cathrin: "A FreeSewing pattern for a underbust corset / waist trainer"
|
cathrin: 'A FreeSewing pattern for a underbust corset / waist trainer'
|
||||||
components: "A collection of React components for FreeSewing web UIs"
|
components: 'A collection of React components for FreeSewing web UIs'
|
||||||
core: "A library for creating made-to-measure sewing patterns"
|
core: 'A library for creating made-to-measure sewing patterns'
|
||||||
create-freesewing-pattern: "Initializer package for FreeSewing patterns: npm init FreeSewing-pattern"
|
create-freesewing-pattern: 'Initializer package for FreeSewing patterns: npm init FreeSewing-pattern'
|
||||||
css-theme: "A CSS theme for FreeSewing web UIs"
|
css-theme: 'A CSS theme for FreeSewing web UIs'
|
||||||
diana: "A FreeSewing pattern for a top with a draped neck"
|
diana: 'A FreeSewing pattern for a top with a draped neck'
|
||||||
examples: "A FreeSewing pattern holding examples for our documentation"
|
examples: 'A FreeSewing pattern holding examples for our documentation'
|
||||||
florent: "A FreeSewing pattern for a flat cap"
|
florent: 'A FreeSewing pattern for a flat cap'
|
||||||
fu: "A FreeSewing pattern for a face mask"
|
fu: 'A FreeSewing pattern for a face mask'
|
||||||
gatsby-remark-jargon: "A gatsby-transformer-remark sub-plugin for jargon terms"
|
gatsby-remark-jargon: 'A gatsby-transformer-remark sub-plugin for jargon terms'
|
||||||
holmes: "A FreeSewing pattern for a Sherlock Holmes hat"
|
holmes: 'A FreeSewing pattern for a Sherlock Holmes hat'
|
||||||
huey: "A FreeSewing pattern for a zip-up hoodie"
|
huey: 'A FreeSewing pattern for a zip-up hoodie'
|
||||||
hugo: "A FreeSewing pattern for a hooded jumper with raglan sleeves"
|
hugo: 'A FreeSewing pattern for a hooded jumper with raglan sleeves'
|
||||||
i18n: "Translations for the FreeSewing project"
|
i18n: 'Translations for the FreeSewing project'
|
||||||
jaeger: "A FreeSewing pattern for a sport coat style jacket"
|
jaeger: 'A FreeSewing pattern for a sport coat style jacket'
|
||||||
models: "Body measurements data for a range of default sizes"
|
models: 'Body measurements data for a range of default sizes'
|
||||||
mui-theme: "A Material-UI theme for FreeSewing web UIs"
|
mui-theme: 'A Material-UI theme for FreeSewing web UIs'
|
||||||
pattern-info: "Information about available freesewing patterns"
|
pattern-info: 'Information about available freesewing patterns'
|
||||||
penelope: "A FreeSewing pattern for a pencil skirt"
|
penelope: 'A FreeSewing pattern for a pencil skirt'
|
||||||
plugin-banner: "A FreeSewing plugin to repeat text on a path"
|
plugin-banner: 'A FreeSewing plugin to repeat text on a path'
|
||||||
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-buttons: "A FreeSewing plugin that provides button and buttonhole snippets"
|
plugin-buttons: 'A FreeSewing plugin that provides button and buttonhole snippets'
|
||||||
plugin-cutonfold: "A FreeSewing plugin to add cut-on-fold indicators on your patterns"
|
plugin-cutonfold: 'A FreeSewing plugin to add cut-on-fold indicators on your patterns'
|
||||||
plugin-debug: "A FreeSewing plugin to log debug info to your browser console"
|
plugin-debug: 'A FreeSewing plugin to log debug info to your browser console'
|
||||||
plugin-designer: "A FreeSewing plugin to facilitate pattern design"
|
plugin-designer: 'A FreeSewing plugin to facilitate pattern design'
|
||||||
plugin-dimension: "A FreeSewing plugin to add dimensions to your (paperless) pattern"
|
plugin-dimension: 'A FreeSewing plugin to add dimensions to your (paperless) pattern'
|
||||||
plugin-flip: "A FreeSewing plugin to flip parts horizontally"
|
plugin-export-dxf: 'A FreeSewing plugin to export your pattern as DXF-ASTM'
|
||||||
plugin-gore: "A FreeSewing plugin to generate gores for a semi-sphere or dome"
|
plugin-flip: 'A FreeSewing plugin to flip parts horizontally'
|
||||||
plugin-grainline: "A FreeSewing plugin to add grainline indicators on your patterns"
|
plugin-gore: 'A FreeSewing plugin to generate gores for a semi-sphere or dome'
|
||||||
plugin-i18n: "A FreeSewing plugin for pattern translation"
|
plugin-grainline: 'A FreeSewing plugin to add grainline indicators on your patterns'
|
||||||
plugin-logo: "A FreeSewing plugin to add our logo to your patterns"
|
plugin-i18n: 'A FreeSewing plugin for pattern translation'
|
||||||
plugin-round: "A FreeSewing plugin to round corners"
|
plugin-logo: 'A FreeSewing plugin to add our logo to your patterns'
|
||||||
plugin-scalebox: "A FreeSewing plugin to add a scalebox to your pattern"
|
plugin-round: 'A FreeSewing plugin to round corners'
|
||||||
plugin-sprinkle: "A FreeSewing plugin to bulk-add snippets to your pattern"
|
plugin-scalebox: 'A FreeSewing plugin to add a scalebox to your pattern'
|
||||||
plugin-svgattr: "A FreeSewing plugin to set SVG attributes"
|
plugin-sprinkle: 'A FreeSewing plugin to bulk-add snippets to your pattern'
|
||||||
plugin-theme: "A FreeSewing plugin that provides a default theme"
|
plugin-svgattr: 'A FreeSewing plugin to set SVG attributes'
|
||||||
plugin-title: "A FreeSewing plugin to add a title to your pattern parts"
|
plugin-theme: 'A FreeSewing plugin that provides a default theme'
|
||||||
plugin-validate: "A FreeSewing plugin that validates aspects of your code"
|
plugin-title: 'A FreeSewing plugin to add a title to your pattern parts'
|
||||||
|
plugin-validate: 'A FreeSewing plugin that validates aspects of your code'
|
||||||
prettier-config: "FreeSewing's shared configuration for prettier"
|
prettier-config: "FreeSewing's shared configuration for prettier"
|
||||||
remark-jargon: "A Remark plugin for jargon terms"
|
remark-jargon: 'A Remark plugin for jargon terms'
|
||||||
rendertest: "A FreeSewing pattern to test (y)our render engine our CSS"
|
rendertest: 'A FreeSewing pattern to test (y)our render engine our CSS'
|
||||||
sandy: "A FreeSewing pattern for a circle skirt"
|
sandy: 'A FreeSewing pattern for a circle skirt'
|
||||||
shin: "A FreeSewing pattern for swim trunks"
|
shin: 'A FreeSewing pattern for swim trunks'
|
||||||
simon: "A FreeSewing pattern for a button down shirt"
|
simon: 'A FreeSewing pattern for a button down shirt'
|
||||||
simone: "A FreeSewing pattern for a button down shirt (Simone = Simon for people with breasts)"
|
simone: 'A FreeSewing pattern for a button down shirt (Simone = Simon for people with breasts)'
|
||||||
sven: "A FreeSewing pattern for a straightforward sweater"
|
sven: 'A FreeSewing pattern for a straightforward sweater'
|
||||||
tamiko: "A FreeSewing pattern for a zero-waste top"
|
tamiko: 'A FreeSewing pattern for a zero-waste top'
|
||||||
theo: "A FreeSewing pattern for classic trousers"
|
theo: 'A FreeSewing pattern for classic trousers'
|
||||||
trayvon: "A FreeSewing pattern for a tie"
|
trayvon: 'A FreeSewing pattern for a tie'
|
||||||
tutorial: "A FreeSewing pattern for a baby bib that's used in our tutorial"
|
tutorial: "A FreeSewing pattern for a baby bib that's used in our tutorial"
|
||||||
utils: "A collection of utilities shared across freesewing frontend projects"
|
utils: 'A collection of utilities shared across freesewing frontend projects'
|
||||||
wahid: "A FreeSewing pattern for a classic fitted waistcoat"
|
wahid: 'A FreeSewing pattern for a classic fitted waistcoat'
|
||||||
waralee: "A FreeSewing pattern for wrap pants"
|
waralee: 'A FreeSewing pattern for wrap pants'
|
||||||
|
|
108
packages/plugin-export-dxf/CHANGELOG.md
Normal file
108
packages/plugin-export-dxf/CHANGELOG.md
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
# Change log for: @freesewing/plugin-export-dxf
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.5.0 (2020-04-05)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.4.6 (2020-03-23)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.4.5 (2020-03-19)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.4.4 (2020-03-15)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.4.3 (2020-03-12)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.4.2 (2020-03-08)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.4.1 (2020-03-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.4.0 (2020-02-29)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.3.0 (2020-02-23)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.2.0 (2020-02-22)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.1.9 (2020-01-18)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.1.8 (2019-12-16)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.1.7 (2019-12-15)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.1.6 (2019-11-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.1.5 (2019-11-19)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.1.4 (2019-11-01)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.1.3 (2019-10-18)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.1.2 (2019-10-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.1.1 (2019-10-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.1.0 (2019-10-06)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.0.4 (2019-09-27)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.0.3 (2019-09-15)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.0.2 (2019-09-06)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.0.1 (2019-09-01)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package plugin-export-dxf
|
||||||
|
|
||||||
|
## 2.0.0 (2019-08-25)
|
||||||
|
|
||||||
|
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.
|
185
packages/plugin-export-dxf/README.md
Normal file
185
packages/plugin-export-dxf/README.md
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|

|
||||||
|
|
||||||
|
<p align='center'><a
|
||||||
|
href="https://www.npmjs.com/package/@freesewing/plugin-export-dxf"
|
||||||
|
title="@freesewing/plugin-export-dxf on NPM"
|
||||||
|
><img src="https://img.shields.io/npm/v/@freesewing/plugin-export-dxf.svg"
|
||||||
|
alt="@freesewing/plugin-export-dxf on NPM"/>
|
||||||
|
</a><a
|
||||||
|
href="https://opensource.org/licenses/MIT"
|
||||||
|
title="License: MIT"
|
||||||
|
><img src="https://img.shields.io/npm/l/@freesewing/plugin-export-dxf.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-export-dxf"
|
||||||
|
title="Open issues tagged pkg:plugin-export-dxf"
|
||||||
|
><img src="https://img.shields.io/github/issues/freesewing/freesewing/pkg:plugin-export-dxf.svg?label=Issues"
|
||||||
|
alt="Open issues tagged pkg:plugin-export-dxf"/>
|
||||||
|
</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://gitter.im/freesewing/chat"
|
||||||
|
title="Chat with us on Gitter"
|
||||||
|
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Chat%20with%20us-CA0547.svg?logo=gitter&logoColor=white&logoWidth=15"
|
||||||
|
alt="Chat with us on Gitter"/>
|
||||||
|
</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>
|
||||||
|
|
||||||
|
## What am I looking at? 🤔
|
||||||
|
|
||||||
|
This repository is our _monorepo_ holding [all our NPM packages](https://www.npmjs.com/search?q=keywords:freesewing).
|
||||||
|
This folder holds **@freesewing/plugin-export-dxf**
|
||||||
|
|
||||||
|
A FreeSewing plugin to export your pattern as DXF-ASTM
|
||||||
|
|
||||||
|
## About
|
||||||
|
|
||||||
|
This plugin adds the ability to export patterns to DXF-ASTM.
|
||||||
|
|
||||||
|
DXF (Drawing interchange format) is a file format developed by Autodesk
|
||||||
|
(of AutoCAD® fame).
|
||||||
|
The DXF-ASTM variety is a subset of the format, specifically targetted
|
||||||
|
at the garment industry.
|
||||||
|
|
||||||
|
ASTM is the _American Society for Testing and Materials_ — a standards body —
|
||||||
|
that published the format.
|
||||||
|
DXF-ASTM is the successor of DXF-AAMA which was developed by the _American
|
||||||
|
Apparel Manufacturers Association_ which reveals the origins of the file format.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Instantiate your pattern, and use the plugin.
|
||||||
|
It will add the `exportDxf()` method to the pattern object.
|
||||||
|
This method will return the DXF-ASTM output.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const models import '@freesewing/models'
|
||||||
|
const Aaron import '@freesewing/aaron'
|
||||||
|
const exportDxfPlugin = import '@freesewing/plugin-export-dxf'
|
||||||
|
|
||||||
|
const settings = {
|
||||||
|
// Make sure to set complete to false
|
||||||
|
complete: false,
|
||||||
|
measurements: models.withoutBreasts.size42
|
||||||
|
}
|
||||||
|
|
||||||
|
let dxf = new Aaron(settings)
|
||||||
|
.use(exportDxfPlugin)
|
||||||
|
.draft()
|
||||||
|
.exportDxf()
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
This plugin takes a configuration object as a second parameter to the
|
||||||
|
`pattern.use()` method.
|
||||||
|
|
||||||
|
### Precision
|
||||||
|
|
||||||
|
The precision property determines the length of the line segments used
|
||||||
|
to approximate curves. The generated DXF-ASTM output will only contain
|
||||||
|
straight lines, so curves will be approximated wiht lines segments.
|
||||||
|
|
||||||
|
The `precision` sets the length of those segments in mm.
|
||||||
|
In the example below, the `precision` is set to `25` resulting in
|
||||||
|
the use of line segments 25mm (1 inch) to approximate the curve.
|
||||||
|
|
||||||
|
```js
|
||||||
|
let config = {
|
||||||
|
precision: 25
|
||||||
|
}
|
||||||
|
|
||||||
|
let dxf = new Aaron(settings).use(exportDxfPlugin, config)
|
||||||
|
```
|
||||||
|
|
||||||
|
The default `precision` is `1`, giving you 1mm long line segments
|
||||||
|
to approximate curves.
|
||||||
|
|
||||||
|
## Reasons to use this plugin
|
||||||
|
|
||||||
|
This plugin can export your pattern to DXF-ASTM so you can import it to
|
||||||
|
your 3D software of choice.
|
||||||
|
|
||||||
|
## Reasons to not use this plugin
|
||||||
|
|
||||||
|
### Because DXF is inferior to SVG in every way
|
||||||
|
|
||||||
|
DXF (and DXF-AAMA and DXF-ASTM with it) are rooted in the world of industrial
|
||||||
|
manufacturing. And it shows.
|
||||||
|
|
||||||
|
Nowadays, it's easy to think of the DXF file format as a bit of an embarassment.
|
||||||
|
But it is deliberatly kept dumb so that old industrial CNC milling machines,
|
||||||
|
plotters, laster cutters and whatnot, can handle the format.
|
||||||
|
|
||||||
|
### Because this plugin does not implement all of DXF
|
||||||
|
|
||||||
|
This plugin does the minimum to allow export of FreeSewing patterns into
|
||||||
|
3D garment tools. It expexts the input pattern to only include the outlines.
|
||||||
|
|
||||||
|
That means, no seam allowance, or titles, no notches, and so on.
|
||||||
|
|
||||||
|
## About FreeSewing 💀
|
||||||
|
|
||||||
|
Where the world of makers and developers collide, that's where you'll find FreeSewing.
|
||||||
|
|
||||||
|
Our [core library](https://freesewing.dev/reference/api/) is a _batteries-included_ toolbox
|
||||||
|
for parametric design of sewing patterns. It's a modular system (check our list
|
||||||
|
of [plugins](https://freesewing.dev/reference/plugins/) and getting started is as simple as:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm init freesewing-pattern
|
||||||
|
```
|
||||||
|
|
||||||
|
The [getting started](https://freesewing.dev/guides/getting-started/) section on [freesewing.dev](https://freesewing.dev/) is a good
|
||||||
|
entrypoint to our documentation, but you'll find a lot more there, including
|
||||||
|
our [API reference](https://freesewing.dev/reference/api/),
|
||||||
|
as well as [our turorial](https://freesewing.dev/tutorials/pattern-design/),
|
||||||
|
and [howtos](https://freesewing.dev/howtos/).
|
||||||
|
|
||||||
|
If you're a maker, checkout [freesewing.org](https://freesewing/) where you can generate
|
||||||
|
our sewing patterns adapted to your measurements.
|
||||||
|
|
||||||
|
## Support FreeSewing: Become a patron 🥰
|
||||||
|
|
||||||
|
FreeSewing is an open source project run by a community,
|
||||||
|
and financially supported by our patrons.
|
||||||
|
|
||||||
|
If you feel what we do is worthwhile, you too
|
||||||
|
should [become a patron](https://freesewing.org/patrons/join).
|
||||||
|
|
||||||
|
## Links 👩💻
|
||||||
|
|
||||||
|
- 💻 Makers website: [freesewing.org](https://freesewing.org)
|
||||||
|
- 💻 Developers website: [freesewing.dev](https://freesewing.dev)
|
||||||
|
- 💬 Chat: [gitter.im/freesewing](https://gitter.im/freesewing/chat)
|
||||||
|
- 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org)
|
||||||
|
- 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
|
||||||
|
|
||||||
|
## License: MIT 🤓
|
||||||
|
|
||||||
|
© [Joost De Cock](https://github.com/joostdecock).
|
||||||
|
See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details.
|
||||||
|
|
||||||
|
## Where to get help 🤯
|
||||||
|
|
||||||
|
Our [chatroom on Gitter](https://gitter.im/freesewing/chat) is the best place to ask questions,
|
||||||
|
share your feedback, or just hang out.
|
||||||
|
|
||||||
|
If you want to report a problem, please [create an issue](https://github.com/freesewing/freesewing/issues/new).
|
85
packages/plugin-export-dxf/info.md
Normal file
85
packages/plugin-export-dxf/info.md
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
## About
|
||||||
|
|
||||||
|
This plugin adds the ability to export patterns to DXF-ASTM.
|
||||||
|
|
||||||
|
DXF (Drawing interchange format) is a file format developed by Autodesk
|
||||||
|
(of AutoCAD® fame).
|
||||||
|
The DXF-ASTM variety is a subset of the format, specifically targetted
|
||||||
|
at the garment industry.
|
||||||
|
|
||||||
|
ASTM is the _American Society for Testing and Materials_ — a standards body —
|
||||||
|
that published the format.
|
||||||
|
DXF-ASTM is the successor of DXF-AAMA which was developed by the _American
|
||||||
|
Apparel Manufacturers Association_ which reveals the origins of the file format.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Instantiate your pattern, and use the plugin.
|
||||||
|
It will add the `exportDxf()` method to the pattern object.
|
||||||
|
This method will return the DXF-ASTM output.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const models import '@freesewing/models'
|
||||||
|
const Aaron import '@freesewing/aaron'
|
||||||
|
const exportDxfPlugin = import '@freesewing/plugin-export-dxf'
|
||||||
|
|
||||||
|
const settings = {
|
||||||
|
// Make sure to set complete to false
|
||||||
|
complete: false,
|
||||||
|
measurements: models.withoutBreasts.size42
|
||||||
|
}
|
||||||
|
|
||||||
|
let dxf = new Aaron(settings)
|
||||||
|
.use(exportDxfPlugin)
|
||||||
|
.draft()
|
||||||
|
.exportDxf()
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
This plugin takes a configuration object as a second parameter to the
|
||||||
|
`pattern.use()` method.
|
||||||
|
|
||||||
|
### Precision
|
||||||
|
|
||||||
|
The precision property determines the length of the line segments used
|
||||||
|
to approximate curves. The generated DXF-ASTM output will only contain
|
||||||
|
straight lines, so curves will be approximated wiht lines segments.
|
||||||
|
|
||||||
|
The `precision` sets the length of those segments in mm.
|
||||||
|
In the example below, the `precision` is set to `25` resulting in
|
||||||
|
the use of line segments 25mm (1 inch) to approximate the curve.
|
||||||
|
|
||||||
|
```js
|
||||||
|
let config = {
|
||||||
|
precision: 25
|
||||||
|
}
|
||||||
|
|
||||||
|
let dxf = new Aaron(settings).use(exportDxfPlugin, config)
|
||||||
|
```
|
||||||
|
|
||||||
|
The default `precision` is `1`, giving you 1mm long line segments
|
||||||
|
to approximate curves.
|
||||||
|
|
||||||
|
## Reasons to use this plugin
|
||||||
|
|
||||||
|
This plugin can export your pattern to DXF-ASTM so you can import it to
|
||||||
|
your 3D software of choice.
|
||||||
|
|
||||||
|
## Reasons to not use this plugin
|
||||||
|
|
||||||
|
### Because DXF is inferior to SVG in every way
|
||||||
|
|
||||||
|
DXF (and DXF-AAMA and DXF-ASTM with it) are rooted in the world of industrial
|
||||||
|
manufacturing. And it shows.
|
||||||
|
|
||||||
|
Nowadays, it's easy to think of the DXF file format as a bit of an embarassment.
|
||||||
|
But it is deliberatly kept dumb so that old industrial CNC milling machines,
|
||||||
|
plotters, laster cutters and whatnot, can handle the format.
|
||||||
|
|
||||||
|
### Because this plugin does not implement all of DXF
|
||||||
|
|
||||||
|
This plugin does the minimum to allow export of FreeSewing patterns into
|
||||||
|
3D garment tools. It expexts the input pattern to only include the outlines.
|
||||||
|
|
||||||
|
That means, no seam allowance, or titles, no notches, and so on.
|
52
packages/plugin-export-dxf/package.json
Normal file
52
packages/plugin-export-dxf/package.json
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
{
|
||||||
|
"name": "@freesewing/plugin-export-dxf",
|
||||||
|
"version": "2.5.0",
|
||||||
|
"description": "A FreeSewing plugin to export your pattern as DXF-ASTM",
|
||||||
|
"author": "Joost De Cock <joost@decock.org> (https://github.com/joostdecock)",
|
||||||
|
"homepage": "https://freesewing.org/",
|
||||||
|
"repository": "github:freesewing/freesewing",
|
||||||
|
"license": "MIT",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/freesewing/freesewing/issues"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"freesewing",
|
||||||
|
"plugin",
|
||||||
|
"sewing pattern",
|
||||||
|
"sewing",
|
||||||
|
"design",
|
||||||
|
"parametric design",
|
||||||
|
"made to measure",
|
||||||
|
"diy",
|
||||||
|
"fashion"
|
||||||
|
],
|
||||||
|
"main": "dist/index.js",
|
||||||
|
"module": "dist/index.mjs",
|
||||||
|
"scripts": {
|
||||||
|
"clean": "rimraf dist",
|
||||||
|
"build": "npm run clean && rollup -c",
|
||||||
|
"test": "echo \"plugin-export-dxf: No tests configured. Perhaps you'd like to do this?\" && exit 0",
|
||||||
|
"pubtest": "npm publish --registry http://localhost:6662",
|
||||||
|
"pubforce": "npm publish",
|
||||||
|
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
|
||||||
|
"start": "rollup -c -w"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@freesewing/core": "^2.5.0"
|
||||||
|
},
|
||||||
|
"dependencies": {},
|
||||||
|
"devDependencies": {},
|
||||||
|
"files": [
|
||||||
|
"dist/*",
|
||||||
|
"README.md",
|
||||||
|
"package.json"
|
||||||
|
],
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public",
|
||||||
|
"tag": "latest"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8.0.0",
|
||||||
|
"npm": ">=5"
|
||||||
|
}
|
||||||
|
}
|
41
packages/plugin-export-dxf/rollup.config.js
Normal file
41
packages/plugin-export-dxf/rollup.config.js
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
import babel from 'rollup-plugin-babel'
|
||||||
|
import resolve from 'rollup-plugin-node-resolve'
|
||||||
|
import commonjs from 'rollup-plugin-commonjs'
|
||||||
|
import json from 'rollup-plugin-json'
|
||||||
|
import minify from 'rollup-plugin-babel-minify'
|
||||||
|
import peerDepsExternal from 'rollup-plugin-peer-deps-external'
|
||||||
|
import { name, version, description, author, license, main, module } from './package.json'
|
||||||
|
|
||||||
|
const output = [
|
||||||
|
{
|
||||||
|
file: main,
|
||||||
|
format: 'cjs',
|
||||||
|
sourcemap: true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
if (typeof module !== 'undefined')
|
||||||
|
output.push({
|
||||||
|
file: module,
|
||||||
|
format: 'es',
|
||||||
|
sourcemap: true
|
||||||
|
})
|
||||||
|
|
||||||
|
export default {
|
||||||
|
input: 'src/index.js',
|
||||||
|
output,
|
||||||
|
plugins: [
|
||||||
|
peerDepsExternal(),
|
||||||
|
resolve({ modulesOnly: true }),
|
||||||
|
commonjs(),
|
||||||
|
json(),
|
||||||
|
babel({
|
||||||
|
exclude: 'node_modules/**',
|
||||||
|
plugins: ['@babel/plugin-proposal-object-rest-spread']
|
||||||
|
}),
|
||||||
|
minify({
|
||||||
|
comments: false,
|
||||||
|
sourceMap: true,
|
||||||
|
banner: `/**\n * ${name} | v${version}\n * ${description}\n * (c) ${new Date().getFullYear()} ${author}\n * @license ${license}\n */`
|
||||||
|
})
|
||||||
|
]
|
||||||
|
}
|
243
packages/plugin-export-dxf/src/dxf.js
Normal file
243
packages/plugin-export-dxf/src/dxf.js
Normal file
|
@ -0,0 +1,243 @@
|
||||||
|
import { name, version, description, author, license } from '../package.json'
|
||||||
|
|
||||||
|
function Dxf(config) {
|
||||||
|
this.config = config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Round to 2 decimals because DXF is stupid
|
||||||
|
Dxf.prototype.round = function (val) {
|
||||||
|
return Math.round(val * 100) / 100
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns DXF code for optional banner */
|
||||||
|
Dxf.prototype.banner = function (pattern) {
|
||||||
|
return `999
|
||||||
|
${name.slice(1)} | v${version}
|
||||||
|
999
|
||||||
|
${description}
|
||||||
|
999
|
||||||
|
(c) ${new Date().getFullYear()} ${author}
|
||||||
|
999
|
||||||
|
License: ${license}
|
||||||
|
999
|
||||||
|
Pattern: ${pattern.config.name} | v${pattern.config.version}
|
||||||
|
999
|
||||||
|
Export date: ${new Date().toISOString()}`
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns DXF code for tables */
|
||||||
|
Dxf.prototype.tables = function (tables) {
|
||||||
|
let dxf = `
|
||||||
|
0
|
||||||
|
SECTION
|
||||||
|
2
|
||||||
|
TABLES`
|
||||||
|
for (let lineType of tables.lineTypes)
|
||||||
|
dxf += `
|
||||||
|
0
|
||||||
|
TABLE
|
||||||
|
2
|
||||||
|
LTYPE
|
||||||
|
0
|
||||||
|
LTYPE
|
||||||
|
2
|
||||||
|
${lineType.name}
|
||||||
|
3
|
||||||
|
${lineType.description}
|
||||||
|
72
|
||||||
|
65
|
||||||
|
73
|
||||||
|
0
|
||||||
|
40
|
||||||
|
0.00
|
||||||
|
0
|
||||||
|
ENDTAB`
|
||||||
|
for (let layer of tables.layers)
|
||||||
|
dxf += `
|
||||||
|
0
|
||||||
|
TABLE
|
||||||
|
2
|
||||||
|
LAYER
|
||||||
|
0
|
||||||
|
LAYER
|
||||||
|
2
|
||||||
|
${layer.name}
|
||||||
|
62
|
||||||
|
${layer.color}
|
||||||
|
6
|
||||||
|
${layer.lineType}
|
||||||
|
0
|
||||||
|
ENDTAB`
|
||||||
|
dxf += `
|
||||||
|
0
|
||||||
|
ENDSEC`
|
||||||
|
|
||||||
|
return dxf
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns DXF code to close/end a DXF file */
|
||||||
|
Dxf.prototype.footer = function () {
|
||||||
|
return `
|
||||||
|
0
|
||||||
|
EOF
|
||||||
|
`
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns DXF code for a line */
|
||||||
|
Dxf.prototype.line = function (to, layer) {
|
||||||
|
return `
|
||||||
|
0
|
||||||
|
VERTEX
|
||||||
|
8
|
||||||
|
${layer}
|
||||||
|
10
|
||||||
|
${this.round(to.x)}
|
||||||
|
20
|
||||||
|
${this.round(to.y)}`
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns DXF code for a curve */
|
||||||
|
Dxf.prototype.curve = function (from, cp1, cp2, to, layer, part) {
|
||||||
|
let { Path } = part.shorthand()
|
||||||
|
let path = new Path().move(from).curve(cp1, cp2, to)
|
||||||
|
let steps = Math.floor(path.length() / this.config.precision)
|
||||||
|
let dxf, current
|
||||||
|
for (let i = 1; i <= steps; i++) {
|
||||||
|
current = path.shiftAlong(i * this.config.precision)
|
||||||
|
dxf += this.line(current, layer)
|
||||||
|
}
|
||||||
|
if (current.dist(to) > 0.1) dxf += this.line(to, layer)
|
||||||
|
|
||||||
|
return dxf
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns DXF code for a Path object */
|
||||||
|
Dxf.prototype.path = function (path, layer, part) {
|
||||||
|
let dxf = `
|
||||||
|
0
|
||||||
|
POLYLINE
|
||||||
|
8
|
||||||
|
${layer}
|
||||||
|
70
|
||||||
|
1`
|
||||||
|
let current, start
|
||||||
|
for (let op of path.ops) {
|
||||||
|
switch (op.type) {
|
||||||
|
case 'move':
|
||||||
|
start = op.to
|
||||||
|
dxf += this.line(op.to, layer)
|
||||||
|
break
|
||||||
|
case 'line':
|
||||||
|
dxf += this.line(op.to, layer)
|
||||||
|
break
|
||||||
|
case 'curve':
|
||||||
|
dxf += this.curve(current, op.cp1, op.cp2, op.to, layer, part)
|
||||||
|
break
|
||||||
|
case 'close':
|
||||||
|
dxf += this.line(start, layer)
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
throw new Error(`Unsupported path operation: ${op.type}`)
|
||||||
|
}
|
||||||
|
current = op.to
|
||||||
|
}
|
||||||
|
dxf += `
|
||||||
|
0
|
||||||
|
SEQEND`
|
||||||
|
|
||||||
|
return dxf
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns blocs portion of the DXF code for a Part object */
|
||||||
|
Dxf.prototype.partBlocks = function (part, name, layer = 1) {
|
||||||
|
let dxf = `
|
||||||
|
0
|
||||||
|
BLOCK
|
||||||
|
8
|
||||||
|
${layer}
|
||||||
|
2
|
||||||
|
${name}
|
||||||
|
70
|
||||||
|
0
|
||||||
|
10
|
||||||
|
0.00
|
||||||
|
20
|
||||||
|
0.00`
|
||||||
|
for (let key in part.paths) {
|
||||||
|
let path = part.paths[key]
|
||||||
|
if (path.render) dxf += this.path(path, layer, part)
|
||||||
|
}
|
||||||
|
dxf += `
|
||||||
|
0
|
||||||
|
ENDBLK`
|
||||||
|
|
||||||
|
return dxf
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns entities portion of the DXF code for a Part object */
|
||||||
|
Dxf.prototype.partEntities = function (part, name, layer = 1) {
|
||||||
|
return `
|
||||||
|
0
|
||||||
|
INSERT
|
||||||
|
8
|
||||||
|
${layer}
|
||||||
|
2
|
||||||
|
${name}
|
||||||
|
10
|
||||||
|
0.00
|
||||||
|
20
|
||||||
|
0.00`
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Exports (drafted) pattern as DXF-ASTM */
|
||||||
|
Dxf.prototype.render = function (pattern) {
|
||||||
|
// Ensure pattern layout
|
||||||
|
pattern.pack()
|
||||||
|
|
||||||
|
// Tables structure
|
||||||
|
let tables = {
|
||||||
|
lineTypes: [
|
||||||
|
{
|
||||||
|
name: 'CONTINUOUS',
|
||||||
|
description: 'SOLIDLINE'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
layers: [
|
||||||
|
{
|
||||||
|
name: 1,
|
||||||
|
color: 7,
|
||||||
|
lineType: 'CONTINIOUS'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
let dxf = ''
|
||||||
|
dxf += this.banner(pattern)
|
||||||
|
dxf += this.tables(tables)
|
||||||
|
dxf += `
|
||||||
|
0
|
||||||
|
SECTION
|
||||||
|
2
|
||||||
|
BLOCKS`
|
||||||
|
for (let partId in pattern.parts) {
|
||||||
|
if (pattern.parts[partId].render) dxf += this.partBlocks(pattern.parts[partId], partId)
|
||||||
|
}
|
||||||
|
dxf += `
|
||||||
|
0
|
||||||
|
ENDSEC
|
||||||
|
0
|
||||||
|
SECTION
|
||||||
|
2
|
||||||
|
ENTITIES`
|
||||||
|
for (let partId in pattern.parts) {
|
||||||
|
if (pattern.parts[partId].render) dxf += this.partEntities(pattern.parts[partId], partId)
|
||||||
|
}
|
||||||
|
dxf += `
|
||||||
|
0
|
||||||
|
ENDSEC`
|
||||||
|
dxf += this.footer()
|
||||||
|
|
||||||
|
return dxf
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Dxf
|
5
packages/plugin-export-dxf/src/footer.js
Normal file
5
packages/plugin-export-dxf/src/footer.js
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
const footer = `
|
||||||
|
0
|
||||||
|
EOF
|
||||||
|
`
|
||||||
|
export default footer
|
13
packages/plugin-export-dxf/src/header.js
Normal file
13
packages/plugin-export-dxf/src/header.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
import { name, version, description, author, license } from '../package.json'
|
||||||
|
|
||||||
|
const header = `999
|
||||||
|
${name.slice(1)} | v${version}
|
||||||
|
999
|
||||||
|
${description}
|
||||||
|
999
|
||||||
|
(c) ${new Date().getFullYear()} ${author}
|
||||||
|
999
|
||||||
|
License: ${license}
|
||||||
|
999`
|
||||||
|
|
||||||
|
export default header
|
13
packages/plugin-export-dxf/src/index.js
Normal file
13
packages/plugin-export-dxf/src/index.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
import { name, version } from '../package.json'
|
||||||
|
|
||||||
|
import Dxf from './dxf'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: name,
|
||||||
|
version: version,
|
||||||
|
hooks: {
|
||||||
|
postDraft: (pattern, config = { precision: 1 }) => {
|
||||||
|
pattern.exportDxf = () => new Dxf(config).render(pattern)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
12
packages/plugin-export-dxf/tests/bust.test.js
Normal file
12
packages/plugin-export-dxf/tests/bust.test.js
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import freesewing from 'freesewing'
|
||||||
|
import { version } from '../package.json'
|
||||||
|
let chai = require('chai')
|
||||||
|
let expect = chai.expect
|
||||||
|
chai.use(require('chai-string'))
|
||||||
|
let plugin = require('../dist/index.js')
|
||||||
|
|
||||||
|
it('Should set the plugin name:version attribute', () => {
|
||||||
|
let pattern = new freesewing.Pattern()
|
||||||
|
pattern.use(plugin).draft().render()
|
||||||
|
expect(pattern.svg.attributes.get('freesewing:plugin-buttons')).to.equal(version)
|
||||||
|
})
|
Loading…
Add table
Add a link
Reference in a new issue