@linkiez/dxf-renew 7.0.0 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/.eslintrc.json +1 -16
  2. package/.github/instructions/code-patterns.instructions.md +1 -1
  3. package/.github/instructions/exdxf.instruction.md +161 -0
  4. package/.github/instructions/tdd.instructions.md +271 -0
  5. package/.yarn/install-state.gz +0 -0
  6. package/ARCHITECTURE.md +163 -0
  7. package/CHANGELOG.md +39 -0
  8. package/CONTRIBUTING.md +16 -14
  9. package/README.md +113 -16
  10. package/{PLAN.md → ROADMAP.md} +244 -102
  11. package/dist/dxf.js +2212 -454
  12. package/docs/EZDXF_REFERENCE_SITEMAP.md +55 -0
  13. package/docs/FIXTURE_VALIDATION_EZDXF.md +62 -0
  14. package/lib/Helper.cjs +6 -2
  15. package/lib/Helper.cjs.map +3 -3
  16. package/lib/Helper.js +6 -2
  17. package/lib/Helper.js.map +2 -2
  18. package/lib/denormalise.cjs +131 -91
  19. package/lib/denormalise.cjs.map +2 -2
  20. package/lib/denormalise.js +131 -91
  21. package/lib/denormalise.js.map +2 -2
  22. package/lib/dimensionToSVG.cjs +318 -53
  23. package/lib/dimensionToSVG.cjs.map +3 -3
  24. package/lib/dimensionToSVG.js +316 -52
  25. package/lib/dimensionToSVG.js.map +2 -2
  26. package/lib/entityToPolyline.cjs +95 -0
  27. package/lib/entityToPolyline.cjs.map +3 -3
  28. package/lib/entityToPolyline.js +95 -0
  29. package/lib/entityToPolyline.js.map +2 -2
  30. package/lib/handlers/entities.cjs +111 -27
  31. package/lib/handlers/entities.cjs.map +3 -3
  32. package/lib/handlers/entities.js +111 -27
  33. package/lib/handlers/entities.js.map +3 -3
  34. package/lib/handlers/entity/dgnUnderlay.cjs +106 -0
  35. package/lib/handlers/entity/dgnUnderlay.cjs.map +7 -0
  36. package/lib/handlers/entity/dgnUnderlay.js +71 -0
  37. package/lib/handlers/entity/dgnUnderlay.js.map +7 -0
  38. package/lib/handlers/entity/dimension.cjs +24 -0
  39. package/lib/handlers/entity/dimension.cjs.map +2 -2
  40. package/lib/handlers/entity/dimension.js +24 -0
  41. package/lib/handlers/entity/dimension.js.map +2 -2
  42. package/lib/handlers/entity/dwfUnderlay.cjs +106 -0
  43. package/lib/handlers/entity/dwfUnderlay.cjs.map +7 -0
  44. package/lib/handlers/entity/dwfUnderlay.js +71 -0
  45. package/lib/handlers/entity/dwfUnderlay.js.map +7 -0
  46. package/lib/handlers/entity/image.cjs +123 -0
  47. package/lib/handlers/entity/image.cjs.map +7 -0
  48. package/lib/handlers/entity/image.js +88 -0
  49. package/lib/handlers/entity/image.js.map +7 -0
  50. package/lib/handlers/entity/leader.cjs +148 -0
  51. package/lib/handlers/entity/leader.cjs.map +7 -0
  52. package/lib/handlers/entity/leader.js +113 -0
  53. package/lib/handlers/entity/leader.js.map +7 -0
  54. package/lib/handlers/entity/mleader.cjs +69 -0
  55. package/lib/handlers/entity/mleader.cjs.map +7 -0
  56. package/lib/handlers/entity/mleader.js +34 -0
  57. package/lib/handlers/entity/mleader.js.map +7 -0
  58. package/lib/handlers/entity/mline.cjs +91 -0
  59. package/lib/handlers/entity/mline.cjs.map +7 -0
  60. package/lib/handlers/entity/mline.js +56 -0
  61. package/lib/handlers/entity/mline.js.map +7 -0
  62. package/lib/handlers/entity/oleframe.cjs +98 -0
  63. package/lib/handlers/entity/oleframe.cjs.map +7 -0
  64. package/lib/handlers/entity/oleframe.js +63 -0
  65. package/lib/handlers/entity/oleframe.js.map +7 -0
  66. package/lib/handlers/entity/pdfUnderlay.cjs +106 -0
  67. package/lib/handlers/entity/pdfUnderlay.cjs.map +7 -0
  68. package/lib/handlers/entity/pdfUnderlay.js +71 -0
  69. package/lib/handlers/entity/pdfUnderlay.js.map +7 -0
  70. package/lib/handlers/entity/ray.cjs +81 -0
  71. package/lib/handlers/entity/ray.cjs.map +7 -0
  72. package/lib/handlers/entity/ray.js +46 -0
  73. package/lib/handlers/entity/ray.js.map +7 -0
  74. package/lib/handlers/entity/region.cjs +67 -0
  75. package/lib/handlers/entity/region.cjs.map +7 -0
  76. package/lib/handlers/entity/region.js +32 -0
  77. package/lib/handlers/entity/region.js.map +7 -0
  78. package/lib/handlers/entity/shape.cjs +95 -0
  79. package/lib/handlers/entity/shape.cjs.map +7 -0
  80. package/lib/handlers/entity/shape.js +60 -0
  81. package/lib/handlers/entity/shape.js.map +7 -0
  82. package/lib/handlers/entity/table.cjs +71 -0
  83. package/lib/handlers/entity/table.cjs.map +7 -0
  84. package/lib/handlers/entity/table.js +36 -0
  85. package/lib/handlers/entity/table.js.map +7 -0
  86. package/lib/handlers/entity/tolerance.cjs +90 -0
  87. package/lib/handlers/entity/tolerance.cjs.map +7 -0
  88. package/lib/handlers/entity/tolerance.js +55 -0
  89. package/lib/handlers/entity/tolerance.js.map +7 -0
  90. package/lib/handlers/entity/trace.cjs +101 -0
  91. package/lib/handlers/entity/trace.cjs.map +7 -0
  92. package/lib/handlers/entity/trace.js +66 -0
  93. package/lib/handlers/entity/trace.js.map +7 -0
  94. package/lib/handlers/entity/wipeout.cjs +122 -0
  95. package/lib/handlers/entity/wipeout.cjs.map +7 -0
  96. package/lib/handlers/entity/wipeout.js +87 -0
  97. package/lib/handlers/entity/wipeout.js.map +7 -0
  98. package/lib/handlers/entity/xline.cjs +81 -0
  99. package/lib/handlers/entity/xline.cjs.map +7 -0
  100. package/lib/handlers/entity/xline.js +46 -0
  101. package/lib/handlers/entity/xline.js.map +7 -0
  102. package/lib/handlers/objects.cjs +299 -136
  103. package/lib/handlers/objects.cjs.map +2 -2
  104. package/lib/handlers/objects.js +299 -136
  105. package/lib/handlers/objects.js.map +2 -2
  106. package/lib/handlers/tables.cjs +96 -17
  107. package/lib/handlers/tables.cjs.map +2 -2
  108. package/lib/handlers/tables.js +96 -17
  109. package/lib/handlers/tables.js.map +2 -2
  110. package/lib/index.cjs +5 -2
  111. package/lib/index.cjs.map +3 -3
  112. package/lib/index.js +18 -16
  113. package/lib/index.js.map +3 -3
  114. package/lib/toJson.cjs +29 -0
  115. package/lib/toJson.cjs.map +7 -0
  116. package/lib/toJson.js +9 -0
  117. package/lib/toJson.js.map +7 -0
  118. package/lib/toSVG.cjs +105 -11
  119. package/lib/toSVG.cjs.map +3 -3
  120. package/lib/toSVG.js +106 -12
  121. package/lib/toSVG.js.map +2 -2
  122. package/lib/types/dimension-entity.cjs.map +1 -1
  123. package/lib/types/entity.cjs.map +1 -1
  124. package/lib/types/helper.cjs.map +1 -1
  125. package/lib/types/image-entity.cjs +17 -0
  126. package/lib/types/image-entity.cjs.map +7 -0
  127. package/lib/types/image-entity.js +1 -0
  128. package/lib/types/image-entity.js.map +7 -0
  129. package/lib/types/index.cjs +28 -0
  130. package/lib/types/index.cjs.map +2 -2
  131. package/lib/types/index.js +14 -0
  132. package/lib/types/index.js.map +2 -2
  133. package/lib/types/leader-entity.cjs +17 -0
  134. package/lib/types/leader-entity.cjs.map +7 -0
  135. package/lib/types/leader-entity.js +1 -0
  136. package/lib/types/leader-entity.js.map +7 -0
  137. package/lib/types/mleader-entity.cjs +17 -0
  138. package/lib/types/mleader-entity.cjs.map +7 -0
  139. package/lib/types/mleader-entity.js +1 -0
  140. package/lib/types/mleader-entity.js.map +7 -0
  141. package/lib/types/mline-entity.cjs +17 -0
  142. package/lib/types/mline-entity.cjs.map +7 -0
  143. package/lib/types/mline-entity.js +1 -0
  144. package/lib/types/mline-entity.js.map +7 -0
  145. package/lib/types/oleframe-entity.cjs +17 -0
  146. package/lib/types/oleframe-entity.cjs.map +7 -0
  147. package/lib/types/oleframe-entity.js +1 -0
  148. package/lib/types/oleframe-entity.js.map +7 -0
  149. package/lib/types/options.cjs.map +1 -1
  150. package/lib/types/ray-entity.cjs +17 -0
  151. package/lib/types/ray-entity.cjs.map +7 -0
  152. package/lib/types/ray-entity.js +1 -0
  153. package/lib/types/ray-entity.js.map +7 -0
  154. package/lib/types/region-entity.cjs +17 -0
  155. package/lib/types/region-entity.cjs.map +7 -0
  156. package/lib/types/region-entity.js +1 -0
  157. package/lib/types/region-entity.js.map +7 -0
  158. package/lib/types/shape-entity.cjs +17 -0
  159. package/lib/types/shape-entity.cjs.map +7 -0
  160. package/lib/types/shape-entity.js +1 -0
  161. package/lib/types/shape-entity.js.map +7 -0
  162. package/lib/types/table-entity.cjs +17 -0
  163. package/lib/types/table-entity.cjs.map +7 -0
  164. package/lib/types/table-entity.js +1 -0
  165. package/lib/types/table-entity.js.map +7 -0
  166. package/lib/types/tables.cjs.map +1 -1
  167. package/lib/types/tolerance-entity.cjs +17 -0
  168. package/lib/types/tolerance-entity.cjs.map +7 -0
  169. package/lib/types/tolerance-entity.js +1 -0
  170. package/lib/types/tolerance-entity.js.map +7 -0
  171. package/lib/types/trace-entity.cjs +17 -0
  172. package/lib/types/trace-entity.cjs.map +7 -0
  173. package/lib/types/trace-entity.js +1 -0
  174. package/lib/types/trace-entity.js.map +7 -0
  175. package/lib/types/underlay-entity.cjs +17 -0
  176. package/lib/types/underlay-entity.cjs.map +7 -0
  177. package/lib/types/underlay-entity.js +1 -0
  178. package/lib/types/underlay-entity.js.map +7 -0
  179. package/lib/types/wipeout-entity.cjs +17 -0
  180. package/lib/types/wipeout-entity.cjs.map +7 -0
  181. package/lib/types/wipeout-entity.js +1 -0
  182. package/lib/types/wipeout-entity.js.map +7 -0
  183. package/lib/types/xline-entity.cjs +17 -0
  184. package/lib/types/xline-entity.cjs.map +7 -0
  185. package/lib/types/xline-entity.js +1 -0
  186. package/lib/types/xline-entity.js.map +7 -0
  187. package/lib/util/escapeXmlText.cjs +27 -0
  188. package/lib/util/escapeXmlText.cjs.map +7 -0
  189. package/lib/util/escapeXmlText.js +7 -0
  190. package/lib/util/escapeXmlText.js.map +7 -0
  191. package/package.json +9 -18
  192. package/playwright.config.cjs +20 -0
  193. package/src/Helper.ts +8 -3
  194. package/src/denormalise.ts +182 -116
  195. package/src/dimensionToSVG.ts +466 -54
  196. package/src/entityToPolyline.ts +124 -2
  197. package/src/handlers/entities.ts +129 -34
  198. package/src/handlers/entity/dgnUnderlay.ts +94 -0
  199. package/src/handlers/entity/dimension.ts +27 -1
  200. package/src/handlers/entity/dwfUnderlay.ts +94 -0
  201. package/src/handlers/entity/image.ts +118 -0
  202. package/src/handlers/entity/leader.ts +153 -0
  203. package/src/handlers/entity/mleader.ts +46 -0
  204. package/src/handlers/entity/mline.ts +74 -0
  205. package/src/handlers/entity/oleframe.ts +62 -0
  206. package/src/handlers/entity/pdfUnderlay.ts +94 -0
  207. package/src/handlers/entity/ray.ts +52 -0
  208. package/src/handlers/entity/region.ts +42 -0
  209. package/src/handlers/entity/shape.ts +73 -0
  210. package/src/handlers/entity/table.ts +49 -0
  211. package/src/handlers/entity/tolerance.ts +75 -0
  212. package/src/handlers/entity/trace.ts +72 -0
  213. package/src/handlers/entity/wipeout.ts +114 -0
  214. package/src/handlers/entity/xline.ts +52 -0
  215. package/src/handlers/objects.ts +379 -139
  216. package/src/handlers/tables.ts +134 -21
  217. package/src/index.ts +9 -18
  218. package/src/toJson.ts +8 -0
  219. package/src/toSVG.ts +143 -10
  220. package/src/types/dimension-entity.ts +11 -0
  221. package/src/types/entity.ts +30 -0
  222. package/src/types/helper.ts +2 -1
  223. package/src/types/image-entity.ts +35 -0
  224. package/src/types/index.ts +14 -0
  225. package/src/types/leader-entity.ts +40 -0
  226. package/src/types/mleader-entity.ts +8 -0
  227. package/src/types/mline-entity.ts +12 -0
  228. package/src/types/oleframe-entity.ts +40 -0
  229. package/src/types/options.ts +48 -0
  230. package/src/types/ray-entity.ts +12 -0
  231. package/src/types/region-entity.ts +11 -0
  232. package/src/types/shape-entity.ts +19 -0
  233. package/src/types/table-entity.ts +14 -0
  234. package/src/types/tables.ts +160 -0
  235. package/src/types/tolerance-entity.ts +20 -0
  236. package/src/types/trace-entity.ts +14 -0
  237. package/src/types/underlay-entity.ts +35 -0
  238. package/src/types/wipeout-entity.ts +20 -0
  239. package/src/types/xline-entity.ts +12 -0
  240. package/src/util/escapeXmlText.ts +10 -0
  241. package/tools/browser_test_server.cjs +87 -0
  242. package/tools/ezdxf_generate_dimensions_all_types.py +246 -0
  243. package/tools/ezdxf_generate_dimensions_angular_3p.py +59 -0
  244. package/tools/ezdxf_generate_dimensions_large_scale.py +87 -0
  245. package/tools/ezdxf_regenerate_problem_fixtures.py +184 -0
  246. package/tools/ezdxf_validate_fixtures.py +165 -0
  247. package/docs/DIMENSION_SUMMARY.md +0 -248
  248. package/docs/DIMENSION_SUMMARY.pt-BR.md +0 -248
  249. package/docs/IMPLEMENTED-2D-ENTITIES.md +0 -54
  250. package/docs/IMPLEMENTED-2D-ENTITIES.pt-BR.md +0 -54
  251. package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.md +0 -241
  252. package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.pt-BR.md +0 -169
@@ -1,5 +1,132 @@
1
1
  import cloneDeep from "lodash/cloneDeep";
2
2
  import logger from "./util/logger";
3
+ function adjustLineForBlockBasePoint(entity, block) {
4
+ const line = entity;
5
+ line.start.x -= block.x;
6
+ line.start.y -= block.y;
7
+ line.end.x -= block.x;
8
+ line.end.y -= block.y;
9
+ }
10
+ function adjustPolylineForBlockBasePoint(entity, block) {
11
+ const poly = entity;
12
+ for (const v of poly.vertices) {
13
+ if (v.x !== void 0) v.x -= block.x;
14
+ if (v.y !== void 0) v.y -= block.y;
15
+ }
16
+ }
17
+ function adjustCircleForBlockBasePoint(entity, block) {
18
+ const circle = entity;
19
+ circle.x -= block.x;
20
+ circle.y -= block.y;
21
+ }
22
+ function adjustEllipseForBlockBasePoint(entity, block) {
23
+ const ellipse = entity;
24
+ ellipse.x -= block.x;
25
+ ellipse.y -= block.y;
26
+ }
27
+ function adjustArcForBlockBasePoint(entity, block) {
28
+ const arc = entity;
29
+ arc.x -= block.x;
30
+ arc.y -= block.y;
31
+ }
32
+ function adjustSplineForBlockBasePoint(entity, block) {
33
+ const spline = entity;
34
+ for (const cp of spline.controlPoints) {
35
+ cp.x -= block.x;
36
+ cp.y -= block.y;
37
+ }
38
+ }
39
+ function adjustTextForBlockBasePoint(entity, block) {
40
+ const text = entity;
41
+ if (text.x !== void 0) text.x -= block.x;
42
+ if (text.y !== void 0) text.y -= block.y;
43
+ if (text.x2 !== void 0) text.x2 -= block.x;
44
+ if (text.y2 !== void 0) text.y2 -= block.y;
45
+ }
46
+ function adjustMTextForBlockBasePoint(entity, block) {
47
+ const mtext = entity;
48
+ if (mtext.x !== void 0) mtext.x -= block.x;
49
+ if (mtext.y !== void 0) mtext.y -= block.y;
50
+ }
51
+ function adjustDimensionForBlockBasePoint(entity, block) {
52
+ const dim = entity;
53
+ dim.start.x -= block.x;
54
+ dim.start.y -= block.y;
55
+ dim.textMidpoint.x -= block.x;
56
+ dim.textMidpoint.y -= block.y;
57
+ dim.measureStart.x -= block.x;
58
+ dim.measureStart.y -= block.y;
59
+ dim.measureEnd.x -= block.x;
60
+ dim.measureEnd.y -= block.y;
61
+ }
62
+ const BLOCK_BASEPOINT_ADJUSTERS = {
63
+ LINE: adjustLineForBlockBasePoint,
64
+ LWPOLYLINE: adjustPolylineForBlockBasePoint,
65
+ POLYLINE: adjustPolylineForBlockBasePoint,
66
+ CIRCLE: adjustCircleForBlockBasePoint,
67
+ ELLIPSE: adjustEllipseForBlockBasePoint,
68
+ ARC: adjustArcForBlockBasePoint,
69
+ SPLINE: adjustSplineForBlockBasePoint,
70
+ TEXT: adjustTextForBlockBasePoint,
71
+ MTEXT: adjustMTextForBlockBasePoint,
72
+ DIMENSION: adjustDimensionForBlockBasePoint
73
+ };
74
+ function applyBlockBasePointAdjustment(entity, block) {
75
+ const adjust = BLOCK_BASEPOINT_ADJUSTERS[entity.type];
76
+ if (adjust) adjust(entity, block);
77
+ }
78
+ function computeRectangularArrayVectors(insert) {
79
+ const rowCount = insert.rowCount ?? 1;
80
+ const columnCount = insert.columnCount ?? 1;
81
+ const rowSpacing = insert.rowSpacing ?? 0;
82
+ const columnSpacing = insert.columnSpacing ?? 0;
83
+ const rotation = insert.rotation ?? 0;
84
+ if (rowCount <= 1 && columnCount <= 1) {
85
+ return { rowVec: { x: 0, y: 0 }, colVec: { x: 0, y: 0 } };
86
+ }
87
+ const cos = Math.cos(rotation * Math.PI / 180);
88
+ const sin = Math.sin(rotation * Math.PI / 180);
89
+ return {
90
+ rowVec: { x: -sin * rowSpacing, y: cos * rowSpacing },
91
+ colVec: { x: cos * columnSpacing, y: sin * columnSpacing }
92
+ };
93
+ }
94
+ function expandInsert(insert, blocksByName, transforms, gatherEntities) {
95
+ const block = blocksByName[insert.block];
96
+ if (!block) {
97
+ logger.error("no block found for insert. block:", insert.block);
98
+ return [];
99
+ }
100
+ const rowCount = insert.rowCount ?? 1;
101
+ const columnCount = insert.columnCount ?? 1;
102
+ const { rowVec, colVec } = computeRectangularArrayVectors(insert);
103
+ const current = [];
104
+ for (let r = 0; r < rowCount; r++) {
105
+ for (let c = 0; c < columnCount; c++) {
106
+ const t = {
107
+ x: insert.x + rowVec.x * r + colVec.x * c,
108
+ y: insert.y + rowVec.y * r + colVec.y * c,
109
+ scaleX: insert.scaleX,
110
+ scaleY: insert.scaleY,
111
+ scaleZ: insert.scaleZ,
112
+ extrusionX: insert.extrusionX,
113
+ extrusionY: insert.extrusionY,
114
+ extrusionZ: insert.extrusionZ,
115
+ rotation: insert.rotation
116
+ };
117
+ const transforms2 = transforms.slice(0);
118
+ transforms2.push(t);
119
+ const blockEntities = block.entities.map((be) => {
120
+ const be2 = cloneDeep(be);
121
+ be2.layer = insert.layer;
122
+ applyBlockBasePointAdjustment(be2, block);
123
+ return be2;
124
+ });
125
+ current.push(...gatherEntities(blockEntities, transforms2));
126
+ }
127
+ }
128
+ return current;
129
+ }
3
130
  function denormalise(parseResult) {
4
131
  const blocksByName = parseResult.blocks.reduce(
5
132
  (acc, b) => {
@@ -9,99 +136,12 @@ function denormalise(parseResult) {
9
136
  {}
10
137
  );
11
138
  const gatherEntities = (entities, transforms) => {
12
- let current = [];
139
+ const current = [];
13
140
  for (const e of entities) {
14
141
  if (e.type === "INSERT") {
15
- const insert = e;
16
- const block = blocksByName[insert.block];
17
- if (!block) {
18
- logger.error("no block found for insert. block:", insert.block);
19
- continue;
20
- }
21
- const rowCount = insert.rowCount ?? 1;
22
- const columnCount = insert.columnCount ?? 1;
23
- const rowSpacing = insert.rowSpacing ?? 0;
24
- const columnSpacing = insert.columnSpacing ?? 0;
25
- const rotation = insert.rotation ?? 0;
26
- let rowVec;
27
- let colVec;
28
- if (rowCount > 1 || columnCount > 1) {
29
- const cos = Math.cos(rotation * Math.PI / 180);
30
- const sin = Math.sin(rotation * Math.PI / 180);
31
- rowVec = { x: -sin * rowSpacing, y: cos * rowSpacing };
32
- colVec = { x: cos * columnSpacing, y: sin * columnSpacing };
33
- } else {
34
- rowVec = { x: 0, y: 0 };
35
- colVec = { x: 0, y: 0 };
36
- }
37
- for (let r = 0; r < rowCount; r++) {
38
- for (let c = 0; c < columnCount; c++) {
39
- const t = {
40
- x: insert.x + rowVec.x * r + colVec.x * c,
41
- y: insert.y + rowVec.y * r + colVec.y * c,
42
- scaleX: insert.scaleX,
43
- scaleY: insert.scaleY,
44
- scaleZ: insert.scaleZ,
45
- extrusionX: insert.extrusionX,
46
- extrusionY: insert.extrusionY,
47
- extrusionZ: insert.extrusionZ,
48
- rotation: insert.rotation
49
- };
50
- const transforms2 = transforms.slice(0);
51
- transforms2.push(t);
52
- const blockEntities = block.entities.map((be) => {
53
- const be2 = cloneDeep(be);
54
- be2.layer = insert.layer;
55
- switch (be2.type) {
56
- case "LINE": {
57
- const line = be2;
58
- line.start.x -= block.x;
59
- line.start.y -= block.y;
60
- line.end.x -= block.x;
61
- line.end.y -= block.y;
62
- break;
63
- }
64
- case "LWPOLYLINE":
65
- case "POLYLINE": {
66
- const poly = be2;
67
- for (const v of poly.vertices) {
68
- if (v.x !== void 0) v.x -= block.x;
69
- if (v.y !== void 0) v.y -= block.y;
70
- }
71
- break;
72
- }
73
- case "CIRCLE": {
74
- const circle = be2;
75
- circle.x -= block.x;
76
- circle.y -= block.y;
77
- break;
78
- }
79
- case "ELLIPSE": {
80
- const ellipse = be2;
81
- ellipse.x -= block.x;
82
- ellipse.y -= block.y;
83
- break;
84
- }
85
- case "ARC": {
86
- const arc = be2;
87
- arc.x -= block.x;
88
- arc.y -= block.y;
89
- break;
90
- }
91
- case "SPLINE": {
92
- const spline = be2;
93
- for (const cp of spline.controlPoints) {
94
- cp.x -= block.x;
95
- cp.y -= block.y;
96
- }
97
- break;
98
- }
99
- }
100
- return be2;
101
- });
102
- current = current.concat(gatherEntities(blockEntities, transforms2));
103
- }
104
- }
142
+ current.push(
143
+ ...expandInsert(e, blocksByName, transforms, gatherEntities)
144
+ );
105
145
  } else {
106
146
  const e2 = cloneDeep(e);
107
147
  e2.transforms = transforms.slice().reverse();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/denormalise.ts"],
4
- "sourcesContent": ["import cloneDeep from 'lodash/cloneDeep'\n\nimport logger from './util/logger'\n\nimport type {\n ArcEntity,\n Block,\n CircleEntity,\n EllipseEntity,\n Entity,\n InsertEntity,\n LineEntity,\n ParsedDXF,\n PolylineEntity,\n SplineEntity,\n Transform,\n} from './types'\n\nexport default function denormalise(parseResult: ParsedDXF): Entity[] {\n const blocksByName = parseResult.blocks.reduce(\n (acc: { [name: string]: Block }, b: Block) => {\n acc[b.name] = b\n return acc\n },\n {},\n )\n\n const gatherEntities = (\n entities: Entity[],\n transforms: Transform[],\n ): Entity[] => {\n let current: Entity[] = []\n for (const e of entities) {\n if (e.type === 'INSERT') {\n const insert = e as InsertEntity\n const block = blocksByName[insert.block]\n if (!block) {\n logger.error('no block found for insert. block:', insert.block)\n continue\n }\n\n const rowCount = insert.rowCount ?? 1\n const columnCount = insert.columnCount ?? 1\n const rowSpacing = insert.rowSpacing ?? 0\n const columnSpacing = insert.columnSpacing ?? 0\n const rotation = insert.rotation ?? 0\n\n // It appears that the rectangular array is affected by rotation, but NOT by scale.\n let rowVec: { x: number; y: number }\n let colVec: { x: number; y: number }\n if (rowCount > 1 || columnCount > 1) {\n const cos = Math.cos((rotation * Math.PI) / 180)\n const sin = Math.sin((rotation * Math.PI) / 180)\n rowVec = { x: -sin * rowSpacing, y: cos * rowSpacing }\n colVec = { x: cos * columnSpacing, y: sin * columnSpacing }\n } else {\n rowVec = { x: 0, y: 0 }\n colVec = { x: 0, y: 0 }\n }\n\n // For rectangular arrays, add the block entities for each location in the array\n for (let r = 0; r < rowCount; r++) {\n for (let c = 0; c < columnCount; c++) {\n // Adjust insert transform by row and column for rectangular arrays\n const t: Transform = {\n x: insert.x + rowVec.x * r + colVec.x * c,\n y: insert.y + rowVec.y * r + colVec.y * c,\n scaleX: insert.scaleX,\n scaleY: insert.scaleY,\n scaleZ: insert.scaleZ,\n extrusionX: insert.extrusionX,\n extrusionY: insert.extrusionY,\n extrusionZ: insert.extrusionZ,\n rotation: insert.rotation,\n }\n // Add the insert transform and recursively add entities\n const transforms2 = transforms.slice(0)\n transforms2.push(t)\n\n // Use the insert layer\n const blockEntities = block.entities.map((be: Entity) => {\n const be2 = cloneDeep(be)\n be2.layer = insert.layer\n // https://github.com/bjnortier/dxf/issues/52\n // See Issue 52. If we don't modify the\n // entity coordinates here it creates an issue with the\n // transformation matrices (which are only applied AFTER\n // block insertion modifications has been applied).\n switch (be2.type) {\n case 'LINE': {\n const line = be2 as LineEntity\n line.start.x -= block.x\n line.start.y -= block.y\n line.end.x -= block.x\n line.end.y -= block.y\n break\n }\n case 'LWPOLYLINE':\n case 'POLYLINE': {\n const poly = be2 as PolylineEntity\n for (const v of poly.vertices) {\n if (v.x !== undefined) v.x -= block.x\n if (v.y !== undefined) v.y -= block.y\n }\n break\n }\n case 'CIRCLE': {\n const circle = be2 as CircleEntity\n circle.x -= block.x\n circle.y -= block.y\n break\n }\n case 'ELLIPSE': {\n const ellipse = be2 as EllipseEntity\n ellipse.x -= block.x\n ellipse.y -= block.y\n break\n }\n case 'ARC': {\n const arc = be2 as ArcEntity\n arc.x -= block.x\n arc.y -= block.y\n break\n }\n case 'SPLINE': {\n const spline = be2 as SplineEntity\n for (const cp of spline.controlPoints) {\n cp.x -= block.x\n cp.y -= block.y\n }\n break\n }\n }\n return be2\n })\n current = current.concat(gatherEntities(blockEntities, transforms2))\n }\n }\n } else {\n // Top-level entity. Clone and add the transforms\n // The transforms are reversed so they occur in\n // order of application - i.e. the transform of the\n // top-level insert is applied last\n const e2 = cloneDeep(e)\n e2.transforms = transforms.slice().reverse()\n current.push(e2)\n }\n }\n return current\n }\n\n return gatherEntities(parseResult.entities, [])\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import cloneDeep from 'lodash/cloneDeep'\n\nimport logger from './util/logger'\n\nimport type {\n ArcEntity,\n Block,\n CircleEntity,\n DimensionEntity,\n EllipseEntity,\n Entity,\n InsertEntity,\n LineEntity,\n MTextEntity,\n ParsedDXF,\n PolylineEntity,\n SplineEntity,\n TextEntity,\n Transform,\n} from './types'\n\ntype BlockBasePointAdjuster = (entity: Entity, block: Block) => void\n\nfunction adjustLineForBlockBasePoint(entity: Entity, block: Block): void {\n const line = entity as LineEntity\n line.start.x -= block.x\n line.start.y -= block.y\n line.end.x -= block.x\n line.end.y -= block.y\n}\n\nfunction adjustPolylineForBlockBasePoint(entity: Entity, block: Block): void {\n const poly = entity as PolylineEntity\n for (const v of poly.vertices) {\n if (v.x !== undefined) v.x -= block.x\n if (v.y !== undefined) v.y -= block.y\n }\n}\n\nfunction adjustCircleForBlockBasePoint(entity: Entity, block: Block): void {\n const circle = entity as CircleEntity\n circle.x -= block.x\n circle.y -= block.y\n}\n\nfunction adjustEllipseForBlockBasePoint(entity: Entity, block: Block): void {\n const ellipse = entity as EllipseEntity\n ellipse.x -= block.x\n ellipse.y -= block.y\n}\n\nfunction adjustArcForBlockBasePoint(entity: Entity, block: Block): void {\n const arc = entity as ArcEntity\n arc.x -= block.x\n arc.y -= block.y\n}\n\nfunction adjustSplineForBlockBasePoint(entity: Entity, block: Block): void {\n const spline = entity as SplineEntity\n for (const cp of spline.controlPoints) {\n cp.x -= block.x\n cp.y -= block.y\n }\n}\n\nfunction adjustTextForBlockBasePoint(entity: Entity, block: Block): void {\n const text = entity as TextEntity\n if (text.x !== undefined) text.x -= block.x\n if (text.y !== undefined) text.y -= block.y\n if (text.x2 !== undefined) text.x2 -= block.x\n if (text.y2 !== undefined) text.y2 -= block.y\n}\n\nfunction adjustMTextForBlockBasePoint(entity: Entity, block: Block): void {\n const mtext = entity as MTextEntity\n if (mtext.x !== undefined) mtext.x -= block.x\n if (mtext.y !== undefined) mtext.y -= block.y\n}\n\nfunction adjustDimensionForBlockBasePoint(entity: Entity, block: Block): void {\n const dim = entity as DimensionEntity\n dim.start.x -= block.x\n dim.start.y -= block.y\n dim.textMidpoint.x -= block.x\n dim.textMidpoint.y -= block.y\n dim.measureStart.x -= block.x\n dim.measureStart.y -= block.y\n dim.measureEnd.x -= block.x\n dim.measureEnd.y -= block.y\n}\n\nconst BLOCK_BASEPOINT_ADJUSTERS: Record<string, BlockBasePointAdjuster> = {\n LINE: adjustLineForBlockBasePoint,\n LWPOLYLINE: adjustPolylineForBlockBasePoint,\n POLYLINE: adjustPolylineForBlockBasePoint,\n CIRCLE: adjustCircleForBlockBasePoint,\n ELLIPSE: adjustEllipseForBlockBasePoint,\n ARC: adjustArcForBlockBasePoint,\n SPLINE: adjustSplineForBlockBasePoint,\n TEXT: adjustTextForBlockBasePoint,\n MTEXT: adjustMTextForBlockBasePoint,\n DIMENSION: adjustDimensionForBlockBasePoint,\n}\n\nfunction applyBlockBasePointAdjustment(entity: Entity, block: Block): void {\n // https://github.com/bjnortier/dxf/issues/52\n // See Issue 52. If we don't modify the entity coordinates here it creates an\n // issue with the transformation matrices (which are only applied AFTER block\n // insertion modifications has been applied).\n const adjust = BLOCK_BASEPOINT_ADJUSTERS[entity.type]\n if (adjust) adjust(entity, block)\n}\n\nfunction computeRectangularArrayVectors(insert: InsertEntity): {\n rowVec: { x: number; y: number }\n colVec: { x: number; y: number }\n} {\n const rowCount = insert.rowCount ?? 1\n const columnCount = insert.columnCount ?? 1\n const rowSpacing = insert.rowSpacing ?? 0\n const columnSpacing = insert.columnSpacing ?? 0\n const rotation = insert.rotation ?? 0\n\n // It appears that the rectangular array is affected by rotation, but NOT by scale.\n if (rowCount <= 1 && columnCount <= 1) {\n return { rowVec: { x: 0, y: 0 }, colVec: { x: 0, y: 0 } }\n }\n\n const cos = Math.cos((rotation * Math.PI) / 180)\n const sin = Math.sin((rotation * Math.PI) / 180)\n return {\n rowVec: { x: -sin * rowSpacing, y: cos * rowSpacing },\n colVec: { x: cos * columnSpacing, y: sin * columnSpacing },\n }\n}\n\nfunction expandInsert(\n insert: InsertEntity,\n blocksByName: Record<string, Block>,\n transforms: Transform[],\n gatherEntities: (entities: Entity[], transforms: Transform[]) => Entity[],\n): Entity[] {\n const block = blocksByName[insert.block]\n if (!block) {\n logger.error('no block found for insert. block:', insert.block)\n return []\n }\n\n const rowCount = insert.rowCount ?? 1\n const columnCount = insert.columnCount ?? 1\n const { rowVec, colVec } = computeRectangularArrayVectors(insert)\n\n const current: Entity[] = []\n for (let r = 0; r < rowCount; r++) {\n for (let c = 0; c < columnCount; c++) {\n const t: Transform = {\n x: insert.x + rowVec.x * r + colVec.x * c,\n y: insert.y + rowVec.y * r + colVec.y * c,\n scaleX: insert.scaleX,\n scaleY: insert.scaleY,\n scaleZ: insert.scaleZ,\n extrusionX: insert.extrusionX,\n extrusionY: insert.extrusionY,\n extrusionZ: insert.extrusionZ,\n rotation: insert.rotation,\n }\n\n const transforms2 = transforms.slice(0)\n transforms2.push(t)\n\n // Use the insert layer\n const blockEntities = block.entities.map((be: Entity) => {\n const be2 = cloneDeep(be)\n be2.layer = insert.layer\n applyBlockBasePointAdjustment(be2, block)\n return be2\n })\n\n current.push(...gatherEntities(blockEntities, transforms2))\n }\n }\n\n return current\n}\n\nexport default function denormalise(parseResult: ParsedDXF): Entity[] {\n const blocksByName = parseResult.blocks.reduce(\n (acc: { [name: string]: Block }, b: Block) => {\n acc[b.name] = b\n return acc\n },\n {},\n )\n\n const gatherEntities = (\n entities: Entity[],\n transforms: Transform[],\n ): Entity[] => {\n const current: Entity[] = []\n for (const e of entities) {\n if (e.type === 'INSERT') {\n current.push(\n ...expandInsert(e as InsertEntity, blocksByName, transforms, gatherEntities),\n )\n } else {\n // Top-level entity. Clone and add the transforms\n // The transforms are reversed so they occur in\n // order of application - i.e. the transform of the\n // top-level insert is applied last\n const e2 = cloneDeep(e)\n e2.transforms = transforms.slice().reverse()\n current.push(e2)\n }\n }\n return current\n }\n\n return gatherEntities(parseResult.entities, [])\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }