164 lines
4.5 KiB
JavaScript
164 lines
4.5 KiB
JavaScript
import common from './common'
|
|
|
|
export const TYPE = 'DIMENSION'
|
|
|
|
export const process = (tuples) => {
|
|
return tuples.reduce(
|
|
(entity, tuple) => {
|
|
const type = tuple[0]
|
|
const value = tuple[1]
|
|
switch (type) {
|
|
case 2:
|
|
entity.block = value
|
|
break
|
|
case 10:
|
|
entity.start.x = value
|
|
break
|
|
case 20:
|
|
entity.start.y = value
|
|
break
|
|
case 30:
|
|
entity.start.z = value
|
|
break
|
|
case 11:
|
|
entity.textMidpoint.x = value
|
|
break
|
|
case 21:
|
|
entity.textMidpoint.y = value
|
|
break
|
|
case 31:
|
|
entity.textMidpoint.z = value
|
|
break
|
|
case 13:
|
|
entity.measureStart.x = value
|
|
break
|
|
case 23:
|
|
entity.measureStart.y = value
|
|
break
|
|
case 33:
|
|
entity.measureStart.z = value
|
|
break
|
|
case 14:
|
|
entity.measureEnd.x = value
|
|
break
|
|
case 24:
|
|
entity.measureEnd.y = value
|
|
break
|
|
case 34:
|
|
entity.measureEnd.z = value
|
|
break
|
|
case 50:
|
|
entity.rotation = value
|
|
break
|
|
case 51:
|
|
entity.horizonRotation = value
|
|
break
|
|
case 52:
|
|
entity.extensionRotation = value
|
|
break
|
|
case 53:
|
|
entity.textRotation = value
|
|
break
|
|
case 70: {
|
|
const dimType = parseBitCombinationsFromValue(value)
|
|
if (dimType.ordinateType) {
|
|
entity.ordinateType = true
|
|
}
|
|
if (dimType.uniqueBlockReference) {
|
|
entity.uniqueBlockReference = true
|
|
}
|
|
if (dimType.userDefinedLocation) {
|
|
entity.userDefinedLocation = true
|
|
}
|
|
entity.dimensionType = dimType.dimensionType
|
|
break
|
|
}
|
|
case 71:
|
|
entity.attachementPoint = value
|
|
break
|
|
case 210:
|
|
entity.extrudeDirection = entity.extrudeDirection || {}
|
|
entity.extrudeDirection.x = value
|
|
break
|
|
case 220:
|
|
entity.extrudeDirection = entity.extrudeDirection || {}
|
|
entity.extrudeDirection.y = value
|
|
break
|
|
case 230:
|
|
entity.extrudeDirection = entity.extrudeDirection || {}
|
|
entity.extrudeDirection.z = value
|
|
break
|
|
default:
|
|
Object.assign(entity, common(type, value))
|
|
break
|
|
}
|
|
return entity
|
|
},
|
|
{
|
|
type: TYPE,
|
|
start: { x: 0, y: 0, z: 0 },
|
|
measureStart: { x: 0, y: 0, z: 0 },
|
|
measureEnd: { x: 0, y: 0, z: 0 },
|
|
textMidpoint: { x: 0, y: 0, z: 0 },
|
|
attachementPoint: 1,
|
|
dimensionType: 0,
|
|
},
|
|
)
|
|
}
|
|
|
|
/**
|
|
* From DXF Reference for DIMENSION
|
|
* Values 0-6 are integer values that represent the dimension type. Values 32, 64, and 128
|
|
* are bit values, which are added to the integer values (value 32 is always set in R13 and
|
|
* later releases)
|
|
* 0 = Rotated, horizontal, or vertical; 1 = Aligned
|
|
* 2 = Angular; 3 = Diameter; 4 = Radius
|
|
* 5 = Angular 3 point; 6 = Ordinate
|
|
* 32 = Indicates that the block reference (group code 2) is referenced by this dimension only
|
|
* 64 = Ordinate type. This is a bit value (bit 7) used only with integer value 6. If set, ordinate is X-type; if not set, ordinate is Y-type
|
|
* 128 = This is a bit value (bit 8) added to the other group 70 values if the dimension text has been positioned at a user-defined location rather than at the default location
|
|
*/
|
|
function parseBitCombinationsFromValue(value) {
|
|
let uniqueBlockReference = false
|
|
let ordinateType = false
|
|
let userDefinedLocation = false
|
|
|
|
// ToDo: Solve in some more clever way??
|
|
if (value > 6) {
|
|
const alt1 = value - 32
|
|
const alt2 = value - 64
|
|
const alt3 = value - 32 - 64
|
|
const alt4 = value - 32 - 128
|
|
const alt5 = value - 32 - 64 - 128
|
|
|
|
if (alt1 >= 0 && alt1 <= 6) {
|
|
uniqueBlockReference = true
|
|
value = alt1
|
|
} else if (alt2 >= 0 && alt2 <= 6) {
|
|
ordinateType = true
|
|
value = alt2
|
|
} else if (alt3 >= 0 && alt3 <= 6) {
|
|
uniqueBlockReference = true
|
|
ordinateType = true
|
|
value = alt3
|
|
} else if (alt4 >= 0 && alt4 <= 6) {
|
|
uniqueBlockReference = true
|
|
userDefinedLocation = true
|
|
value = alt4
|
|
} else if (alt5 >= 0 && alt5 <= 6) {
|
|
uniqueBlockReference = true
|
|
ordinateType = true
|
|
userDefinedLocation = true
|
|
value = alt5
|
|
}
|
|
}
|
|
return {
|
|
dimensionType: value,
|
|
uniqueBlockReference,
|
|
ordinateType,
|
|
userDefinedLocation,
|
|
}
|
|
}
|
|
|
|
export default { TYPE, process }
|