@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
@@ -0,0 +1,55 @@
1
+ # ezdxf Reference Sitemap (Stable)
2
+
3
+ This project uses the official **ezdxf** documentation as the primary, practical reference when implementing DXF parsing behavior.
4
+
5
+ - Reference home: <https://ezdxf.readthedocs.io/en/stable/reference.html>
6
+
7
+ ## What to use for what
8
+
9
+ - **High-level DXF structure (sections/tables/blocks/entities/objects):**
10
+ - Sections index: <https://ezdxf.readthedocs.io/en/stable/sections/index.html>
11
+ - Tables index: <https://ezdxf.readthedocs.io/en/stable/tables/index.html>
12
+ - Blocks index: <https://ezdxf.readthedocs.io/en/stable/blocks/index.html>
13
+
14
+ - **Entity-specific group codes and attributes (our roadmap A.1):**
15
+ - DXF Entities index: <https://ezdxf.readthedocs.io/en/stable/dxfentities/index.html>
16
+
17
+ Common 2D targets:
18
+ - TEXT: <https://ezdxf.readthedocs.io/en/stable/dxfentities/text.html>
19
+ - MTEXT: <https://ezdxf.readthedocs.io/en/stable/dxfentities/mtext.html>
20
+ - DIMENSION: <https://ezdxf.readthedocs.io/en/stable/dxfentities/dimension.html>
21
+ - LEADER: <https://ezdxf.readthedocs.io/en/stable/dxfentities/leader.html>
22
+ - MLEADER: <https://ezdxf.readthedocs.io/en/stable/dxfentities/mleader.html>
23
+ - IMAGE: <https://ezdxf.readthedocs.io/en/stable/dxfentities/image.html>
24
+ - UNDERLAY: <https://ezdxf.readthedocs.io/en/stable/dxfentities/underlay.html>
25
+ - WIPEOUT: <https://ezdxf.readthedocs.io/en/stable/dxfentities/wipeout.html>
26
+ - RAY: <https://ezdxf.readthedocs.io/en/stable/dxfentities/ray.html>
27
+ - XLINE: <https://ezdxf.readthedocs.io/en/stable/dxfentities/xline.html>
28
+ - TRACE: <https://ezdxf.readthedocs.io/en/stable/dxfentities/trace.html>
29
+ - REGION: <https://ezdxf.readthedocs.io/en/stable/dxfentities/region.html>
30
+ - SHAPE: <https://ezdxf.readthedocs.io/en/stable/dxfentities/shape.html>
31
+ - MLINE: <https://ezdxf.readthedocs.io/en/stable/dxfentities/mline.html>
32
+
33
+ - **Objects (our roadmap A.3):**
34
+ - DXF Objects index: <https://ezdxf.readthedocs.io/en/stable/dxfobjects/index.html>
35
+
36
+ Common reference-based objects:
37
+ - DICTIONARY: <https://ezdxf.readthedocs.io/en/stable/dxfobjects/dictionary.html>
38
+ - XRECORD: <https://ezdxf.readthedocs.io/en/stable/dxfobjects/xrecord.html>
39
+ - ImageDef / ImageDefReactor: <https://ezdxf.readthedocs.io/en/stable/dxfobjects/imagedef.html>
40
+ - UnderlayDefinition: <https://ezdxf.readthedocs.io/en/stable/dxfobjects/underlaydef.html>
41
+ - MLeaderStyle: <https://ezdxf.readthedocs.io/en/stable/dxfobjects/mleaderstyle.html>
42
+
43
+ - **Tables (our roadmap A.2):**
44
+ - Layer: <https://ezdxf.readthedocs.io/en/stable/tables/layer_table_entry.html>
45
+ - DimStyle: <https://ezdxf.readthedocs.io/en/stable/tables/dimstyle_table_entry.html>
46
+ - Style: <https://ezdxf.readthedocs.io/en/stable/tables/style_table_entry.html>
47
+ - Linetype: <https://ezdxf.readthedocs.io/en/stable/tables/linetype_table_entry.html>
48
+ - View: <https://ezdxf.readthedocs.io/en/stable/tables/view_table_entry.html>
49
+ - AppID: <https://ezdxf.readthedocs.io/en/stable/tables/appid_table_entry.html>
50
+ - UCS: <https://ezdxf.readthedocs.io/en/stable/tables/ucs_table_entry.html>
51
+ - BlockRecord: <https://ezdxf.readthedocs.io/en/stable/tables/blockrecord_table_entry.html>
52
+
53
+ ## Notes
54
+
55
+ - ezdxf tracks DXF internals closely, but it is still an implementation. When behavior is ambiguous, treat Autodesk’s DXF reference as the authoritative source.
@@ -0,0 +1,62 @@
1
+ # DXF Fixture Validation (ezdxf)
2
+
3
+ ## Goal
4
+
5
+ Ensure every DXF fixture under `test/resources/` is:
6
+
7
+ - Readable by **ezdxf** (independent parser), and
8
+ - Free of audit fatal errors (and optionally free of audit errors).
9
+
10
+ This provides an external sanity check so our test fixtures stay “real DXF” and not just “files our parser happens to accept”.
11
+
12
+ ## How It Works
13
+
14
+ The project includes a small validator:
15
+
16
+ - `tools/ezdxf_validate_fixtures.py`
17
+
18
+ It:
19
+
20
+ 1. Enumerates `test/resources/*.dxf`
21
+ 2. Loads each file via `ezdxf.readfile(...)`
22
+ 3. Extracts `$ACADVER`
23
+ 4. Counts entity types in modelspace
24
+ 5. Runs `doc.audit()` and reports counts
25
+
26
+ ## Run Locally
27
+
28
+ - `yarn validate:fixtures`
29
+
30
+ Notes:
31
+
32
+ - If `./.venv-ezdxf/bin/python` exists, the script uses it.
33
+ - Otherwise it falls back to `python3`.
34
+
35
+ ## Failure Policy
36
+
37
+ By default (current yarn script):
38
+
39
+ - Fails if any fixture cannot be read by ezdxf
40
+ - Fails if audit reports fatal errors or errors
41
+
42
+ If you need a “report-only” run, execute the script directly:
43
+
44
+ - `./.venv-ezdxf/bin/python tools/ezdxf_validate_fixtures.py`
45
+
46
+ ## Using the Report
47
+
48
+ Use the printed per-file summary to:
49
+
50
+ - Verify a new fixture’s `$ACADVER` is what you expect
51
+ - Confirm an entity appears in the file (entity type counts)
52
+ - Catch malformed DXF output from generators
53
+
54
+ ## Adding/Updating Fixtures
55
+
56
+ When adding a new fixture:
57
+
58
+ 1. Add the DXF file under `test/resources/`.
59
+ 2. Run `yarn validate:fixtures`.
60
+ 3. Add unit tests (parsing) and integration tests (final SVG).
61
+
62
+ See also: the entity workflow checklist in `ROADMAP.md` under “Documentation (Consolidated) → Entity SVG Roadmap”.
package/lib/Helper.cjs CHANGED
@@ -34,6 +34,7 @@ module.exports = __toCommonJS(Helper_exports);
34
34
  var import_denormalise = __toESM(require("./denormalise"), 1);
35
35
  var import_groupEntitiesByLayer = __toESM(require("./groupEntitiesByLayer"), 1);
36
36
  var import_parseString = __toESM(require("./parseString"), 1);
37
+ var import_toJson = __toESM(require("./toJson"), 1);
37
38
  var import_toPolylines = __toESM(require("./toPolylines"), 1);
38
39
  var import_toSVG = __toESM(require("./toSVG"), 1);
39
40
  var import_logger = __toESM(require("./util/logger"), 1);
@@ -79,8 +80,11 @@ class Helper {
79
80
  }
80
81
  return this._groups;
81
82
  }
82
- toSVG() {
83
- return (0, import_toSVG.default)(this.parsed);
83
+ toSVG(options) {
84
+ return (0, import_toSVG.default)(this.parsed, options);
85
+ }
86
+ toJson(options) {
87
+ return (0, import_toJson.default)(this.parsed, options);
84
88
  }
85
89
  toPolylines() {
86
90
  return (0, import_toPolylines.default)(this.parsed);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/Helper.ts"],
4
- "sourcesContent": ["import denormalise from './denormalise'\nimport groupEntitiesByLayer from './groupEntitiesByLayer'\nimport parseString from './parseString'\nimport toPolylines from './toPolylines'\nimport toSVG from './toSVG'\nimport logger from './util/logger'\n\nimport type { Entity, LayerGroups, ParsedDXF } from './types'\n\nexport default class Helper {\n private readonly _contents: string\n private _parsed: ParsedDXF | null\n private _denormalised: Entity[] | null\n private _groups: LayerGroups | null\n\n constructor(contents: string) {\n if (typeof contents !== 'string') {\n throw new TypeError('Helper constructor expects a DXF string')\n }\n this._contents = contents\n this._parsed = null\n this._denormalised = null\n this._groups = null\n }\n\n parse(): ParsedDXF {\n this._parsed = parseString(this._contents)\n logger.info('parsed:', this.parsed)\n return this._parsed\n }\n\n get parsed(): ParsedDXF {\n if (this._parsed === null) {\n this.parse()\n }\n return this._parsed as ParsedDXF\n }\n\n denormalise(): Entity[] {\n this._denormalised = denormalise(this.parsed)\n logger.info('denormalised:', this._denormalised)\n return this._denormalised\n }\n\n get denormalised(): Entity[] {\n if (!this._denormalised) {\n this.denormalise()\n }\n return this._denormalised as Entity[]\n }\n\n group(): LayerGroups {\n this._groups = groupEntitiesByLayer(this.denormalised)\n return this._groups\n }\n\n get groups(): LayerGroups {\n if (!this._groups) {\n this.group()\n }\n return this._groups as LayerGroups\n }\n\n toSVG(): string {\n return toSVG(this.parsed)\n }\n\n toPolylines(): ReturnType<typeof toPolylines> {\n return toPolylines(this.parsed)\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAwB;AACxB,kCAAiC;AACjC,yBAAwB;AACxB,yBAAwB;AACxB,mBAAkB;AAClB,oBAAmB;AAInB,MAAO,OAAqB;AAAA,EAM1B,YAAY,UAAkB;AAC5B,QAAI,OAAO,aAAa,UAAU;AAChC,YAAM,IAAI,UAAU,yCAAyC;AAAA,IAC/D;AACA,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,gBAAgB;AACrB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,QAAmB;AACjB,SAAK,cAAU,mBAAAA,SAAY,KAAK,SAAS;AACzC,kBAAAC,QAAO,KAAK,WAAW,KAAK,MAAM;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAoB;AACtB,QAAI,KAAK,YAAY,MAAM;AACzB,WAAK,MAAM;AAAA,IACb;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAwB;AACtB,SAAK,oBAAgB,mBAAAC,SAAY,KAAK,MAAM;AAC5C,kBAAAD,QAAO,KAAK,iBAAiB,KAAK,aAAa;AAC/C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,eAAyB;AAC3B,QAAI,CAAC,KAAK,eAAe;AACvB,WAAK,YAAY;AAAA,IACnB;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAqB;AACnB,SAAK,cAAU,4BAAAE,SAAqB,KAAK,YAAY;AACrD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAsB;AACxB,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,MAAM;AAAA,IACb;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAgB;AACd,eAAO,aAAAC,SAAM,KAAK,MAAM;AAAA,EAC1B;AAAA,EAEA,cAA8C;AAC5C,eAAO,mBAAAC,SAAY,KAAK,MAAM;AAAA,EAChC;AACF;",
6
- "names": ["parseString", "logger", "denormalise", "groupEntitiesByLayer", "toSVG", "toPolylines"]
4
+ "sourcesContent": ["import denormalise from './denormalise'\nimport groupEntitiesByLayer from './groupEntitiesByLayer'\nimport parseString from './parseString'\nimport toJson from './toJson'\nimport toPolylines from './toPolylines'\nimport toSVG from './toSVG'\nimport logger from './util/logger'\n\nimport type { Entity, LayerGroups, ParsedDXF, ToJsonOptions, ToSVGOptions } from './types'\n\nexport default class Helper {\n private readonly _contents: string\n private _parsed: ParsedDXF | null\n private _denormalised: Entity[] | null\n private _groups: LayerGroups | null\n\n constructor(contents: string) {\n if (typeof contents !== 'string') {\n throw new TypeError('Helper constructor expects a DXF string')\n }\n this._contents = contents\n this._parsed = null\n this._denormalised = null\n this._groups = null\n }\n\n parse(): ParsedDXF {\n this._parsed = parseString(this._contents)\n logger.info('parsed:', this.parsed)\n return this._parsed\n }\n\n get parsed(): ParsedDXF {\n if (this._parsed === null) {\n this.parse()\n }\n return this._parsed as ParsedDXF\n }\n\n denormalise(): Entity[] {\n this._denormalised = denormalise(this.parsed)\n logger.info('denormalised:', this._denormalised)\n return this._denormalised\n }\n\n get denormalised(): Entity[] {\n if (!this._denormalised) {\n this.denormalise()\n }\n return this._denormalised as Entity[]\n }\n\n group(): LayerGroups {\n this._groups = groupEntitiesByLayer(this.denormalised)\n return this._groups\n }\n\n get groups(): LayerGroups {\n if (!this._groups) {\n this.group()\n }\n return this._groups as LayerGroups\n }\n\n toSVG(options?: ToSVGOptions): string {\n return toSVG(this.parsed, options)\n }\n\n toJson(options?: ToJsonOptions): string {\n return toJson(this.parsed, options)\n }\n\n toPolylines(): ReturnType<typeof toPolylines> {\n return toPolylines(this.parsed)\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAwB;AACxB,kCAAiC;AACjC,yBAAwB;AACxB,oBAAmB;AACnB,yBAAwB;AACxB,mBAAkB;AAClB,oBAAmB;AAInB,MAAO,OAAqB;AAAA,EAM1B,YAAY,UAAkB;AAC5B,QAAI,OAAO,aAAa,UAAU;AAChC,YAAM,IAAI,UAAU,yCAAyC;AAAA,IAC/D;AACA,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,gBAAgB;AACrB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,QAAmB;AACjB,SAAK,cAAU,mBAAAA,SAAY,KAAK,SAAS;AACzC,kBAAAC,QAAO,KAAK,WAAW,KAAK,MAAM;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAoB;AACtB,QAAI,KAAK,YAAY,MAAM;AACzB,WAAK,MAAM;AAAA,IACb;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAwB;AACtB,SAAK,oBAAgB,mBAAAC,SAAY,KAAK,MAAM;AAC5C,kBAAAD,QAAO,KAAK,iBAAiB,KAAK,aAAa;AAC/C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,eAAyB;AAC3B,QAAI,CAAC,KAAK,eAAe;AACvB,WAAK,YAAY;AAAA,IACnB;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAqB;AACnB,SAAK,cAAU,4BAAAE,SAAqB,KAAK,YAAY;AACrD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAsB;AACxB,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,MAAM;AAAA,IACb;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,SAAgC;AACpC,eAAO,aAAAC,SAAM,KAAK,QAAQ,OAAO;AAAA,EACnC;AAAA,EAEA,OAAO,SAAiC;AACtC,eAAO,cAAAC,SAAO,KAAK,QAAQ,OAAO;AAAA,EACpC;AAAA,EAEA,cAA8C;AAC5C,eAAO,mBAAAC,SAAY,KAAK,MAAM;AAAA,EAChC;AACF;",
6
+ "names": ["parseString", "logger", "denormalise", "groupEntitiesByLayer", "toSVG", "toJson", "toPolylines"]
7
7
  }
package/lib/Helper.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import denormalise from "./denormalise";
2
2
  import groupEntitiesByLayer from "./groupEntitiesByLayer";
3
3
  import parseString from "./parseString";
4
+ import toJson from "./toJson";
4
5
  import toPolylines from "./toPolylines";
5
6
  import toSVG from "./toSVG";
6
7
  import logger from "./util/logger";
@@ -46,8 +47,11 @@ class Helper {
46
47
  }
47
48
  return this._groups;
48
49
  }
49
- toSVG() {
50
- return toSVG(this.parsed);
50
+ toSVG(options) {
51
+ return toSVG(this.parsed, options);
52
+ }
53
+ toJson(options) {
54
+ return toJson(this.parsed, options);
51
55
  }
52
56
  toPolylines() {
53
57
  return toPolylines(this.parsed);
package/lib/Helper.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/Helper.ts"],
4
- "sourcesContent": ["import denormalise from './denormalise'\nimport groupEntitiesByLayer from './groupEntitiesByLayer'\nimport parseString from './parseString'\nimport toPolylines from './toPolylines'\nimport toSVG from './toSVG'\nimport logger from './util/logger'\n\nimport type { Entity, LayerGroups, ParsedDXF } from './types'\n\nexport default class Helper {\n private readonly _contents: string\n private _parsed: ParsedDXF | null\n private _denormalised: Entity[] | null\n private _groups: LayerGroups | null\n\n constructor(contents: string) {\n if (typeof contents !== 'string') {\n throw new TypeError('Helper constructor expects a DXF string')\n }\n this._contents = contents\n this._parsed = null\n this._denormalised = null\n this._groups = null\n }\n\n parse(): ParsedDXF {\n this._parsed = parseString(this._contents)\n logger.info('parsed:', this.parsed)\n return this._parsed\n }\n\n get parsed(): ParsedDXF {\n if (this._parsed === null) {\n this.parse()\n }\n return this._parsed as ParsedDXF\n }\n\n denormalise(): Entity[] {\n this._denormalised = denormalise(this.parsed)\n logger.info('denormalised:', this._denormalised)\n return this._denormalised\n }\n\n get denormalised(): Entity[] {\n if (!this._denormalised) {\n this.denormalise()\n }\n return this._denormalised as Entity[]\n }\n\n group(): LayerGroups {\n this._groups = groupEntitiesByLayer(this.denormalised)\n return this._groups\n }\n\n get groups(): LayerGroups {\n if (!this._groups) {\n this.group()\n }\n return this._groups as LayerGroups\n }\n\n toSVG(): string {\n return toSVG(this.parsed)\n }\n\n toPolylines(): ReturnType<typeof toPolylines> {\n return toPolylines(this.parsed)\n }\n}\n"],
5
- "mappings": "AAAA,OAAO,iBAAiB;AACxB,OAAO,0BAA0B;AACjC,OAAO,iBAAiB;AACxB,OAAO,iBAAiB;AACxB,OAAO,WAAW;AAClB,OAAO,YAAY;AAInB,MAAO,OAAqB;AAAA,EAM1B,YAAY,UAAkB;AAC5B,QAAI,OAAO,aAAa,UAAU;AAChC,YAAM,IAAI,UAAU,yCAAyC;AAAA,IAC/D;AACA,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,gBAAgB;AACrB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,QAAmB;AACjB,SAAK,UAAU,YAAY,KAAK,SAAS;AACzC,WAAO,KAAK,WAAW,KAAK,MAAM;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAoB;AACtB,QAAI,KAAK,YAAY,MAAM;AACzB,WAAK,MAAM;AAAA,IACb;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAwB;AACtB,SAAK,gBAAgB,YAAY,KAAK,MAAM;AAC5C,WAAO,KAAK,iBAAiB,KAAK,aAAa;AAC/C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,eAAyB;AAC3B,QAAI,CAAC,KAAK,eAAe;AACvB,WAAK,YAAY;AAAA,IACnB;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAqB;AACnB,SAAK,UAAU,qBAAqB,KAAK,YAAY;AACrD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAsB;AACxB,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,MAAM;AAAA,IACb;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAgB;AACd,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA,EAEA,cAA8C;AAC5C,WAAO,YAAY,KAAK,MAAM;AAAA,EAChC;AACF;",
4
+ "sourcesContent": ["import denormalise from './denormalise'\nimport groupEntitiesByLayer from './groupEntitiesByLayer'\nimport parseString from './parseString'\nimport toJson from './toJson'\nimport toPolylines from './toPolylines'\nimport toSVG from './toSVG'\nimport logger from './util/logger'\n\nimport type { Entity, LayerGroups, ParsedDXF, ToJsonOptions, ToSVGOptions } from './types'\n\nexport default class Helper {\n private readonly _contents: string\n private _parsed: ParsedDXF | null\n private _denormalised: Entity[] | null\n private _groups: LayerGroups | null\n\n constructor(contents: string) {\n if (typeof contents !== 'string') {\n throw new TypeError('Helper constructor expects a DXF string')\n }\n this._contents = contents\n this._parsed = null\n this._denormalised = null\n this._groups = null\n }\n\n parse(): ParsedDXF {\n this._parsed = parseString(this._contents)\n logger.info('parsed:', this.parsed)\n return this._parsed\n }\n\n get parsed(): ParsedDXF {\n if (this._parsed === null) {\n this.parse()\n }\n return this._parsed as ParsedDXF\n }\n\n denormalise(): Entity[] {\n this._denormalised = denormalise(this.parsed)\n logger.info('denormalised:', this._denormalised)\n return this._denormalised\n }\n\n get denormalised(): Entity[] {\n if (!this._denormalised) {\n this.denormalise()\n }\n return this._denormalised as Entity[]\n }\n\n group(): LayerGroups {\n this._groups = groupEntitiesByLayer(this.denormalised)\n return this._groups\n }\n\n get groups(): LayerGroups {\n if (!this._groups) {\n this.group()\n }\n return this._groups as LayerGroups\n }\n\n toSVG(options?: ToSVGOptions): string {\n return toSVG(this.parsed, options)\n }\n\n toJson(options?: ToJsonOptions): string {\n return toJson(this.parsed, options)\n }\n\n toPolylines(): ReturnType<typeof toPolylines> {\n return toPolylines(this.parsed)\n }\n}\n"],
5
+ "mappings": "AAAA,OAAO,iBAAiB;AACxB,OAAO,0BAA0B;AACjC,OAAO,iBAAiB;AACxB,OAAO,YAAY;AACnB,OAAO,iBAAiB;AACxB,OAAO,WAAW;AAClB,OAAO,YAAY;AAInB,MAAO,OAAqB;AAAA,EAM1B,YAAY,UAAkB;AAC5B,QAAI,OAAO,aAAa,UAAU;AAChC,YAAM,IAAI,UAAU,yCAAyC;AAAA,IAC/D;AACA,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,gBAAgB;AACrB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,QAAmB;AACjB,SAAK,UAAU,YAAY,KAAK,SAAS;AACzC,WAAO,KAAK,WAAW,KAAK,MAAM;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAoB;AACtB,QAAI,KAAK,YAAY,MAAM;AACzB,WAAK,MAAM;AAAA,IACb;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAwB;AACtB,SAAK,gBAAgB,YAAY,KAAK,MAAM;AAC5C,WAAO,KAAK,iBAAiB,KAAK,aAAa;AAC/C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,eAAyB;AAC3B,QAAI,CAAC,KAAK,eAAe;AACvB,WAAK,YAAY;AAAA,IACnB;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAqB;AACnB,SAAK,UAAU,qBAAqB,KAAK,YAAY;AACrD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAsB;AACxB,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,MAAM;AAAA,IACb;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,SAAgC;AACpC,WAAO,MAAM,KAAK,QAAQ,OAAO;AAAA,EACnC;AAAA,EAEA,OAAO,SAAiC;AACtC,WAAO,OAAO,KAAK,QAAQ,OAAO;AAAA,EACpC;AAAA,EAEA,cAA8C;AAC5C,WAAO,YAAY,KAAK,MAAM;AAAA,EAChC;AACF;",
6
6
  "names": []
7
7
  }
@@ -33,6 +33,133 @@ __export(denormalise_exports, {
33
33
  module.exports = __toCommonJS(denormalise_exports);
34
34
  var import_cloneDeep = __toESM(require("lodash/cloneDeep"), 1);
35
35
  var import_logger = __toESM(require("./util/logger"), 1);
36
+ function adjustLineForBlockBasePoint(entity, block) {
37
+ const line = entity;
38
+ line.start.x -= block.x;
39
+ line.start.y -= block.y;
40
+ line.end.x -= block.x;
41
+ line.end.y -= block.y;
42
+ }
43
+ function adjustPolylineForBlockBasePoint(entity, block) {
44
+ const poly = entity;
45
+ for (const v of poly.vertices) {
46
+ if (v.x !== void 0) v.x -= block.x;
47
+ if (v.y !== void 0) v.y -= block.y;
48
+ }
49
+ }
50
+ function adjustCircleForBlockBasePoint(entity, block) {
51
+ const circle = entity;
52
+ circle.x -= block.x;
53
+ circle.y -= block.y;
54
+ }
55
+ function adjustEllipseForBlockBasePoint(entity, block) {
56
+ const ellipse = entity;
57
+ ellipse.x -= block.x;
58
+ ellipse.y -= block.y;
59
+ }
60
+ function adjustArcForBlockBasePoint(entity, block) {
61
+ const arc = entity;
62
+ arc.x -= block.x;
63
+ arc.y -= block.y;
64
+ }
65
+ function adjustSplineForBlockBasePoint(entity, block) {
66
+ const spline = entity;
67
+ for (const cp of spline.controlPoints) {
68
+ cp.x -= block.x;
69
+ cp.y -= block.y;
70
+ }
71
+ }
72
+ function adjustTextForBlockBasePoint(entity, block) {
73
+ const text = entity;
74
+ if (text.x !== void 0) text.x -= block.x;
75
+ if (text.y !== void 0) text.y -= block.y;
76
+ if (text.x2 !== void 0) text.x2 -= block.x;
77
+ if (text.y2 !== void 0) text.y2 -= block.y;
78
+ }
79
+ function adjustMTextForBlockBasePoint(entity, block) {
80
+ const mtext = entity;
81
+ if (mtext.x !== void 0) mtext.x -= block.x;
82
+ if (mtext.y !== void 0) mtext.y -= block.y;
83
+ }
84
+ function adjustDimensionForBlockBasePoint(entity, block) {
85
+ const dim = entity;
86
+ dim.start.x -= block.x;
87
+ dim.start.y -= block.y;
88
+ dim.textMidpoint.x -= block.x;
89
+ dim.textMidpoint.y -= block.y;
90
+ dim.measureStart.x -= block.x;
91
+ dim.measureStart.y -= block.y;
92
+ dim.measureEnd.x -= block.x;
93
+ dim.measureEnd.y -= block.y;
94
+ }
95
+ const BLOCK_BASEPOINT_ADJUSTERS = {
96
+ LINE: adjustLineForBlockBasePoint,
97
+ LWPOLYLINE: adjustPolylineForBlockBasePoint,
98
+ POLYLINE: adjustPolylineForBlockBasePoint,
99
+ CIRCLE: adjustCircleForBlockBasePoint,
100
+ ELLIPSE: adjustEllipseForBlockBasePoint,
101
+ ARC: adjustArcForBlockBasePoint,
102
+ SPLINE: adjustSplineForBlockBasePoint,
103
+ TEXT: adjustTextForBlockBasePoint,
104
+ MTEXT: adjustMTextForBlockBasePoint,
105
+ DIMENSION: adjustDimensionForBlockBasePoint
106
+ };
107
+ function applyBlockBasePointAdjustment(entity, block) {
108
+ const adjust = BLOCK_BASEPOINT_ADJUSTERS[entity.type];
109
+ if (adjust) adjust(entity, block);
110
+ }
111
+ function computeRectangularArrayVectors(insert) {
112
+ const rowCount = insert.rowCount ?? 1;
113
+ const columnCount = insert.columnCount ?? 1;
114
+ const rowSpacing = insert.rowSpacing ?? 0;
115
+ const columnSpacing = insert.columnSpacing ?? 0;
116
+ const rotation = insert.rotation ?? 0;
117
+ if (rowCount <= 1 && columnCount <= 1) {
118
+ return { rowVec: { x: 0, y: 0 }, colVec: { x: 0, y: 0 } };
119
+ }
120
+ const cos = Math.cos(rotation * Math.PI / 180);
121
+ const sin = Math.sin(rotation * Math.PI / 180);
122
+ return {
123
+ rowVec: { x: -sin * rowSpacing, y: cos * rowSpacing },
124
+ colVec: { x: cos * columnSpacing, y: sin * columnSpacing }
125
+ };
126
+ }
127
+ function expandInsert(insert, blocksByName, transforms, gatherEntities) {
128
+ const block = blocksByName[insert.block];
129
+ if (!block) {
130
+ import_logger.default.error("no block found for insert. block:", insert.block);
131
+ return [];
132
+ }
133
+ const rowCount = insert.rowCount ?? 1;
134
+ const columnCount = insert.columnCount ?? 1;
135
+ const { rowVec, colVec } = computeRectangularArrayVectors(insert);
136
+ const current = [];
137
+ for (let r = 0; r < rowCount; r++) {
138
+ for (let c = 0; c < columnCount; c++) {
139
+ const t = {
140
+ x: insert.x + rowVec.x * r + colVec.x * c,
141
+ y: insert.y + rowVec.y * r + colVec.y * c,
142
+ scaleX: insert.scaleX,
143
+ scaleY: insert.scaleY,
144
+ scaleZ: insert.scaleZ,
145
+ extrusionX: insert.extrusionX,
146
+ extrusionY: insert.extrusionY,
147
+ extrusionZ: insert.extrusionZ,
148
+ rotation: insert.rotation
149
+ };
150
+ const transforms2 = transforms.slice(0);
151
+ transforms2.push(t);
152
+ const blockEntities = block.entities.map((be) => {
153
+ const be2 = (0, import_cloneDeep.default)(be);
154
+ be2.layer = insert.layer;
155
+ applyBlockBasePointAdjustment(be2, block);
156
+ return be2;
157
+ });
158
+ current.push(...gatherEntities(blockEntities, transforms2));
159
+ }
160
+ }
161
+ return current;
162
+ }
36
163
  function denormalise(parseResult) {
37
164
  const blocksByName = parseResult.blocks.reduce(
38
165
  (acc, b) => {
@@ -42,99 +169,12 @@ function denormalise(parseResult) {
42
169
  {}
43
170
  );
44
171
  const gatherEntities = (entities, transforms) => {
45
- let current = [];
172
+ const current = [];
46
173
  for (const e of entities) {
47
174
  if (e.type === "INSERT") {
48
- const insert = e;
49
- const block = blocksByName[insert.block];
50
- if (!block) {
51
- import_logger.default.error("no block found for insert. block:", insert.block);
52
- continue;
53
- }
54
- const rowCount = insert.rowCount ?? 1;
55
- const columnCount = insert.columnCount ?? 1;
56
- const rowSpacing = insert.rowSpacing ?? 0;
57
- const columnSpacing = insert.columnSpacing ?? 0;
58
- const rotation = insert.rotation ?? 0;
59
- let rowVec;
60
- let colVec;
61
- if (rowCount > 1 || columnCount > 1) {
62
- const cos = Math.cos(rotation * Math.PI / 180);
63
- const sin = Math.sin(rotation * Math.PI / 180);
64
- rowVec = { x: -sin * rowSpacing, y: cos * rowSpacing };
65
- colVec = { x: cos * columnSpacing, y: sin * columnSpacing };
66
- } else {
67
- rowVec = { x: 0, y: 0 };
68
- colVec = { x: 0, y: 0 };
69
- }
70
- for (let r = 0; r < rowCount; r++) {
71
- for (let c = 0; c < columnCount; c++) {
72
- const t = {
73
- x: insert.x + rowVec.x * r + colVec.x * c,
74
- y: insert.y + rowVec.y * r + colVec.y * c,
75
- scaleX: insert.scaleX,
76
- scaleY: insert.scaleY,
77
- scaleZ: insert.scaleZ,
78
- extrusionX: insert.extrusionX,
79
- extrusionY: insert.extrusionY,
80
- extrusionZ: insert.extrusionZ,
81
- rotation: insert.rotation
82
- };
83
- const transforms2 = transforms.slice(0);
84
- transforms2.push(t);
85
- const blockEntities = block.entities.map((be) => {
86
- const be2 = (0, import_cloneDeep.default)(be);
87
- be2.layer = insert.layer;
88
- switch (be2.type) {
89
- case "LINE": {
90
- const line = be2;
91
- line.start.x -= block.x;
92
- line.start.y -= block.y;
93
- line.end.x -= block.x;
94
- line.end.y -= block.y;
95
- break;
96
- }
97
- case "LWPOLYLINE":
98
- case "POLYLINE": {
99
- const poly = be2;
100
- for (const v of poly.vertices) {
101
- if (v.x !== void 0) v.x -= block.x;
102
- if (v.y !== void 0) v.y -= block.y;
103
- }
104
- break;
105
- }
106
- case "CIRCLE": {
107
- const circle = be2;
108
- circle.x -= block.x;
109
- circle.y -= block.y;
110
- break;
111
- }
112
- case "ELLIPSE": {
113
- const ellipse = be2;
114
- ellipse.x -= block.x;
115
- ellipse.y -= block.y;
116
- break;
117
- }
118
- case "ARC": {
119
- const arc = be2;
120
- arc.x -= block.x;
121
- arc.y -= block.y;
122
- break;
123
- }
124
- case "SPLINE": {
125
- const spline = be2;
126
- for (const cp of spline.controlPoints) {
127
- cp.x -= block.x;
128
- cp.y -= block.y;
129
- }
130
- break;
131
- }
132
- }
133
- return be2;
134
- });
135
- current = current.concat(gatherEntities(blockEntities, transforms2));
136
- }
137
- }
175
+ current.push(
176
+ ...expandInsert(e, blocksByName, transforms, gatherEntities)
177
+ );
138
178
  } else {
139
179
  const e2 = (0, import_cloneDeep.default)(e);
140
180
  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": ["logger", "cloneDeep"]
7
7
  }