UNPKG

autocad-dxf

Version:

A module which can be used to parse AutoCAD dxf files and to make programmatic and geometric operations on the AutoCAD drawing entities.

1,167 lines (1,148 loc) 97.4 kB
const Distance = require("./Distance"); const Length = require("./Length"); const Intersection = require("./Intersection"); const Closest = require("./Closest"); const Triangulate = require("./Triangulate"); const BSpline = require("./BSpline"); const Area = require("./Area"); const Connected = require("./Connected"); const Crossing = require("./Crossing"); const Tangent = require("./Tangent"); const Checkif = require("./Checkif"); const ErrorMessages = require("./ErrorMessages.json"); const DIMSTYLE_CODES = require("./DIMSTYLE_CODES.json"); const KEYS = require("./KEYS"); const CODES = require("./CODES"); const Entities = class { constructor(data, tolerance) { this.entities = []; this.tables = {}; this.blocks = []; this.tolerance = isNaN(tolerance) ? 0.0001 : tolerance; this.KEYS = KEYS; this.CODES = CODES; if (data && typeof data == "string") { this.processData(data.split("\n")); } } getDimStyleParams = (code, value, key) => { let actualValue; if (code == "148" || code == "171" || code == "179") { actualValue = value; } else if (code == "371" || code == "372") { if (value == "-3") { actualValue = "Standard"; } else if (value == "-2") { actualValue = "ByLayer"; } else if (value == "-1") { actualValue = "ByBlock"; } else { actualValue = `${(parseFloat(value)/100)}mm`; } } else if (code == "280" || code == "77" || code == "275" || code == "270" || code == "277" || code == "279" || code == "283" || code == "289") { actualValue = DIMSTYLE_CODES[key][value]; } else if (code == "75" || code == "76" || code == "281" || code == "282") { actualValue = value == "1" ? "Suppressed" : "Not suppressed"; } else { let temp = parseFloat(value); if (isNaN(temp)) temp = value; if (DIMSTYLE_CODES.booleans.indexOf(code) != -1) { temp = (temp == 1) ? "On" : "Off"; } actualValue = temp; } return actualValue; } getTables = (array, COUNT) => { let ttype, json; while (COUNT < array.length - 1) { const code = array[COUNT].trim(); const value = array[COUNT + 1].trim(); if (code == "0" && value == "TABLE") { ttype = array[COUNT + 3].trim(); this.tables[ttype] = []; } else if (code == "0" && value == "ENDSEC") { return COUNT + 2; } if (ttype == "APPID") { if (code == "100" && value == "AcDbRegAppTableRecord") { if (json) this.tables.APPID.push(json); json = {}; } else if (json && code == "0" && value == "ENDTAB") { this.tables.APPID.push(json); json = null; } else if (json && code == "2") { json.name = value; } } else if (ttype == "BLOCK_RECORD") { if (code == "100" && value == "AcDbBlockTableRecord") { if (json) this.tables.BLOCK_RECORD.push(json); json = {}; } else if (json && code == "0" && value == "ENDTAB") { if (json) this.tables.BLOCK_RECORD.push(json); json = null; } else if (json && code == "2") { json.name = value; } } else if (ttype == "DIMSTYLE") { if (code == "100" && value == "AcDbDimStyleTableRecord") { if (json) this.tables.DIMSTYLE.push(json); json = {}; } else if (json && code == "0" && value == "ENDTAB") { this.tables.DIMSTYLE.push(json); json = null; } else if (json && code == "2") { json.name = value; } else if (json && DIMSTYLE_CODES[code]) { if (code == "78" || code == "286") { if (value == "0") { json.suppress_zero_inches = "No"; json.suppress_zero_feet = "Yes"; } else if (value == "1") { json.suppress_zero_inches = "No"; json.suppress_zero_feet = "No"; } else if (value == "2") { json.suppress_zero_inches = "Yes"; json.suppress_zero_feet = "No"; } else if (value == "3") { json.suppress_zero_inches = "No"; json.suppress_zero_feet = "Yes"; } } else if (code == "284") { if (value == "0") { json.alt_suppress_leading_zeros = "No"; json.alt_suppress_trailing_zeros = "No"; } else if (value == "1") { json.alt_suppress_leading_zeros = "Yes"; json.alt_suppress_trailing_zeros = "No"; } else if (value == "2") { json.alt_suppress_leading_zeros = "No"; json.alt_suppress_trailing_zeros = "Yes"; } else if (value == "3") { json.alt_suppress_leading_zeros = "Yes"; json.alt_suppress_trailing_zeros = "Yes"; } } else if (code == "79" || code == "285") { if (value == "0") { json.suppress_leading_zeros = "No"; json.suppress_trailing_zeros = "No"; } else if (value == "1") { json.suppress_leading_zeros = "Yes"; json.suppress_trailing_zeros = "No"; } else if (value == "2") { json.suppress_leading_zeros = "No"; json.suppress_trailing_zeros = "Yes"; } else if (value == "3") { json.suppress_leading_zeros = "Yes"; json.suppress_trailing_zeros = "Yes"; } } else { const key = DIMSTYLE_CODES[code] const actualValue = this.getDimStyleParams(code, value, key); json[key] = actualValue; } } } else if (ttype == "LAYER") { if (code == "100" && value == "AcDbLayerTableRecord") { if (json) this.tables.LAYER.push(json); json = {}; } else if (json && code == "0" && value == "ENDTAB") { this.tables.LAYER.push(json); json = null; } else if (json && code == "2") { json.name = value; } else if (json && code == "70") { if (value == "0") { json.status = "Thawed"; } else if (value == "1") { json.status = "Frozen"; } else if (value == "2") { json.status = "Frozen by default"; } else if (value == "4") { json.status = "Locked"; } } else if (json && code == "62") { json.color_number = value; } else if (json && code == "6") { json.line_type = value; } } else if (ttype == "LTYPE") { if (code == "100" && value == "AcDbLinetypeTableRecord") { if (json) this.tables.LTYPE.push(json); json = {}; } else if (json && code == "0" && value == "ENDTAB") { this.tables.LTYPE.push(json); json = null; } else if (json && code == "2") { json.name = value; } else if (json && code == "3") { json.description = value; } else if (json && code == "9") { if (!json.embedded_texts) json.embedded_texts = []; json.embedded_texts.push(value); } else if (json && code == "40") { json.total_pattern_length = parseInt(value); } else if (json && code == "44") { if (!json.x_offsets) json.x_offsets = []; json.x_offsets.push(parseFloat(value)); } else if (json && code == "45") { if (!json.y_offsets) json.y_offsets = []; json.y_offsets.push(parseFloat(value)); } else if (json && code == "46") { if (!json.scale_value) json.scale_value = []; json.scale_value.push(parseFloat(value)); } else if (json && code == "49") { if (!json.pattern_lengths) json.pattern_lengths = []; json.pattern_lengths.push(parseFloat(value)); } else if (json && code == "50") { if (!json.embedded_element_rotations) json.embedded_element_rotations = []; json.embedded_element_rotations.push(parseFloat(value)); } else if (json && code == "73") { json.number_of_elements = parseInt(value); } else if (json && code == "74") { if (value == "0") { json.embedded_element_type = "None"; } else if (value == "1") { json.embedded_element_rotation_type = "Absolute"; } else if (value == "2") { json.embedded_element_type = "Text"; } else if (value == "4") { json.embedded_element_type = "Shape"; } } } else if (ttype == "STYLE") { if (code == "100" && value == "AcDbTextStyleTableRecord") { if (json) this.tables.STYLE.push(json); json = {text_height: 0}; } else if (json && code == "0" && value == "ENDTAB") { this.tables.STYLE.push(json); json = null; } else if (json && code == "2") { json.name = value; } else if (json && code == "40") { json.text_height = parseFloat(value); } else if (json && code == "41") { json.width_factor = parseFloat(value); } else if (json && code == "50") { json.oblique_angle = parseFloat(value); } else if (json && code == "70") { if (value == "1") { json.type = "Shape"; } else if (value == "4") { json.type = "Vertical text"; } } else if (json && code == "71") { if (value == "2") { json.text_type = "Backward (mirrored in X)"; } else if (value == "4") { json.text_type = "Upside down (mirrored in Y)"; } } else if (json && code == "1071") { json.font_type = value; } } else if (ttype == "UCS") { if (code == "100" && value == "AcDbUCSTableRecord") { if (json) this.tables.UCS.push(json); json = {}; } else if (json && code == "0" && value == "ENDTAB") { this.tables.UCS.push(json); json = null; } else if (json && code == "2") { json.name = value; } else if (json && code == "10") { json.origin = {x : parseFloat(value)}; } else if (json && code == "11") { json.x_axis_direction = {x : parseFloat(value)}; } else if (json && code == "12") { json.y_axis_direction = {x: parseFloat(value)}; } else if (json && code == "13") { json.orthographic_origin = {x: parseFloat(value)}; } else if (json && code == "20") { json.origin.y = parseFloat(value); } else if (json && code == "21") { json.x_axis_direction.y = parseFloat(value); } else if (json && code == "22") { json.y_axis_direction.y = parseFloat(value); } else if (json && code == "23") { json.orthographic_origin.y = parseFloat(value); } else if (json && code == "30") { json.origin.z = parseFloat(value); } else if (json && code == "31") { json.x_axis_direction.z = parseFloat(value); } else if (json && code == "32") { json.y_axis_direction.z = parseFloat(value); } else if (json && code == "33") { json.orthographic_origin.z = parseFloat(value); } else if (json && code == "71") { if (value == "1") { json.orthographic_type = "Top"; } else if (value == "2") { json.orthographic_type = "Bottom"; } else if (value == "3") { json.orthographic_type = "Front"; } else if (value == "4") { json.orthographic_type = "Back"; } else if (value == "5") { json.orthographic_type = "Left"; } else if (value == "6") { json.orthographic_type = "Right"; } } else if (json && code == "146") { json.elevation = parseFloat(value); } } else if (ttype == "VIEW") { if (code == "100" && value == "AcDbViewTableRecord") { if (json) this.tables.VIEW.push(json); json = {hasUCS: false}; } else if (json && code == "0" && value == "ENDTAB") { this.tables.VIEW.push(json); json = null; } else if (json && code == "2") { json.name = value; } else if (json && code == "10") { json.center = {x : parseFloat(value)}; } else if (json && code == "11") { json.direction = {x : parseFloat(value)}; } else if (json && code == "12") { json.target_point = {x: parseFloat(value)}; } else if (json && code == "20") { json.center.y = parseFloat(value); } else if (json && code == "21") { json.direction.y = parseFloat(value); } else if (json && code == "22") { json.target_point.y = parseFloat(value); } else if (json && code == "31") { json.direction.z = parseFloat(value); } else if (json && code == "32") { json.target_point.z = parseFloat(value); } else if (json && code == "40") { json.height = parseFloat(value); } else if (json && code == "41") { json.width = parseFloat(value); } else if (json && code == "42") { json.lens_angle = parseFloat(value); } else if (json && code == "50") { json.twist_angle = parseFloat(value); } else if (json && code == "70") { if (value == "1") { json.type = "Paper space view"; } } else if (json && code == "72") { if (value == "1") { json.hasUCS = true; } } else if (json && code == "79") { if (value == "0") { json.orthographic_type = "N/A"; } else if (value == "1") { json.orthographic_type = "Top"; } else if (value == "2") { json.orthographic_type = "Bottom"; } else if (value == "3") { json.orthographic_type = "Front"; } else if (value == "4") { json.orthographic_type = "Back"; } else if (value == "5") { json.orthographic_type = "Left"; } else if (value == "6") { json.orthographic_type = "Right"; } } else if (json && code == "110") { json.origin = {x: parseFloat(value)}; } else if (json && code == "111") { json.ucs_x = {x: parseFloat(value)}; } else if (json && code == "112") { json.ucs_y = {x: parseFloat(value)}; } else if (json && code == "120") { json.origin.y = parseFloat(value); } else if (json && code == "121") { json.ucs_x.y = parseFloat(value); } else if (json && code == "122") { json.ucs_y.y = parseFloat(value); } else if (json && code == "130") { json.origin.z = parseFloat(value); } else if (json && code == "131") { json.ucs_x.z = parseFloat(value); } else if (json && code == "132") { json.ucs_y.z = parseFloat(value); } else if (json && code == "146") { json.elevation = parseFloat(value); } } else if (ttype == "VPORT") { if (code == "100" && value == "AcDbViewportTableRecord") { if (json) this.tables.VPORT.push(json); json = {}; } else if (json && code == "0" && value == "ENDTAB") { this.tables.VPORT.push(json); json = null; } else if (json && code == "2") { json.name = value; } else if (json && code == "10") { json.lower_left_corner = {x : parseFloat(value)}; } else if (json && code == "11") { json.upper_right_corner = {x : parseFloat(value)}; } else if (json && code == "12") { json.center = {x: parseFloat(value)}; } else if (json && code == "13") { json.snap_base_point = {x: parseFloat(value)}; } else if (json && code == "14") { json.snap_spacing = {x: parseFloat(value)}; } else if (json && code == "15") { json.grid_spacing = {x: parseFloat(value)}; } else if (json && code == "16") { json.view_direction = {x: parseFloat(value)}; } else if (json && code == "17") { json.target_point = {x: parseFloat(value)}; } else if (json && code == "20") { json.lower_left_corner.y = parseFloat(value); } else if (json && code == "21") { json.upper_right_corner.y = parseFloat(value); } else if (json && code == "22") { json.center.y = parseFloat(value); } else if (json && code == "23") { json.snap_base_point.y = parseFloat(value); } else if (json && code == "24") { json.snap_spacing.y = parseFloat(value); } else if (json && code == "25") { json.grid_spacing.y = parseFloat(value); } else if (json && code == "26") { json.view_direction.y = parseFloat(value); } else if (json && code == "27") { json.target_point.y = parseFloat(value); } else if (json && code == "36") { json.view_direction.z = parseFloat(value); } else if (json && code == "37") { json.target_point.z = parseFloat(value); } else if (json && code == "45") { json.height = parseFloat(value); } else if (json && code == "42") { json.lens_length = parseFloat(value); } else if (json && code == "50") { json.snap_rotation_angle = parseFloat(value); } else if (json && code == "51") { json.twist_angle = parseFloat(value); } else if (json && code == "72") { json.circle_sides = value; } else if (json && code == "79") { if (value == "0") { json.orthographic_type = "N/A"; } else if (value == "1") { json.orthographic_type = "Top"; } else if (value == "2") { json.orthographic_type = "Bottom"; } else if (value == "3") { json.orthographic_type = "Front"; } else if (value == "4") { json.orthographic_type = "Back"; } else if (value == "5") { json.orthographic_type = "Left"; } else if (value == "6") { json.orthographic_type = "Right"; } } else if (json && code == "110") { json.origin = {x: parseFloat(value)}; } else if (json && code == "111") { json.ucs_x = {x: parseFloat(value)}; } else if (json && code == "112") { json.ucs_y = {x: parseFloat(value)}; } else if (json && code == "120") { json.origin.y = parseFloat(value); } else if (json && code == "121") { json.ucs_x.y = parseFloat(value); } else if (json && code == "122") { json.ucs_y.y = parseFloat(value); } else if (json && code == "130") { json.origin.z = parseFloat(value); } else if (json && code == "131") { json.ucs_x.z = parseFloat(value); } else if (json && code == "132") { json.ucs_y.z = parseFloat(value); } else if (json && code == "146") { json.elevation = parseFloat(value); } } COUNT = COUNT + 2; } } getBlocks = (array, COUNT) => { let json, json2, blockBegan = false, entityStarted = false; while (COUNT < array.length - 1) { const code = array[COUNT].trim(); const value = array[COUNT + 1].trim(); if (code == "0" && value == "BLOCK") { json = {}; } else if (code == "0" && value == "ENDSEC") { this.blocks.push(json); return COUNT + 2; } else if (code == "0" && value == "ENDBLK") { if (json.entities && json2) json.entities.push(json2); this.blocks.push(json); blockBegan = false; } else if (code == "100" && value == "AcDbBlockBegin") { blockBegan = true; entityStarted = false; } if (blockBegan && code == "0") { if (!json.entities) json.entities = []; json2 = {etype: value}; entityStarted = true; } else if (blockBegan && json.entities && code == "330") { json.entities.push(json2); } else if (blockBegan && code == "2") { json.name = value; } else if (blockBegan && code == "4") { json.description = value; } else if (!blockBegan && code == "8") { json.layer = value; } else if (!entityStarted && code == "10") { json.base_point = { x : parseFloat(value) }; } else if (!entityStarted && code == "20") { json.base_point.y = parseFloat(value); } else if (!entityStarted && code == "30") { json.base_point.z = parseFloat(value); } else if (blockBegan && json2) { this.insertEntity(code, value, json2); } COUNT = COUNT + 2; } } getEntities = (array, COUNT) => { let json, json2; while (COUNT < array.length - 1) { const code = array[COUNT].trim(); const value = array[COUNT + 1].trim(); if (code == "0" && value == "ENDSEC" && json.etype != "SEQEND") { if (json.subclass == "AcDbDimension" && (json.specific_type == 'AcDbRotatedDimension' || json.specific_type == 'AcDbAlignedDimension')) { this.getDimLineCoordinates(json); } this.entities.push(json); return COUNT + 2; } if (value == "DSTYLE") { let ds_code = code, ds_value = value; while (ds_value != "}" && ds_code != "0") { COUNT = COUNT + 2; ds_code = array[COUNT].trim(); ds_value = array[COUNT + 1].trim(); if (DIMSTYLE_CODES[ds_value] !== undefined) { const temp = array[COUNT + 3].trim(); const key = DIMSTYLE_CODES[ds_value]; const actualValue = this.getDimStyleParams(ds_value, temp, key); json[key] = actualValue; COUNT = COUNT + 2; } } } if (code == "0" && (!json || (json.subclass && json.subclass != "AcDb3dPolyline" && json.etype != "SEQEND"))) { if (json) { if (json.subclass == "AcDbDimension" && (json.specific_type == 'AcDbRotatedDimension' || json.specific_type == 'AcDbAlignedDimension')) { this.getDimLineCoordinates(json); } this.entities.push(json); } json = {}; this.insertEntity(code, value, json); } else if (code == "0" && json && json.subclass == "AcDb3dPolyline" && value == "SEQEND") { if (json2 && json.vertices) json.vertices.push(json2); if (json) this.entities.push(json); json = {}; json2 = undefined; while (array[COUNT + 2].trim() != "0") { COUNT = COUNT + 2; } } else if (code == "0" && json && json.subclass == "AcDb3dPolyline") { if (!json.vertices) json.vertices = []; if (json2) json.vertices.push(json2); json2 = {}; this.insertEntity(code, value, json2); } else if (json2) { this.insertEntity(code, value, json2); } else { this.insertEntity(code, value, json); } COUNT = COUNT + 2; } } insertEntity = (code, value, json) => { if (json && !json.etype && code == "0") { json.etype = value; json.line_type = "ByLayer"; json.color = "ByLayer"; } else if (code == "1") { if (json.subclass == "AcDbText" || json.subclass == "AcDbMText") { const regex = /(\\P|\\L|\{|\}|\\*\\*a\d+;|\\H\d+\.?\d*x;|\+\/\-|%%u|\\Fromanc\||\\f.*p\d+;|t\d+;|c\d+;|\\fFutura Md BT\||\\Fsimplex\||\\fitalic.*c.*\d+;|scale.*\d+:\d+)/gim; json.text = value.replace(regex, ""); json.style = "STANDARD"; json.rotation = 0; } else if (json.subclass == "AcDbDimension") { const regex = /(\\P|\\L|\{|\}|\\*\\*a\d+;|\\H\d+\.?\d*x;|\+\/\-|%%u|\\Fromanc\||\\f.*p\d+;|t\d+;|c\d+;|\\fFutura Md BT\||\\Fsimplex\||\\fitalic.*c.*\d+;|scale.*\d+:\d+)/gim; json.text_override = value.replace(regex, ""); } else if (json.subclass == "AcDbModelerGeometry") { if (!json.proprietary_data) json.proprietary_data = []; json.proprietary_data.push(value); } else if (json.subclass == "AcDbFcf") { json.visual_representation = value; } } else if (code == "2") { if (json.subclass == "AcDbShape" || json.subclass == "AcDbMline" || json.subclass == "AcDbHatch") { json.style_name = value; } else if (json.subclass == "AcDbBlockReference") { json.block_name = value; } } else if (code == "3") { if (json.subclass == "AcDbDimension" || json.subclass == "AcDbLeader" || json.subclass == "AcDbFcf") { json.dimension_style = value; } else if (json.subclass == "AcDbModelerGeometry") { const temp = json.proprietary_data[json.proprietary_data.length - 1]; json.proprietary_data[json.proprietary_data.length - 1] = temp + value; } } else if (code == "6") { json.line_type = value; } else if (code == "7") { if (json.subclass == "AcDbMText") { json.style = value; } if (json.etype == "ACAD_TABLE" && json.subclass == "AcDbBlockReference") { if (json.cells && json.cells[json.cells.length - 1]) { json.cells[json.cells.length - 1].text_style = value; } else { json.text_style = value; } } } else if (code == "8") { json.layer = value; } else if (code == "10") { if (json.subclass == "AcDbLine" || json.subclass == "AcDbRay" || json.subclass == "AcDbMline") { json.start_x = parseFloat(value); } else if (json.subclass == "AcDbPolyline" || json.subclass == "AcDbLeader") { if (!json.vertices) json.vertices = []; json.vertices.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbSpline") { if (!json.control_points) json.control_points = []; json.control_points.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbTrace" || json.subclass == "AcDbFace") { if (!json.corners) json.corners = []; json.corners.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbHatch") { if (!json.seed_points) json.seed_points = []; json.seed_points.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbHelix") { if (!json.axis_base_point) json.axis_base_point = []; json.axis_base_point.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbRasterImage") { if (!json.insertion_point) json.insertion_point = []; json.insertion_point.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbXline") { if (!json.first_point) json.first_point = {}; json.first_point.x = parseFloat(value); } else if (json.subclass == "AcDbFcf") { if (!json.insertion_point) json.insertion_point = {}; json.insertion_point.x = parseFloat(value); } else { json.x = parseFloat(value); } } else if (code == "11") { if (json.subclass == "AcDbLine") { json.end_x = parseFloat(value); } else if (json.subclass == "AcDbSpline") { if (!json.fit_points) json.fit_points = []; json.fit_points.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbEllipse") { json.major_end_dx = parseFloat(value); } else if (json.subclass == "AcDbDimension") { json.x_text = parseFloat(value); } else if (json.subclass == "AcDbTrace" || json.subclass == "AcDbFace") { if (!json.corners) json.corners = []; json.corners.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbRay") { json.unit_direction_x = parseFloat(value); } else if (json.subclass == "AcDbHelix") { if (!json.start_point) json.start_point = []; json.start_point.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbMline") { if (!json.vertices) json.vertices = []; json.vertices.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbXline") { if (!json.unit_direction_vector) json.unit_direction_vector = {}; json.unit_direction_vector.x = parseFloat(value); } else if (json.subclass == "AcDbRasterImage") { if (!json.u_vector) json.u_vector = []; json.u_vector.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbRevolvedSurface") { if (!json.axis_vector) json.axis_vector = []; json.axis_vector.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbModelerGeometry" && (json.specific_type == "AcDbExtrudedSurface" || json.specific_type == "AcDbSweptSurface")) { if (!json.ref_vector) json.ref_vector = []; json.ref_vector.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbBlockReference" && json.specific_type == "AcDbTable") { json.direction_vector = {x: parseFloat(value)}; } else if (json.subclass == "AcDbFcf") { if (!json.x_axis_direction) json.x_axis_direction = {}; json.x_axis_direction.x = parseFloat(value); } } else if (code == "12") { if (json.subclass == "AcDbTrace" || json.subclass == "AcDbFace") { if (!json.corners) json.corners = []; json.corners.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbMline") { if (json.vertices && json.vertices.length > 0) { for (let i = 0; i < json.vertices.length; i++) { if (json.vertices[i].segment_dir_vector_x !== undefined) continue; json.vertices[i].segment_dir_vector_x = parseFloat(value); break; } } } else if (json.subclass == "AcDbHelix") { if (!json.axis_vector) json.axis_vector = []; json.axis_vector.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbRasterImage") { if (!json.v_vector) json.v_vector = []; json.v_vector.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbSpline") { if (!json.start_tangent) json.start_tangent = {}; json.start_tangent.x = parseFloat(value); } } else if (code == "13") { if (json.specific_type == "AcDbAlignedDimension" || json.specific_type == "AcDb3PointAngularDimension" || json.specific_type == "AcDb2LineAngularDimension") { json.ext_line1_x = parseFloat(value); } else if (json.specific_type == "AcDbOrdinateDimension") { json.location_x = parseFloat(value); } else if (json.subclass == "AcDbTrace" || json.subclass == "AcDbFace") { if (!json.corners) json.corners = []; json.corners.push({x: parseFloat(value)}); } else if (json.subclass == "AcDbMline") { if (json.vertices && json.vertices.length > 0) { for (let i = 0; i < json.vertices.length; i++) { if (json.vertices[i].miter_dir_vector_x !== undefined) continue; json.vertices[i].miter_dir_vector_x = parseFloat(value); break; } } } else if (json.subclass == "AcDbRasterImage") { json.u_value = parseFloat(value); } else if (json.subclass == "AcDbSpline") { if (!json.end_tangent) json.end_tangent = {}; json.end_tangent.x = parseFloat(value); } } else if (code == "14") { if (json.specific_type == "AcDbAlignedDimension" || json.specific_type == "AcDb3PointAngularDimension" || json.specific_type == "AcDb2LineAngularDimension") { json.ext_line2_x = parseFloat(value); } else if (json.specific_type == "AcDbOrdinateDimension") { json.leader_end_x = parseFloat(value); } else if (json.subclass == "AcDbRasterImage") { if (!json.clip_vertex) json.clip_vertex = []; json.clip_vertex.push({x: parseFloat(value)}); } } else if (code == "15") { if (json.specific_type == "AcDb3PointAngularDimension") { json.vertex_x = parseFloat(value); } else if (json.specific_type == "AcDbRadialDimension" || json.specific_type == "AcDbDiametricDimension" || json.specific_type == "AcDb2LineAngularDimension") { json.dim_first_point_x = parseFloat(value); } } else if (code == "16") { if (json.specific_type == "AcDb3PointAngularDimension") { json.arc_dim_line_x = parseFloat(value); } } else if (code == "20") { if (json.subclass == "AcDbLine" || json.subclass == "AcDbRay" || json.subclass == "AcDbMline") { json.start_y = parseFloat(value); } else if (json.subclass == "AcDbPolyline" || json.subclass == "AcDbLeader") { json.vertices[json.vertices.length - 1]["y"] = parseFloat(value); } else if (json.subclass == "AcDbSpline") { json.control_points[json.control_points.length - 1]["y"] = parseFloat(value); } else if (json.subclass == "AcDbTrace" || json.subclass == "AcDbFace") { if (json.corners && json.corners[0]) { json.corners[0]["y"] = parseFloat(value); } } else if (json.subclass == "AcDbHatch") { json.seed_points[json.seed_points.length - 1]["y"] = parseFloat(value); } else if (json.subclass == "AcDbHelix") { json.axis_base_point[json.axis_base_point.length - 1]["y"] = parseFloat(value); } else if (json.subclass == "AcDbRasterImage") { json.insertion_point[json.insertion_point.length - 1]["y"] = parseFloat(value); } else if (json.subclass == "AcDbXline") { json.first_point.y = parseFloat(value); } else if (json.subclass == "AcDbFcf") { json.insertion_point.y = parseFloat(value); } else { json.y = parseFloat(value); } } else if (code == "21") { if (json.subclass == "AcDbLine") { json.end_y = parseFloat(value); } else if (json.subclass == "AcDbSpline") { json.fit_points[json.fit_points.length - 1]["y"] = parseFloat(value); } else if (json.subclass == "AcDbEllipse") { json.major_end_dy = parseFloat(value); } else if (json.subclass == "AcDbDimension") { json.y_text = parseFloat(value); } else if (json.subclass == "AcDbTrace" || json.subclass == "AcDbFace") { if (json.corners && json.corners[1]) { json.corners[1]["y"] = parseFloat(value); } } else if (json.subclass == "AcDbRay") { json.unit_direction_y = parseFloat(value); } else if (json.subclass == "AcDbHelix") { json.start_point[json.start_point.length - 1]["y"] = parseFloat(value); } else if (json.subclass == "AcDbMline") { if (json.vertices && json.vertices.length > 0) { json.vertices[json.vertices.length - 1]["y"] = parseFloat(value); } } else if (json.subclass == "AcDbXline") { json.unit_direction_vector.y = parseFloat(value); } else if (json.subclass == "AcDbRasterImage") { json.u_vector[json.u_vector.length - 1]["y"] = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbRevolvedSurface") { json.axis_vector[json.axis_vector.length - 1]["y"] = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && (json.specific_type == "AcDbExtrudedSurface" || json.specific_type == "AcDbSweptSurface")) { json.ref_vector[json.ref_vector.length - 1]["y"] = parseFloat(value); } else if (json.subclass == "AcDbBlockReference" && json.specific_type == "AcDbTable") { json.direction_vector["y"] = parseFloat(value); } else if (json.subclass == "AcDbFcf") { json.x_axis_direction.y = parseFloat(value); } } else if (code == "22") { if (json.subclass == "AcDbTrace" || json.subclass == "AcDbFace") { if (json.corners && json.corners[2]) { json.corners[2]["y"] = parseFloat(value); } } else if (json.subclass == "AcDbMline") { if (json.vertices && json.vertices.length > 0) { for (let i = 0; i < json.vertices.length; i++) { if (json.vertices[i].segment_dir_vector_y !== undefined) continue; json.vertices[i].segment_dir_vector_y = parseFloat(value); break; } } } else if (json.subclass == "AcDbHelix") { json.axis_vector[json.axis_vector.length - 1]["y"] = parseFloat(value); } else if (json.subclass == "AcDbRasterImage") { json.v_vector[json.v_vector.length - 1]["y"] = parseFloat(value); } else if (json.subclass == "AcDbSpline") { if (!json.start_tangent) json.start_tangent = {}; json.start_tangent.y = parseFloat(value); } } else if (code == "23") { if (json.specific_type == "AcDbAlignedDimension" || json.specific_type == "AcDb3PointAngularDimension" || json.specific_type == "AcDb2LineAngularDimension") { json.ext_line1_y = parseFloat(value); } else if (json.specific_type == "AcDbOrdinateDimension") { json.location_y = parseFloat(value); } else if (json.subclass == "AcDbTrace" || json.subclass == "AcDbFace") { if (json.corners && json.corners[3]) { json.corners[3]["y"] = parseFloat(value); } } else if (json.subclass == "AcDbMline") { if (json.vertices && json.vertices.length > 0) { for (let i = 0; i < json.vertices.length; i++) { if (json.vertices[i].miter_dir_vector_y !== undefined) continue; json.vertices[i].miter_dir_vector_y = parseFloat(value); break; } } } else if (json.subclass == "AcDbRasterImage") { json.v_value = parseFloat(value); } else if (json.subclass == "AcDbSpline") { if (!json.end_tangent) json.end_tangent = {}; json.end_tangent.y = parseFloat(value); } } else if (code == "24") { if (json.specific_type == "AcDbAlignedDimension" || json.specific_type == "AcDb3PointAngularDimension" || json.specific_type == "AcDb2LineAngularDimension") { json.ext_line2_y = parseFloat(value); } else if (json.specific_type == "AcDbOrdinateDimension") { json.leader_end_y = parseFloat(value); } else if (json.subclass == "AcDbRasterImage") { json.clip_vertex[json.clip_vertex.length - 1]["y"] = parseFloat(value); } } else if (code == "25") { if (json.specific_type == "AcDb3PointAngularDimension") { json.vertex_y = parseFloat(value); } else if (json.specific_type == "AcDbRadialDimension" || json.specific_type == "AcDbDiametricDimension" || json.specific_type == "AcDb2LineAngularDimension") { json.dim_first_point_y = parseFloat(value); } } else if (code == "26") { if (json.specific_type == "AcDb3PointAngularDimension") { json.arc_dim_line_y = parseFloat(value); } } else if (code == "30") { if (json.subclass == "AcDbLine" || json.subclass == "AcDbRay" || json.subclass == "AcDbMline") { json.start_z = parseFloat(value); } else if (json.subclass == "AcDbPolyline" || json.subclass == "AcDbLeader") { json.vertices[json.vertices.length - 1]["z"] = parseFloat(value); } else if (json.subclass == "AcDbSpline") { json.control_points[json.control_points.length - 1]["z"] = parseFloat(value); } else if (json.subclass == "AcDbTrace" || json.subclass == "AcDbFace") { if (json.corners && json.corners[0]) { json.corners[0]["z"] = parseFloat(value); } } else if (json.subclass == "AcDbHatch") { json.seed_points[json.seed_points.length - 1]["z"] = parseFloat(value); } else if (json.subclass == "AcDbHelix") { json.axis_base_point[json.axis_base_point.length - 1]["z"] = parseFloat(value); } else if (json.subclass == "AcDbRasterImage") { json.insertion_point[json.insertion_point.length - 1]["z"] = parseFloat(value); } else if (json.subclass == "AcDbXline") { json.first_point.z = parseFloat(value); } else if (json.subclass == "AcDbFcf") { json.insertion_point.z = parseFloat(value); } else { json.z = parseFloat(value); } } else if (code == "31") { if (json.subclass == "AcDbLine") { json.end_z = parseFloat(value); json.length = this.length(json); } else if (json.subclass == "AcDbSpline") { json.fit_points[json.fit_points.length - 1]["z"] = parseFloat(value); } else if (json.subclass == "AcDbEllipse") { json.major_end_dz = parseFloat(value); } else if (json.subclass == "AcDbDimension") { json.z_text = parseFloat(value); } else if (json.subclass == "AcDbTrace" || json.subclass == "AcDbFace") { if (json.corners && json.corners[1]) { json.corners[1]["z"] = parseFloat(value); } } else if (json.subclass == "AcDbRay") { json.unit_direction_z = parseFloat(value); } else if (json.subclass == "AcDbHelix") { json.start_point[json.start_point.length - 1]["z"] = parseFloat(value); } else if (json.subclass == "AcDbMline") { if (json.vertices && json.vertices.length > 0) { json.vertices[json.vertices.length - 1]["z"] = parseFloat(value); } } else if (json.subclass == "AcDbXline") { json.unit_direction_vector.z = parseFloat(value); } else if (json.subclass == "AcDbRasterImage") { json.u_vector[json.u_vector.length - 1]["z"] = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbRevolvedSurface") { json.axis_vector[json.axis_vector.length - 1]["z"] = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && (json.specific_type == "AcDbExtrudedSurface" || json.specific_type == "AcDbSweptSurface")) { json.ref_vector[json.ref_vector.length - 1]["z"] = parseFloat(value); } else if (json.subclass == "AcDbBlockReference" && json.specific_type == "AcDbTable") { json.direction_vector["z"] = parseFloat(value); } else if (json.subclass == "AcDbFcf") { json.x_axis_direction.z = parseFloat(value); } } else if (code == "32") { if (json.subclass == "AcDbTrace" || json.subclass == "AcDbFace") { if (json.corners && json.corners[2]) { json.corners[2]["z"] = parseFloat(value); } } else if (json.subclass == "AcDbMline") { if (json.vertices && json.vertices.length > 0) { for (let i = 0; i < json.vertices.length; i++) { if (json.vertices[i].segment_dir_vector_z !== undefined) continue; json.vertices[i].segment_dir_vector_z = parseFloat(value); break; } } } else if (json.subclass == "AcDbHelix") { json.axis_vector[json.axis_vector.length - 1]["z"] = parseFloat(value); } else if (json.subclass == "AcDbRasterImage") { json.v_vector[json.v_vector.length - 1]["z"] = parseFloat(value); } else if (json.subclass == "AcDbSpline") { if (!json.start_tangent) json.start_tangent = {}; json.start_tangent.z = parseFloat(value); } } else if (code == "33") { if (json.specific_type == "AcDbAlignedDimension" || json.specific_type == "AcDb3PointAngularDimension" || json.specific_type == "AcDb2LineAngularDimension") { json.ext_line1_z = parseFloat(value); } else if (json.specific_type == "AcDbOrdinateDimension") { json.location_z = parseFloat(value); } else if (json.subclass == "AcDbTrace" || json.subclass == "AcDbFace") { if (json.corners && json.corners[3]) { json.corners[3]["z"] = parseFloat(value); } } else if (json.subclass == "AcDbMline") { if (json.vertices && json.vertices.length > 0) { for (let i = 0; i < json.vertices.length; i++) { if (json.vertices[i].miter_dir_vector_z !== undefined) continue; json.vertices[i].miter_dir_vector_z = parseFloat(value); break; } } } else if (json.subclass == "AcDbSpline") { if (!json.end_tangent) json.end_tangent = {}; json.end_tangent.z = parseFloat(value); } } else if (code == "34") { if (json.specific_type == "AcDbAlignedDimension" || json.specific_type == "AcDb3PointAngularDimension" || json.specific_type == "AcDb2LineAngularDimension") { json.ext_line2_z = parseFloat(value); } else if (json.specific_type == "AcDbOrdinateDimension") { json.leader_end_z = parseFloat(value); } else if (json.subclass == "AcDbRasterImage") { json.clip_vertex[json.clip_vertex.length - 1]["z"] = parseFloat(value); } } else if (code == "35") { if (json.specific_type == "AcDb3PointAngularDimension") { json.vertex_z = parseFloat(value); } else if (json.specific_type == "AcDbRadialDimension" || json.specific_type == "AcDbDiametricDimension" || json.specific_type == "AcDb2LineAngularDimension") { json.dim_first_point_z = parseFloat(value); } } else if (code == "36") { if (json.specific_type == "AcDb3PointAngularDimension") { json.ext_line1_p1_x = json.ext_line1_x; json.ext_line1_p2_x = json.ext_line2_x; json.ext_line2_p1_x = json.x; json.ext_line2_p2_x = json.vertex_x; json.ext_line1_p1_y = json.ext_line1_y; json.ext_line1_p2_y = json.ext_line2_y; json.ext_line2_p1_y = json.y; json.ext_line2_p2_y = json.vertex_y; json.ext_line1_p1_z = json.ext_line1_z; json.ext_line1_p2_z = json.ext_line2_z; json.ext_line2_p1_z = json.z; json.ext_line2_p2_z = json.vertex_z; json.arc_dim_line_z = parseFloat(value); delete json.ext_line1_x; delete json.ext_line2_x; delete json.x; delete json.vertex_x; delete json.ext_line1_y; delete json.ext_line2_y; delete json.y; delete json.vertex_y; delete json.ext_line1_z; delete json.ext_line2_z; delete json.z; delete json.vertex_z; } } else if (code == "40") { if (json.subclass == "AcDbCircle") { json.radius = parseFloat(value); let A = this.area(json); const C = this.length(json); json.area = A.area; json.circumference = C; } else if (json.subclass == "AcDbEllipse") { json.minorToMajor = parseFloat(value); } else if (json.subclass == "AcDbSpline") { if (!json.knot_values) json.knot_values = []; json.knot_values.push(parseFloat(value)); } else if (json.subclass == "AcDbText" || json.subclass == "AcDbMText") { json.height = parseFloat(value); } else if (json.subclass == "AcDbVertex") { json.start_width = parseFloat(value); } else if (json.subclass == "AcDbShape") { json.size = parseFloat(value); } else if (json.subclass == "AcDbMline") { json.scale_factor = parseFloat(value); } else if (json.subclass == "AcDbDimension") { json.leader_length = parseFloat(value); } else if (json.subclass == "AcDbHelix") { json.radius = parseFloat(value); } else if (json.subclass == "AcDbLeader") { json.text_height = parseFloat(value); } else if (json.subclass == "AcDbPolyline") { json.vertices[json.vertices.length - 1]["start_width"] = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbRevolvedSurface") { json.revolve_angle = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbExtrudedSurface") { if (!json.transform_matrix_revolved) json.transform_matrix_revolved = []; json.transform_matrix_revolved.push(parseFloat(value)); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbLoftedSurface") { if (!json.transform_matrix) json.transform_matrix = []; json.transform_matrix.push(parseFloat(value)); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbSweptSurface") { if (!json.transform_matrix_sweep2) json.transform_matrix_sweep2 = []; json.transform_matrix_sweep2.push(parseFloat(value)); } else if (json.etype == "ACAD_TABLE" && json.subclass == "AcDbBlockReference") { json.horizontal_margin = parseFloat(value); } } else if (code == "41") { if (json.subclass == "AcDbEllipse") { json.start_parameter = parseFloat(value); if (!isNaN(json.end_parameter)) { this.getEllipseAngles(json); } } else if (json.subclass == "AcDbText") { json.width = parseFloat(value); } else if (json.subclass == "AcDbVertex") { json.end_width = parseFloat(value); } else if (json.subclass == "AcDbMline") { if (json.vertices && json.vertices.length > 0) { if (!json.vertices[json.vertices.length - 1].parameters) { json.vertices[json.vertices.length - 1].parameters = []; } json.vertices[json.vertices.length - 1].parameters.push(parseFloat(value)); } } else if (json.subclass == "AcDbSpline") { if (!json.weights) json.weights = []; json.weights.push(parseFloat(value)); } else if (json.subclass == "AcDbHatch") { json.pattern_scale = parseFloat(value); } else if (json.subclass == "AcDbBlockReference") { json.scale_x = parseFloat(value); } else if (json.subclass == "AcDbHelix") { json.number_of_turns = parseFloat(value); } else if (json.subclass == "AcDbLeader") { json.text_width = parseFloat(value); } else if (json.subclass == "AcDbPolyline") { json.vertices[json.vertices.length - 1]["end_width"] = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbRevolvedSurface") { json.start_angle = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbLoftedSurface") { json.start_draft_angle = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbSweptSurface") { if (!json.transform_matrix_path2) json.transform_matrix_path2 = []; json.transform_matrix_path2.push(parseFloat(value)); } else if (json.etype == "ACAD_TABLE" && json.subclass == "AcDbBlockReference") { json.vertical_margin = parseFloat(value); } } else if (code == "42") { if (json.subclass == "AcDbEllipse") { json.end_parameter = parseFloat(value); if (!isNaN(json.start_parameter)) { this.getEllipseAngles(json); } } else if (json.subclass == "AcDbText") { json.character_width = parseFloat(value); } else if (json.subclass == "AcDbDimension") { json.actual_measurement = parseFloat(value); if (json.text_override == "<>") { json.text_override = value; } } else if (json.subclass == "AcDbBlockReference") { json.scale_y = parseFloat(value); } else if (json.subclass == "AcDbHelix") { json.turn_height = parseFloat(value); } else if (json.subclass == "AcDbPolyline") { json.vertices[json.vertices.length - 1]["bulge"] = parseFloat(value); } else if (json.subclass == "AcDbMline") { if (json.vertices && json.vertices.length > 0) { if (!json.vertices[json.vertices.length - 1].area_fill_parameters) { json.vertices[json.vertices.length - 1].area_fill_parameters = []; } json.vertices[json.vertices.length - 1].area_fill_parameters.push(parseFloat(value)); } } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbRevolvedSurface") { if (!json.transform_matrix) json.transform_matrix = []; json.transform_matrix.push(parseFloat(value)); } else if (json.subclass == "AcDbModelerGeometry" && (json.specific_type == "AcDbExtrudedSurface" || json.specific_type == "AcDbSweptSurface")) { json.draft_angle = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbLoftedSurface") { json.end_draft_angle = parseFloat(value); } } else if (code == "43") { if (json.subclass == "AcDbBlockReference") { json.scale_z = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbRevolvedSurface") { json.draft_angle = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && (json.specific_type == "AcDbExtrudedSurface" || json.specific_type == "AcDbSweptSurface")) { json.start_draft_distance = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbLoftedSurface") { json.start_draft_magnitude = parseFloat(value); } } else if (code == "44") { if (json.subclass == "AcDbBlockReference") { json.column_spacing = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbRevolvedSurface") { json.start_draft_distance = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && (json.specific_type == "AcDbExtrudedSurface" || json.specific_type == "AcDbSweptSurface")) { json.end_draft_distance = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbLoftedSurface") { json.end_draft_magnitude = parseFloat(value); } } else if (code == "45") { if (json.subclass == "AcDbBlockReference") { json.row_spacing = parseFloat(value); } else if (json.subclass == "AcDbModelerGeometry" && json.specific_type == "AcDbRevolvedSurface") { json.end_draft_distance = parseFloat(value);