dxf
Version:
DXF parser for node/browser
537 lines (534 loc) • 12.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.process = exports["default"] = exports.TYPE = void 0;
var _common = _interopRequireDefault(require("./common"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
var TYPE = exports.TYPE = 'HATCH';
var status = 'IDLE';
var drawEntity = {};
var drawType = 0;
var isPolyline = false;
var seed = null;
var loop = {
references: [],
entities: []
};
var polyPoint = null;
var process = exports.process = function process(tuples) {
return tuples.reduce(function (entity, tuple) {
var type = tuple[0];
var value = tuple[1];
switch (type) {
case 100:
status = 'IDLE';
break;
case 2:
entity.patternName = value;
break;
case 10:
{
if (status === 'IDLE') entity.elevation.x = parseFloat(value);else if (status === 'POLYLINE') {
polyPoint = {
x: parseFloat(value),
y: 0,
bulge: 0
};
loop.entities[0].points.push(polyPoint);
} else if (status === 'SEED') {
if (!seed) {
seed = {
x: 0,
y: 0
};
entity.seeds.seeds.push(seed);
}
seed.x = parseFloat(value);
} else fillDrawEntity(type, drawType, parseFloat(value));
}
break;
case 20:
{
if (status === 'IDLE') entity.elevation.y = parseFloat(value);else if (status === 'POLYLINE') polyPoint.y = parseFloat(value);else if (status === 'SEED') {
seed.y = parseFloat(value);
seed = null;
} else fillDrawEntity(type, drawType, parseFloat(value));
}
break;
case 30:
entity.elevation.z = parseFloat(value);
break;
case 63:
entity.fillColor = value;
break;
case 70:
entity.fillType = parseFloat(value) === 1 ? 'SOLID' : 'PATTERN';
break;
case 210:
entity.extrusionDir.x = parseFloat(value);
break;
case 220:
entity.extrusionDir.y = parseFloat(value);
break;
case 230:
entity.extrusionDir.z = parseFloat(value);
break;
case 91:
{
// LOOP COUNT
entity.boundary.count = parseFloat(value);
}
break;
case 92:
{
// 0 = Default; 1 = External; 2 = Polyline; 4 = Derived; 8 = Textbox; 16 = Outermost
loop = {
references: [],
entities: []
};
entity.boundary.loops.push(loop);
loop.type = parseFloat(value);
isPolyline = (loop.type & 2) === 2;
if (isPolyline) {
var ent = {
type: 'POLYLINE',
points: []
};
loop.entities.push(ent);
status = 'POLYLINE';
}
}
break;
case 93:
{
if (status === 'IDLE') status = 'ENT';
loop.count = parseFloat(value);
}
break;
case 11:
case 21:
case 40:
case 50:
case 51:
case 74:
case 94:
case 95:
case 96:
if (drawType === 4) status = 'SPLINE';
fillDrawEntity(type, drawType, parseFloat(value));
break;
case 42:
{
if (isPolyline) polyPoint.bulge = parseFloat(value);else fillDrawEntity(type, drawType, parseFloat(value));
}
break;
case 72:
{
// !Polyline --> 1 = Line; 2 = Circular arc; 3 = Elliptic arc; 4 = Spline
// Polyline --> hasBulge
drawType = parseFloat(value);
loop[isPolyline ? 'hasBulge' : 'edgeType'] = drawType;
if (!isPolyline) {
drawEntity = createDrawEntity(drawType);
loop.entities.push(drawEntity);
}
}
break;
case 73:
{
if (status === 'IDLE' || isPolyline) loop.entities[0].closed = value;else fillDrawEntity(type, drawType, parseFloat(value));
}
break;
case 75:
{
// END OF BOUNDARY PATH DATA
status = 'IDLE';
// 0 = Hatch “odd parity” area (Normal style)
// 1 = Hatch outermost area only (Outer style)
// 2 = Hatch through entire area (Ignore style)
entity.style = parseFloat(value);
}
break;
case 76:
// 0 = User-defined; 1 = Predefined; 2 = Custom
entity.hatchType = parseFloat(value);
break;
case 97:
{
status = 'IDLE';
isPolyline = false;
loop.sourceObjects = parseFloat(value);
}
break;
case 98:
{
status = 'SEED';
entity.seeds.count = parseFloat(value);
}
break;
case 52:
entity.shadowPatternAngle = parseFloat(value);
break;
case 41:
entity.spacing = parseFloat(value);
break;
case 77:
entity["double"] = parseFloat(value) === 1;
break;
case 78:
entity.pattern.lineCount = parseFloat(value);
break;
case 53:
entity.pattern.angle = parseFloat(value);
break;
case 43:
entity.pattern.x = parseFloat(value);
break;
case 44:
entity.pattern.y = parseFloat(value);
break;
case 45:
entity.pattern.offsetX = parseFloat(value);
break;
case 46:
entity.pattern.offsetY = parseFloat(value);
break;
case 79:
entity.pattern.dashCount = parseFloat(value);
break;
case 49:
entity.pattern.length.push(value);
break;
case 330:
loop.references.push(value);
break;
case 450:
entity.solidOrGradient = parseFloat(value) === 0 ? 'SOLID' : 'GRADIENT';
break;
case 453:
// 0 = Solid; 2 = Gradient
entity.color.count = parseFloat(value);
break;
case 460:
entity.color.rotation = value;
break;
case 461:
entity.color.gradient = value;
break;
case 462:
entity.color.tint = value;
break;
default:
Object.assign(entity, (0, _common["default"])(type, value));
break;
}
return entity;
}, {
type: TYPE,
elevation: {},
extrusionDir: {
x: 0,
y: 0,
z: 1
},
pattern: {
length: []
},
boundary: {
loops: []
},
seeds: {
count: 0,
seeds: []
},
color: {}
});
};
var _default = exports["default"] = {
TYPE: TYPE,
process: process
};
function createDrawEntity(type) {
if (isPolyline) return {};
// 1 = Line; 2 = Circular arc; 3 = Elliptic arc; 4 = Spline
switch (type) {
case 1:
return {
type: 'LINE',
start: {
x: 0,
y: 0
},
end: {
x: 0,
y: 0
}
};
case 2:
return {
type: 'ARC',
center: {
x: 0,
y: 0
},
radius: 0,
startAngle: 0,
endAngle: 0,
counterClockWise: false
};
case 3:
return {
type: 'ELLIPSE',
center: {
x: 0,
y: 0
},
startAngle: 0,
endAngle: 0,
counterClockWise: false,
major: {
x: 0,
y: 0
},
minor: 0
};
case 4:
return {
type: 'SPLINE',
degree: 0,
rational: 0,
periodic: 0,
knots: {
count: 0,
knots: []
},
controlPoints: {
count: 0,
points: []
},
weights: 1
};
}
return {};
}
function fillDrawEntity(type, drawType, value) {
switch (type) {
case 10:
{
switch (drawType) {
case 1:
{
drawEntity.start.x = value;
}
break;
case 2:
{
drawEntity.center.x = value;
}
break;
case 3:
{
drawEntity.center.x = value;
}
break;
case 4:
{
drawEntity.controlPoints.points.push({
x: value,
y: 0
});
}
break;
}
}
break;
case 20:
{
switch (drawType) {
case 1:
{
drawEntity.start.y = value;
}
break;
case 2:
{
drawEntity.center.y = value;
}
break;
case 3:
{
drawEntity.center.y = value;
}
break;
case 4:
{
drawEntity.controlPoints.points[drawEntity.controlPoints.points.length - 1].y = value;
}
break;
}
break;
}
case 11:
{
switch (drawType) {
case 1:
{
drawEntity.end.x = value;
}
break;
case 3:
{
drawEntity.major.x = value;
}
break;
}
}
break;
case 21:
{
switch (drawType) {
case 1:
{
drawEntity.end.y = value;
}
break;
case 3:
{
drawEntity.major.y = value;
}
break;
}
break;
}
case 40:
{
switch (drawType) {
case 2:
{
drawEntity.radius = value;
}
break;
case 3:
{
drawEntity.minor = value;
}
break;
case 4:
{
drawEntity.knots.knots.push(value);
}
break;
}
}
break;
case 42:
{
switch (drawType) {
case 4:
{
drawEntity.weights = value;
}
break;
}
}
break;
case 50:
{
switch (drawType) {
case 2:
{
drawEntity.startAngle = value;
}
break;
case 3:
{
drawEntity.startAngle = value;
}
break;
}
}
break;
case 51:
{
switch (drawType) {
case 2:
{
drawEntity.endAngle = value;
}
break;
case 3:
{
drawEntity.endAngle = value;
}
break;
}
}
break;
case 73:
{
switch (drawType) {
case 2:
{
drawEntity.counterClockWise = parseFloat(value) === 1;
}
break;
case 3:
{
drawEntity.counterClockWise = parseFloat(value) === 1;
}
break;
case 4:
{
drawEntity.rational = value;
}
break;
}
}
break;
case 74:
{
switch (drawType) {
case 4:
{
drawEntity.periodic = value;
}
break;
}
}
break;
case 94:
{
switch (drawType) {
case 4:
{
drawEntity.degree = value;
}
break;
}
}
break;
case 95:
{
switch (drawType) {
case 4:
{
drawEntity.knots.count = value;
}
break;
}
}
break;
case 96:
{
switch (drawType) {
case 4:
{
drawEntity.controlPoints.count = value;
}
break;
}
}
break;
}
}