@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,8 @@
1
+ import type { BaseEntity } from './base-entity'
2
+
3
+ export interface MLeaderEntity extends BaseEntity {
4
+ type: 'MLEADER'
5
+
6
+ styleName?: string
7
+ text?: string
8
+ }
@@ -0,0 +1,12 @@
1
+ import type { BaseEntity } from './base-entity'
2
+ import type { Point3D } from './common'
3
+
4
+ export interface MLineEntity extends BaseEntity {
5
+ type: 'MLINE'
6
+
7
+ startPoint?: Point3D
8
+ endPoint?: Point3D
9
+
10
+ vertexCount?: number
11
+ styleName?: string
12
+ }
@@ -0,0 +1,40 @@
1
+ // OLEFrame entity type
2
+
3
+ import type { BaseEntity } from './base-entity'
4
+
5
+ /**
6
+ * OLEFRAME entity
7
+ * Legacy OLE object frame entity.
8
+ */
9
+ export interface OleFrameEntity extends BaseEntity {
10
+ type: 'OLEFRAME'
11
+
12
+ /** OLE version number */
13
+ version?: string | number
14
+ /** End of object name/description */
15
+ name?: string | number
16
+
17
+ /** Upper-left corner X coordinate (WCS) */
18
+ upperLeftX?: string | number
19
+ /** Upper-left corner Y coordinate (WCS) */
20
+ upperLeftY?: string | number
21
+ /** Upper-left corner Z coordinate (WCS) */
22
+ upperLeftZ?: string | number
23
+
24
+ /** Lower-right corner X coordinate (WCS) */
25
+ lowerRightX?: string | number
26
+ /** Lower-right corner Y coordinate (WCS) */
27
+ lowerRightY?: string | number
28
+ /** Lower-right corner Z coordinate (WCS) */
29
+ lowerRightZ?: string | number
30
+
31
+ /** Object type (1=Link, 2=Embedded, 3=Static) */
32
+ objectType?: string | number
33
+ /** Tile mode descriptor (0=Model space, 1=Paper space) */
34
+ tile?: string | number
35
+
36
+ /** Length of binary data */
37
+ length?: string | number
38
+ /** Binary data (concatenated from multiple 310 codes) */
39
+ data: string
40
+ }
@@ -4,9 +4,57 @@ export interface ToPolylinesOptions {
4
4
  interpolationsPerSplineSegment?: number
5
5
  }
6
6
 
7
+ export interface ToJsonOptions {
8
+ /** Pretty-print JSON output (defaults to false). */
9
+ pretty?: boolean
10
+ /** Indentation spaces when pretty-printing (defaults to 2). */
11
+ space?: number
12
+ }
13
+
14
+ /**
15
+ * Viewport percentage controls for DIMENSION autoScale.
16
+ *
17
+ * Each value is a percentage (0..100) of the viewport minimum dimension.
18
+ */
19
+ export interface DimensionAutoScaleViewportPercentages {
20
+ /** Arrowhead marker size (markerWidth/markerHeight) */
21
+ arrowSize?: number
22
+ /** Text height (`font-size`) */
23
+ textHeight?: number
24
+ /** Extension line offset from the measured points */
25
+ extLineOffset?: number
26
+ /** Extension line overshoot beyond the dimension line */
27
+ extLineExtension?: number
28
+ }
29
+
7
30
  export interface ToSVGOptions {
8
31
  width?: number
9
32
  height?: number
33
+ dimension?: {
34
+ /**
35
+ * Automatically scale DIMENSION arrow size, extension endpoints, and
36
+ * text height estimates based on the SVG viewport size.
37
+ */
38
+ autoScale?: boolean
39
+
40
+ /**
41
+ * Viewport reference size used by DIMENSION autoScale.
42
+ * Scale factor is: min(viewBoxWidth, viewBoxHeight) / autoScaleViewportReference.
43
+ * Default: 40.
44
+ */
45
+ autoScaleViewportReference?: number
46
+
47
+ /**
48
+ * Per-element viewport-percentage overrides for DIMENSION autoScale.
49
+ *
50
+ * When provided (and `autoScale` is enabled), these values set the final
51
+ * sizes directly as a percentage of the viewport minimum dimension:
52
+ * `size = min(viewBoxWidth, viewBoxHeight) * (percent / 100)`.
53
+ *
54
+ * Percent values are expected in the `0..100` range.
55
+ */
56
+ autoScaleViewportPercentages?: DimensionAutoScaleViewportPercentages
57
+ }
10
58
  }
11
59
 
12
60
  export interface Config {
@@ -0,0 +1,12 @@
1
+ // RAY entity type
2
+
3
+ import type { BaseEntity } from './base-entity'
4
+ import type { Point3D } from './common'
5
+
6
+ export interface RayEntity extends BaseEntity {
7
+ type: 'RAY'
8
+ /** Starting point for the ray. */
9
+ start: Point3D
10
+ /** Unit direction vector. */
11
+ direction: Point3D
12
+ }
@@ -0,0 +1,11 @@
1
+ import type { BaseEntity } from './base-entity'
2
+
3
+ export interface RegionEntity extends BaseEntity {
4
+ type: 'REGION'
5
+
6
+ /**
7
+ * ACIS data payload (text form). This project currently parses and stores it,
8
+ * but does not attempt to interpret it.
9
+ */
10
+ acisData?: string[]
11
+ }
@@ -0,0 +1,19 @@
1
+ // SHAPE entity type
2
+
3
+ import type { BaseEntity } from './base-entity'
4
+ import type { Point3D } from './common'
5
+
6
+ export interface ShapeEntity extends BaseEntity {
7
+ type: 'SHAPE'
8
+ insertionPoint: Point3D
9
+ /** Shape name (from a loaded SHX shape file). */
10
+ name: string
11
+ /** Size in drawing units. */
12
+ size: number
13
+ rotation?: number
14
+ relativeXScale?: number
15
+ oblique?: number
16
+ thickness?: number
17
+ extrusionX?: number
18
+ extrusionY?: number
19
+ }
@@ -0,0 +1,14 @@
1
+ import type { BaseEntity } from './base-entity'
2
+
3
+ export interface TableEntity extends BaseEntity {
4
+ type: 'TABLE'
5
+
6
+ rows?: number
7
+ columns?: number
8
+
9
+ /**
10
+ * Minimal extracted cell text (from group code 1).
11
+ * This is intentionally lossy; full TABLE semantics are not implemented.
12
+ */
13
+ cellText?: string[]
14
+ }
@@ -1,6 +1,7 @@
1
1
  // DXF Tables parsing types
2
2
 
3
3
  import type { Point2D, Point3D } from './common'
4
+ import type { DXFTuple } from './dxf'
4
5
 
5
6
  /**
6
7
  * Partial point for parsing (all coordinates optional)
@@ -116,6 +117,54 @@ export interface LayerInternal {
116
117
  lineWeightEnum?: string | number
117
118
  }
118
119
 
120
+ /**
121
+ * Application ID (APPID) table entry
122
+ * Minimal internal representation during DXF parsing
123
+ */
124
+ export interface AppIdInternal {
125
+ type: string
126
+ /** Application name */
127
+ name?: string | number
128
+ /** Standard flags (bit-coded) */
129
+ flags?: string | number
130
+ }
131
+
132
+ /**
133
+ * Block Record (BLOCK_RECORD) table entry
134
+ * Minimal internal representation during DXF parsing
135
+ */
136
+ export interface BlockRecordInternal {
137
+ type: string
138
+ /** Block record name */
139
+ name?: string | number
140
+ /** Standard flags (bit-coded) */
141
+ flags?: string | number
142
+ }
143
+
144
+ /**
145
+ * User Coordinate System (UCS) table entry
146
+ * Minimal internal representation during DXF parsing
147
+ */
148
+ export interface UcsInternal {
149
+ type: string
150
+ /** UCS name */
151
+ name?: string | number
152
+ /** Standard flags (bit-coded) */
153
+ flags?: string | number
154
+ }
155
+
156
+ /**
157
+ * View (VIEW) table entry
158
+ * Minimal internal representation during DXF parsing
159
+ */
160
+ export interface ViewInternal {
161
+ type: string
162
+ /** View name */
163
+ name?: string | number
164
+ /** Standard flags (bit-coded) */
165
+ flags?: string | number
166
+ }
167
+
119
168
  /**
120
169
  * Text Style (STYLE) table entry
121
170
  * Internal representation during DXF parsing
@@ -408,7 +457,118 @@ export interface DimStyleInternal {
408
457
  /**
409
458
  * DXF Objects section result
410
459
  */
460
+ export interface DictionaryObject {
461
+ type: 'DICTIONARY'
462
+ handle?: string | number
463
+ ownerHandle?: string | number
464
+ entries: Record<string, string>
465
+ }
466
+
467
+ export interface XRecordObject {
468
+ type: 'XRECORD'
469
+ handle?: string | number
470
+ ownerHandle?: string | number
471
+
472
+ /** Raw tuples for downstream consumers (excluding the initial 0/XRECORD tuple). */
473
+ tuples: DXFTuple[]
474
+ }
475
+
476
+ export interface ImageDefObject {
477
+ type: 'IMAGEDEF'
478
+ handle?: string | number
479
+
480
+ /** Soft-pointer ID/handle to the ACAD_IMAGE_dict dictionary (when present). */
481
+ ownerHandle?: string | number
482
+
483
+ /** File name of the referenced image. */
484
+ fileName?: string
485
+
486
+ /** Image size in pixels (when available). */
487
+ pixelSizeX?: number
488
+ pixelSizeY?: number
489
+
490
+ /** Raw tuples for downstream consumers (excluding the initial 0/IMAGEDEF tuple). */
491
+ tuples: DXFTuple[]
492
+ }
493
+
494
+ export interface ImageDefReactorObject {
495
+ type: 'IMAGEDEF_REACTOR'
496
+ handle?: string | number
497
+
498
+ /** Object ID/handle for the associated IMAGE entity (when present). */
499
+ imageHandle?: string | number
500
+
501
+ /** Raw tuples for downstream consumers (excluding the initial 0/IMAGEDEF_REACTOR tuple). */
502
+ tuples: DXFTuple[]
503
+ }
504
+
505
+ export type UnderlayDefinitionObjectType =
506
+ | 'UNDERLAYDEFINITION'
507
+ | 'PDFDEFINITION'
508
+ | 'DWFDEFINITION'
509
+ | 'DGNDEFINITION'
510
+
511
+ export interface UnderlayDefinitionObject {
512
+ type: UnderlayDefinitionObjectType
513
+ handle?: string | number
514
+
515
+ /** Soft-pointer ID/handle to the owning dictionary (when present). */
516
+ ownerHandle?: string | number
517
+
518
+ /** File name or path of the referenced underlay. */
519
+ fileName?: string
520
+
521
+ /** Underlay name within the file (e.g., sheet name). */
522
+ underlayName?: string
523
+
524
+ /** Raw tuples for downstream consumers (excluding the initial 0/<TYPE> tuple). */
525
+ tuples: DXFTuple[]
526
+ }
527
+
528
+ export interface DimAssocObject {
529
+ type: 'DIMASSOC'
530
+ handle?: string | number
531
+
532
+ /** Soft-pointer ID/handle to the owning dictionary (when present). */
533
+ ownerHandle?: string | number
534
+
535
+ /** Raw tuples for downstream consumers (excluding the initial 0/DIMASSOC tuple). */
536
+ tuples: DXFTuple[]
537
+ }
538
+
539
+ export interface FieldObject {
540
+ type: 'FIELD'
541
+ handle?: string | number
542
+
543
+ /** Soft-pointer ID/handle to the owning dictionary (when present). */
544
+ ownerHandle?: string | number
545
+
546
+ /** Raw tuples for downstream consumers (excluding the initial 0/FIELD tuple). */
547
+ tuples: DXFTuple[]
548
+ }
549
+
411
550
  export interface ParsedObjects {
412
551
  /** Layout objects */
413
552
  layouts: LayoutInternal[]
553
+
554
+ /** DICTIONARY objects keyed by handle */
555
+ dictionaries?: Record<string, DictionaryObject>
556
+
557
+ /** XRECORD objects keyed by handle */
558
+ xRecords?: Record<string, XRecordObject>
559
+
560
+ /** IMAGEDEF objects keyed by handle */
561
+ imageDefs?: Record<string, ImageDefObject>
562
+
563
+ /** IMAGEDEF_REACTOR objects keyed by handle */
564
+ imageDefReactors?: Record<string, ImageDefReactorObject>
565
+
566
+ /** UNDERLAYDEFINITION objects keyed by handle */
567
+ underlayDefinitions?: Record<string, UnderlayDefinitionObject>
568
+
569
+ /** DIMASSOC objects keyed by handle */
570
+ dimAssocs?: Record<string, DimAssocObject>
571
+
572
+ /** FIELD objects keyed by handle */
573
+ fields?: Record<string, FieldObject>
414
574
  }
@@ -0,0 +1,20 @@
1
+ // TOLERANCE entity type (feature control frame)
2
+
3
+ import type { BaseEntity } from './base-entity'
4
+ import type { Point3D } from './common'
5
+
6
+ export interface ToleranceEntity extends BaseEntity {
7
+ type: 'TOLERANCE'
8
+
9
+ /** Insertion point (WCS). */
10
+ insertionPoint: Point3D
11
+
12
+ /** Raw tolerance string (may include control codes like %%v). */
13
+ text?: string
14
+
15
+ /** Dimension style name (group code 3). */
16
+ dimensionStyleName?: string
17
+
18
+ /** X-axis direction vector (group codes 11/21/31). */
19
+ xAxisDirection?: Point3D
20
+ }
@@ -0,0 +1,14 @@
1
+ // TRACE entity type
2
+
3
+ import type { BaseEntity } from './base-entity'
4
+ import type { Point3D } from './common'
5
+
6
+ export interface TraceEntity extends BaseEntity {
7
+ type: 'TRACE'
8
+
9
+ /** Four corner points (10/20/30, 11/21/31, 12/22/32, 13/23/33). */
10
+ corners: Point3D[]
11
+
12
+ /** Optional thickness (39). */
13
+ thickness?: number
14
+ }
@@ -0,0 +1,35 @@
1
+ // UNDERLAY entity types (DWFUNDERLAY / DGNUNDERLAY / PDFUNDERLAY)
2
+
3
+ import type { BaseEntity } from './base-entity'
4
+ import type { Point3D } from './common'
5
+
6
+ export interface UnderlayReferenceEntityBase extends BaseEntity {
7
+ insertionPoint: Point3D
8
+ scale: Point3D
9
+ rotation?: number
10
+ normal?: Point3D
11
+
12
+ /** Hard reference to UNDERLAYDEFINITION object. */
13
+ underlayDefinitionHandle?: string
14
+
15
+ /** Display properties bitmask. */
16
+ flags?: number
17
+
18
+ /** Contrast in range [0, 100]. */
19
+ contrast?: number
20
+
21
+ /** Fade in range [0, 100]. */
22
+ fade?: number
23
+ }
24
+
25
+ export interface DwfUnderlayEntity extends UnderlayReferenceEntityBase {
26
+ type: 'DWFUNDERLAY'
27
+ }
28
+
29
+ export interface DgnUnderlayEntity extends UnderlayReferenceEntityBase {
30
+ type: 'DGNUNDERLAY'
31
+ }
32
+
33
+ export interface PdfUnderlayEntity extends UnderlayReferenceEntityBase {
34
+ type: 'PDFUNDERLAY'
35
+ }
@@ -0,0 +1,20 @@
1
+ // WIPEOUT entity type
2
+
3
+ import type { BaseEntity } from './base-entity'
4
+ import type { Point2D, Point3D } from './common'
5
+
6
+ export interface WipeoutEntity extends BaseEntity {
7
+ type: 'WIPEOUT'
8
+
9
+ insertionPoint: Point3D
10
+ uVector: Point3D
11
+ vVector: Point3D
12
+
13
+ clipBoundaryType?: 1 | 2
14
+ clipBoundaryVertices?: Point2D[]
15
+
16
+ displayProperties?: number
17
+ clippingState?: 0 | 1
18
+ classVersion?: number
19
+ imageSizePixels?: { u: number; v: number }
20
+ }
@@ -0,0 +1,12 @@
1
+ // XLINE entity type
2
+
3
+ import type { BaseEntity } from './base-entity'
4
+ import type { Point3D } from './common'
5
+
6
+ export interface XLineEntity extends BaseEntity {
7
+ type: 'XLINE'
8
+ /** Base point for the infinite line. */
9
+ basePoint: Point3D
10
+ /** Unit direction vector. */
11
+ direction: Point3D
12
+ }
@@ -0,0 +1,10 @@
1
+ export default function escapeXmlText(value: string): string {
2
+ // Escape text for use inside XML/SVG text nodes.
3
+ // Keep it small and dependency-free.
4
+ return value
5
+ .split('&').join('&amp;')
6
+ .split('<').join('&lt;')
7
+ .split('>').join('&gt;')
8
+ .split('"').join('&quot;')
9
+ .split("'").join('&apos;')
10
+ }
@@ -0,0 +1,87 @@
1
+ const http = require('node:http')
2
+ const { createReadStream, existsSync, statSync } = require('node:fs')
3
+ const { extname, join, normalize, resolve } = require('node:path')
4
+
5
+ const projectRoot = resolve(__dirname, '..')
6
+ const port = Number(process.env.PORT || 4173)
7
+
8
+ const harnessHtmlPath = join(projectRoot, 'test', 'browser', 'harness.html')
9
+ const distBundlePath = join(projectRoot, 'dist', 'dxf.js')
10
+ const fixturesDir = join(projectRoot, 'test', 'resources')
11
+
12
+ function sendText(res, statusCode, text, contentType = 'text/plain; charset=utf-8') {
13
+ res.writeHead(statusCode, { 'Content-Type': contentType })
14
+ res.end(text)
15
+ }
16
+
17
+ function contentTypeForPath(filePath) {
18
+ const ext = extname(filePath).toLowerCase()
19
+ switch (ext) {
20
+ case '.html':
21
+ return 'text/html; charset=utf-8'
22
+ case '.js':
23
+ return 'text/javascript; charset=utf-8'
24
+ case '.dxf':
25
+ return 'text/plain; charset=utf-8'
26
+ case '.json':
27
+ return 'application/json; charset=utf-8'
28
+ default:
29
+ return 'application/octet-stream'
30
+ }
31
+ }
32
+
33
+ function safeJoin(baseDir, requestedPath) {
34
+ const cleaned = requestedPath.replace(/^\/+/, '')
35
+ const target = normalize(join(baseDir, cleaned))
36
+ const resolvedBase = resolve(baseDir)
37
+ const resolvedTarget = resolve(target)
38
+ if (!resolvedTarget.startsWith(resolvedBase + '/')) {
39
+ return null
40
+ }
41
+ return resolvedTarget
42
+ }
43
+
44
+ const server = http.createServer((req, res) => {
45
+ const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`)
46
+ const pathname = url.pathname
47
+
48
+ if (pathname === '/' || pathname === '/harness') {
49
+ if (!existsSync(harnessHtmlPath)) {
50
+ return sendText(res, 500, 'Missing test/browser/harness.html')
51
+ }
52
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' })
53
+ return createReadStream(harnessHtmlPath).pipe(res)
54
+ }
55
+
56
+ if (pathname === '/dist/dxf.js') {
57
+ if (!existsSync(distBundlePath)) {
58
+ return sendText(
59
+ res,
60
+ 500,
61
+ 'Missing dist/dxf.js. Run `yarn dist` before running browser tests.'
62
+ )
63
+ }
64
+ res.writeHead(200, { 'Content-Type': 'text/javascript; charset=utf-8' })
65
+ return createReadStream(distBundlePath).pipe(res)
66
+ }
67
+
68
+ if (pathname.startsWith('/fixtures/')) {
69
+ const fixtureName = pathname.slice('/fixtures/'.length)
70
+ const fixturePath = safeJoin(fixturesDir, fixtureName)
71
+ if (!fixturePath) {
72
+ return sendText(res, 400, 'Invalid fixture path')
73
+ }
74
+ if (!existsSync(fixturePath) || !statSync(fixturePath).isFile()) {
75
+ return sendText(res, 404, 'Fixture not found')
76
+ }
77
+ res.writeHead(200, { 'Content-Type': contentTypeForPath(fixturePath) })
78
+ return createReadStream(fixturePath).pipe(res)
79
+ }
80
+
81
+ return sendText(res, 404, 'Not found')
82
+ })
83
+
84
+ server.listen(port, () => {
85
+ // Used by Playwright webServer readiness checks.
86
+ console.log(`Browser test server listening on http://localhost:${port}`)
87
+ })