Skip to content

Commit

Permalink
feat: viewport & vport parsing (#108)
Browse files Browse the repository at this point in the history
Co-authored-by: ibon eskudero <ibon.eskudero@tecnalia.com>
  • Loading branch information
ieskudero and ibon eskudero committed Sep 14, 2022
1 parent d0a6d19 commit f26642e
Show file tree
Hide file tree
Showing 4 changed files with 276 additions and 2 deletions.
4 changes: 3 additions & 1 deletion src/handlers/entities.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import insert from './entity/insert'
import threeDFace from './entity/threeDFace'
import dimension from './entity/dimension'
import text from './entity/text'
import viewport from './entity/viewport'

const handlers = [
point,
Expand All @@ -30,7 +31,8 @@ const handlers = [
text,
insert,
dimension,
threeDFace
threeDFace,
viewport
].reduce((acc, mod) => {
acc[mod.TYPE] = mod
return acc
Expand Down
15 changes: 15 additions & 0 deletions src/handlers/entity/common.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
export default (type, value) => {
switch (type) {
case 5: {
return {
handle: value

This comment has been minimized.

Copy link
@skymakerolof

skymakerolof Sep 14, 2022

Owner

Some tests are failing due to this change I believe. Could you help me understand what the purpose is of adding this handle property @ieskudero?

This comment has been minimized.

Copy link
@ieskudero

ieskudero Sep 14, 2022

Author Contributor

Some entities are referenced by this handle inside another entities. It is like an ID, I believe. That is why I set it. I can't remember exactly where. I will try to find it.

This comment has been minimized.

Copy link
@ieskudero

ieskudero Sep 14, 2022

Author Contributor

As I can see in my dxf viewer code, vport stores the last active viewport in the handle property. But vport is not an entity, it is in tables, hence is not using the common.js handle property. Maybe the handle property could be removed from common. I am more in favor of keeping it for consistency and maybe in future versions could be used, but remove it if necessary.

This comment has been minimized.

Copy link
@skymakerolof

skymakerolof Sep 14, 2022

Owner

Thank you for the insight! Let's keep it for consistency like you suggest.

}
}
case 6:
// Linetype name (present if not BYLAYER).
// The special name BYBLOCK indicates a
Expand Down Expand Up @@ -35,6 +40,16 @@ export default (type, value) => {
return value === 0 ? {} : {
paperSpace: value
}
case 68:
// Identifies whether viewport is on but fully off screen, is not active, or is off
return {
viewportOn: value
}
case 69:
// Viewport identification number
return {
viewport: value
}
case 210:
return {
extrusionX: value
Expand Down
135 changes: 135 additions & 0 deletions src/handlers/entity/viewport.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
import common from './common'

export const TYPE = 'VIEWPORT'

export const process = (tuples) => {
return tuples.reduce((entity, tuple) => {
const type = tuple[0]
const value = tuple[1]
switch (type) {
case 1:
entity.layout = parseFloat( value )
break
case 10:
entity.center.x = parseFloat( value )
break
case 20:
entity.center.y = parseFloat( value )
break
case 30:
entity.center.z = parseFloat( value )
break
case 12:
entity.centerDCS.x = parseFloat( value )
break
case 22:
entity.centerDCS.y = parseFloat( value )
break
case 13:
entity.snap.x = parseFloat( value )
break
case 23:
entity.snap.y = parseFloat( value )
break
case 14:
entity.snapSpacing.x = parseFloat( value )
break
case 24:
entity.snapSpacing.y = parseFloat( value )
break
case 15:
entity.gridSpacing.x = parseFloat( value )
break
case 25:
entity.gridSpacing.y = parseFloat( value )
break
case 16:
entity.direction.x = parseFloat( value )
break
case 26:
entity.direction.y = parseFloat( value )
break
case 36:
entity.direction.z = parseFloat( value )
break
case 17:
entity.target.x = parseFloat( value )
break
case 27:
entity.target.y = parseFloat( value )
break
case 37:
entity.target.z = parseFloat( value )
break
case 40:
entity.width = parseFloat( value )
break
case 41:
entity.height = parseFloat( value )
break
case 50:
entity.snapAngle = parseFloat( value )
break
case 51:
entity.angle = parseFloat( value )
break
case 68:
entity.status = value
break
case 69:
entity.id = value
break
case 90:
entity.flags = value
break
case 110:
entity.x = parseFloat( value )
break
case 120:
entity.y = parseFloat( value )
break
case 130:
entity.z = parseFloat( value )
break
case 111:
entity.xAxisX = parseFloat( value )
break
case 121:
entity.xAxisY = parseFloat( value )
break
case 131:
entity.xAxisZ = parseFloat( value )
break
case 112:
entity.xAxisX = parseFloat( value )
break
case 122:
entity.xAxisY = parseFloat( value )
break
case 132:
entity.xAxisZ = parseFloat( value )
break
case 146:
entity.elevation = parseFloat( value )
break
case 281:
entity.render = value
break
default:
Object.assign(entity, common(type, value))
break
}
return entity
}, {
type: TYPE,
center: {},
centerDCS: {},
snap: {},
snapSpacing: {},
gridSpacing: {},
direction: {},
target: {}
})
}

export default { TYPE, process }
124 changes: 123 additions & 1 deletion src/handlers/tables.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,124 @@ const styleHandler = (tuples) => {
}, { type: 'STYLE' })
}

const vPortHandler = (tuples) => {
return tuples.reduce((vport, tuple) => {
const type = tuple[0]
const value = tuple[1]
switch (type) {
case 2:
vport.name = value
break
case 5:
vport.handle = value
break
case 70:
vport.flags = value
break
case 10:
vport.lowerLeft.x = parseFloat( value )
break
case 20:
vport.lowerLeft.y = parseFloat( value )
break
case 11:
vport.upperRight.x = parseFloat( value )
break
case 21:
vport.upperRight.y = parseFloat( value )
break
case 12:
vport.center.x = parseFloat( value )
break
case 22:
vport.center.y = parseFloat( value )
break
case 14:
vport.snapSpacing.x = parseFloat( value )
break
case 24:
vport.snapSpacing.y = parseFloat( value )
break
case 15:
vport.gridSpacing.x = parseFloat( value )
break
case 25:
vport.gridSpacing.y = parseFloat( value )
break
case 16:
vport.direction.x = parseFloat( value )
break
case 26:
vport.direction.y = parseFloat( value )
break
case 36:
vport.direction.z = parseFloat( value )
break
case 17:
vport.target.x = parseFloat( value )
break
case 27:
vport.target.y = parseFloat( value )
break
case 37:
vport.target.z = parseFloat( value )
break
case 45:
vport.height = parseFloat( value )
break
case 50:
vport.snapAngle = parseFloat( value )
break
case 51:
vport.angle = parseFloat( value )
break
case 110:
vport.x = parseFloat( value )
break
case 120:
vport.y = parseFloat( value )
break
case 130:
vport.z = parseFloat( value )
break
case 111:
vport.xAxisX = parseFloat( value )
break
case 121:
vport.xAxisY = parseFloat( value )
break
case 131:
vport.xAxisZ = parseFloat( value )
break
case 112:
vport.xAxisX = parseFloat( value )
break
case 122:
vport.xAxisY = parseFloat( value )
break
case 132:
vport.xAxisZ = parseFloat( value )
break
case 146:
vport.elevation = parseFloat( value )
break
default:
}
return vport
}, {
type: 'VPORT',
center: {},
lowerLeft: {},
upperRight: {},
center: {},
snap: {},
snapSpacing: {},
gridSpacing: {},
direction: {},
target: {}
})
}

const tableHandler = (tuples, tableType, handler) => {
const tableRowsTuples = []

Expand Down Expand Up @@ -112,18 +230,22 @@ export default (tuples) => {

let stylesTuples = []
let layersTuples = []
let vPortTuples = []
tableGroups.forEach(group => {
if (group[0][1] === 'STYLE') {
stylesTuples = group
} else if (group[0][1] === 'LTYPE') {
logger.warn('LTYPE in tables not supported')
} else if (group[0][1] === 'LAYER') {
layersTuples = group
}else if (group[0][1] === 'VPORT') {
vPortTuples = group
}
})

return {
layers: tableHandler(layersTuples, 'LAYER', layerHandler),
styles: tableHandler(stylesTuples, 'STYLE', styleHandler)
styles: tableHandler(stylesTuples, 'STYLE', styleHandler),
vports: tableHandler(vPortTuples, 'VPORT', vPortHandler)
}
}

0 comments on commit f26642e

Please sign in to comment.