libredwg-web-ts
Version:
A DWG/DXF JavaScript parser based on libredwg
1,006 lines (1,004 loc) • 37.1 kB
JavaScript
import { HEADER_VARIABLES, MODEL_SPACE } 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) {
const db = {
tables: {
BLOCK_RECORD: {
entries: []
},
DIMSTYLE: {
entries: []
},
LAYER: {
entries: []
},
LTYPE: {
entries: []
},
STYLE: {
entries: []
},
VPORT: {
entries: []
}
},
objects: {
IMAGEDEF: [],
LAYOUT: []
},
header: {},
entities: []
};
const libredwg = this.libredwg;
this.convertHeader(data, db.header);
const num_objects = libredwg.dwg_get_num_objects(data);
const results = [];
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 (btr.name == MODEL_SPACE) {
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_LAYER:
db.tables.LAYER.entries.push(this.convertLayer(tio, obj));
break;
case Dwg_Object_Type.DWG_TYPE_LTYPE:
db.tables.LTYPE.entries.push(this.convertLineType(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;
}
results.push(tio);
}
}
return db;
}
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;
});
}
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);
commonAttrs.name = block.name;
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);
}
const entities = this.convertEntities(obj, commonAttrs.handle);
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;
const unsignedValue = color.rgb >>> 0;
const index = unsignedValue & 0xFF;
const colors = [
0,
16711680,
16776960,
65280,
65535,
255,
16711935,
16777215,
8421504,
12632256,
16711680,
16744319,
13369344,
13395558,
10027008,
10046540,
8323072,
8339263,
4980736,
4990502,
16727808,
16752511,
13382400,
13401958,
10036736,
10051404,
8331008,
8343359,
4985600,
4992806,
16744192,
16760703,
13395456,
13408614,
10046464,
10056268,
8339200,
8347455,
4990464,
4995366,
16760576,
16768895,
13408512,
13415014,
10056192,
10061132,
8347392,
8351551,
4995328,
4997670,
16776960,
16777087,
13421568,
13421670,
10000384,
10000460,
8355584,
8355647,
5000192,
5000230,
12582656,
14679935,
10079232,
11717734,
7510016,
8755276,
6258432,
7307071,
3755008,
4344870,
8388352,
12582783,
6736896,
10079334,
5019648,
7510092,
4161280,
6258495,
2509824,
3755046,
4194048,
10485631,
3394560,
8375398,
2529280,
6264908,
2064128,
5209919,
1264640,
3099686,
65280,
8388479,
52224,
6736998,
38912,
5019724,
32512,
4161343,
19456,
2509862,
65343,
8388511,
52275,
6737023,
38950,
5019743,
32543,
4161359,
19475,
2509871,
65407,
8388543,
52326,
6737049,
38988,
5019762,
32575,
4161375,
19494,
2509881,
65471,
8388575,
52377,
6737074,
39026,
5019781,
32607,
4161391,
19513,
2509890,
65535,
8388607,
52428,
6737100,
39064,
5019800,
32639,
4161407,
19532,
2509900,
49151,
8380415,
39372,
6730444,
29336,
5014936,
24447,
4157311,
14668,
2507340,
32767,
8372223,
26316,
6724044,
19608,
5010072,
16255,
4153215,
9804,
2505036,
16383,
8364031,
13260,
6717388,
9880,
5005208,
8063,
4149119,
4940,
2502476,
255,
8355839,
204,
6710988,
152,
5000344,
127,
4145023,
76,
2500172,
4129023,
10452991,
3342540,
8349388,
2490520,
6245528,
2031743,
5193599,
1245260,
3089996,
8323327,
12550143,
6684876,
10053324,
4980888,
7490712,
4128895,
6242175,
2490444,
3745356,
12517631,
14647295,
10027212,
11691724,
7471256,
8735896,
6226047,
7290751,
3735628,
4335180,
16711935,
16744447,
13369548,
13395660,
9961624,
9981080,
8323199,
8339327,
4980812,
4990540,
16711871,
16744415,
13369497,
13395634,
9961586,
9981061,
8323167,
8339311,
4980793,
4990530,
16711807,
16744383,
13369446,
13395609,
9961548,
9981042,
8323135,
8339295,
4980774,
4990521,
16711743,
16744351,
13369395,
13395583,
9961510,
9981023,
8323103,
8339279,
4980755,
4990511,
3355443,
5987163,
8684676,
11382189,
14079702,
16777215
]
return {
...commonAttrs,
standardFlag: flag,
colorIndex: color.index,
color: colors[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