[![Build Status](https://travis-ci.org/bjnortier/dxf.svg?branch=master)](https://travis-ci.org/bjnortier/dxf)
# dxf
DXF parser for node/browser.
Uses several ES6 features in the source code (import, classes, let, const, arrows) but is packaged using babel so you can use it legacy JS environments.
Version 2.0 is a complete rewrite from the first attempt to write it in a SAX style, which wasn't really appropriate for a document with nested references (e.g inserts referencing blocks, nested inserts).
Version 3.0 converted the codebase to use [standard JS](https://standardjs.com), ES6 imports, stopped using Gulp, and updated & removed some dependencies.
Version 4.x is in progress and the aim is to use native SVG elements where possible, e.g. ``, `` etc. 4.0 introduces the `` element.
At this point in time, the important geometric entities are supported, but notably:
* MTEXT
* DIMENSION
* STYLE
* HATCH
and some others are **parsed**, but are **not supported for SVG rendering** (see section below on SVG rendering)
## Getting started
There is an ES5 and ES6 example in the ```examples/``` directory that show how to use the library. There are exposed functions for advanced users, but for the majority of users you can use the `Helper` object to get the data you're interested in (or convert to SVG):
```
const helper = new Helper()
// The 1-to-1 object representation of the DXF
console.log('parsed:', helper.parsed)
// Denormalised blocks inserted with transforms applied
console.log('denormalised:', helper.denormalised)
// Create an SVG
console.log('svg:', helper.toSVG())
// Create polylines (e.g. to render in WebGL)
console.log('polylines:', helper.toPolylines())
```
## Running the Examples
Node ES5. Will write an SVG to `examples/example.es5.svg`:
```
$ node examples/example.es5.js
```
Node ES6. Will write an SVG to `examples/example.es6.svg`:
```
$ npx babel-node examples/example.es6.js
```
Browser. Compile to a browser bundle and open the example webpage:
```
$ npm run compile
$ open examples/dxf.html
```
## SVG
Geometric elements are supported, but dimensions, text, hatches and styles (except for line colors) are ***not***.
Native SVG elements are used as far as possible for curved entities (``, `` etc.), ***except for the SPLINE entity***, which is interpolated.
Here's an example you will find in the functional test output:
![svg example image](https://cloud.githubusercontent.com/assets/57994/17583566/e00f5d78-5fb1-11e6-9030-55686f980e6f.png)
## Interpolation
The library supports outputting DXFs as interpolated polylines for custom rendering (e.g. WebGL) or other applications, by using:
```
> helper.toPolylines()
```
## Command line
There is a command-line utility (courtesy of [@Joge97](https://github.com/Joge97)) for converting DXF files to SVG:
```
$ npm i -g dxf
$ dxf-to-svg
Usage: dxf-to-svg [options] [svgFile]
Converts a dxf file to a svg file.
Options:
-V, --version output the version number
-v --verbose Verbose output
-h, --help output usage information
```
## Tests
Running
```$ npm test```
will execute the unit tests.
```$ npm run test:functional``` will run the functional tests in a browser. Please open `toSVG.html` when the file listing loads in the browser (or open `http://localhost:8030/toSVG.html#/`).
### Contributors
- Liam Mitchell https://github.com/LiamKarlMitchell
- Artur Zochniak https://github.com/arjamizo
- Andy Werner https://github.com/Gallore
- Ivan Baktsheev https://github.com/apla
- Jeff Chen https://github.com/jeffontheground
- Markko Paas https://github.com/markkopaas
- Kim Lokøy https://github.com/klokoy
- Erik Söhnel https://github.com/hoeck
- Teja https://github.com/hungerpirat
- Jakob Pallhuber https://github.com/Joge97
- Eric Mansfield https://github.com/ericman314