Skip to content

Commit

Permalink
Merge branch 'release/3.5.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
bjnortier committed Jan 22, 2019
2 parents d9d45fc + 57f8d1c commit 9dc2a17
Show file tree
Hide file tree
Showing 12 changed files with 19,903 additions and 66 deletions.
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "dxf",
"version": "3.4.4",
"version": "3.5.0",
"description": "DXF parser for node/browser",
"main": "lib/index.js",
"bin": {
Expand Down
9 changes: 6 additions & 3 deletions src/denormalise.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,12 @@ export default (parseResult) => {
const t = {
x: -block.x + insert.x,
y: -block.y + insert.y,
xScale: insert.xscale,
yScale: insert.yscale,
zScale: insert.zscale,
scaleX: insert.scaleX,
scaleY: insert.scaleY,
scaleZ: insert.scaleZ,
extrusionX: insert.extrusionX,
extrusionY: insert.extrusionY,
extrusionZ: insert.extrusionZ,
rotation: insert.rotation
}
// Add the insert transform and recursively add entities
Expand Down
10 changes: 5 additions & 5 deletions src/entityToPolyline.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,11 +120,11 @@ const applyTransforms = (polyline, transforms) => {
polyline = polyline.map(function (p) {
// Use a copy to avoid side effects
let p2 = [p[0], p[1]]
if (transform.xScale) {
p2[0] = p2[0] * transform.xScale
if (transform.scaleX) {
p2[0] = p2[0] * transform.scaleX
}
if (transform.yScale) {
p2[1] = p2[1] * transform.yScale
if (transform.scaleY) {
p2[1] = p2[1] * transform.scaleY
}
if (transform.rotation) {
const angle = transform.rotation / 180 * Math.PI
Expand All @@ -141,7 +141,7 @@ const applyTransforms = (polyline, transforms) => {
}
// Observed once in a sample DXF - some cad applications
// use negative zscale for flipping
if (transform.zScale === -1) {
if (transform.extrusionZ === -1) {
p2[0] = -p2[0]
}
return p2
Expand Down
12 changes: 6 additions & 6 deletions src/handlers/entity/insert.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@ export const process = (tuples) => {
entity.z = value
break
case 41:
entity.xscale = value
entity.scaleX = value
break
case 42:
entity.yscale = value
entity.scaleY = value
break
case 43:
entity.zscale = value
entity.scaleZ = value
break
case 44:
entity.columnSpacing = value
Expand All @@ -44,13 +44,13 @@ export const process = (tuples) => {
entity.rowCount = value
break
case 210:
entity.xExtrusion = value
entity.extrusionX = value
break
case 220:
entity.yExtrusion = value
entity.extrusionY = value
break
case 230:
entity.zExtrusion = value
entity.extrusionZ = value
break
default:
Object.assign(entity, common(type, value))
Expand Down
2 changes: 2 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import entitiesHandler from './handlers/entities'
import config from './config'
import denormalise from './denormalise'
import groupEntitiesByLayer from './groupEntitiesByLayer'
import toPolylines from './toPolylines'
import toSVG from './toSVG'
import colors from './util/colors'

Expand Down Expand Up @@ -94,6 +95,7 @@ export {
config,
denormalise,
groupEntitiesByLayer,
toPolylines,
toSVG,
colors
}
36 changes: 36 additions & 0 deletions src/toPolylines.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { Box2 } from 'vecks'

import colors from './util/colors'
import denormalise from './denormalise'
import entityToPolyline from './entityToPolyline'
import logger from './util/logger'

export default (parsed) => {
const entities = denormalise(parsed)
const polylines = entities.map(entity => {
const layerTable = parsed.tables.layers[entity.layer]
let rgb
if (layerTable) {
let colorNumber = ('colorNumber' in entity) ? entity.colorNumber : layerTable.colorNumber
rgb = colors[colorNumber]
if (rgb === undefined) {
logger.warn('Color index', colorNumber, 'invalid, defaulting to black')
rgb = [0, 0, 0]
}
} else {
logger.warn('no layer table for layer:' + entity.layer)
rgb = [0, 0, 0]
}

return { rgb, vertices: entityToPolyline(entity) }
})

const bbox = new Box2()
polylines.forEach(polyline => {
polyline.vertices.forEach(vertex => {
bbox.expandByPoint({ x: vertex[0], y: vertex[1] })
})
})

return { bbox, polylines }
}
60 changes: 18 additions & 42 deletions src/toSVG.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
import { pd } from 'pretty-data'
import { Box2 } from 'vecks'

import denormalise from './denormalise'
import entityToPolyline from './entityToPolyline'
import colors from './util/colors'
import logger from './util/logger'
import toPolylines from './toPolylines'

const polylineToPath = (rgb, polyline) => {
const color24bit = rgb[2] | (rgb[1] << 8) | (rgb[0] << 16)
Expand All @@ -31,38 +27,12 @@ const polylineToPath = (rgb, polyline) => {
* Convert the interpolate polylines to SVG
*/
export default (parsed) => {
const entities = denormalise(parsed)
const polylines = entities.map(e => {
return entityToPolyline(e)
})

const bbox = new Box2()
polylines.forEach(polyline => {
polyline.forEach(point => {
bbox.expandByPoint({ x: point[0], y: point[1] })
})
})

const paths = []
polylines.forEach((polyline, i) => {
const entity = entities[i]
const layerTable = parsed.tables.layers[entity.layer]
let rgb
if (layerTable) {
let colorNumber = ('colorNumber' in entity) ? entity.colorNumber : layerTable.colorNumber
rgb = colors[colorNumber]
if (rgb === undefined) {
logger.warn('Color index', colorNumber, 'invalid, defaulting to black')
rgb = [0, 0, 0]
}
} else {
logger.warn('no layer table for layer:' + entity.layer)
rgb = [0, 0, 0]
}
const p2 = polyline.map(function (p) {
return [p[0], -p[1]]
const { bbox, polylines } = toPolylines(parsed)
const paths = polylines.map((polyline, i) => {
const vertices = polyline.vertices.map(v => {
return [v[0], -v[1]]
})
paths.push(polylineToPath(rgb, p2))
return polylineToPath(polyline.rgb, vertices)
})

// If the DXF is empty the bounding box will have +-Infinity values,
Expand All @@ -71,11 +41,17 @@ export default (parsed) => {
? { x: 0, y: 0, width: 0, height: 0 }
: { x: bbox.min.x, y: -bbox.max.y, width: bbox.max.x - bbox.min.x, height: bbox.max.y - bbox.min.y }

let svgString = '<?xml version="1.0"?>'
svgString += '<svg xmlns="https://www.w3.org/2000/svg"'
svgString += ' xmlns:xlink="https://www.w3.org/1999/xlink" version="1.1"'
svgString += ' preserveAspectRatio="xMinYMin meet"'
svgString += ` viewBox="${viewBox.x} ${viewBox.y} ${viewBox.width} ${viewBox.height}"`
svgString += ' width="100%" height="100%">' + paths.join('') + '</svg>'
let svgString = `
<?xml version="1.0"?>
<svg
xmlns="https://www.w3.org/2000/svg"
xmlns:xlink="https://www.w3.org/1999/xlink" version="1.1"
preserveAspectRatio="xMinYMin meet"
viewBox="${viewBox.x} ${viewBox.y} ${viewBox.width} ${viewBox.height}"
width="100%"
height="100%"
>
${paths.join('\n')}
</svg>`
return pd.xml(svgString)
}
Loading

0 comments on commit 9dc2a17

Please sign in to comment.