DxfEntitiesParse.java 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
  1. package com.fdkankan.dxf.parse.analysis;
  2. import com.fdkankan.dxf.generate.util.DxfUtil;
  3. import com.fdkankan.dxf.parse.constant.EntityNameConstant;
  4. import com.fdkankan.dxf.parse.constant.PolyLineConstant;
  5. import com.fdkankan.dxf.parse.enums.DxfEntitiesBaseEnum;
  6. import com.fdkankan.dxf.parse.enums.entities.*;
  7. import com.fdkankan.dxf.parse.enums.error.DxfAnalysisErrorEnum;
  8. import com.fdkankan.dxf.parse.exception.DxfAnalysisException;
  9. import com.fdkankan.dxf.parse.model.GeometricModel;
  10. import com.fdkankan.dxf.parse.model.entities.*;
  11. import com.fdkankan.dxf.parse.utils.DecimalCheckUtil;
  12. import com.fdkankan.dxf.parse.utils.MTextStyleParse;
  13. import java.math.BigDecimal;
  14. import java.math.RoundingMode;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. import java.util.Map;
  18. /**
  19. * @Author ytzjj
  20. * @DateTime 2023/11/27 11:00
  21. * @Description dxf 解析entities 节点
  22. */
  23. public class DxfEntitiesParse {
  24. public static final Integer DECIMAL_SIZE = 10;
  25. /**
  26. * 获取图元
  27. *
  28. * @param i 多线段开始读取的行数
  29. * @param lineList 总数据
  30. * @param map 接收解析的数据map
  31. * @return 返回多线段读完最后行数
  32. */
  33. public static int getInsert(int i, List<String> lineList, Map<String, List<GeometricModel>> map) {
  34. String str;
  35. GeometricPoint point = new GeometricPoint();
  36. while (true) {
  37. str = lineList.get(++i);
  38. i = getGeometricBase(i, lineList, str, point);
  39. if (InsertEnum.LAYER_NAME.getCode().equals(str)) {
  40. str = lineList.get(++i);
  41. point.setLayerName(str);
  42. }
  43. if (InsertEnum.COORDINATE_X.getCode().equals(str)) {
  44. str = lineList.get(++i);
  45. if (!DecimalCheckUtil.check(str.trim())) {
  46. throw new DxfAnalysisException(DxfAnalysisErrorEnum.POINT_NOT_X);
  47. }
  48. point.setX(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  49. }
  50. if (InsertEnum.COORDINATE_Y.getCode().equals(str)) {
  51. str = lineList.get(++i);
  52. if (!DecimalCheckUtil.check(str.trim())) {
  53. throw new DxfAnalysisException(DxfAnalysisErrorEnum.POINT_NOT_Y);
  54. }
  55. point.setY(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  56. }
  57. if (InsertEnum.COORDINATE_Z.getCode().equals(str)) {
  58. str = lineList.get(++i);
  59. if (!DecimalCheckUtil.check(str.trim())) {
  60. throw new DxfAnalysisException(DxfAnalysisErrorEnum.POINT_NOT_Z);
  61. }
  62. point.setZ(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  63. }
  64. if (str.equals("0") && "5".equals(lineList.get(i + 2))) {
  65. // 实体结束
  66. break;
  67. }
  68. }
  69. List<GeometricModel> pointList = map.get(EntityNameConstant.POINT_NAME);
  70. if (pointList == null) {
  71. pointList = new ArrayList<>();
  72. ;
  73. }
  74. pointList.add(point);
  75. map.put(EntityNameConstant.POINT_NAME, pointList);
  76. return i;
  77. }
  78. /**
  79. * 获取多文本
  80. *
  81. * @param i 多线段开始读取的行数
  82. * @param lineList 总数据
  83. * @param map 接收解析的数据map
  84. * @return 返回多线段读完最后行数
  85. */
  86. public static int getMText(int i, List<String> lineList, Map<String, List<GeometricModel>> map) {
  87. String str = null;
  88. GeometricText point = new GeometricText();
  89. while (true) {
  90. str = lineList.get(++i);
  91. i = getGeometricBase(i, lineList, str, point);
  92. if (MTextEnum.LAYER_NAME.getCode().equals(str)) {
  93. str = lineList.get(++i);
  94. point.setLayerName(str);
  95. } else if (MTextEnum.COORDINATE_X.getCode().equals(str)) {
  96. str = lineList.get(++i);
  97. if (!DecimalCheckUtil.check(str.trim())) {
  98. throw new DxfAnalysisException(DxfAnalysisErrorEnum.POINT_NOT_X);
  99. }
  100. point.setX(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  101. } else if (MTextEnum.COORDINATE_Y.getCode().equals(str)) {
  102. str = lineList.get(++i);
  103. if (!DecimalCheckUtil.check(str.trim())) {
  104. throw new DxfAnalysisException(DxfAnalysisErrorEnum.POINT_NOT_Y);
  105. }
  106. point.setY(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  107. } else if (MTextEnum.COORDINATE_Z.getCode().equals(str)) {
  108. str = lineList.get(++i);
  109. if (!DecimalCheckUtil.check(str.trim())) {
  110. throw new DxfAnalysisException(DxfAnalysisErrorEnum.POINT_NOT_Z);
  111. }
  112. point.setZ(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  113. } else if (MTextEnum.MTEXT_CONTENT.getCode().equals(str)) {
  114. str = lineList.get(++i);
  115. String rule = "[{]\\\\fSimSun([|][a-z\\d]+){4};";
  116. String end = "(?<!\\\\)}";
  117. String changeLine = "\\P";
  118. str = str.replaceAll(rule, "");
  119. str = str.replaceAll(end, "");
  120. str = str.replace(changeLine, "\n");
  121. str = str.replace("\\}", "}");
  122. str = str.replace("\\{", "{");
  123. str = str.replace("\\\\f", "\\f");
  124. point.setText(str);
  125. } else if (MTextEnum.HEIGH.getCode().equals(str)) {
  126. str = lineList.get(++i);
  127. point.setHigh(Double.parseDouble(str));
  128. } else if (MTextEnum.WIDTH.getCode().equals(str)) {
  129. str = lineList.get(++i);
  130. point.setWidth(Double.parseDouble(str));
  131. } else if (MTextEnum.ANGLE.getCode().equals(str)) {
  132. str = lineList.get(++i);
  133. point.setAngle(new BigDecimal(str));
  134. } else if (MTextEnum.INCLINATION.getCode().equals(str)) {
  135. str = lineList.get(++i);
  136. point.setInclination(new BigDecimal(str));
  137. } else if (str.equals("0") && "5".equals(lineList.get(i + 2))) {
  138. // 实体结束
  139. break;
  140. } else {
  141. i++;
  142. }
  143. }
  144. List<GeometricModel> testList = map.get(EntityNameConstant.TEXT_NAME);
  145. if (testList == null) {
  146. testList = new ArrayList<>();
  147. ;
  148. }
  149. testList.add(point);
  150. map.put(EntityNameConstant.TEXT_NAME, testList);
  151. return i;
  152. }
  153. /**
  154. * 获取单行文本
  155. *
  156. * @param i 多线段开始读取的行数
  157. * @param lineList 总数据
  158. * @param map 接收解析的数据map
  159. * @return 返回多线段读完最后行数
  160. */
  161. public static int getText(int i, List<String> lineList, Map<String, List<GeometricModel>> map) {
  162. String str = null;
  163. GeometricText point = new GeometricText();
  164. while (true) {
  165. str = lineList.get(++i);
  166. i = getGeometricBase(i, lineList, str, point);
  167. if (TextEnum.LAYER_NAME.getCode().equals(str)) {
  168. str = lineList.get(++i);
  169. point.setLayerName(str);
  170. }
  171. if (TextEnum.COORDINATE_X.getCode().equals(str)) {
  172. str = lineList.get(++i);
  173. if (!DecimalCheckUtil.check(str.trim())) {
  174. throw new DxfAnalysisException(DxfAnalysisErrorEnum.POINT_NOT_X);
  175. }
  176. point.setX(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  177. }
  178. if (TextEnum.COORDINATE_Y.getCode().equals(str)) {
  179. str = lineList.get(++i);
  180. if (!DecimalCheckUtil.check(str.trim())) {
  181. throw new DxfAnalysisException(DxfAnalysisErrorEnum.POINT_NOT_Y);
  182. }
  183. point.setY(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  184. }
  185. if (TextEnum.COORDINATE_Z.getCode().equals(str)) {
  186. str = lineList.get(++i);
  187. if (!DecimalCheckUtil.check(str.trim())) {
  188. throw new DxfAnalysisException(DxfAnalysisErrorEnum.POINT_NOT_Z);
  189. }
  190. point.setZ(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  191. }
  192. if (TextEnum.TEXT_CONTENT.getCode().equals(str)) {
  193. str = lineList.get(++i);
  194. point.setText(str);
  195. }
  196. if (TextEnum.HEIGH.getCode().equals(str)) {
  197. str = lineList.get(++i);
  198. point.setHigh(Double.parseDouble(str));
  199. }
  200. if (TextEnum.WIDTH.getCode().equals(str)) {
  201. str = lineList.get(++i);
  202. point.setWidth(Double.parseDouble(str));
  203. }
  204. if (TextEnum.ANGLE.getCode().equals(str)) {
  205. str = lineList.get(++i);
  206. point.setAngle(new BigDecimal(str));
  207. }
  208. if (TextEnum.INCLINATION.getCode().equals(str)) {
  209. str = lineList.get(++i);
  210. point.setInclination(new BigDecimal(str));
  211. }
  212. if (str.equals("0") && "5".equals(lineList.get(i + 2))) {
  213. // 实体结束
  214. break;
  215. }
  216. }
  217. List<GeometricModel> testList = map.get(EntityNameConstant.TEXT_NAME);
  218. if (testList == null) {
  219. testList = new ArrayList<>();
  220. ;
  221. }
  222. testList.add(point);
  223. map.put(EntityNameConstant.TEXT_NAME, testList);
  224. return i;
  225. }
  226. /**
  227. * 获取多线段
  228. *
  229. * @param i 多线段开始读取的行数
  230. * @param lineList 总数据
  231. * @param map 接收解析的数据map
  232. * @return 返回多线段读完最后行数
  233. */
  234. public static int getLWPolyLine(int i, List<String> lineList, Map<String, List<GeometricModel>> map) {
  235. String str = null;
  236. GeometricPolyLine polyLine = new GeometricPolyLine();
  237. polyLine.setLogicClose(false);
  238. List<GeometricVertex> vertices = new ArrayList<>();
  239. int vertexNum = 0;
  240. while (true) {
  241. str = lineList.get(++i);
  242. // 多段线闭合
  243. if (PolyLineEnum.CLOSE.getCode().equals(str)) {
  244. str = lineList.get(++i);
  245. // 多段线的标志,表明这是一个闭合的多段线
  246. if (str.equals(PolyLineConstant.POLYLINE_LOGIC_CLOSE)) {
  247. polyLine.setLogicClose(true);
  248. } else if (str.equals(PolyLineConstant.POLYLINE_LOGIC_CLOSE_1)) {
  249. polyLine.setLogicClose(true);
  250. }
  251. }
  252. // 图层名称
  253. if (PolyLineEnum.LAYER_NAME.getCode().equals(str)) {
  254. str = lineList.get(++i);
  255. polyLine.setLayerName(str);
  256. }
  257. // 获取矢量图形的基本信息
  258. i = getGeometricBase(i, lineList, str, polyLine);
  259. // 线条类型
  260. if (PolyLineEnum.LINE_TYPE.getCode().equals(str)) {
  261. str = lineList.get(++i);
  262. polyLine.setLineType(str);
  263. }
  264. // 填充色
  265. if (PolyLineEnum.FILL_COLOR.getCode().equals(str)) {
  266. str = lineList.get(++i);
  267. polyLine.setFillColor(MTextStyleParse.parseCadColorToHexColorCode(str));
  268. }
  269. // 顶点数量
  270. if (PolyLineEnum.VERTEX_NUM.getCode().equals(str)) {
  271. str = lineList.get(++i);
  272. vertexNum = Integer.parseInt(str.trim());
  273. polyLine.setVertexNum(vertexNum);
  274. } else if (PolyLineEnum.COORDINATE_X.getCode().equals(str)) {
  275. for (int j = 0; j < vertexNum; j++) {
  276. GeometricVertex vertex = new GeometricVertex();
  277. //顶点的x坐标
  278. if (PolyLineEnum.COORDINATE_X.getCode().equals(str)) {
  279. str = lineList.get(++i);
  280. if (DecimalCheckUtil.check(str.trim())) {
  281. vertex.setX(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  282. str = lineList.get(++i);
  283. } else {
  284. break;
  285. }
  286. }
  287. //顶点的y坐标
  288. if (PolyLineEnum.COORDINATE_Y.getCode().equals(str)) {
  289. str = lineList.get(++i);
  290. vertex.setY(new BigDecimal(str.trim()));
  291. if (DecimalCheckUtil.check(str.trim())) {
  292. vertex.setY(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  293. str = lineList.get(++i);
  294. }
  295. vertices.add(vertex);
  296. }
  297. //起点宽度
  298. if (PolyLineEnum.START_WIDTH.getCode().equals(str)) {
  299. i += 2;
  300. str = lineList.get(i);
  301. }
  302. //端点宽度
  303. if (PolyLineEnum.END_WIDTH.getCode().equals(str)) {
  304. i += 2;
  305. str = lineList.get(i);
  306. }
  307. //凸度
  308. if (PolyLineEnum.OUT_DO.getCode().equals(str)) {
  309. i += 2;
  310. str = lineList.get(i);
  311. }
  312. // 最后一个点位 重置 flag 字段为 -1
  313. if (j == vertexNum - 1) {
  314. vertexNum = -1;
  315. }
  316. }
  317. }
  318. // 顶点结束
  319. if (vertexNum < 0) {
  320. break;
  321. }
  322. }
  323. polyLine.setVertexList(vertices);
  324. List<GeometricModel> polyLines = map.get(EntityNameConstant.POLY_LINE_NAME);
  325. if (polyLines == null) {
  326. polyLines = new ArrayList<>();
  327. ;
  328. map.put(EntityNameConstant.POLY_LINE_NAME, polyLines);
  329. }
  330. polyLines.add(polyLine);
  331. return i;
  332. }
  333. /**
  334. * 解析多段线
  335. *
  336. * @param i 多线段开始读取的行数
  337. * @param lineList 总数据
  338. * @param map 接收解析的数据map
  339. * @return: 返回多线段读完最后行数
  340. **/
  341. public static int getPolyLine(int i, List<String> lineList, Map<String, List<GeometricModel>> map) {
  342. String str = null;
  343. GeometricPolyLine polyLine = new GeometricPolyLine();
  344. polyLine.setLogicClose(false);
  345. List<GeometricVertex> vertices = new ArrayList<>();
  346. while (true) {
  347. str = lineList.get(++i);
  348. // 逻辑闭合
  349. if (PolyLineEnum.CLOSE.getCode().equals(str)) {
  350. str = lineList.get(++i);
  351. if (str.equals(PolyLineConstant.POLYLINE_LOGIC_CLOSE)) {
  352. polyLine.setLogicClose(true);
  353. } else if (str.equals(PolyLineConstant.POLYLINE_LOGIC_CLOSE_1)) {
  354. polyLine.setLogicClose(true);
  355. }
  356. }
  357. // 图层名称
  358. if (PolyLineEnum.LAYER_NAME.getCode().equals(str)) {
  359. str = lineList.get(++i);
  360. polyLine.setLayerName(str);
  361. }
  362. // 获取矢量图形的基本信息
  363. i = getGeometricBase(i, lineList, str, polyLine);
  364. // 线条类型
  365. if (PolyLineEnum.LINE_TYPE.getCode().equals(str)) {
  366. str = lineList.get(++i);
  367. polyLine.setLineType(str);
  368. }
  369. // 填充色
  370. if (PolyLineEnum.FILL_COLOR.getCode().equals(str)) {
  371. str = lineList.get(++i);
  372. polyLine.setFillColor(MTextStyleParse.parseCadColorToHexColorCode(str));
  373. }
  374. if (PolyLineEnum.BLOCK.getCode().equals(str)) {
  375. str = lineList.get(++i);
  376. if (PolyLineEnum.VERTEX_NAME.getCode().equals(str)) {
  377. GeometricVertex vertex = new GeometricVertex();
  378. //顶点的x坐标
  379. while (!PolyLineEnum.COORDINATE_X.getCode().equals(str)) {
  380. str = lineList.get(++i);
  381. }
  382. if (PolyLineEnum.COORDINATE_X.getCode().equals(str)) {
  383. str = lineList.get(++i);
  384. if (DecimalCheckUtil.check(str.trim())) {
  385. vertex.setX(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  386. str = lineList.get(++i);
  387. } else {
  388. break;
  389. }
  390. }
  391. //顶点的y坐标
  392. if (PolyLineEnum.COORDINATE_Y.getCode().equals(str)) {
  393. str = lineList.get(++i);
  394. if (DecimalCheckUtil.check(str.trim())) {
  395. vertex.setY(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  396. str = lineList.get(++i);
  397. }
  398. vertices.add(vertex);
  399. }
  400. //顶点的z坐标
  401. if (PolyLineEnum.COORDINATE_Z.getCode().equals(str)) {
  402. str = lineList.get(++i);
  403. if (DecimalCheckUtil.check(str.trim())) {
  404. vertex.setZ(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  405. str = lineList.get(++i);
  406. }
  407. vertices.add(vertex);
  408. }
  409. } else if (PolyLineEnum.SEQEND.getCode().equals(str)) {
  410. break;
  411. }
  412. }
  413. }
  414. polyLine.setVertexList(vertices);
  415. List<GeometricModel> polyLines = map.computeIfAbsent(EntityNameConstant.POLY_LINE_NAME, k -> new ArrayList<>());
  416. polyLines.add(polyLine);
  417. return i;
  418. }
  419. /**
  420. * 获取线
  421. *
  422. * @param i 线开始读取的行数
  423. * @param lineList 总数据
  424. * @param map 接收解析的数据map
  425. * @return 返回直线读完的最后行数
  426. */
  427. public static int getLine(int i, List<String> lineList, Map<String, List<GeometricModel>> map) {
  428. String str = null;
  429. GeometricLine line = new GeometricLine();
  430. while (true) {
  431. str = lineList.get(++i);
  432. i = getGeometricBase(i, lineList, str, line);
  433. //图层名称
  434. if (LineEnum.LAYER_NAME.getCode().equals(str)) {
  435. str = lineList.get(++i);
  436. line.setLayerName(str);
  437. }
  438. //起点x坐标
  439. if (LineEnum.COORDINATE_X.getCode().equals(str)) {
  440. str = lineList.get(++i);
  441. if (!DecimalCheckUtil.check(str.trim())) {
  442. throw new DxfAnalysisException(DxfAnalysisErrorEnum.LINE_START_NOT_X);
  443. }
  444. line.setStartX(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  445. }
  446. //起点y的坐标
  447. if (LineEnum.COORDINATE_Y.getCode().equals(str)) {
  448. str = lineList.get(++i);
  449. if (!DecimalCheckUtil.check(str.trim())) {
  450. throw new DxfAnalysisException(DxfAnalysisErrorEnum.LINE_START_NOT_Y);
  451. }
  452. line.setStartY(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  453. }
  454. //起点z的坐标
  455. if (LineEnum.COORDINATE_Z.getCode().equals(str)) {
  456. str = lineList.get(++i);
  457. if (!DecimalCheckUtil.check(str.trim())) {
  458. throw new DxfAnalysisException(DxfAnalysisErrorEnum.LINE_START_NOT_Z);
  459. }
  460. line.setStartZ(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  461. }
  462. //终点的x坐标
  463. if (LineEnum.LINE_END_X_COORDINATES.getCode().equals(str)) {
  464. str = lineList.get(++i);
  465. if (!DecimalCheckUtil.check(str.trim())) {
  466. throw new DxfAnalysisException(DxfAnalysisErrorEnum.LINE_END_NOT_X);
  467. }
  468. line.setEndX(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  469. }
  470. //终点的y坐标
  471. if (LineEnum.LINE_END_Y_COORDINATES.getCode().equals(str)) {
  472. str = lineList.get(++i);
  473. if (!DecimalCheckUtil.check(str.trim())) {
  474. throw new DxfAnalysisException(DxfAnalysisErrorEnum.LINE_END_NOT_Y);
  475. }
  476. line.setEndY(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  477. }
  478. //终点的z坐标
  479. if (LineEnum.LINE_END_Z_COORDINATES.getCode().equals(str)) {
  480. str = lineList.get(++i);
  481. if (!DecimalCheckUtil.check(str.trim())) {
  482. throw new DxfAnalysisException(DxfAnalysisErrorEnum.LINE_END_NOT_Z);
  483. }
  484. line.setEndZ(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  485. }
  486. if (ArcEnum.COLOR.getCode().equals(str)) {
  487. str = lineList.get(++i);
  488. line.setColor(MTextStyleParse.parseCadColorToHexColorCode(str));
  489. }
  490. if (str.equals("0") && "5".equals(lineList.get(i + 2))) {
  491. // 实体结束
  492. break;
  493. }
  494. }
  495. List<GeometricModel> linesList = map.get(EntityNameConstant.LINE_NAME);
  496. if (linesList == null) {
  497. linesList = new ArrayList<>();
  498. ;
  499. }
  500. linesList.add(line);
  501. map.put(EntityNameConstant.LINE_NAME, linesList);
  502. return i;
  503. }
  504. /**
  505. * 获取圆
  506. *
  507. * @param i 圆开始读取的行数
  508. * @param lineList 总数据
  509. * @param map 接收解析的数据map
  510. * @return 返回圆读完的最后行数
  511. */
  512. public static int getCircle(int i, List<String> lineList, Map<String, List<GeometricModel>> map) {
  513. String str = null;
  514. GeometricCircle circle = new GeometricCircle();
  515. while (true) {
  516. str = lineList.get(++i);
  517. i = getGeometricBase(i, lineList, str, circle);
  518. //图层名
  519. if (CircleEnum.LAYER_NAME.getCode().equals(str)) {
  520. str = lineList.get(++i);
  521. circle.setLayerName(str);
  522. }
  523. //圆心的x坐标
  524. if (CircleEnum.COORDINATE_X.getCode().equals(str)) {
  525. str = lineList.get(++i);
  526. if (!DecimalCheckUtil.check(str.trim())) {
  527. throw new DxfAnalysisException(DxfAnalysisErrorEnum.CIRCLE_NOT_X);
  528. }
  529. circle.setX(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  530. }
  531. //圆心的y坐标
  532. if (CircleEnum.COORDINATE_Y.getCode().equals(str)) {
  533. str = lineList.get(++i);
  534. if (!DecimalCheckUtil.check(str.trim())) {
  535. throw new DxfAnalysisException(DxfAnalysisErrorEnum.CIRCLE_NOT_Y);
  536. }
  537. circle.setY(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  538. }
  539. //圆心的z坐标
  540. if (CircleEnum.COORDINATE_Z.getCode().equals(str)) {
  541. str = lineList.get(++i);
  542. if (!DecimalCheckUtil.check(str.trim())) {
  543. throw new DxfAnalysisException(DxfAnalysisErrorEnum.CIRCLE_NOT_Z);
  544. }
  545. circle.setZ(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  546. }
  547. //解析圆的半径
  548. if (CircleEnum.CIRCULAR_RADIUS.getCode().equals(str)) {
  549. str = lineList.get(++i);
  550. if (!DecimalCheckUtil.check(str.trim())) {
  551. throw new DxfAnalysisException(DxfAnalysisErrorEnum.CIRCLE_NOT_RADIUS);
  552. }
  553. circle.setRadius(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  554. }
  555. if (CircleEnum.COLOR.getCode().equals(str)) {
  556. str = lineList.get(++i);
  557. circle.setColor(MTextStyleParse.parseCadColorToHexColorCode(str));
  558. }
  559. if (str.equals("0") && "5".equals(lineList.get(i + 2))) {
  560. // 实体结束
  561. break;
  562. }
  563. }
  564. List<GeometricModel> circleList = map.get(EntityNameConstant.CIRCLE_NAME);
  565. if (circleList == null) {
  566. circleList = new ArrayList<>();
  567. ;
  568. }
  569. circleList.add(circle);
  570. map.put(EntityNameConstant.CIRCLE_NAME, circleList);
  571. return i;
  572. }
  573. /**
  574. * 解析点
  575. *
  576. * @param i 点开始读取的行数
  577. * @param lineList 总数据
  578. * @param map 接收解析的数据map
  579. * @return 返回点读完的最后行数
  580. */
  581. public static int getPoint(int i, List<String> lineList, Map<String, List<GeometricModel>> map) {
  582. String str = null;
  583. GeometricPoint point = new GeometricPoint();
  584. while (true) {
  585. str = lineList.get(++i);
  586. i = getGeometricBase(i, lineList, str, point);
  587. if (PointEnum.LAYER_NAME.getCode().equals(str)) {
  588. str = lineList.get(++i);
  589. point.setLayerName(str);
  590. }
  591. if (PointEnum.COORDINATE_X.getCode().equals(str)) {
  592. str = lineList.get(++i);
  593. if (!DecimalCheckUtil.check(str.trim())) {
  594. throw new DxfAnalysisException(DxfAnalysisErrorEnum.POINT_NOT_X);
  595. }
  596. point.setX(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  597. }
  598. if (PointEnum.COORDINATE_Y.getCode().equals(str)) {
  599. str = lineList.get(++i);
  600. if (!DecimalCheckUtil.check(str.trim())) {
  601. throw new DxfAnalysisException(DxfAnalysisErrorEnum.POINT_NOT_Y);
  602. }
  603. point.setY(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  604. }
  605. if (PointEnum.COORDINATE_Z.getCode().equals(str)) {
  606. str = lineList.get(++i);
  607. if (!DecimalCheckUtil.check(str.trim())) {
  608. throw new DxfAnalysisException(DxfAnalysisErrorEnum.POINT_NOT_Z);
  609. }
  610. point.setZ(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  611. }
  612. if (PointEnum.COLOR.getCode().equals(str)) {
  613. str = lineList.get(++i);
  614. point.setColor(MTextStyleParse.parseCadColorToHexColorCode(str));
  615. }
  616. if (str.equals("0") && "5".equals(lineList.get(i + 2))) {
  617. // 实体结束
  618. break;
  619. }
  620. }
  621. List<GeometricModel> pointList = map.get(EntityNameConstant.POINT_NAME);
  622. if (pointList == null) {
  623. pointList = new ArrayList<>();
  624. ;
  625. }
  626. pointList.add(point);
  627. map.put(EntityNameConstant.POINT_NAME, pointList);
  628. return i;
  629. }
  630. /**
  631. * 获取弧线
  632. *
  633. * @param i 弧线开始读取的行数
  634. * @param lineList 总数据
  635. * @param map 接收解析的数据map
  636. * @return 返回弧线读完的最后行数
  637. */
  638. public static int getArc(int i, List<String> lineList, Map<String, List<GeometricModel>> map) {
  639. String str = null;
  640. GeometricArc arc = new GeometricArc();
  641. while (true) {
  642. str = lineList.get(++i);
  643. i = getGeometricBase(i, lineList, str, arc);
  644. //图层名
  645. if (ArcEnum.LAYER_NAME.getCode().equals(str)) {
  646. str = lineList.get(++i);
  647. arc.setLayerName(str);
  648. }
  649. //圆弧圆心x坐标
  650. if (ArcEnum.COORDINATE_X.getCode().equals(str)) {
  651. str = lineList.get(++i);
  652. if (!DecimalCheckUtil.check(str.trim())) {
  653. throw new DxfAnalysisException(DxfAnalysisErrorEnum.ARC_NOT_X);
  654. }
  655. arc.setX(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  656. }
  657. //圆弧圆心y坐标
  658. if (ArcEnum.COORDINATE_Y.getCode().equals(str)) {
  659. str = lineList.get(++i);
  660. if (!DecimalCheckUtil.check(str.trim())) {
  661. throw new DxfAnalysisException(DxfAnalysisErrorEnum.ARC_NOT_Y);
  662. }
  663. arc.setY(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  664. }
  665. //圆弧圆心z坐标
  666. if (ArcEnum.COORDINATE_Z.getCode().equals(str)) {
  667. str = lineList.get(++i);
  668. if (!DecimalCheckUtil.check(str.trim())) {
  669. throw new DxfAnalysisException(DxfAnalysisErrorEnum.ARC_NOT_Z);
  670. }
  671. arc.setZ(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  672. }
  673. //圆弧半径
  674. if (ArcEnum.ARC_RADIUS.getCode().equals(str)) {
  675. str = lineList.get(++i);
  676. if (!DecimalCheckUtil.check(str.trim())) {
  677. throw new DxfAnalysisException(DxfAnalysisErrorEnum.ARC_NOT_RADIUS);
  678. }
  679. arc.setRadius(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  680. }
  681. //圆弧起始角度
  682. if (ArcEnum.ARC_START_ANGLE.getCode().equals(str)) {
  683. str = lineList.get(++i);
  684. if (!DecimalCheckUtil.check(str.trim())) {
  685. throw new DxfAnalysisException(DxfAnalysisErrorEnum.ARC_NOT_START_ANGLE);
  686. }
  687. arc.setStartArc(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  688. }
  689. //圆弧中止角度
  690. if (ArcEnum.ARC_END_ANGLE.getCode().equals(str)) {
  691. str = lineList.get(++i);
  692. if (!DecimalCheckUtil.check(str.trim())) {
  693. throw new DxfAnalysisException(DxfAnalysisErrorEnum.ARC_NOT_END_ANGLE);
  694. }
  695. arc.setEndArc(new BigDecimal(str.trim()).setScale(DECIMAL_SIZE, RoundingMode.HALF_UP));
  696. }
  697. if (ArcEnum.COLOR.getCode().equals(str)) {
  698. str = lineList.get(++i);
  699. arc.setColor(MTextStyleParse.parseCadColorToHexColorCode(str));
  700. }
  701. if (str.equals("0") && "5".equals(lineList.get(i + 2))) {
  702. // 实体结束
  703. break;
  704. }
  705. }
  706. List<GeometricModel> arcList = map.get(EntityNameConstant.ARC_NAME);
  707. if (arcList == null) {
  708. arcList = new ArrayList<>();
  709. ;
  710. }
  711. arcList.add(arc);
  712. map.put(EntityNameConstant.ARC_NAME, arcList);
  713. return i;
  714. }
  715. /**
  716. * 获取矢量图形的基本信息
  717. *
  718. * @param i
  719. * @param lineList
  720. * @param str
  721. * @param geomertic
  722. * @return
  723. */
  724. public static int getGeometricBase(int i, List<String> lineList, String str, GeometricModel geomertic) {
  725. if (DxfEntitiesBaseEnum.COLOR_16.getCode().equals(str)) {
  726. str = lineList.get(++i);
  727. geomertic.setColor(DxfUtil.convertToHtmlColor(Integer.parseInt(str)));
  728. }
  729. if (DxfEntitiesBaseEnum.COLOR_CODE.getCode().equals(str)) {
  730. str = lineList.get(++i);
  731. geomertic.setColor(MTextStyleParse.parseCadColorToHexColorCode(str));
  732. }
  733. if (DxfEntitiesBaseEnum.ALPHA.getCode().equals(str)) {
  734. str = lineList.get(++i);
  735. geomertic.setAlpha(Integer.parseInt(str));
  736. }
  737. if (DxfEntitiesBaseEnum.LINE_WIDTH.getCode().equals(str)) {
  738. str = lineList.get(++i);
  739. geomertic.setLineWidth(Double.parseDouble(str));
  740. }
  741. if (DxfEntitiesBaseEnum.HEIGHT.getCode().equals(str)) {
  742. str = lineList.get(++i);
  743. geomertic.setHeight(Double.parseDouble(str));
  744. }
  745. return i;
  746. }
  747. }