package com.fdkankan.dxf.parse.analysis;
import com.fdkankan.dxf.parse.enums.CadVersionEnum;
import com.fdkankan.dxf.parse.enums.DxfSystemEnum;
import com.fdkankan.dxf.parse.enums.entities.*;
import com.fdkankan.dxf.parse.model.GeometricModel;
import com.fdkankan.dxf.parse.model.headers.HeaderModel;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @AUTHOR ZhangJunJie
* @DATE 2023/11/25
*
* 概要:DXF 文件解析
*/
public class DxfAnalysis {
/**
* 读取所有的行
*
* @param reader BufferedReader
* @return 返回文件的所有数据,以每一行数据为一个item
* @throws IOException IO异常
*/
private static List readAllLine(BufferedReader reader) throws IOException {
List list = new ArrayList<>();;
String line = null;
while ((line = reader.readLine()) != null) {
list.add(line.trim());
}
return list;
}
/**
* 解析dxf文件头信息,形成对象模型
*
* @param inputStream 文件流
* @param charset 字符编码 (UTF-8 GBK)
* @return
* @throws IOException
*/
public static HeaderModel parseDxfHeaderModel(InputStream inputStream, String charset) throws IOException {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charset))) {
List dxfAllLine = readAllLine(reader);
return DxfHeaderParse.getHeaderParse(dxfAllLine);
}
}
/**
* 返回几何图像解析数据
*
* @param inputStream dxf文件流
* @param dxfHeaderModel dxf解析出的头信息
* @return
* @throws IOException
*/
public static Map> parseDxfGeometricList(InputStream inputStream, HeaderModel dxfHeaderModel) throws IOException {
/**
* 从cad版本信息中获取字符编码
*/
CadVersionEnum cadVersionEnum = CadVersionEnum.getCadVersion(dxfHeaderModel.getCadVersion());
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, cadVersionEnum.getCharset()))) {
Map> map = new HashMap<>();
//读取dxf所有的数据
List lineList = readAllLine(reader);
// 解析dxf文件结构
parseFile(lineList, map, dxfHeaderModel);
return map;
}
}
/**
* 解析dxf文件结构
*
* @param lineList 总数据
* @param map 接收解析的数据map
*/
private static void parseFile(List lineList, Map> map, HeaderModel dxfHeaderModel) {
if (lineList == null || lineList.isEmpty()) {
return;
}
int i = 0;
String str = lineList.get(i);
//未到文件结束标志
while (!DxfSystemEnum.FILE_END.getCode().equals(str)) {
str = lineList.get(++i);
//实体段开始
if (DxfSystemEnum.ENTITIES_START.getCode().equals(str)) {
//解析实体
parseEntities(i, lineList, map, dxfHeaderModel);
}
// 文件循环语句结束
}
// 解析函数结束
}
/**
* 解析实体
*
* @param i 实体开始读取的行数
* @param lineList 总数据
* @param map 接收解析的数据map
* @param dxfHeaderModel dxf文件的头信息模型
*/
private static void parseEntities(int i, List lineList, Map> map, HeaderModel dxfHeaderModel) {
String str = null;
while (true) {
str = lineList.get(++i);
//点开始
if (PointEnum.POINT_NAME.getCode().equals(str)) {
i = DxfEntitiesParse.getPoint(i, lineList, map);
}
//圆开始
if (CircleEnum.CIRCLE_NAME.getCode().equals(str)) {
i = DxfEntitiesParse.getCircle(i, lineList, map);
}
// 椭圆开始
if (EllipseEnum.ELLIPSE_NAME.getCode().equals(str)) {
// TODO 解析椭圆
}
// 圆弧开始
if (ArcEnum.ARC_NAME.getCode().equals(str)) {
i = DxfEntitiesParse.getArc(i, lineList, map);
}
//直线开始
if (LineEnum.LINE_NAME.getCode().equals(str)) {
i = DxfEntitiesParse.getLine(i, lineList, map);
}
//多线段
if (PolyLineEnum.LWPOLYLINE_NAME.getCode().equals(str)) {
i = DxfEntitiesParse.getLWPolyLine(i, lineList, map);
}
// 多线段
if (PolyLineEnum.POLYLINE_NAME.getCode().equals(str)) {
i = DxfEntitiesParse.getPolyLine(i, lineList, map);
}
// 文本
if (TextEnum.TEXT_NAME.getCode().equals(str)) {
i = DxfEntitiesParse.getText(i, lineList, map);
}
// 多文本
if (MTextEnum.MTEXT_NAME.getCode().equals(str)) {
i = DxfEntitiesParse.getMText(i, lineList, map);
}
// 插入图元
if (InsertEnum.INSERT_NAME.getCode().equals(str)) {
i = DxfEntitiesParse.getInsert(i, lineList, map);
}
//实体结束
if (DxfSystemEnum.END_SEC.getCode().equals(str)) {
break;
}
}
}
}