@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.
- package/.eslintrc.json +1 -16
- package/.yarn/install-state.gz +0 -0
- package/ARCHITECTURE.md +163 -0
- package/CHANGELOG.md +16 -0
- package/README.md +72 -10
- package/{PLAN.md → ROADMAP.md} +227 -35
- package/dist/dxf.js +1090 -344
- package/docs/FIXTURE_VALIDATION_EZDXF.md +1 -1
- package/lib/Helper.cjs +4 -0
- package/lib/Helper.cjs.map +3 -3
- package/lib/Helper.js +4 -0
- package/lib/Helper.js.map +2 -2
- package/lib/entityToPolyline.cjs +95 -0
- package/lib/entityToPolyline.cjs.map +3 -3
- package/lib/entityToPolyline.js +95 -0
- package/lib/entityToPolyline.js.map +2 -2
- package/lib/handlers/entities.cjs +22 -2
- package/lib/handlers/entities.cjs.map +3 -3
- package/lib/handlers/entities.js +22 -2
- package/lib/handlers/entities.js.map +2 -2
- package/lib/handlers/entity/mleader.cjs +69 -0
- package/lib/handlers/entity/mleader.cjs.map +7 -0
- package/lib/handlers/entity/mleader.js +34 -0
- package/lib/handlers/entity/mleader.js.map +7 -0
- package/lib/handlers/entity/mline.cjs +91 -0
- package/lib/handlers/entity/mline.cjs.map +7 -0
- package/lib/handlers/entity/mline.js +56 -0
- package/lib/handlers/entity/mline.js.map +7 -0
- package/lib/handlers/entity/oleframe.cjs +98 -0
- package/lib/handlers/entity/oleframe.cjs.map +7 -0
- package/lib/handlers/entity/oleframe.js +63 -0
- package/lib/handlers/entity/oleframe.js.map +7 -0
- package/lib/handlers/entity/ray.cjs +81 -0
- package/lib/handlers/entity/ray.cjs.map +7 -0
- package/lib/handlers/entity/ray.js +46 -0
- package/lib/handlers/entity/ray.js.map +7 -0
- package/lib/handlers/entity/region.cjs +67 -0
- package/lib/handlers/entity/region.cjs.map +7 -0
- package/lib/handlers/entity/region.js +32 -0
- package/lib/handlers/entity/region.js.map +7 -0
- package/lib/handlers/entity/shape.cjs +95 -0
- package/lib/handlers/entity/shape.cjs.map +7 -0
- package/lib/handlers/entity/shape.js +60 -0
- package/lib/handlers/entity/shape.js.map +7 -0
- package/lib/handlers/entity/table.cjs +71 -0
- package/lib/handlers/entity/table.cjs.map +7 -0
- package/lib/handlers/entity/table.js +36 -0
- package/lib/handlers/entity/table.js.map +7 -0
- package/lib/handlers/entity/trace.cjs +101 -0
- package/lib/handlers/entity/trace.cjs.map +7 -0
- package/lib/handlers/entity/trace.js +66 -0
- package/lib/handlers/entity/trace.js.map +7 -0
- package/lib/handlers/entity/wipeout.cjs +122 -0
- package/lib/handlers/entity/wipeout.cjs.map +7 -0
- package/lib/handlers/entity/wipeout.js +87 -0
- package/lib/handlers/entity/wipeout.js.map +7 -0
- package/lib/handlers/entity/xline.cjs +81 -0
- package/lib/handlers/entity/xline.cjs.map +7 -0
- package/lib/handlers/entity/xline.js +46 -0
- package/lib/handlers/entity/xline.js.map +7 -0
- package/lib/handlers/objects.cjs +43 -1
- package/lib/handlers/objects.cjs.map +2 -2
- package/lib/handlers/objects.js +43 -1
- package/lib/handlers/objects.js.map +2 -2
- package/lib/handlers/tables.cjs +96 -17
- package/lib/handlers/tables.cjs.map +2 -2
- package/lib/handlers/tables.js +96 -17
- package/lib/handlers/tables.js.map +2 -2
- package/lib/index.cjs +5 -2
- package/lib/index.cjs.map +3 -3
- package/lib/index.js +18 -16
- package/lib/index.js.map +3 -3
- package/lib/toJson.cjs +29 -0
- package/lib/toJson.cjs.map +7 -0
- package/lib/toJson.js +9 -0
- package/lib/toJson.js.map +7 -0
- package/lib/toSVG.cjs +34 -3
- package/lib/toSVG.cjs.map +2 -2
- package/lib/toSVG.js +34 -3
- package/lib/toSVG.js.map +2 -2
- package/lib/types/entity.cjs.map +1 -1
- package/lib/types/helper.cjs.map +1 -1
- package/lib/types/index.cjs +20 -0
- package/lib/types/index.cjs.map +2 -2
- package/lib/types/index.js +10 -0
- package/lib/types/index.js.map +2 -2
- package/lib/types/mleader-entity.cjs +17 -0
- package/lib/types/mleader-entity.cjs.map +7 -0
- package/lib/types/mleader-entity.js +1 -0
- package/lib/types/mleader-entity.js.map +7 -0
- package/lib/types/mline-entity.cjs +17 -0
- package/lib/types/mline-entity.cjs.map +7 -0
- package/lib/types/mline-entity.js +1 -0
- package/lib/types/mline-entity.js.map +7 -0
- package/lib/types/oleframe-entity.cjs +17 -0
- package/lib/types/oleframe-entity.cjs.map +7 -0
- package/lib/types/oleframe-entity.js +1 -0
- package/lib/types/oleframe-entity.js.map +7 -0
- package/lib/types/options.cjs.map +1 -1
- package/lib/types/ray-entity.cjs +17 -0
- package/lib/types/ray-entity.cjs.map +7 -0
- package/lib/types/ray-entity.js +1 -0
- package/lib/types/ray-entity.js.map +7 -0
- package/lib/types/region-entity.cjs +17 -0
- package/lib/types/region-entity.cjs.map +7 -0
- package/lib/types/region-entity.js +1 -0
- package/lib/types/region-entity.js.map +7 -0
- package/lib/types/shape-entity.cjs +17 -0
- package/lib/types/shape-entity.cjs.map +7 -0
- package/lib/types/shape-entity.js +1 -0
- package/lib/types/shape-entity.js.map +7 -0
- package/lib/types/table-entity.cjs +17 -0
- package/lib/types/table-entity.cjs.map +7 -0
- package/lib/types/table-entity.js +1 -0
- package/lib/types/table-entity.js.map +7 -0
- package/lib/types/tables.cjs.map +1 -1
- package/lib/types/trace-entity.cjs +17 -0
- package/lib/types/trace-entity.cjs.map +7 -0
- package/lib/types/trace-entity.js +1 -0
- package/lib/types/trace-entity.js.map +7 -0
- package/lib/types/wipeout-entity.cjs +17 -0
- package/lib/types/wipeout-entity.cjs.map +7 -0
- package/lib/types/wipeout-entity.js +1 -0
- package/lib/types/wipeout-entity.js.map +7 -0
- package/lib/types/xline-entity.cjs +17 -0
- package/lib/types/xline-entity.cjs.map +7 -0
- package/lib/types/xline-entity.js +1 -0
- package/lib/types/xline-entity.js.map +7 -0
- package/package.json +5 -19
- package/src/Helper.ts +6 -1
- package/src/entityToPolyline.ts +124 -2
- package/src/handlers/entities.ts +21 -1
- package/src/handlers/entity/mleader.ts +46 -0
- package/src/handlers/entity/mline.ts +74 -0
- package/src/handlers/entity/oleframe.ts +62 -0
- package/src/handlers/entity/ray.ts +52 -0
- package/src/handlers/entity/region.ts +42 -0
- package/src/handlers/entity/shape.ts +73 -0
- package/src/handlers/entity/table.ts +49 -0
- package/src/handlers/entity/trace.ts +72 -0
- package/src/handlers/entity/wipeout.ts +114 -0
- package/src/handlers/entity/xline.ts +52 -0
- package/src/handlers/objects.ts +64 -8
- package/src/handlers/tables.ts +134 -21
- package/src/index.ts +9 -18
- package/src/toJson.ts +8 -0
- package/src/toSVG.ts +45 -3
- package/src/types/entity.ts +20 -0
- package/src/types/helper.ts +2 -1
- package/src/types/index.ts +10 -0
- package/src/types/mleader-entity.ts +8 -0
- package/src/types/mline-entity.ts +12 -0
- package/src/types/oleframe-entity.ts +40 -0
- package/src/types/options.ts +7 -0
- package/src/types/ray-entity.ts +12 -0
- package/src/types/region-entity.ts +11 -0
- package/src/types/shape-entity.ts +19 -0
- package/src/types/table-entity.ts +14 -0
- package/src/types/tables.ts +76 -0
- package/src/types/trace-entity.ts +14 -0
- package/src/types/wipeout-entity.ts +20 -0
- package/src/types/xline-entity.ts +12 -0
- package/docs/DIMENSION_SUMMARY.md +0 -254
- package/docs/DXF_VERSION_SUPPORT.md +0 -45
- package/docs/ENTITY_SVG_ROADMAP.md +0 -96
- package/docs/IMPLEMENTED-2D-ENTITIES.md +0 -54
- package/docs/README.md +0 -22
- package/docs/SVG_RENDERING_INTEGRATION_TESTS.md +0 -119
- package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.md +0 -241
package/src/entityToPolyline.ts
CHANGED
|
@@ -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 []
|
package/src/handlers/entities.ts
CHANGED
|
@@ -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 }
|