A library that reliably parses DXF files into JSON files without missing data.
The goal of this library is to fully analyze dxf files from AutoCad and convert them to json files.
Block:
Header:
Entity:
Tables:
Objects:
I was able to get a lot of ideas from the dxf-parser library.
npm package:
npm i dxf-json
build:
npm install
npm run build
test:
npm install
npm run test:parser
parseSync:
const parser = new DxfParser()
return parser.parseSync(buffer)
parseStream:
import fs from 'fs'
const parser = new DxfParser();
const fileStream = fs.createReadStream("dxf file path", { encoding: 'utf8' });
return await parser.parseStream(fileStream);
parseUrl:
const parser = new DxfParser();
return await parser.parseFromUrl(url, encoding, RequestInit);
ParsedDxf:
interface ParsedDxf {
header: DxfHeader;
blocks: Record<string, DxfBlock>;
entities: CommonDxfEntity[];
tables: {
BLOCK_RECORD?: DxfTable<BlockRecordTableEntry>;
DIMSTYLE?: DxfTable<DimStylesTableEntry>;
STYLE?: DxfTable<StyleTableEntry>;
LAYER?: DxfTable<LayerTableEntry>;
LTYPE?: DxfTable<LTypeTableEntry>;
VPORT?: DxfTable<VPortTableEntry>;
};
objects: {
byName: Record<string, CommonDXFObject[]>;
byTree?: DxfObject;
};
}
DxfHeader:
type DxfHeaderVariable =
...
| 'DRAGVS'
| 'INTERFERECOLOR'
| 'INTERFEREOBJVS'
| 'INTERFEREVPVS'
| 'OBSLTYPE'
| 'SHADEDIF'
| 'MEASUREMENT';
export type DxfHeader = typeof DefaultDxfHeaderVariables & {
MEASUREMENT: Measurement;
} & Record<string, any>;
DxfBlock:
interface DxfBlock {
type: number;
name: string;
name2: string;
handle: string;
ownerHandle: string;
layer: string;
position: Point3D;
paperSpace: boolean;
xrefPath: string;
entities?: CommonDxfEntity[];
}
CommonDxfEntity:
interface CommonDxfEntity {
type: string;
handle: string;
ownerBlockRecordSoftId?: string;
isInPaperSpace?: boolean;
layer: string;
lineType?: string;
materialObjectHardId?: string;
colorIndex?: ColorIndex;
lineweight?: number;
lineTypeScale?: number;
isVisible?: boolean;
proxyByte?: number;
proxyEntity?: string;
color?: ColorInstance;
colorName?: string;
transparency?: number;
plotStyleHardId?: string;
shadowMode?: ShadowMode;
xdata?: XData;
ownerdictionaryHardId?: string | number | boolean;
ownerDictionarySoftId?: string | number | boolean;
}
tables: {
BLOCK_RECORD?: DxfTable<BlockRecordTableEntry>;
DIMSTYLE?: DxfTable<DimStylesTableEntry>;
STYLE?: DxfTable<StyleTableEntry>;
LAYER?: DxfTable<LayerTableEntry>;
LTYPE?: DxfTable<LTypeTableEntry>;
VPORT?: DxfTable<VPortTableEntry>;
};
interface DxfTable<T extends CommonDxfTableEntry> {
subclassMarker: 'AcDbSymbolTable';
name: string;
handle: string;
ownerDictionaryIds?: string[];
ownerObjectId: string;
maxNumberOfEntries: number;
entries: T[];
}
interface CommonDxfTableEntry {
name: string;
handle: string;
ownerObjectId: string;
}
BlockRecordTableEntry:
interface BlockRecordTableEntry extends CommonDxfTableEntry {
subclassMarker: 'AcDbBlockTableRecord';
name: string;
layoutObjects: string;
insertionUnits: number;
explodability: number;
scalability: number;
bmpPreview: string;
}
type DimStyleVariable =
| 'DIMPOST'
| 'DIMAPOST'
| 'DIMBLK_OBSOLETE'
| 'DIMBLK1_OBSOLETE'
| 'DIMBLK2_OBSOLETE'
| 'DIMSCALE'
| 'DIMASZ'
| 'DIMEXO'
| 'DIMDLI'
| 'DIMEXE'
| 'DIMRND'
| 'DIMDLE'
| 'DIMTP'
| 'DIMTM'
| 'DIMTXT'
| 'DIMCEN'
| 'DIMTSZ'
| 'DIMALTF'
| 'DIMLFAC'
| 'DIMTVP'
| 'DIMTFAC'
| 'DIMGAP'
| 'DIMALTRND'
| 'DIMTOL'
| 'DIMLIM'
| 'DIMTIH'
| 'DIMTOH'
| 'DIMSE1'
| 'DIMSE2'
| 'DIMTAD'
| 'DIMZIN'
| 'DIMAZIN'
| 'DIMALT'
| 'DIMALTD'
| 'DIMTOFL'
| 'DIMSAH'
| 'DIMTIX'
| 'DIMSOXD'
| 'DIMCLRD'
| 'DIMCLRE'
| 'DIMCLRT'
| 'DIMADEC'
| 'DIMUNIT'
| 'DIMDEC'
| 'DIMTDEC'
| 'DIMALTU'
| 'DIMALTTD'
| 'DIMAUNIT'
| 'DIMFRAC'
| 'DIMLUNIT'
| 'DIMDSEP'
| 'DIMTMOVE'
| 'DIMJUST'
| 'DIMSD1'
| 'DIMSD2'
| 'DIMTOLJ'
| 'DIMTZIN'
| 'DIMALTZ'
| 'DIMALTTZ'
| 'DIMFIT'
| 'DIMUPT'
| 'DIMATFIT'
| 'DIMTXSTY'
| 'DIMLDRBLK'
| 'DIMBLK'
| 'DIMBLK1'
| 'DIMBLK2'
| 'DIMLWD'
| 'DIMLWE';
interface DimStyleVariableSchema {
name: string;
code: number;
defaultValue?: string | number;
defaultValueImperial?: string | number;
}
type DimStylesTableEntry = {
subclassMarker: 'AcDbDimStyleTableRecord';
styleName: string;
DIMPOST?: string;
DIMAPOST?: string;
DIMBLK_OBSOLETE?: string;
DIMBLK1_OBSOLETE?: string;
DIMBLK2_OBSOLETE?: string;
DIMSCALE: number;
DIMASZ: number;
DIMEXO: number;
DIMDLI: number;
DIMEXE: number;
DIMRND: number;
DIMDLE: number;
DIMTP: number;
DIMTM: number;
DIMTXT: number;
DIMCEN: number;
DIMTSZ: number;
DIMALTF: number;
DIMLFAC: number;
DIMTVP: number;
DIMTFAC: number;
DIMGAP: number;
DIMALTRND: number;
DIMTOL: number;
DIMLIM: number;
DIMTIH: number;
DIMTOH: number;
DIMSE1: 0 | 1;
DIMSE2: 0 | 1;
DIMTAD: DimensionTextVertical;
DIMZIN: DimensionZeroSuppression;
DIMAZIN: DimensionZeroSuppressionAngular;
DIMALT: 0 | 1;
DIMALTD: number;
DIMTOFL: 0 | 1;
DIMSAH: 0 | 1;
DIMTIX: 0 | 1;
DIMSOXD: 0 | 1;
DIMCLRD: number;
DIMCLRE: number;
DIMCLRT: number;
DIMADEC?: number;
DIMUNIT?: number;
DIMDEC: number;
DIMTDEC: number;
DIMALTU: number;
DIMALTTD: number;
DIMAUNIT: number;
DIMFRAC: number;
DIMLUNIT: number;
DIMDSEP: string;
DIMTMOVE: undefined; // 미사용
DIMJUST: DimensionTextHorizontal;
DIMSD1: 0 | 1;
DIMSD2: 0 | 1;
DIMTOLJ: DimensionTextVertical;
DIMTZIN: DimensionZeroSuppression;
DIMALTZ: DimensionZeroSuppression;
DIMALTTZ: DimensionZeroSuppression;
DIMFIT?: number;
DIMUPT: number;
DIMATFIT: number;
DIMTXSTY?: string;
DIMLDRBLK?: string;
DIMBLK?: string;
DIMBLK1?: string;
DIMBLK2?: string;
DIMLWD: number;
DIMLWE: number;
} & CommonDxfTableEntry;
type StyleResolver = <Name extends DimStyleVariable>(
variableName: Name,
) => DimStylesTableEntry[Name];
interface StyleTableEntry extends CommonDxfTableEntry {
subclassMarker: 'AcDbTextStyleTableRecord';
name: string;
standardFlag: number;
fixedTextHeight: number;
widthFactor: number;
obliqueAngle: number;
textGenerationFlag: number;
lastHeight: number;
font: string;
bigFont: string;
extendedFont?: string;
}
interface LayerTableEntry extends CommonDxfTableEntry {
subclassMarker: 'AcDbLayerTableRecord';
name: string;
standardFlag: number;
colorIndex: ColorIndex;
lineType: string;
isPlotting: boolean;
lineweight: number;
plotStyleNameObjectId?: string;
materialObjectId?: string;
}
interface LTypeTableEntry extends CommonDxfTableEntry {
subclassMarker: 'AcDbLinetypeTableRecord';
name: string;
standardFlag: number;
description: string;
numberOfLineTypes: number;
totalPatternLength: number;
pattern?: LineTypeElement[];
}
interface LineTypeElement {
elementLength: number;
elementTypeFlag: number;
shapeNumber?: number;
styleObjectId?: string;
scale?: number;
rotation?: number;
offsetX?: number;
offsetY?: number;
text?: string;
}
interface VPortTableEntry extends CommonDxfTableEntry {
subclassMarker: 'AcDbViewportTableRecord';
name: string;
standardFlag: number;
lowerLeftCorner: Point2D;
upperRightCorner: Point2D;
center: Point2D;
snapBasePoint: Point2D;
snapSpacing: Point2D;
gridSpacing: Point2D;
viewDirectionFromTarget: Point3D;
viewTarget: Point3D;
lensLength: number;
frontClippingPlane: number;
backClippingPlane: number;
viewHeight: number;
snapRotationAngle: number;
viewTwistAngle: number;
circleSides: number;
frozenLayers: string[];
styleSheet: string;
renderMode: RenderMode;
viewMode: number;
ucsIconSetting: number;
ucsOrigin: Point3D;
ucsXAxis: Point3D;
ucsYAxis: Point3D;
orthographicType: OrthographicType;
elevation: number;
shadePlotSetting: number;
majorGridLines: number;
backgroundObjectId?: string;
shadePlotObjectId?: string;
visualStyleObjectId?: string;
isDefaultLightingOn: boolean;
defaultLightingType: DefaultLightingType;
brightness: number;
contrast: number;
ambientColor?: number;
}
objects: {
byName: Record<string, CommonDXFObject[]>;
byTree?: DxfObject;
};
CommonDXFObject:
interface CommonDXFObject {
ownerObjectId: string;
ownerDictionaryIdHard: string;
ownerDictionaryIdSoft: string;
handle: string;
}
interface DxfObject {
name: string;
handle: string;
ownerDictionaryIdSoft: string;
ownerDictionaryIdHard?: string;
ownerObjectId?: string;
}
Please refer to the dxf reference for undefined elements and leave them as issues!
GPL-3.0 license