DXF parsing을 위한 dxf-json 패키지

dotoritos·2024년 11월 9일
0
post-thumbnail

dxf-json

개요

데이터 누락 없이 DXF 파일을 JSON 파일로 안정적으로 구문 분석하는 라이브러리

왜 만들었는가

dxf 파일에 대한 분석을 위해 이 복잡하고도 난해한 dxf format 파일을 도식화 하고 분류해서 체계적으로 내용물들을 관리 할 필요성이 있었음.

기존에 있는 물건이 있는데 왜 또만드냐

당연히 인지 하고 있었다.
dxf-parser 이라는 레포지토리의 존재를 알고 이미 이것을 사용하고 있었다.
이 레포지토리는 도면 분석에 있어 진짜 필요한 데이터를 모두 불러오지 않았다.
3D는 바라지도 않았지만 Leaders, objects 들을 가져오지 못했으며 entities도 2D 도면을 구성하는 엔티티들 중 많은 것을 누락시켰고 파서 구조 또한 불안정했다.

신뢰할 수 없었던 파서였다.

특징

  • 동기식 파싱, 비동기식 파싱, URL 가져오기가 가능합니다.
  • AutoCad Dxf 형식을 구문 분석하기 위해 만들어졌습니다.
  • 이는 모듈화되어 있으며 헤더, 클래스, 테이블, 블록, 엔터티, 객체 섹션으로 구분되어 있습니다.
  • 사용하기 매우 간단합니다.
  • dxf 파일을 입력하면 json 데이터가 반환됩니다.

파싱 적용 범위

대부분 헤더를 로드할 수 있습니다.

Tables

  • blockRecord - 블록레코드
  • dimStyle - 치수스타일
  • layer - 레이어
  • ltype - 선 타입
  • style - 스타일
  • vport - 뷰포트

Blocks

도면의 각 블록 참조에 대한 항목까지 포함되어 있습니다.

Entities

  • arc - 호
  • attdef - 명령
  • attribute - 속성
  • circle - 원
  • dimension - 치수선
  • ellipse - 타원
  • hatch - 해치
  • insert - 삽입 명령어
  • leader - 지시선
  • line - 선
  • lwpolyline - lw폴리라인
  • mtext - MTEXT
  • point - 점
  • polyline - 폴리라인
  • section - 단면
  • solid - 솔리드
  • spline - 자유선
  • text - 텍스트
  • vertex - 정점
  • viewport - 뷰포트

Objects

  • dictionary - 딕셔너리
  • layout - 레이아웃
  • plotSettings - 플롯세팅

그리고 개발 시 필요한 타입정의도 안전하게 지원 합니다.

예시

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;
    };
}

사용법

Sync, Stream, UrlFetch 세 방법을 이용해 파싱할 수 있습니다.
하지만 아직 진정한 의미의 Stream 파싱이 구현되지 않았으니 Sync 혹은 UrlFetch를 권장드립니다.
String Length 문서에 명시되어 있듯, 메모리에 dxf 데이터를 전부 올려두고 스트림 하는 방ㅇ식이라 진정한 의미의 스트림 파싱이 아닙니다. 최소 512MB, 최대 4GB 까지만 가능합니다.

npm:

npm package
npm install
npm run build
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);

마무리

10달 전에 제가 만들어두고 간간히 약간의 패치만 해둔 채 오픈소스 커뮤니티가 활성화 되지 않고 스타만 늘어나는 느낌이라 활기가 없는 레포지토리 입니다.
기능요청, 버그, 풀리퀘 등 원하시면 얼마든지 요청 부탁드려요!

profile
졸려

0개의 댓글