Skip to content

Commit

Permalink
Add a 'toPolylines' intermediate step for third party renderers
Browse files Browse the repository at this point in the history
  • Loading branch information
bjnortier committed Jan 22, 2019
1 parent 235a358 commit 07b56a9
Show file tree
Hide file tree
Showing 5 changed files with 19,876 additions and 42 deletions.
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="http:https://www.w3.org/2000/svg"'
svgString += ' xmlns:xlink="http: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="http:https://www.w3.org/2000/svg"
xmlns:xlink="http: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 07b56a9

Please sign in to comment.