@linkiez/dxf-renew 7.1.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 (169) hide show
  1. package/.eslintrc.json +1 -16
  2. package/.yarn/install-state.gz +0 -0
  3. package/ARCHITECTURE.md +163 -0
  4. package/CHANGELOG.md +16 -0
  5. package/README.md +72 -10
  6. package/{PLAN.md → ROADMAP.md} +227 -35
  7. package/dist/dxf.js +1090 -344
  8. package/docs/FIXTURE_VALIDATION_EZDXF.md +1 -1
  9. package/lib/Helper.cjs +4 -0
  10. package/lib/Helper.cjs.map +3 -3
  11. package/lib/Helper.js +4 -0
  12. package/lib/Helper.js.map +2 -2
  13. package/lib/entityToPolyline.cjs +95 -0
  14. package/lib/entityToPolyline.cjs.map +3 -3
  15. package/lib/entityToPolyline.js +95 -0
  16. package/lib/entityToPolyline.js.map +2 -2
  17. package/lib/handlers/entities.cjs +22 -2
  18. package/lib/handlers/entities.cjs.map +3 -3
  19. package/lib/handlers/entities.js +22 -2
  20. package/lib/handlers/entities.js.map +2 -2
  21. package/lib/handlers/entity/mleader.cjs +69 -0
  22. package/lib/handlers/entity/mleader.cjs.map +7 -0
  23. package/lib/handlers/entity/mleader.js +34 -0
  24. package/lib/handlers/entity/mleader.js.map +7 -0
  25. package/lib/handlers/entity/mline.cjs +91 -0
  26. package/lib/handlers/entity/mline.cjs.map +7 -0
  27. package/lib/handlers/entity/mline.js +56 -0
  28. package/lib/handlers/entity/mline.js.map +7 -0
  29. package/lib/handlers/entity/oleframe.cjs +98 -0
  30. package/lib/handlers/entity/oleframe.cjs.map +7 -0
  31. package/lib/handlers/entity/oleframe.js +63 -0
  32. package/lib/handlers/entity/oleframe.js.map +7 -0
  33. package/lib/handlers/entity/ray.cjs +81 -0
  34. package/lib/handlers/entity/ray.cjs.map +7 -0
  35. package/lib/handlers/entity/ray.js +46 -0
  36. package/lib/handlers/entity/ray.js.map +7 -0
  37. package/lib/handlers/entity/region.cjs +67 -0
  38. package/lib/handlers/entity/region.cjs.map +7 -0
  39. package/lib/handlers/entity/region.js +32 -0
  40. package/lib/handlers/entity/region.js.map +7 -0
  41. package/lib/handlers/entity/shape.cjs +95 -0
  42. package/lib/handlers/entity/shape.cjs.map +7 -0
  43. package/lib/handlers/entity/shape.js +60 -0
  44. package/lib/handlers/entity/shape.js.map +7 -0
  45. package/lib/handlers/entity/table.cjs +71 -0
  46. package/lib/handlers/entity/table.cjs.map +7 -0
  47. package/lib/handlers/entity/table.js +36 -0
  48. package/lib/handlers/entity/table.js.map +7 -0
  49. package/lib/handlers/entity/trace.cjs +101 -0
  50. package/lib/handlers/entity/trace.cjs.map +7 -0
  51. package/lib/handlers/entity/trace.js +66 -0
  52. package/lib/handlers/entity/trace.js.map +7 -0
  53. package/lib/handlers/entity/wipeout.cjs +122 -0
  54. package/lib/handlers/entity/wipeout.cjs.map +7 -0
  55. package/lib/handlers/entity/wipeout.js +87 -0
  56. package/lib/handlers/entity/wipeout.js.map +7 -0
  57. package/lib/handlers/entity/xline.cjs +81 -0
  58. package/lib/handlers/entity/xline.cjs.map +7 -0
  59. package/lib/handlers/entity/xline.js +46 -0
  60. package/lib/handlers/entity/xline.js.map +7 -0
  61. package/lib/handlers/objects.cjs +43 -1
  62. package/lib/handlers/objects.cjs.map +2 -2
  63. package/lib/handlers/objects.js +43 -1
  64. package/lib/handlers/objects.js.map +2 -2
  65. package/lib/handlers/tables.cjs +96 -17
  66. package/lib/handlers/tables.cjs.map +2 -2
  67. package/lib/handlers/tables.js +96 -17
  68. package/lib/handlers/tables.js.map +2 -2
  69. package/lib/index.cjs +5 -2
  70. package/lib/index.cjs.map +3 -3
  71. package/lib/index.js +18 -16
  72. package/lib/index.js.map +3 -3
  73. package/lib/toJson.cjs +29 -0
  74. package/lib/toJson.cjs.map +7 -0
  75. package/lib/toJson.js +9 -0
  76. package/lib/toJson.js.map +7 -0
  77. package/lib/toSVG.cjs +34 -3
  78. package/lib/toSVG.cjs.map +2 -2
  79. package/lib/toSVG.js +34 -3
  80. package/lib/toSVG.js.map +2 -2
  81. package/lib/types/entity.cjs.map +1 -1
  82. package/lib/types/helper.cjs.map +1 -1
  83. package/lib/types/index.cjs +20 -0
  84. package/lib/types/index.cjs.map +2 -2
  85. package/lib/types/index.js +10 -0
  86. package/lib/types/index.js.map +2 -2
  87. package/lib/types/mleader-entity.cjs +17 -0
  88. package/lib/types/mleader-entity.cjs.map +7 -0
  89. package/lib/types/mleader-entity.js +1 -0
  90. package/lib/types/mleader-entity.js.map +7 -0
  91. package/lib/types/mline-entity.cjs +17 -0
  92. package/lib/types/mline-entity.cjs.map +7 -0
  93. package/lib/types/mline-entity.js +1 -0
  94. package/lib/types/mline-entity.js.map +7 -0
  95. package/lib/types/oleframe-entity.cjs +17 -0
  96. package/lib/types/oleframe-entity.cjs.map +7 -0
  97. package/lib/types/oleframe-entity.js +1 -0
  98. package/lib/types/oleframe-entity.js.map +7 -0
  99. package/lib/types/options.cjs.map +1 -1
  100. package/lib/types/ray-entity.cjs +17 -0
  101. package/lib/types/ray-entity.cjs.map +7 -0
  102. package/lib/types/ray-entity.js +1 -0
  103. package/lib/types/ray-entity.js.map +7 -0
  104. package/lib/types/region-entity.cjs +17 -0
  105. package/lib/types/region-entity.cjs.map +7 -0
  106. package/lib/types/region-entity.js +1 -0
  107. package/lib/types/region-entity.js.map +7 -0
  108. package/lib/types/shape-entity.cjs +17 -0
  109. package/lib/types/shape-entity.cjs.map +7 -0
  110. package/lib/types/shape-entity.js +1 -0
  111. package/lib/types/shape-entity.js.map +7 -0
  112. package/lib/types/table-entity.cjs +17 -0
  113. package/lib/types/table-entity.cjs.map +7 -0
  114. package/lib/types/table-entity.js +1 -0
  115. package/lib/types/table-entity.js.map +7 -0
  116. package/lib/types/tables.cjs.map +1 -1
  117. package/lib/types/trace-entity.cjs +17 -0
  118. package/lib/types/trace-entity.cjs.map +7 -0
  119. package/lib/types/trace-entity.js +1 -0
  120. package/lib/types/trace-entity.js.map +7 -0
  121. package/lib/types/wipeout-entity.cjs +17 -0
  122. package/lib/types/wipeout-entity.cjs.map +7 -0
  123. package/lib/types/wipeout-entity.js +1 -0
  124. package/lib/types/wipeout-entity.js.map +7 -0
  125. package/lib/types/xline-entity.cjs +17 -0
  126. package/lib/types/xline-entity.cjs.map +7 -0
  127. package/lib/types/xline-entity.js +1 -0
  128. package/lib/types/xline-entity.js.map +7 -0
  129. package/package.json +5 -19
  130. package/src/Helper.ts +6 -1
  131. package/src/entityToPolyline.ts +124 -2
  132. package/src/handlers/entities.ts +21 -1
  133. package/src/handlers/entity/mleader.ts +46 -0
  134. package/src/handlers/entity/mline.ts +74 -0
  135. package/src/handlers/entity/oleframe.ts +62 -0
  136. package/src/handlers/entity/ray.ts +52 -0
  137. package/src/handlers/entity/region.ts +42 -0
  138. package/src/handlers/entity/shape.ts +73 -0
  139. package/src/handlers/entity/table.ts +49 -0
  140. package/src/handlers/entity/trace.ts +72 -0
  141. package/src/handlers/entity/wipeout.ts +114 -0
  142. package/src/handlers/entity/xline.ts +52 -0
  143. package/src/handlers/objects.ts +64 -8
  144. package/src/handlers/tables.ts +134 -21
  145. package/src/index.ts +9 -18
  146. package/src/toJson.ts +8 -0
  147. package/src/toSVG.ts +45 -3
  148. package/src/types/entity.ts +20 -0
  149. package/src/types/helper.ts +2 -1
  150. package/src/types/index.ts +10 -0
  151. package/src/types/mleader-entity.ts +8 -0
  152. package/src/types/mline-entity.ts +12 -0
  153. package/src/types/oleframe-entity.ts +40 -0
  154. package/src/types/options.ts +7 -0
  155. package/src/types/ray-entity.ts +12 -0
  156. package/src/types/region-entity.ts +11 -0
  157. package/src/types/shape-entity.ts +19 -0
  158. package/src/types/table-entity.ts +14 -0
  159. package/src/types/tables.ts +76 -0
  160. package/src/types/trace-entity.ts +14 -0
  161. package/src/types/wipeout-entity.ts +20 -0
  162. package/src/types/xline-entity.ts +12 -0
  163. package/docs/DIMENSION_SUMMARY.md +0 -254
  164. package/docs/DXF_VERSION_SUPPORT.md +0 -45
  165. package/docs/ENTITY_SVG_ROADMAP.md +0 -96
  166. package/docs/IMPLEMENTED-2D-ENTITIES.md +0 -54
  167. package/docs/README.md +0 -22
  168. package/docs/SVG_RENDERING_INTEGRATION_TESTS.md +0 -119
  169. package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.md +0 -241
@@ -9,8 +9,13 @@ import type {
9
9
  EllipseEntity,
10
10
  EntityToPolylineOptions,
11
11
  HandlerVertex,
12
+ LeaderEntity,
12
13
  LineEntity,
14
+ RayEntity,
15
+ ShapeEntity,
13
16
  SplineEntity,
17
+ WipeoutEntity,
18
+ XLineEntity,
14
19
  } from './types'
15
20
  import type { PointTuple } from './types/common'
16
21
 
@@ -35,7 +40,17 @@ interface LocalPolylineEntity {
35
40
 
36
41
  type Entity =
37
42
  | LineEntity
43
+ | LeaderEntity
44
+ | RayEntity
45
+ | XLineEntity
46
+ | ShapeEntity
47
+ | WipeoutEntity
38
48
  | (LocalPolylineEntity & { type: 'LWPOLYLINE' | 'POLYLINE' })
49
+ | {
50
+ type: 'SOLID' | 'TRACE'
51
+ corners?: Array<{ x: number; y: number }>
52
+ points?: Array<{ x: number; y: number }>
53
+ }
39
54
  | CircleEntity
40
55
  | EllipseEntity
41
56
  | ArcEntity
@@ -151,7 +166,7 @@ export const interpolateBSpline = (
151
166
  return polyline
152
167
  }
153
168
 
154
- export const polyfaceOutline = (entity: LocalPolylineEntity): Point[][] => {
169
+ export const polyfaceOutline = (entity: LocalPolylineEntity): Point[][] => { // NOSONAR
155
170
  const vertices: Array<{ x: number; y: number }> = []
156
171
  const faces: Array<{ indices: number[]; hiddens: boolean[] }> = []
157
172
 
@@ -219,13 +234,21 @@ export const polyfaceOutline = (entity: LocalPolylineEntity): Point[][] => {
219
234
  * the DXF in SVG, Canvas, WebGL etc., without depending on native support
220
235
  * of primitive objects (ellispe, spline etc.)
221
236
  */
222
- export default function entityToPolyline(
237
+ export default function entityToPolyline( // NOSONAR
223
238
  entity: Entity,
224
239
  options?: EntityToPolylineOptions,
225
240
  ): Point[] {
226
241
  options = options || {}
227
242
  let polyline: Point[] | undefined
228
243
 
244
+ const INFINITE_LINE_LENGTH = 1000
245
+
246
+ const normalize2 = (x: number, y: number): { x: number; y: number } | null => {
247
+ const len = Math.hypot(x, y)
248
+ if (len === 0) return null
249
+ return { x: x / len, y: y / len }
250
+ }
251
+
229
252
  if (entity.type === 'LINE') {
230
253
  polyline = [
231
254
  [entity.start.x, entity.start.y],
@@ -233,6 +256,92 @@ export default function entityToPolyline(
233
256
  ]
234
257
  }
235
258
 
259
+ if (entity.type === 'LEADER') {
260
+ if (entity.vertices.length >= 2) {
261
+ polyline = entity.vertices.map((v) => [v.x, v.y])
262
+ } else {
263
+ logger.warn('LEADER entity with insufficient vertices')
264
+ polyline = []
265
+ }
266
+ }
267
+
268
+ if (entity.type === 'RAY') {
269
+ const dir = normalize2(entity.direction.x, entity.direction.y)
270
+ if (dir === null) {
271
+ logger.warn('RAY entity with zero direction vector')
272
+ polyline = []
273
+ } else {
274
+ polyline = [
275
+ [entity.start.x, entity.start.y],
276
+ [
277
+ entity.start.x + dir.x * INFINITE_LINE_LENGTH,
278
+ entity.start.y + dir.y * INFINITE_LINE_LENGTH,
279
+ ],
280
+ ]
281
+ }
282
+ }
283
+
284
+ if (entity.type === 'XLINE') {
285
+ const dir = normalize2(entity.direction.x, entity.direction.y)
286
+ if (dir === null) {
287
+ logger.warn('XLINE entity with zero direction vector')
288
+ polyline = []
289
+ } else {
290
+ polyline = [
291
+ [
292
+ entity.basePoint.x - dir.x * INFINITE_LINE_LENGTH,
293
+ entity.basePoint.y - dir.y * INFINITE_LINE_LENGTH,
294
+ ],
295
+ [
296
+ entity.basePoint.x + dir.x * INFINITE_LINE_LENGTH,
297
+ entity.basePoint.y + dir.y * INFINITE_LINE_LENGTH,
298
+ ],
299
+ ]
300
+ }
301
+ }
302
+
303
+ if (entity.type === 'SHAPE') {
304
+ const x = entity.insertionPoint?.x ?? 0
305
+ const y = entity.insertionPoint?.y ?? 0
306
+ const size = entity.size ?? 0
307
+ const scaleX = entity.relativeXScale ?? 1
308
+ const length = size * scaleX
309
+ polyline = [
310
+ [x, y],
311
+ [x + length, y],
312
+ ]
313
+ }
314
+
315
+ if (entity.type === 'WIPEOUT') {
316
+ const verts = entity.clipBoundaryVertices
317
+ if (!verts || verts.length < 2) {
318
+ logger.warn('WIPEOUT entity with missing clip boundary vertices')
319
+ polyline = []
320
+ } else {
321
+ const insX = entity.insertionPoint?.x ?? 0
322
+ const insY = entity.insertionPoint?.y ?? 0
323
+
324
+ const ux = entity.uVector?.x ?? 1
325
+ const uy = entity.uVector?.y ?? 0
326
+
327
+ const vx = entity.vVector?.x ?? 0
328
+ const vy = entity.vVector?.y ?? 1
329
+
330
+ polyline = verts.map((p) => [
331
+ insX + ux * p.x + vx * p.y,
332
+ insY + uy * p.x + vy * p.y,
333
+ ])
334
+
335
+ if (polyline.length > 0) {
336
+ const first = polyline[0]
337
+ const last = polyline[polyline.length - 1]
338
+ if (first[0] !== last[0] || first[1] !== last[1]) {
339
+ polyline.push(first)
340
+ }
341
+ }
342
+ }
343
+ }
344
+
236
345
  if (entity.type === 'LWPOLYLINE' || entity.type === 'POLYLINE') {
237
346
  polyline = []
238
347
  if (entity.polyfaceMesh) {
@@ -330,6 +439,19 @@ export default function entityToPolyline(
330
439
  )
331
440
  }
332
441
 
442
+ if (entity.type === 'SOLID' || entity.type === 'TRACE') {
443
+ const corners = entity.corners ?? entity.points
444
+ if (corners && corners.length >= 4) {
445
+ polyline = [
446
+ [corners[0].x, corners[0].y],
447
+ [corners[1].x, corners[1].y],
448
+ [corners[2].x, corners[2].y],
449
+ [corners[3].x, corners[3].y],
450
+ [corners[0].x, corners[0].y],
451
+ ]
452
+ }
453
+ }
454
+
333
455
  if (!polyline) {
334
456
  logger.warn('unsupported entity for converting to polyline:', entity.type)
335
457
  return []
@@ -10,7 +10,6 @@ import circle from './entity/circle'
10
10
  import dgnUnderlay from './entity/dgnUnderlay'
11
11
  import dimension from './entity/dimension'
12
12
  import dwfUnderlay from './entity/dwfUnderlay'
13
- import pdfUnderlay from './entity/pdfUnderlay'
14
13
  import ellipse from './entity/ellipse'
15
14
  import hatch from './entity/hatch'
16
15
  import image from './entity/image'
@@ -18,17 +17,28 @@ import insert from './entity/insert'
18
17
  import leader from './entity/leader'
19
18
  import line from './entity/line'
20
19
  import lwpolyline from './entity/lwpolyline'
20
+ import mleader from './entity/mleader'
21
+ import mline from './entity/mline'
21
22
  import mtext from './entity/mtext'
22
23
  import ole2Frame from './entity/ole2Frame'
24
+ import oleFrame from './entity/oleframe'
25
+ import pdfUnderlay from './entity/pdfUnderlay'
23
26
  import point from './entity/point'
24
27
  import polyline from './entity/polyline'
28
+ import ray from './entity/ray'
29
+ import region from './entity/region'
30
+ import shape from './entity/shape'
25
31
  import solid from './entity/solid'
26
32
  import spline from './entity/spline'
33
+ import table from './entity/table'
27
34
  import text from './entity/text'
28
35
  import threeDFace from './entity/threeDFace'
29
36
  import tolerance from './entity/tolerance'
37
+ import trace from './entity/trace'
30
38
  import vertex from './entity/vertex'
31
39
  import viewport from './entity/viewport'
40
+ import wipeout from './entity/wipeout'
41
+ import xline from './entity/xline'
32
42
 
33
43
  interface EntityHandler {
34
44
  TYPE: string
@@ -39,19 +49,26 @@ const handlers: Record<string, EntityHandler> = [
39
49
  point,
40
50
  line,
41
51
  lwpolyline,
52
+ mline,
53
+ mleader,
42
54
  polyline,
43
55
  vertex,
44
56
  circle,
45
57
  arc,
46
58
  ellipse,
47
59
  spline,
60
+ table,
48
61
  solid,
62
+ trace,
49
63
  hatch,
50
64
  image,
51
65
  leader,
66
+ ray,
67
+ region,
52
68
  dwfUnderlay,
53
69
  dgnUnderlay,
54
70
  pdfUnderlay,
71
+ shape,
55
72
  mtext,
56
73
  tolerance,
57
74
  attdef,
@@ -62,6 +79,9 @@ const handlers: Record<string, EntityHandler> = [
62
79
  threeDFace,
63
80
  viewport,
64
81
  ole2Frame,
82
+ oleFrame,
83
+ xline,
84
+ wipeout,
65
85
  ].reduce((acc, mod) => {
66
86
  acc[mod.TYPE] = mod
67
87
  return acc
@@ -0,0 +1,46 @@
1
+ import type { DXFTuple } from '../../types'
2
+
3
+ import common from './common'
4
+
5
+ export const TYPE = 'MLEADER'
6
+
7
+ interface MLeaderEntity {
8
+ type: typeof TYPE
9
+
10
+ styleName?: string
11
+ text?: string
12
+
13
+ [key: string]: unknown
14
+ }
15
+
16
+ export const process = (tuples: DXFTuple[]): MLeaderEntity => {
17
+ return tuples.reduce(
18
+ (entity, tuple) => {
19
+ const code = tuple[0]
20
+ const value = tuple[1]
21
+
22
+ switch (code) {
23
+ // Style name
24
+ case 2:
25
+ entity.styleName = String(value)
26
+ break
27
+
28
+ // Text string (simplified). MLEADER text can also be stored in more complex structures.
29
+ case 1:
30
+ entity.text = String(value)
31
+ break
32
+
33
+ default:
34
+ Object.assign(entity, common(code, value))
35
+ break
36
+ }
37
+
38
+ return entity
39
+ },
40
+ {
41
+ type: TYPE,
42
+ } as MLeaderEntity,
43
+ )
44
+ }
45
+
46
+ export default { TYPE, process }
@@ -0,0 +1,74 @@
1
+ import type { DXFTuple, PartialPoint3D } from '../../types'
2
+
3
+ import common from './common'
4
+
5
+ export const TYPE = 'MLINE'
6
+
7
+ interface MLineEntity {
8
+ type: typeof TYPE
9
+
10
+ startPoint?: PartialPoint3D
11
+ endPoint?: PartialPoint3D
12
+
13
+ vertexCount?: number
14
+ styleName?: string
15
+
16
+ [key: string]: unknown
17
+ }
18
+
19
+ function ensurePoint3(entity: MLineEntity, key: 'startPoint' | 'endPoint'): PartialPoint3D {
20
+ entity[key] ??= {}
21
+ return entity[key]
22
+ }
23
+
24
+ export const process = (tuples: DXFTuple[]): MLineEntity => {
25
+ return tuples.reduce(
26
+ (entity, tuple) => {
27
+ const code = tuple[0]
28
+ const value = tuple[1]
29
+
30
+ switch (code) {
31
+ // Start point
32
+ case 10:
33
+ ensurePoint3(entity, 'startPoint').x = value as number
34
+ break
35
+ case 20:
36
+ ensurePoint3(entity, 'startPoint').y = value as number
37
+ break
38
+ case 30:
39
+ ensurePoint3(entity, 'startPoint').z = value as number
40
+ break
41
+
42
+ // End point
43
+ case 11:
44
+ ensurePoint3(entity, 'endPoint').x = value as number
45
+ break
46
+ case 21:
47
+ ensurePoint3(entity, 'endPoint').y = value as number
48
+ break
49
+ case 31:
50
+ ensurePoint3(entity, 'endPoint').z = value as number
51
+ break
52
+
53
+ case 71:
54
+ entity.vertexCount = value as number
55
+ break
56
+
57
+ case 2:
58
+ entity.styleName = String(value)
59
+ break
60
+
61
+ default:
62
+ Object.assign(entity, common(code, value))
63
+ break
64
+ }
65
+
66
+ return entity
67
+ },
68
+ {
69
+ type: TYPE,
70
+ } as MLineEntity,
71
+ )
72
+ }
73
+
74
+ export default { TYPE, process }
@@ -0,0 +1,62 @@
1
+ import type { DXFTuple, OleFrameEntity } from '../../types'
2
+
3
+ import common from './common'
4
+
5
+ export const TYPE = 'OLEFRAME'
6
+
7
+ export const process = (tuples: DXFTuple[]): OleFrameEntity => {
8
+ return tuples.reduce(
9
+ (entity, tuple) => {
10
+ const type = tuple[0]
11
+ const value = tuple[1]
12
+ switch (type) {
13
+ case 70:
14
+ entity.version = value
15
+ break
16
+ case 3:
17
+ entity.name = value
18
+ break
19
+ case 10:
20
+ entity.upperLeftX = value
21
+ break
22
+ case 20:
23
+ entity.upperLeftY = value
24
+ break
25
+ case 30:
26
+ entity.upperLeftZ = value
27
+ break
28
+ case 11:
29
+ entity.lowerRightX = value
30
+ break
31
+ case 21:
32
+ entity.lowerRightY = value
33
+ break
34
+ case 31:
35
+ entity.lowerRightZ = value
36
+ break
37
+ case 71:
38
+ entity.objectType = value
39
+ break
40
+ case 72:
41
+ entity.tile = value
42
+ break
43
+ case 90:
44
+ entity.length = value
45
+ break
46
+ case 310:
47
+ entity.data += String(value)
48
+ break
49
+ default:
50
+ Object.assign(entity, common(type, value))
51
+ break
52
+ }
53
+ return entity
54
+ },
55
+ {
56
+ type: TYPE,
57
+ data: '',
58
+ } as OleFrameEntity,
59
+ )
60
+ }
61
+
62
+ export default { TYPE, process }
@@ -0,0 +1,52 @@
1
+ import type { DXFTuple, PartialPoint3D } from '../../types'
2
+
3
+ import common from './common'
4
+
5
+ export const TYPE = 'RAY'
6
+
7
+ interface RayEntity {
8
+ type: typeof TYPE
9
+ start: PartialPoint3D
10
+ direction: PartialPoint3D
11
+ [key: string]: unknown
12
+ }
13
+
14
+ export const process = (tuples: DXFTuple[]): RayEntity => {
15
+ return tuples.reduce(
16
+ (entity, tuple) => {
17
+ const type = tuple[0]
18
+ const value = tuple[1]
19
+ switch (type) {
20
+ case 10:
21
+ entity.start.x = value as number
22
+ break
23
+ case 20:
24
+ entity.start.y = value as number
25
+ break
26
+ case 30:
27
+ entity.start.z = value as number
28
+ break
29
+ case 11:
30
+ entity.direction.x = value as number
31
+ break
32
+ case 21:
33
+ entity.direction.y = value as number
34
+ break
35
+ case 31:
36
+ entity.direction.z = value as number
37
+ break
38
+ default:
39
+ Object.assign(entity, common(type, value))
40
+ break
41
+ }
42
+ return entity
43
+ },
44
+ {
45
+ type: TYPE,
46
+ start: {},
47
+ direction: {},
48
+ } as RayEntity,
49
+ )
50
+ }
51
+
52
+ export default { TYPE, process }
@@ -0,0 +1,42 @@
1
+ import type { DXFTuple } from '../../types'
2
+
3
+ import common from './common'
4
+
5
+ export const TYPE = 'REGION'
6
+
7
+ interface RegionEntity {
8
+ type: typeof TYPE
9
+
10
+ acisData?: string[]
11
+
12
+ [key: string]: unknown
13
+ }
14
+
15
+ export const process = (tuples: DXFTuple[]): RegionEntity => {
16
+ return tuples.reduce(
17
+ (entity, tuple) => {
18
+ const code = tuple[0]
19
+ const value = tuple[1]
20
+
21
+ switch (code) {
22
+ // ACIS data text (first line: 1, additional lines: 3)
23
+ case 1:
24
+ case 3:
25
+ entity.acisData ??= []
26
+ entity.acisData.push(String(value))
27
+ break
28
+
29
+ default:
30
+ Object.assign(entity, common(code, value))
31
+ break
32
+ }
33
+
34
+ return entity
35
+ },
36
+ {
37
+ type: TYPE,
38
+ } as RegionEntity,
39
+ )
40
+ }
41
+
42
+ export default { TYPE, process }
@@ -0,0 +1,73 @@
1
+ import type { DXFTuple, PartialPoint3D } from '../../types'
2
+
3
+ import common from './common'
4
+
5
+ export const TYPE = 'SHAPE'
6
+
7
+ interface ShapeEntity {
8
+ type: typeof TYPE
9
+ insertionPoint: PartialPoint3D
10
+ name?: string
11
+ size?: number
12
+ rotation?: number
13
+ relativeXScale?: number
14
+ oblique?: number
15
+ thickness?: number
16
+ extrusionX?: number
17
+ extrusionY?: number
18
+ [key: string]: unknown
19
+ }
20
+
21
+ export const process = (tuples: DXFTuple[]): ShapeEntity => {
22
+ return tuples.reduce(
23
+ (entity, tuple) => {
24
+ const type = tuple[0]
25
+ const value = tuple[1]
26
+ switch (type) {
27
+ case 10:
28
+ entity.insertionPoint.x = value as number
29
+ break
30
+ case 20:
31
+ entity.insertionPoint.y = value as number
32
+ break
33
+ case 30:
34
+ entity.insertionPoint.z = value as number
35
+ break
36
+ case 2:
37
+ entity.name = String(value)
38
+ break
39
+ case 39:
40
+ entity.thickness = value as number
41
+ break
42
+ case 40:
43
+ entity.size = value as number
44
+ break
45
+ case 41:
46
+ entity.relativeXScale = value as number
47
+ break
48
+ case 50:
49
+ entity.rotation = value as number
50
+ break
51
+ case 51:
52
+ entity.oblique = value as number
53
+ break
54
+ case 210:
55
+ entity.extrusionX = value as number
56
+ break
57
+ case 220:
58
+ entity.extrusionY = value as number
59
+ break
60
+ default:
61
+ Object.assign(entity, common(type, value))
62
+ break
63
+ }
64
+ return entity
65
+ },
66
+ {
67
+ type: TYPE,
68
+ insertionPoint: {},
69
+ } as ShapeEntity,
70
+ )
71
+ }
72
+
73
+ export default { TYPE, process }
@@ -0,0 +1,49 @@
1
+ import type { DXFTuple } from '../../types'
2
+
3
+ import common from './common'
4
+
5
+ export const TYPE = 'TABLE'
6
+
7
+ interface TableEntity {
8
+ type: typeof TYPE
9
+
10
+ rows?: number
11
+ columns?: number
12
+ cellText?: string[]
13
+
14
+ [key: string]: unknown
15
+ }
16
+
17
+ export const process = (tuples: DXFTuple[]): TableEntity => {
18
+ return tuples.reduce(
19
+ (entity, tuple) => {
20
+ const code = tuple[0]
21
+ const value = tuple[1]
22
+
23
+ switch (code) {
24
+ case 90:
25
+ entity.rows = value as number
26
+ break
27
+ case 91:
28
+ entity.columns = value as number
29
+ break
30
+
31
+ case 1:
32
+ entity.cellText ??= []
33
+ entity.cellText.push(String(value))
34
+ break
35
+
36
+ default:
37
+ Object.assign(entity, common(code, value))
38
+ break
39
+ }
40
+
41
+ return entity
42
+ },
43
+ {
44
+ type: TYPE,
45
+ } as TableEntity,
46
+ )
47
+ }
48
+
49
+ export default { TYPE, process }