UNPKG

@mlightcad/libredwg-web

Version:

A DWG/DXF JavaScript parser based on libredwg

802 lines 34.1 kB
import { HEADER_VARIABLES, isModelSpace } from '../database'; import { Dwg_Object_Type } from '../types'; import { LibreEntityConverter } from './entityConverter'; /** * Class used to convert Dwg_Data instance to DwgDatabase instance. */ export class LibreDwgConverter { libredwg; entityConverter; constructor(instance) { this.libredwg = instance; this.entityConverter = new LibreEntityConverter(instance); } convert(data) { this.entityConverter.clear(); const db = { tables: { BLOCK_RECORD: { entries: [] }, DIMSTYLE: { entries: [] }, LAYER: { entries: [] }, LTYPE: { entries: [] }, STYLE: { entries: [] }, VPORT: { entries: [] } }, objects: { IMAGEDEF: [], LAYOUT: [] }, header: {}, entities: [], classes: [] }; const libredwg = this.libredwg; this.convertHeader(data, db.header); this.convertClasses(data, db.classes); const num_objects = libredwg.dwg_get_num_objects(data); for (let i = 0; i < num_objects; i++) { const obj = libredwg.dwg_get_object(data, i); const tio = libredwg.dwg_object_to_object_tio(obj); if (tio) { const fixedtype = libredwg.dwg_object_get_fixedtype(obj); switch (fixedtype) { case Dwg_Object_Type.DWG_TYPE_LAYER: { const layer = this.convertLayer(tio, obj); db.tables.LAYER.entries.push(layer); this.entityConverter.layers.set(layer.handle, layer.name); } break; case Dwg_Object_Type.DWG_TYPE_LTYPE: { const ltype = this.convertLineType(tio, obj); db.tables.LTYPE.entries.push(ltype); this.entityConverter.ltypes.set(ltype.handle, ltype.name); } break; default: break; } } } for (let i = 0; i < num_objects; i++) { const obj = libredwg.dwg_get_object(data, i); const tio = libredwg.dwg_object_to_object_tio(obj); if (tio) { const fixedtype = libredwg.dwg_object_get_fixedtype(obj); switch (fixedtype) { case Dwg_Object_Type.DWG_TYPE_BLOCK_HEADER: { const btr = this.convertBlockRecord(tio, obj); db.tables.BLOCK_RECORD.entries.push(btr); if (isModelSpace(btr.name)) { db.entities = btr.entities; } } break; case Dwg_Object_Type.DWG_TYPE_DIMSTYLE: db.tables.DIMSTYLE.entries.push(this.convertDimStyle(tio, obj)); break; case Dwg_Object_Type.DWG_TYPE_STYLE: db.tables.STYLE.entries.push(this.convertStyle(tio, obj)); break; case Dwg_Object_Type.DWG_TYPE_VPORT: db.tables.VPORT.entries.push(this.convertViewport(tio, obj)); break; case Dwg_Object_Type.DWG_TYPE_IMAGEDEF: db.objects.IMAGEDEF.push(this.convertImageDef(tio, obj)); break; case Dwg_Object_Type.DWG_TYPE_LAYOUT: db.objects.LAYOUT.push(this.convertLayout(tio, obj)); break; default: break; } } } return db; } getConversionStats() { return { unknownEntityCount: this.entityConverter.unknownEntityCount }; } convertHeader(data, header) { const libredwg = this.libredwg; HEADER_VARIABLES.forEach(name => { let var_name = name; if (name == 'DIMBLK' || name == 'DIMBLK1' || name == 'DIMBLK2') { var_name = var_name + '_T'; } let value = libredwg.dwg_dynapi_header_value(data, var_name).data; // Get object name if the 'value' is one Dwg_Object_Ref instance. // TODO: handle 'CMLSTYLE' correctly if (name == 'CELTYPE' || name == 'CLAYER' || name == 'CLAYER' || name == 'DIMSTYLE' || name == 'DIMTXSTY' || name == 'TEXTSTYLE') { value = libredwg.dwg_ref_get_object_name(value); } else if (name == 'DRAGVS') { value = libredwg.dwg_ref_get_absref(value); } // @ts-expect-error header variable name header[name] = value; }); } convertClasses(data, classes) { const libredwg = this.libredwg; const count = libredwg.dwg_get_num_classes(data); for (let index = 0; index < count; index++) { const cls = libredwg.dwg_get_class(data, index); classes.push({ dxfName: cls.dxfname, cppName: cls.cppname, appName: cls.appname, capabilitiesFlag: cls.proxyflag, instanceCount: cls.num_instances, wasAProxyFlag: cls.s_zombie, // DWG_TYPE_PROXY_ENTITY = 0x1F2 /* 498 */, // DWG_TYPE_PROXY_OBJECT = 0x1F3 /* 499 */, isAnEntityFlag: cls.item_class_id === 0x1F2 }); } } convertBlockRecord(item, obj) { const libredwg = this.libredwg; const commonAttrs = this.getCommonTableEntryAttrs(item, obj); // The BLOCK_HEADER has only the abbrevated name, but we want "*D30" instead of "*D". // So get full name from BLOCK entity. const block = libredwg.dwg_entity_block_header_get_block(item); if (block.name) { commonAttrs.name = block.name; } // The number of entities const num_owned = libredwg.dwg_dynapi_entity_value(item, 'num_owned').data; const flags = libredwg.dwg_dynapi_entity_value(item, 'flag').data; const description = libredwg.dwg_dynapi_entity_value(item, 'description') .data; const basePoint = libredwg.dwg_dynapi_entity_value(item, 'base_pt') .data; const insertionUnits = libredwg.dwg_dynapi_entity_value(item, 'insert_units').data; const explodability = libredwg.dwg_dynapi_entity_value(item, 'explodable') .data; const scalability = libredwg.dwg_dynapi_entity_value(item, 'block_scaling') .data; const layout_ptr = libredwg.dwg_dynapi_entity_value(item, 'layout') .data; const layout = libredwg.dwg_ref_get_absref(layout_ptr); let bmpPreview = ''; const uint8ArrayToHexString = (bytes) => { const hexChars = new Array(bytes.length); for (let i = 0; i < bytes.length; i++) { hexChars[i] = bytes[i].toString(16).toUpperCase(); } return hexChars.join(''); }; const bmpPreviewBinaryData = libredwg.dwg_entity_block_header_get_preview(item); if (bmpPreviewBinaryData && bmpPreviewBinaryData.length > 0) { bmpPreview = uint8ArrayToHexString(bmpPreviewBinaryData); } let entities = this.convertEntities(obj, commonAttrs.handle); if (entities.length == 0 || entities.length < num_owned) { const entities_ptr = libredwg.dwg_dynapi_entity_value(item, 'entities').data; const object_ref_ptr_array = libredwg.dwg_ptr_to_object_ref_ptr_array(entities_ptr, num_owned); const converter = this.entityConverter; entities = []; for (let index = 0; index < num_owned; index++) { const object = libredwg.dwg_ref_get_object(object_ref_ptr_array[index]); const entity = converter.convert(object); if (entity) entities.push(entity); } } return { ...commonAttrs, flags: flags, description: description, basePoint: basePoint, layout: layout, insertionUnits: insertionUnits, explodability: explodability, scalability: scalability, bmpPreview: bmpPreview, entities: entities }; } convertEntities(obj, ownerHandle) { const libredwg = this.libredwg; const converter = this.entityConverter; const entities = []; let next = libredwg.get_first_owned_entity(obj); while (next) { const entity = converter.convert(next); if (entity) { entity.ownerBlockRecordSoftId = ownerHandle; entities.push(entity); } next = libredwg.get_next_owned_entity(obj, next); } return entities; } convertDimStyle(item, obj) { const libredwg = this.libredwg; const commonAttrs = this.getCommonTableEntryAttrs(item, obj); const DIMTOL = libredwg.dwg_dynapi_entity_value(item, 'DIMTOL') .data; const DIMLIM = libredwg.dwg_dynapi_entity_value(item, 'DIMLIM') .data; const DIMTIH = libredwg.dwg_dynapi_entity_value(item, 'DIMTIH') .data; const DIMTOH = libredwg.dwg_dynapi_entity_value(item, 'DIMTOH') .data; const DIMSE1 = libredwg.dwg_dynapi_entity_value(item, 'DIMSE1') .data; const DIMSE2 = libredwg.dwg_dynapi_entity_value(item, 'DIMSE2') .data; const DIMALT = libredwg.dwg_dynapi_entity_value(item, 'DIMALT') .data; const DIMTOFL = libredwg.dwg_dynapi_entity_value(item, 'DIMTOFL') .data; const DIMSAH = libredwg.dwg_dynapi_entity_value(item, 'DIMSAH') .data; const DIMTIX = libredwg.dwg_dynapi_entity_value(item, 'DIMTIX') .data; const DIMSOXD = libredwg.dwg_dynapi_entity_value(item, 'DIMSOXD') .data; const DIMALTD = libredwg.dwg_dynapi_entity_value(item, 'DIMALTD') .data; const DIMZIN = libredwg.dwg_dynapi_entity_value(item, 'DIMZIN') .data; const DIMSD1 = libredwg.dwg_dynapi_entity_value(item, 'DIMSD1') .data; const DIMSD2 = libredwg.dwg_dynapi_entity_value(item, 'DIMSD2') .data; const DIMTOLJ = libredwg.dwg_dynapi_entity_value(item, 'DIMTOLJ') .data; const DIMJUST = libredwg.dwg_dynapi_entity_value(item, 'DIMJUST') .data; const DIMFIT = libredwg.dwg_dynapi_entity_value(item, 'DIMFIT') .data; const DIMUPT = libredwg.dwg_dynapi_entity_value(item, 'DIMUPT') .data; const DIMTZIN = libredwg.dwg_dynapi_entity_value(item, 'DIMTZIN') .data; const DIMALTZ = libredwg.dwg_dynapi_entity_value(item, 'DIMALTZ') .data; const DIMALTTZ = libredwg.dwg_dynapi_entity_value(item, 'DIMALTTZ') .data; const DIMTAD = libredwg.dwg_dynapi_entity_value(item, 'DIMTAD') .data; const DIMUNIT = libredwg.dwg_dynapi_entity_value(item, 'DIMUNIT') .data; const DIMAUNIT = libredwg.dwg_dynapi_entity_value(item, 'DIMAUNIT') .data; const DIMDEC = libredwg.dwg_dynapi_entity_value(item, 'DIMDEC') .data; const DIMTDEC = libredwg.dwg_dynapi_entity_value(item, 'DIMTDEC') .data; const DIMALTU = libredwg.dwg_dynapi_entity_value(item, 'DIMALTU') .data; const DIMALTTD = libredwg.dwg_dynapi_entity_value(item, 'DIMALTTD') .data; const DIMSCALE = libredwg.dwg_dynapi_entity_value(item, 'DIMSCALE') .data; const DIMASZ = libredwg.dwg_dynapi_entity_value(item, 'DIMASZ') .data; const DIMEXO = libredwg.dwg_dynapi_entity_value(item, 'DIMEXO') .data; const DIMDLI = libredwg.dwg_dynapi_entity_value(item, 'DIMDLI') .data; const DIMEXE = libredwg.dwg_dynapi_entity_value(item, 'DIMEXE') .data; const DIMRND = libredwg.dwg_dynapi_entity_value(item, 'DIMRND') .data; const DIMDLE = libredwg.dwg_dynapi_entity_value(item, 'DIMDLE') .data; const DIMTP = libredwg.dwg_dynapi_entity_value(item, 'DIMTP').data; const DIMTM = libredwg.dwg_dynapi_entity_value(item, 'DIMTM').data; const DIMFXL = libredwg.dwg_dynapi_entity_value(item, 'DIMFXL') .data; const DIMJOGANG = libredwg.dwg_dynapi_entity_value(item, 'DIMJOGANG') .data; const DIMTFILL = libredwg.dwg_dynapi_entity_value(item, 'DIMTFILL') .data; const DIMTFILLCLR = libredwg.dwg_dynapi_entity_value(item, 'DIMTFILLCLR') .data; const DIMAZIN = libredwg.dwg_dynapi_entity_value(item, 'DIMAZIN') .data; const DIMARCSYM = libredwg.dwg_dynapi_entity_value(item, 'DIMARCSYM') .data; const DIMTXT = libredwg.dwg_dynapi_entity_value(item, 'DIMTXT') .data; const DIMCEN = libredwg.dwg_dynapi_entity_value(item, 'DIMCEN') .data; const DIMTSZ = libredwg.dwg_dynapi_entity_value(item, 'DIMTSZ') .data; const DIMALTF = libredwg.dwg_dynapi_entity_value(item, 'DIMALTF') .data; const DIMLFAC = libredwg.dwg_dynapi_entity_value(item, 'DIMLFAC') .data; const DIMTVP = libredwg.dwg_dynapi_entity_value(item, 'DIMTVP') .data; const DIMTFAC = libredwg.dwg_dynapi_entity_value(item, 'DIMTFAC') .data; const DIMGAP = libredwg.dwg_dynapi_entity_value(item, 'DIMGAP') .data; const DIMPOST = libredwg.dwg_dynapi_entity_value(item, 'DIMPOST') .data; const DIMAPOST = libredwg.dwg_dynapi_entity_value(item, 'DIMAPOST') .data; const DIMBLK_T = libredwg.dwg_dynapi_entity_value(item, 'DIMBLK_T') .data; const DIMBLK1_T = libredwg.dwg_dynapi_entity_value(item, 'DIMBLK1_T') .data; const DIMBLK2_T = libredwg.dwg_dynapi_entity_value(item, 'DIMBLK2_T') .data; const DIMALTRND = libredwg.dwg_dynapi_entity_value(item, 'DIMALTRND') .data; const DIMCLRD_N = libredwg.dwg_dynapi_entity_value(item, 'DIMCLRD_N') .data; const DIMCLRE_N = libredwg.dwg_dynapi_entity_value(item, 'DIMCLRE_N') .data; const DIMCLRT_N = libredwg.dwg_dynapi_entity_value(item, 'DIMCLRT_N') .data; const DIMCLRD = libredwg.dwg_dynapi_entity_value(item, 'DIMCLRD') .data; const DIMCLRE = libredwg.dwg_dynapi_entity_value(item, 'DIMCLRE') .data; const DIMCLRT = libredwg.dwg_dynapi_entity_value(item, 'DIMCLRT') .data; const DIMADEC = libredwg.dwg_dynapi_entity_value(item, 'DIMADEC') .data; const DIMFRAC = libredwg.dwg_dynapi_entity_value(item, 'DIMFRAC') .data; const DIMLUNIT = libredwg.dwg_dynapi_entity_value(item, 'DIMLUNIT') .data; const DIMDSEP = libredwg.dwg_dynapi_entity_value(item, 'DIMDSEP') .data; const DIMTMOVE = libredwg.dwg_dynapi_entity_value(item, 'DIMTMOVE') .data; const DIMATFIT = libredwg.dwg_dynapi_entity_value(item, 'DIMATFIT') .data; const DIMFXLON = libredwg.dwg_dynapi_entity_value(item, 'DIMFXLON') .data; const DIMTXTDIRECTION = libredwg.dwg_dynapi_entity_value(item, 'DIMTXTDIRECTION').data; const DIMALTMZF = libredwg.dwg_dynapi_entity_value(item, 'DIMALTMZF') .data; const DIMALTMZS = libredwg.dwg_dynapi_entity_value(item, 'DIMALTMZS') .data; const DIMMZF = libredwg.dwg_dynapi_entity_value(item, 'DIMMZF') .data; const DIMMZS = libredwg.dwg_dynapi_entity_value(item, 'DIMMZS') .data; const DIMLWD = libredwg.dwg_dynapi_entity_value(item, 'DIMLWD') .data; const DIMLWE = libredwg.dwg_dynapi_entity_value(item, 'DIMLWE') .data; const DIMTXSTY_Ptr = libredwg.dwg_dynapi_entity_value(item, 'DIMTXSTY') .data; const DIMTXSTY = libredwg.dwg_ref_get_absref(DIMTXSTY_Ptr); const DIMLDRBLK_Ptr = libredwg.dwg_dynapi_entity_value(item, 'DIMLDRBLK') .data; const DIMLDRBLK = libredwg.dwg_ref_get_absref(DIMLDRBLK_Ptr); return { ...commonAttrs, DIMPOST: DIMPOST, DIMAPOST: DIMAPOST, DIMBLK: DIMBLK_T, DIMBLK1: DIMBLK1_T, DIMBLK2: DIMBLK2_T, DIMSCALE: DIMSCALE, DIMASZ: DIMASZ, DIMEXO: DIMEXO, DIMDLI: DIMDLI, DIMEXE: DIMEXE, DIMRND: DIMRND, DIMDLE: DIMDLE, DIMTP: DIMTP, DIMTM: DIMTM, DIMTXT: DIMTXT, DIMCEN: DIMCEN, DIMTSZ: DIMTSZ, DIMALTF: DIMALTF, DIMLFAC: DIMLFAC, DIMTVP: DIMTVP, DIMTFAC: DIMTFAC, DIMGAP: DIMGAP, DIMALTRND: DIMALTRND, DIMTOL: DIMTOL, DIMLIM: DIMLIM, DIMTIH: DIMTIH, DIMTOH: DIMTOH, DIMSE1: DIMSE1, DIMSE2: DIMSE2, DIMTAD: DIMTAD, DIMZIN: DIMZIN, DIMAZIN: DIMAZIN, DIMALT: DIMALT, DIMALTD: DIMALTD, DIMTOFL: DIMTOFL, DIMSAH: DIMSAH, DIMTIX: DIMTIX, DIMSOXD: DIMSOXD, DIMCLRD: DIMCLRD, DIMCLRE: DIMCLRE, DIMCLRT: DIMCLRT, DIMADEC: DIMADEC, DIMUNIT: DIMUNIT, DIMDEC: DIMDEC, DIMTDEC: DIMTDEC, DIMALTU: DIMALTU, DIMALTTD: DIMALTTD, DIMAUNIT: DIMAUNIT, DIMFRAC: DIMFRAC, DIMLUNIT: DIMLUNIT, DIMDSEP: String.fromCharCode(DIMDSEP), DIMTMOVE: DIMTMOVE, DIMJUST: DIMJUST, DIMSD1: DIMSD1, DIMSD2: DIMSD2, DIMTOLJ: DIMTOLJ, DIMTZIN: DIMTZIN, DIMALTZ: DIMALTZ, DIMALTTZ: DIMALTTZ, DIMFIT: DIMFIT, DIMUPT: DIMUPT, DIMATFIT: DIMATFIT, DIMTXSTY: DIMTXSTY, DIMLDRBLK: DIMLDRBLK, DIMLWD: DIMLWD, DIMLWE: DIMLWE, DIMFXL: DIMFXL, DIMJOGANG: DIMJOGANG, DIMTFILL: DIMTFILL, DIMTFILLCLR: DIMTFILLCLR, DIMARCSYM: DIMARCSYM, DIMCLRD_N: DIMCLRD_N, DIMCLRE_N: DIMCLRE_N, DIMCLRT_N: DIMCLRT_N, DIMFXLON: DIMFXLON, DIMTXTDIRECTION: DIMTXTDIRECTION, DIMALTMZF: DIMALTMZF, DIMALTMZS: DIMALTMZS, DIMMZF: DIMMZF, DIMMZS: DIMMZS }; } convertLayer(item, obj) { const libredwg = this.libredwg; const commonAttrs = this.getCommonTableEntryAttrs(item, obj); const flag = libredwg.dwg_dynapi_entity_value(item, 'flag').data; const frozen = libredwg.dwg_dynapi_entity_value(item, 'frozen') .data; const off = libredwg.dwg_dynapi_entity_value(item, 'off').data; const frozenInNew = libredwg.dwg_dynapi_entity_value(item, 'frozen_in_new') .data; const locked = libredwg.dwg_dynapi_entity_value(item, 'plotflockedlag') .data; const plotFlag = libredwg.dwg_dynapi_entity_value(item, 'plotflag') .data; const linewt = libredwg.dwg_dynapi_entity_value(item, 'linewt') .data; const color = libredwg.dwg_dynapi_entity_value(item, 'color') .data; return { ...commonAttrs, standardFlag: flag, colorIndex: color.index, lineType: '', frozen: frozen != 0, off: off != 0, frozenInNew: frozenInNew != 0, locked: locked != 0, plotFlag: plotFlag, lineweight: linewt, plotStyleNameObjectId: '', materialObjectId: '' }; } convertLineType(item, obj) { const libredwg = this.libredwg; const commonAttrs = this.getCommonTableEntryAttrs(item, obj); const flag = libredwg.dwg_dynapi_entity_value(item, 'flag').data; const description = libredwg.dwg_dynapi_entity_value(item, 'description') .data; const numDashes = libredwg.dwg_dynapi_entity_value(item, 'numdashes') .data; const patternLen = libredwg.dwg_dynapi_entity_value(item, 'pattern_len') .data; // const dashes = libredwg.dwg_dynapi_entity_value(item, 'dashes').data as Dwg_Array_Ptr // const dashArray = dashes ? libredwg.dwg_ptr_to_ltype_dash_array(dashes, numDashes) : [] const dashArray = []; return { ...commonAttrs, description: description, standardFlag: flag, numberOfLineTypes: numDashes, totalPatternLength: patternLen, pattern: this.convertLineTypePattern(dashArray) }; } convertLineTypePattern(dashes) { const patterns = []; dashes.forEach(dash => { // For now always convert complex line type to simple line type patterns.push({ elementLength: dash.length || 0, elementTypeFlag: 0 }); }); return patterns; } convertStyle(item, obj) { const libredwg = this.libredwg; const commonAttrs = this.getCommonTableEntryAttrs(item, obj); const standardFlag = libredwg.dwg_dynapi_entity_value(item, 'flag') .data; const widthFactor = libredwg.dwg_dynapi_entity_value(item, 'width_factor') .data; const obliqueAngle = libredwg.dwg_dynapi_entity_value(item, 'oblique_angle') .data; const textGenerationFlag = libredwg.dwg_dynapi_entity_value(item, 'generation').data; const lastHeight = libredwg.dwg_dynapi_entity_value(item, 'last_height') .data; const font = libredwg.dwg_dynapi_entity_value(item, 'font_file') .data; const bigFont = libredwg.dwg_dynapi_entity_value(item, 'bigfont_file') .data; return { ...commonAttrs, standardFlag: standardFlag, fixedTextHeight: 0, // TODO: Set the correct value widthFactor: widthFactor, obliqueAngle: obliqueAngle, textGenerationFlag: textGenerationFlag, lastHeight: lastHeight, font: font, bigFont: bigFont }; } convertViewport(item, obj) { const libredwg = this.libredwg; const commonAttrs = this.getCommonTableEntryAttrs(item, obj); const standardFlag = libredwg.dwg_dynapi_entity_value(item, 'flag') .data; const viewHeight = libredwg.dwg_dynapi_entity_value(item, 'VIEWSIZE') .data; // BITCODE_BD view_width; // in DWG r13+, needed to calc. aspect_ratio // BITCODE_BD aspect_ratio; // DXF 41 = view_width / VIEWSIZE const center = libredwg.dwg_dynapi_entity_value(item, 'VIEWCTR') .data; const viewTarget = libredwg.dwg_dynapi_entity_value(item, 'view_target') .data; const viewDirectionFromTarget = libredwg.dwg_dynapi_entity_value(item, 'VIEWDIR').data; const viewTwistAngle = libredwg.dwg_dynapi_entity_value(item, 'view_twist') .data; const lensLength = libredwg.dwg_dynapi_entity_value(item, 'lens_length') .data; const frontClippingPlane = libredwg.dwg_dynapi_entity_value(item, 'front_clip_z').data; const backClippingPlane = libredwg.dwg_dynapi_entity_value(item, 'back_clip_z').data; const viewMode = libredwg.dwg_dynapi_entity_value(item, 'VIEWMODE') .data; const renderMode = libredwg.dwg_dynapi_entity_value(item, 'render_mode') .data; const isDefaultLightingOn = libredwg.dwg_dynapi_entity_value(item, 'use_default_lights') .data != 0; const defaultLightningType = libredwg.dwg_dynapi_entity_value(item, 'default_lightning_type').data; const brightness = libredwg.dwg_dynapi_entity_value(item, 'brightness') .data; const contrast = libredwg.dwg_dynapi_entity_value(item, 'contrast') .data; const ambient_color = libredwg.dwg_dynapi_entity_value(item, 'ambient_color').data; // ViewportTableRecord const lowerLeftCorner = libredwg.dwg_dynapi_entity_value(item, 'lower_left') .data; const upperRightCorner = libredwg.dwg_dynapi_entity_value(item, 'upper_right').data; // TODO: Not sure whether 'circleSides' is equal to 'circle_zoom' const circleSides = libredwg.dwg_dynapi_entity_value(item, 'circle_zoom') .data; const ucsIconSetting = libredwg.dwg_dynapi_entity_value(item, 'UCSICON') .data; // TODO: Not sure whether 'gridSpacing' is equal to 'GRIDUNIT' const gridSpacing = libredwg.dwg_dynapi_entity_value(item, 'GRIDUNIT') .data; const snapRotationAngle = libredwg.dwg_dynapi_entity_value(item, 'SNAPANG') .data; const snapBasePoint = libredwg.dwg_dynapi_entity_value(item, 'SNAPBASE') .data; // TODO: Not sure whether 'snapSpacing' is equal to 'SNAPUNIT' const snapSpacing = libredwg.dwg_dynapi_entity_value(item, 'SNAPUNIT') .data; const ucsOrigin = libredwg.dwg_dynapi_entity_value(item, 'ucsorg') .data; const ucsXAxis = libredwg.dwg_dynapi_entity_value(item, 'ucsxdir') .data; const ucsYAxis = libredwg.dwg_dynapi_entity_value(item, 'ucsydir') .data; const elevation = libredwg.dwg_dynapi_entity_value(item, 'ucs_elevation') .data; const majorGridLines = libredwg.dwg_dynapi_entity_value(item, 'grid_major') .data; const background = libredwg.dwg_dynapi_entity_value(item, 'background') .data; const backgroundObjectId = background ? libredwg.dwg_ref_get_absref(background).toString() : undefined; const visualstyle = libredwg.dwg_dynapi_entity_value(item, 'visualstyle') .data; const visualStyleObjectId = visualstyle ? libredwg.dwg_ref_get_absref(visualstyle).toString() : undefined; // BITCODE_B UCSFOLLOW; // BITCODE_B FASTZOOM; // BITCODE_B GRIDMODE; /* DXF 76: on or off */ // BITCODE_B SNAPMODE; /* DXF 75: on or off */ // BITCODE_B SNAPSTYLE; // BITCODE_BS SNAPISOPAIR; // BITCODE_B ucs_at_origin; // BITCODE_B UCSVP; // BITCODE_BS UCSORTHOVIEW; // BITCODE_BS grid_flags; /* bit 1: bound to limits, bit 2: adaptive */ // BITCODE_H sun; // BITCODE_H named_ucs; // BITCODE_H base_ucs; return { ...commonAttrs, standardFlag: standardFlag, lowerLeftCorner: lowerLeftCorner, upperRightCorner: upperRightCorner, center: center, snapBasePoint: snapBasePoint, snapSpacing: snapSpacing, gridSpacing: gridSpacing, viewDirectionFromTarget: viewDirectionFromTarget, viewTarget: viewTarget, lensLength: lensLength, frontClippingPlane: frontClippingPlane, backClippingPlane: backClippingPlane, viewHeight: viewHeight, snapRotationAngle: snapRotationAngle, viewTwistAngle: viewTwistAngle, circleSides: circleSides, frozenLayers: [], // TODO: Set the correct value styleSheet: '', // TODO: Set the correct value renderMode: renderMode, viewMode: viewMode, ucsIconSetting: ucsIconSetting, ucsOrigin: ucsOrigin, ucsXAxis: ucsXAxis, ucsYAxis: ucsYAxis, orthographicType: 0, // TODO: Set the correct value elevation: elevation, shadePlotSetting: 0, // TODO: Set the correct value majorGridLines: majorGridLines, backgroundObjectId: backgroundObjectId, // shadePlotObjectId: undefined, visualStyleObjectId: visualStyleObjectId, isDefaultLightingOn: isDefaultLightingOn, defaultLightingType: defaultLightningType, brightness: brightness, contrast: contrast, // TODO: Not sure whether 'index' or 'rgb' should be used ambientColor: ambient_color.index }; } getCommonTableEntryAttrs(tio, obj) { const libredwg = this.libredwg; const object_tio = libredwg.dwg_object_get_tio(obj); const ownerhandle = libredwg.dwg_object_object_get_ownerhandle_object(object_tio); const handle = libredwg.dwg_object_get_handle_object(obj); return { handle: handle.value, ownerHandle: ownerhandle.absolute_ref, name: libredwg.dwg_dynapi_entity_value(tio, 'name').data }; } convertImageDef(item, obj) { const libredwg = this.libredwg; const commonAttrs = this.getCommonObjectAttrs(obj); // const classVersion = libredwg.dwg_dynapi_entity_value(item, 'class_version').data as number const size = libredwg.dwg_dynapi_entity_value(item, 'image_size') .data; const fileName = libredwg.dwg_dynapi_entity_value(item, 'file_path') .data; const isLoaded = libredwg.dwg_dynapi_entity_value(item, 'is_loaded') .data; const sizeOfOnePixel = libredwg.dwg_dynapi_entity_value(item, 'pixel_size') .data; const resolutionUnits = libredwg.dwg_dynapi_entity_value(item, 'resunits') .data; return { ...commonAttrs, fileName: fileName, size: size, sizeOfOnePixel: sizeOfOnePixel, isLoaded: isLoaded, resolutionUnits: resolutionUnits }; } convertLayout(item, obj) { const libredwg = this.libredwg; const commonAttrs = this.getCommonObjectAttrs(obj); // AcDbLayout const layoutName = libredwg.dwg_dynapi_entity_value(item, 'layout_name') .data; const tabOrder = libredwg.dwg_dynapi_entity_value(item, 'tab_order') .data; const controlFlag = libredwg.dwg_dynapi_entity_value(item, 'layout_flags') .data; const insertionPoint = libredwg.dwg_dynapi_entity_value(item, 'INSBASE') .data; const minLimit = libredwg.dwg_dynapi_entity_value(item, 'LIMMIN') .data; const maxLimit = libredwg.dwg_dynapi_entity_value(item, 'LIMMAX') .data; const ucsOrigin = libredwg.dwg_dynapi_entity_value(item, 'UCSORG') .data; const ucsXAxis = libredwg.dwg_dynapi_entity_value(item, 'UCSXDIR') .data; const ucsYAxis = libredwg.dwg_dynapi_entity_value(item, 'UCSYDIR') .data; const orthographicType = libredwg.dwg_dynapi_entity_value(item, 'UCSORTHOVIEW').data; const minExtent = libredwg.dwg_dynapi_entity_value(item, 'EXTMIN') .data; const maxExtent = libredwg.dwg_dynapi_entity_value(item, 'EXTMAX') .data; const elevation = libredwg.dwg_dynapi_entity_value(item, 'ucs_elevation') .data; // BITCODE_H block_header; // BITCODE_H active_viewport; // BITCODE_H base_ucs; // BITCODE_H named_ucs; // BITCODE_BL num_viewports; // r2004+ // BITCODE_H *viewports; // r2004+ return { ...commonAttrs, layoutName: layoutName, controlFlag: controlFlag, tabOrder: tabOrder, minLimit: minLimit, maxLimit: maxLimit, insertionPoint: insertionPoint, minExtent: minExtent, maxExtent: maxExtent, elevation: elevation, ucsOrigin: ucsOrigin, ucsXAxis: ucsXAxis, ucsYAxis: ucsYAxis, orthographicType: orthographicType, paperSpaceTableId: '', // TODO: Set the correct value viewportId: '', // TODO: Set the correct value // namedUcsId?: string; // orthographicUcsId?: string; shadePlotId: '' // TODO: Set the correct value }; } getCommonObjectAttrs(obj) { const libredwg = this.libredwg; const object_tio = libredwg.dwg_object_get_tio(obj); const ownerhandle = libredwg.dwg_object_object_get_ownerhandle_object(object_tio); const handle = libredwg.dwg_object_get_handle_object(obj); return { handle: handle.value, ownerHandle: ownerhandle.absolute_ref }; } } //# sourceMappingURL=converter.js.map