@linkiez/dxf-renew 7.0.0 → 7.1.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/.github/instructions/code-patterns.instructions.md +1 -1
- package/.github/instructions/exdxf.instruction.md +161 -0
- package/.github/instructions/tdd.instructions.md +271 -0
- package/.yarn/install-state.gz +0 -0
- package/CHANGELOG.md +23 -0
- package/CONTRIBUTING.md +16 -14
- package/PLAN.md +34 -84
- package/README.md +43 -8
- package/dist/dxf.js +1388 -376
- package/docs/DIMENSION_SUMMARY.md +11 -5
- package/docs/DXF_VERSION_SUPPORT.md +45 -0
- package/docs/ENTITY_SVG_ROADMAP.md +96 -0
- package/docs/EZDXF_REFERENCE_SITEMAP.md +55 -0
- package/docs/FIXTURE_VALIDATION_EZDXF.md +62 -0
- package/docs/README.md +22 -0
- package/docs/SVG_RENDERING_INTEGRATION_TESTS.md +119 -0
- package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.md +1 -1
- package/lib/Helper.cjs +2 -2
- package/lib/Helper.cjs.map +2 -2
- package/lib/Helper.js +2 -2
- package/lib/Helper.js.map +2 -2
- package/lib/denormalise.cjs +131 -91
- package/lib/denormalise.cjs.map +2 -2
- package/lib/denormalise.js +131 -91
- package/lib/denormalise.js.map +2 -2
- package/lib/dimensionToSVG.cjs +318 -53
- package/lib/dimensionToSVG.cjs.map +3 -3
- package/lib/dimensionToSVG.js +316 -52
- package/lib/dimensionToSVG.js.map +2 -2
- package/lib/handlers/entities.cjs +90 -26
- package/lib/handlers/entities.cjs.map +3 -3
- package/lib/handlers/entities.js +90 -26
- package/lib/handlers/entities.js.map +3 -3
- package/lib/handlers/entity/dgnUnderlay.cjs +106 -0
- package/lib/handlers/entity/dgnUnderlay.cjs.map +7 -0
- package/lib/handlers/entity/dgnUnderlay.js +71 -0
- package/lib/handlers/entity/dgnUnderlay.js.map +7 -0
- package/lib/handlers/entity/dimension.cjs +24 -0
- package/lib/handlers/entity/dimension.cjs.map +2 -2
- package/lib/handlers/entity/dimension.js +24 -0
- package/lib/handlers/entity/dimension.js.map +2 -2
- package/lib/handlers/entity/dwfUnderlay.cjs +106 -0
- package/lib/handlers/entity/dwfUnderlay.cjs.map +7 -0
- package/lib/handlers/entity/dwfUnderlay.js +71 -0
- package/lib/handlers/entity/dwfUnderlay.js.map +7 -0
- package/lib/handlers/entity/image.cjs +123 -0
- package/lib/handlers/entity/image.cjs.map +7 -0
- package/lib/handlers/entity/image.js +88 -0
- package/lib/handlers/entity/image.js.map +7 -0
- package/lib/handlers/entity/leader.cjs +148 -0
- package/lib/handlers/entity/leader.cjs.map +7 -0
- package/lib/handlers/entity/leader.js +113 -0
- package/lib/handlers/entity/leader.js.map +7 -0
- package/lib/handlers/entity/pdfUnderlay.cjs +106 -0
- package/lib/handlers/entity/pdfUnderlay.cjs.map +7 -0
- package/lib/handlers/entity/pdfUnderlay.js +71 -0
- package/lib/handlers/entity/pdfUnderlay.js.map +7 -0
- package/lib/handlers/entity/tolerance.cjs +90 -0
- package/lib/handlers/entity/tolerance.cjs.map +7 -0
- package/lib/handlers/entity/tolerance.js +55 -0
- package/lib/handlers/entity/tolerance.js.map +7 -0
- package/lib/handlers/objects.cjs +257 -136
- package/lib/handlers/objects.cjs.map +2 -2
- package/lib/handlers/objects.js +257 -136
- package/lib/handlers/objects.js.map +2 -2
- package/lib/toSVG.cjs +71 -8
- package/lib/toSVG.cjs.map +3 -3
- package/lib/toSVG.js +72 -9
- package/lib/toSVG.js.map +2 -2
- package/lib/types/dimension-entity.cjs.map +1 -1
- package/lib/types/entity.cjs.map +1 -1
- package/lib/types/image-entity.cjs +17 -0
- package/lib/types/image-entity.cjs.map +7 -0
- package/lib/types/image-entity.js +1 -0
- package/lib/types/image-entity.js.map +7 -0
- package/lib/types/index.cjs +8 -0
- package/lib/types/index.cjs.map +2 -2
- package/lib/types/index.js +4 -0
- package/lib/types/index.js.map +2 -2
- package/lib/types/leader-entity.cjs +17 -0
- package/lib/types/leader-entity.cjs.map +7 -0
- package/lib/types/leader-entity.js +1 -0
- package/lib/types/leader-entity.js.map +7 -0
- package/lib/types/options.cjs.map +1 -1
- package/lib/types/tables.cjs.map +1 -1
- package/lib/types/tolerance-entity.cjs +17 -0
- package/lib/types/tolerance-entity.cjs.map +7 -0
- package/lib/types/tolerance-entity.js +1 -0
- package/lib/types/tolerance-entity.js.map +7 -0
- package/lib/types/underlay-entity.cjs +17 -0
- package/lib/types/underlay-entity.cjs.map +7 -0
- package/lib/types/underlay-entity.js +1 -0
- package/lib/types/underlay-entity.js.map +7 -0
- package/lib/util/escapeXmlText.cjs +27 -0
- package/lib/util/escapeXmlText.cjs.map +7 -0
- package/lib/util/escapeXmlText.js +7 -0
- package/lib/util/escapeXmlText.js.map +7 -0
- package/package.json +6 -1
- package/playwright.config.cjs +20 -0
- package/src/Helper.ts +3 -3
- package/src/denormalise.ts +182 -116
- package/src/dimensionToSVG.ts +466 -54
- package/src/handlers/entities.ts +109 -34
- package/src/handlers/entity/dgnUnderlay.ts +94 -0
- package/src/handlers/entity/dimension.ts +27 -1
- package/src/handlers/entity/dwfUnderlay.ts +94 -0
- package/src/handlers/entity/image.ts +118 -0
- package/src/handlers/entity/leader.ts +153 -0
- package/src/handlers/entity/pdfUnderlay.ts +94 -0
- package/src/handlers/entity/tolerance.ts +75 -0
- package/src/handlers/objects.ts +323 -139
- package/src/toSVG.ts +98 -7
- package/src/types/dimension-entity.ts +11 -0
- package/src/types/entity.ts +10 -0
- package/src/types/image-entity.ts +35 -0
- package/src/types/index.ts +4 -0
- package/src/types/leader-entity.ts +40 -0
- package/src/types/options.ts +41 -0
- package/src/types/tables.ts +84 -0
- package/src/types/tolerance-entity.ts +20 -0
- package/src/types/underlay-entity.ts +35 -0
- package/src/util/escapeXmlText.ts +10 -0
- package/tools/browser_test_server.cjs +87 -0
- package/tools/ezdxf_generate_dimensions_all_types.py +246 -0
- package/tools/ezdxf_generate_dimensions_angular_3p.py +59 -0
- package/tools/ezdxf_generate_dimensions_large_scale.py +87 -0
- package/tools/ezdxf_regenerate_problem_fixtures.py +184 -0
- package/tools/ezdxf_validate_fixtures.py +165 -0
- package/docs/DIMENSION_SUMMARY.pt-BR.md +0 -248
- package/docs/IMPLEMENTED-2D-ENTITIES.pt-BR.md +0 -54
- package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.pt-BR.md +0 -169
package/src/handlers/entities.ts
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import type { DXFTuple } from '../types/dxf'
|
|
2
2
|
import type { Entity } from '../types/entity'
|
|
3
|
-
import type { PolylineEntity } from '../types/polyline-entity'
|
|
3
|
+
import type { PolylineEntity, Vertex } from '../types/polyline-entity'
|
|
4
4
|
|
|
5
5
|
import logger from '../util/logger'
|
|
6
6
|
import arc from './entity/arc'
|
|
7
7
|
import attdef from './entity/attdef'
|
|
8
8
|
import attrib from './entity/attrib'
|
|
9
9
|
import circle from './entity/circle'
|
|
10
|
+
import dgnUnderlay from './entity/dgnUnderlay'
|
|
10
11
|
import dimension from './entity/dimension'
|
|
12
|
+
import dwfUnderlay from './entity/dwfUnderlay'
|
|
13
|
+
import pdfUnderlay from './entity/pdfUnderlay'
|
|
11
14
|
import ellipse from './entity/ellipse'
|
|
12
15
|
import hatch from './entity/hatch'
|
|
16
|
+
import image from './entity/image'
|
|
13
17
|
import insert from './entity/insert'
|
|
18
|
+
import leader from './entity/leader'
|
|
14
19
|
import line from './entity/line'
|
|
15
20
|
import lwpolyline from './entity/lwpolyline'
|
|
16
21
|
import mtext from './entity/mtext'
|
|
@@ -21,6 +26,7 @@ import solid from './entity/solid'
|
|
|
21
26
|
import spline from './entity/spline'
|
|
22
27
|
import text from './entity/text'
|
|
23
28
|
import threeDFace from './entity/threeDFace'
|
|
29
|
+
import tolerance from './entity/tolerance'
|
|
24
30
|
import vertex from './entity/vertex'
|
|
25
31
|
import viewport from './entity/viewport'
|
|
26
32
|
|
|
@@ -41,7 +47,13 @@ const handlers: Record<string, EntityHandler> = [
|
|
|
41
47
|
spline,
|
|
42
48
|
solid,
|
|
43
49
|
hatch,
|
|
50
|
+
image,
|
|
51
|
+
leader,
|
|
52
|
+
dwfUnderlay,
|
|
53
|
+
dgnUnderlay,
|
|
54
|
+
pdfUnderlay,
|
|
44
55
|
mtext,
|
|
56
|
+
tolerance,
|
|
45
57
|
attdef,
|
|
46
58
|
attrib,
|
|
47
59
|
text,
|
|
@@ -61,8 +73,102 @@ const handlers: Record<string, EntityHandler> = [
|
|
|
61
73
|
* @param tuples - Array of DXF tuples representing entities
|
|
62
74
|
* @returns Array of parsed entities
|
|
63
75
|
*/
|
|
76
|
+
class EntityGroupProcessor {
|
|
77
|
+
private readonly entities: Entity[] = []
|
|
78
|
+
private currentPolyline: PolylineEntity | undefined
|
|
79
|
+
|
|
80
|
+
getEntities(): Entity[] {
|
|
81
|
+
return this.entities
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
finalize(): void {
|
|
85
|
+
this.flushOpenPolyline('DXF ended with an open POLYLINE (missing SEQEND); flushing open polyline')
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
processGroup(tuples: DXFTuple[]): void {
|
|
89
|
+
const entityType = String(tuples[0][1])
|
|
90
|
+
const contentTuples = tuples.slice(1)
|
|
91
|
+
|
|
92
|
+
switch (entityType) {
|
|
93
|
+
case 'SEQEND':
|
|
94
|
+
this.endSequence()
|
|
95
|
+
break
|
|
96
|
+
case 'POLYLINE':
|
|
97
|
+
this.startPolyline(contentTuples)
|
|
98
|
+
break
|
|
99
|
+
case 'VERTEX':
|
|
100
|
+
this.addVertex(contentTuples)
|
|
101
|
+
break
|
|
102
|
+
default:
|
|
103
|
+
this.addEntity(entityType, contentTuples)
|
|
104
|
+
break
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private parseEntity(entityType: string, contentTuples: DXFTuple[]): Entity | undefined {
|
|
109
|
+
const handler = handlers[entityType]
|
|
110
|
+
if (!handler) {
|
|
111
|
+
logger.warn('unsupported type in ENTITIES section:', entityType)
|
|
112
|
+
return undefined
|
|
113
|
+
}
|
|
114
|
+
return handler.process(contentTuples)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private flushOpenPolyline(reason: string): void {
|
|
118
|
+
if (!this.currentPolyline) return
|
|
119
|
+
logger.warn(reason)
|
|
120
|
+
this.currentPolyline = undefined
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
private endSequence(): void {
|
|
124
|
+
// SEQEND may also terminate other sequences (e.g. INSERT attributes).
|
|
125
|
+
// Only treat it as significant when we're inside a POLYLINE sequence.
|
|
126
|
+
this.currentPolyline = undefined
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private startPolyline(contentTuples: DXFTuple[]): void {
|
|
130
|
+
this.flushOpenPolyline(
|
|
131
|
+
'POLYLINE started while previous POLYLINE is still open; flushing previous polyline',
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
const e = this.parseEntity('POLYLINE', contentTuples)
|
|
135
|
+
if (!e) return
|
|
136
|
+
|
|
137
|
+
this.currentPolyline = e as PolylineEntity
|
|
138
|
+
this.entities.push(e)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private addVertex(contentTuples: DXFTuple[]): void {
|
|
142
|
+
const e = this.parseEntity('VERTEX', contentTuples)
|
|
143
|
+
if (!e) return
|
|
144
|
+
|
|
145
|
+
if (!this.currentPolyline) {
|
|
146
|
+
logger.error('ignoring invalid VERTEX entity')
|
|
147
|
+
return
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
this.currentPolyline.vertices.push(e as Vertex)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private addEntity(entityType: string, contentTuples: DXFTuple[]): void {
|
|
154
|
+
this.flushOpenPolyline('POLYLINE sequence ended without SEQEND; flushing open polyline')
|
|
155
|
+
|
|
156
|
+
const e = this.parseEntity(entityType, contentTuples)
|
|
157
|
+
if (!e) return
|
|
158
|
+
this.entities.push(e)
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function processEntityGroups(entityGroups: DXFTuple[][]): Entity[] {
|
|
163
|
+
const processor = new EntityGroupProcessor()
|
|
164
|
+
for (const tuples of entityGroups) {
|
|
165
|
+
processor.processGroup(tuples)
|
|
166
|
+
}
|
|
167
|
+
processor.finalize()
|
|
168
|
+
return processor.getEntities()
|
|
169
|
+
}
|
|
170
|
+
|
|
64
171
|
export default function parseEntities(tuples: DXFTuple[]): Entity[] {
|
|
65
|
-
const entities: Entity[] = []
|
|
66
172
|
const entityGroups: DXFTuple[][] = []
|
|
67
173
|
let currentEntityTuples: DXFTuple[] = []
|
|
68
174
|
|
|
@@ -76,36 +182,5 @@ export default function parseEntities(tuples: DXFTuple[]): Entity[] {
|
|
|
76
182
|
currentEntityTuples.push(tuple)
|
|
77
183
|
}
|
|
78
184
|
|
|
79
|
-
|
|
80
|
-
for (const tuples of entityGroups) {
|
|
81
|
-
const entityType = tuples[0][1]
|
|
82
|
-
const contentTuples = tuples.slice(1)
|
|
83
|
-
|
|
84
|
-
if (entityType in handlers) {
|
|
85
|
-
const e = handlers[entityType].process(contentTuples)
|
|
86
|
-
// "POLYLINE" cannot be parsed in isolation, it is followed by
|
|
87
|
-
// N "VERTEX" entities and ended with a "SEQEND" entity.
|
|
88
|
-
// Essentially we convert POLYLINE to LWPOLYLINE - the extra
|
|
89
|
-
// vertex flags are not supported
|
|
90
|
-
if (entityType === 'POLYLINE') {
|
|
91
|
-
currentPolyline = e as PolylineEntity
|
|
92
|
-
entities.push(e)
|
|
93
|
-
} else if (entityType === 'VERTEX') {
|
|
94
|
-
if (currentPolyline) {
|
|
95
|
-
currentPolyline.vertices.push(e as any)
|
|
96
|
-
} else {
|
|
97
|
-
logger.error('ignoring invalid VERTEX entity')
|
|
98
|
-
}
|
|
99
|
-
} else if (entityType === 'SEQEND') {
|
|
100
|
-
currentPolyline = undefined
|
|
101
|
-
} else {
|
|
102
|
-
// All other entities
|
|
103
|
-
entities.push(e)
|
|
104
|
-
}
|
|
105
|
-
} else {
|
|
106
|
-
logger.warn('unsupported type in ENTITIES section:', entityType)
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return entities
|
|
185
|
+
return processEntityGroups(entityGroups)
|
|
111
186
|
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { DXFTuple } from '../../types'
|
|
2
|
+
|
|
3
|
+
import common from './common'
|
|
4
|
+
|
|
5
|
+
export const TYPE = 'DGNUNDERLAY'
|
|
6
|
+
|
|
7
|
+
interface UnderlayEntity {
|
|
8
|
+
type: typeof TYPE
|
|
9
|
+
|
|
10
|
+
insertionPoint: { x: number; y: number; z: number }
|
|
11
|
+
scale: { x: number; y: number; z: number }
|
|
12
|
+
normal: { x: number; y: number; z: number }
|
|
13
|
+
|
|
14
|
+
underlayDefinitionHandle?: string
|
|
15
|
+
rotation?: number
|
|
16
|
+
flags?: number
|
|
17
|
+
contrast?: number
|
|
18
|
+
fade?: number
|
|
19
|
+
|
|
20
|
+
[key: string]: unknown
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const process = (tuples: DXFTuple[]): UnderlayEntity => {
|
|
24
|
+
return tuples.reduce(
|
|
25
|
+
(entity, tuple) => {
|
|
26
|
+
const type = tuple[0]
|
|
27
|
+
const value = tuple[1]
|
|
28
|
+
|
|
29
|
+
switch (type) {
|
|
30
|
+
case 340:
|
|
31
|
+
entity.underlayDefinitionHandle = String(value)
|
|
32
|
+
break
|
|
33
|
+
|
|
34
|
+
case 10:
|
|
35
|
+
entity.insertionPoint.x = value as number
|
|
36
|
+
break
|
|
37
|
+
case 20:
|
|
38
|
+
entity.insertionPoint.y = value as number
|
|
39
|
+
break
|
|
40
|
+
case 30:
|
|
41
|
+
entity.insertionPoint.z = value as number
|
|
42
|
+
break
|
|
43
|
+
|
|
44
|
+
case 41:
|
|
45
|
+
entity.scale.x = value as number
|
|
46
|
+
break
|
|
47
|
+
case 42:
|
|
48
|
+
entity.scale.y = value as number
|
|
49
|
+
break
|
|
50
|
+
case 43:
|
|
51
|
+
entity.scale.z = value as number
|
|
52
|
+
break
|
|
53
|
+
|
|
54
|
+
case 50:
|
|
55
|
+
entity.rotation = value as number
|
|
56
|
+
break
|
|
57
|
+
|
|
58
|
+
case 210:
|
|
59
|
+
entity.normal.x = value as number
|
|
60
|
+
break
|
|
61
|
+
case 220:
|
|
62
|
+
entity.normal.y = value as number
|
|
63
|
+
break
|
|
64
|
+
case 230:
|
|
65
|
+
entity.normal.z = value as number
|
|
66
|
+
break
|
|
67
|
+
|
|
68
|
+
case 280:
|
|
69
|
+
entity.flags = value as number
|
|
70
|
+
break
|
|
71
|
+
case 281:
|
|
72
|
+
entity.contrast = value as number
|
|
73
|
+
break
|
|
74
|
+
case 282:
|
|
75
|
+
entity.fade = value as number
|
|
76
|
+
break
|
|
77
|
+
|
|
78
|
+
default:
|
|
79
|
+
Object.assign(entity, common(type, value))
|
|
80
|
+
break
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return entity
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
type: TYPE,
|
|
87
|
+
insertionPoint: { x: 0, y: 0, z: 0 },
|
|
88
|
+
scale: { x: 1, y: 1, z: 1 },
|
|
89
|
+
normal: { x: 0, y: 0, z: 1 },
|
|
90
|
+
} as UnderlayEntity,
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export default { TYPE, process }
|
|
@@ -15,6 +15,8 @@ interface DimensionEntity {
|
|
|
15
15
|
type: typeof TYPE
|
|
16
16
|
block?: string
|
|
17
17
|
start: Point3D
|
|
18
|
+
angleVertex?: Point3D
|
|
19
|
+
arcPoint?: Point3D
|
|
18
20
|
textMidpoint: Point3D
|
|
19
21
|
measureStart: Point3D
|
|
20
22
|
measureEnd: Point3D
|
|
@@ -89,6 +91,30 @@ export const process = (tuples: DXFTuple[]): DimensionEntity => {
|
|
|
89
91
|
case 34:
|
|
90
92
|
entity.measureEnd.z = value as number
|
|
91
93
|
break
|
|
94
|
+
case 15:
|
|
95
|
+
entity.angleVertex = entity.angleVertex || { x: 0, y: 0, z: 0 }
|
|
96
|
+
entity.angleVertex.x = value as number
|
|
97
|
+
break
|
|
98
|
+
case 25:
|
|
99
|
+
entity.angleVertex = entity.angleVertex || { x: 0, y: 0, z: 0 }
|
|
100
|
+
entity.angleVertex.y = value as number
|
|
101
|
+
break
|
|
102
|
+
case 35:
|
|
103
|
+
entity.angleVertex = entity.angleVertex || { x: 0, y: 0, z: 0 }
|
|
104
|
+
entity.angleVertex.z = value as number
|
|
105
|
+
break
|
|
106
|
+
case 16:
|
|
107
|
+
entity.arcPoint = entity.arcPoint || { x: 0, y: 0, z: 0 }
|
|
108
|
+
entity.arcPoint.x = value as number
|
|
109
|
+
break
|
|
110
|
+
case 26:
|
|
111
|
+
entity.arcPoint = entity.arcPoint || { x: 0, y: 0, z: 0 }
|
|
112
|
+
entity.arcPoint.y = value as number
|
|
113
|
+
break
|
|
114
|
+
case 36:
|
|
115
|
+
entity.arcPoint = entity.arcPoint || { x: 0, y: 0, z: 0 }
|
|
116
|
+
entity.arcPoint.z = value as number
|
|
117
|
+
break
|
|
92
118
|
case 50:
|
|
93
119
|
entity.rotation = value as number
|
|
94
120
|
break
|
|
@@ -177,7 +203,7 @@ function parseBitCombinationsFromValue(value: number): BitCombinationsResult {
|
|
|
177
203
|
let ordinateType = false
|
|
178
204
|
let userDefinedLocation = false
|
|
179
205
|
|
|
180
|
-
//
|
|
206
|
+
// Note: keep this logic explicit; DXF stores flags as bit combinations.
|
|
181
207
|
if (value > 6) {
|
|
182
208
|
const alt1 = value - 32
|
|
183
209
|
const alt2 = value - 64
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { DXFTuple } from '../../types'
|
|
2
|
+
|
|
3
|
+
import common from './common'
|
|
4
|
+
|
|
5
|
+
export const TYPE = 'DWFUNDERLAY'
|
|
6
|
+
|
|
7
|
+
interface UnderlayEntity {
|
|
8
|
+
type: typeof TYPE
|
|
9
|
+
|
|
10
|
+
insertionPoint: { x: number; y: number; z: number }
|
|
11
|
+
scale: { x: number; y: number; z: number }
|
|
12
|
+
normal: { x: number; y: number; z: number }
|
|
13
|
+
|
|
14
|
+
underlayDefinitionHandle?: string
|
|
15
|
+
rotation?: number
|
|
16
|
+
flags?: number
|
|
17
|
+
contrast?: number
|
|
18
|
+
fade?: number
|
|
19
|
+
|
|
20
|
+
[key: string]: unknown
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const process = (tuples: DXFTuple[]): UnderlayEntity => {
|
|
24
|
+
return tuples.reduce(
|
|
25
|
+
(entity, tuple) => {
|
|
26
|
+
const type = tuple[0]
|
|
27
|
+
const value = tuple[1]
|
|
28
|
+
|
|
29
|
+
switch (type) {
|
|
30
|
+
case 340:
|
|
31
|
+
entity.underlayDefinitionHandle = String(value)
|
|
32
|
+
break
|
|
33
|
+
|
|
34
|
+
case 10:
|
|
35
|
+
entity.insertionPoint.x = value as number
|
|
36
|
+
break
|
|
37
|
+
case 20:
|
|
38
|
+
entity.insertionPoint.y = value as number
|
|
39
|
+
break
|
|
40
|
+
case 30:
|
|
41
|
+
entity.insertionPoint.z = value as number
|
|
42
|
+
break
|
|
43
|
+
|
|
44
|
+
case 41:
|
|
45
|
+
entity.scale.x = value as number
|
|
46
|
+
break
|
|
47
|
+
case 42:
|
|
48
|
+
entity.scale.y = value as number
|
|
49
|
+
break
|
|
50
|
+
case 43:
|
|
51
|
+
entity.scale.z = value as number
|
|
52
|
+
break
|
|
53
|
+
|
|
54
|
+
case 50:
|
|
55
|
+
entity.rotation = value as number
|
|
56
|
+
break
|
|
57
|
+
|
|
58
|
+
case 210:
|
|
59
|
+
entity.normal.x = value as number
|
|
60
|
+
break
|
|
61
|
+
case 220:
|
|
62
|
+
entity.normal.y = value as number
|
|
63
|
+
break
|
|
64
|
+
case 230:
|
|
65
|
+
entity.normal.z = value as number
|
|
66
|
+
break
|
|
67
|
+
|
|
68
|
+
case 280:
|
|
69
|
+
entity.flags = value as number
|
|
70
|
+
break
|
|
71
|
+
case 281:
|
|
72
|
+
entity.contrast = value as number
|
|
73
|
+
break
|
|
74
|
+
case 282:
|
|
75
|
+
entity.fade = value as number
|
|
76
|
+
break
|
|
77
|
+
|
|
78
|
+
default:
|
|
79
|
+
Object.assign(entity, common(type, value))
|
|
80
|
+
break
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return entity
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
type: TYPE,
|
|
87
|
+
insertionPoint: { x: 0, y: 0, z: 0 },
|
|
88
|
+
scale: { x: 1, y: 1, z: 1 },
|
|
89
|
+
normal: { x: 0, y: 0, z: 1 },
|
|
90
|
+
} as UnderlayEntity,
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export default { TYPE, process }
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { DXFTuple, PartialPoint3D } from '../../types'
|
|
2
|
+
|
|
3
|
+
import common from './common'
|
|
4
|
+
|
|
5
|
+
export const TYPE = 'IMAGE'
|
|
6
|
+
|
|
7
|
+
interface ImageEntity {
|
|
8
|
+
type: typeof TYPE
|
|
9
|
+
|
|
10
|
+
insertionPoint: PartialPoint3D
|
|
11
|
+
uVector: PartialPoint3D
|
|
12
|
+
vVector: PartialPoint3D
|
|
13
|
+
|
|
14
|
+
pixelSizeX: number
|
|
15
|
+
pixelSizeY: number
|
|
16
|
+
|
|
17
|
+
imageDefHandle?: string
|
|
18
|
+
imageDefReactorHandle?: string
|
|
19
|
+
|
|
20
|
+
displayProperties?: number
|
|
21
|
+
clippingState?: number
|
|
22
|
+
brightness?: number
|
|
23
|
+
contrast?: number
|
|
24
|
+
fade?: number
|
|
25
|
+
classVersion?: number
|
|
26
|
+
|
|
27
|
+
[key: string]: unknown
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const process = (tuples: DXFTuple[]): ImageEntity => {
|
|
31
|
+
return tuples.reduce(
|
|
32
|
+
(entity, tuple) => {
|
|
33
|
+
const type = tuple[0]
|
|
34
|
+
const value = tuple[1]
|
|
35
|
+
|
|
36
|
+
switch (type) {
|
|
37
|
+
case 90:
|
|
38
|
+
entity.classVersion = value as number
|
|
39
|
+
break
|
|
40
|
+
|
|
41
|
+
case 10:
|
|
42
|
+
entity.insertionPoint.x = value as number
|
|
43
|
+
break
|
|
44
|
+
case 20:
|
|
45
|
+
entity.insertionPoint.y = value as number
|
|
46
|
+
break
|
|
47
|
+
case 30:
|
|
48
|
+
entity.insertionPoint.z = value as number
|
|
49
|
+
break
|
|
50
|
+
|
|
51
|
+
case 11:
|
|
52
|
+
entity.uVector.x = value as number
|
|
53
|
+
break
|
|
54
|
+
case 21:
|
|
55
|
+
entity.uVector.y = value as number
|
|
56
|
+
break
|
|
57
|
+
case 31:
|
|
58
|
+
entity.uVector.z = value as number
|
|
59
|
+
break
|
|
60
|
+
|
|
61
|
+
case 12:
|
|
62
|
+
entity.vVector.x = value as number
|
|
63
|
+
break
|
|
64
|
+
case 22:
|
|
65
|
+
entity.vVector.y = value as number
|
|
66
|
+
break
|
|
67
|
+
case 32:
|
|
68
|
+
entity.vVector.z = value as number
|
|
69
|
+
break
|
|
70
|
+
|
|
71
|
+
case 13:
|
|
72
|
+
entity.pixelSizeX = value as number
|
|
73
|
+
break
|
|
74
|
+
case 23:
|
|
75
|
+
entity.pixelSizeY = value as number
|
|
76
|
+
break
|
|
77
|
+
|
|
78
|
+
case 340:
|
|
79
|
+
entity.imageDefHandle = String(value)
|
|
80
|
+
break
|
|
81
|
+
case 360:
|
|
82
|
+
entity.imageDefReactorHandle = String(value)
|
|
83
|
+
break
|
|
84
|
+
|
|
85
|
+
case 70:
|
|
86
|
+
entity.displayProperties = value as number
|
|
87
|
+
break
|
|
88
|
+
case 280:
|
|
89
|
+
entity.clippingState = value as number
|
|
90
|
+
break
|
|
91
|
+
case 281:
|
|
92
|
+
entity.brightness = value as number
|
|
93
|
+
break
|
|
94
|
+
case 282:
|
|
95
|
+
entity.contrast = value as number
|
|
96
|
+
break
|
|
97
|
+
case 283:
|
|
98
|
+
entity.fade = value as number
|
|
99
|
+
break
|
|
100
|
+
|
|
101
|
+
default:
|
|
102
|
+
Object.assign(entity, common(type, value))
|
|
103
|
+
break
|
|
104
|
+
}
|
|
105
|
+
return entity
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
type: TYPE,
|
|
109
|
+
insertionPoint: {},
|
|
110
|
+
uVector: {},
|
|
111
|
+
vVector: {},
|
|
112
|
+
pixelSizeX: 0,
|
|
113
|
+
pixelSizeY: 0,
|
|
114
|
+
} as ImageEntity,
|
|
115
|
+
)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export default { TYPE, process }
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { DXFTuple } from '../../types'
|
|
2
|
+
|
|
3
|
+
import common from './common'
|
|
4
|
+
|
|
5
|
+
export const TYPE = 'LEADER'
|
|
6
|
+
|
|
7
|
+
interface LeaderEntity {
|
|
8
|
+
type: typeof TYPE
|
|
9
|
+
vertices: Array<{ x: number; y: number; z: number }>
|
|
10
|
+
|
|
11
|
+
dimensionStyleName?: string
|
|
12
|
+
arrowheadFlag?: number
|
|
13
|
+
pathType?: number
|
|
14
|
+
creationFlag?: number
|
|
15
|
+
hooklineDirectionFlag?: number
|
|
16
|
+
hooklineFlag?: number
|
|
17
|
+
textHeight?: number
|
|
18
|
+
textWidth?: number
|
|
19
|
+
color?: number
|
|
20
|
+
annotationHandle?: string
|
|
21
|
+
|
|
22
|
+
normal?: { x: number; y: number; z: number }
|
|
23
|
+
horizontalDirection?: { x: number; y: number; z: number }
|
|
24
|
+
blockOffset?: { x: number; y: number; z: number }
|
|
25
|
+
annotationOffset?: { x: number; y: number; z: number }
|
|
26
|
+
|
|
27
|
+
[key: string]: unknown
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function ensureVector3(
|
|
31
|
+
entity: LeaderEntity,
|
|
32
|
+
key: 'normal' | 'horizontalDirection' | 'blockOffset' | 'annotationOffset',
|
|
33
|
+
): { x: number; y: number; z: number } {
|
|
34
|
+
if (!entity[key]) entity[key] = { x: 0, y: 0, z: 0 }
|
|
35
|
+
return entity[key] as { x: number; y: number; z: number }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const process = (tuples: DXFTuple[]): LeaderEntity => {
|
|
39
|
+
return tuples.reduce(
|
|
40
|
+
(entity, tuple) => {
|
|
41
|
+
const type = tuple[0]
|
|
42
|
+
const value = tuple[1]
|
|
43
|
+
|
|
44
|
+
switch (type) {
|
|
45
|
+
case 3:
|
|
46
|
+
entity.dimensionStyleName = String(value)
|
|
47
|
+
break
|
|
48
|
+
|
|
49
|
+
case 71:
|
|
50
|
+
entity.arrowheadFlag = value as number
|
|
51
|
+
break
|
|
52
|
+
case 72:
|
|
53
|
+
entity.pathType = value as number
|
|
54
|
+
break
|
|
55
|
+
case 73:
|
|
56
|
+
entity.creationFlag = value as number
|
|
57
|
+
break
|
|
58
|
+
case 74:
|
|
59
|
+
entity.hooklineDirectionFlag = value as number
|
|
60
|
+
break
|
|
61
|
+
case 75:
|
|
62
|
+
entity.hooklineFlag = value as number
|
|
63
|
+
break
|
|
64
|
+
|
|
65
|
+
case 40:
|
|
66
|
+
entity.textHeight = value as number
|
|
67
|
+
break
|
|
68
|
+
case 41:
|
|
69
|
+
entity.textWidth = value as number
|
|
70
|
+
break
|
|
71
|
+
|
|
72
|
+
case 76:
|
|
73
|
+
// Number of vertices in leader. Keep as metadata only.
|
|
74
|
+
entity.vertexCount = value as number
|
|
75
|
+
break
|
|
76
|
+
|
|
77
|
+
case 10:
|
|
78
|
+
entity.vertices.push({ x: value as number, y: 0, z: 0 })
|
|
79
|
+
break
|
|
80
|
+
case 20: {
|
|
81
|
+
const current = entity.vertices[entity.vertices.length - 1]
|
|
82
|
+
if (current) current.y = value as number
|
|
83
|
+
break
|
|
84
|
+
}
|
|
85
|
+
case 30: {
|
|
86
|
+
const current = entity.vertices[entity.vertices.length - 1]
|
|
87
|
+
if (current) current.z = value as number
|
|
88
|
+
break
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
case 77:
|
|
92
|
+
entity.color = value as number
|
|
93
|
+
break
|
|
94
|
+
|
|
95
|
+
case 340:
|
|
96
|
+
entity.annotationHandle = String(value)
|
|
97
|
+
break
|
|
98
|
+
|
|
99
|
+
case 210:
|
|
100
|
+
ensureVector3(entity, 'normal').x = value as number
|
|
101
|
+
break
|
|
102
|
+
case 220:
|
|
103
|
+
ensureVector3(entity, 'normal').y = value as number
|
|
104
|
+
break
|
|
105
|
+
case 230:
|
|
106
|
+
ensureVector3(entity, 'normal').z = value as number
|
|
107
|
+
break
|
|
108
|
+
|
|
109
|
+
case 211:
|
|
110
|
+
ensureVector3(entity, 'horizontalDirection').x = value as number
|
|
111
|
+
break
|
|
112
|
+
case 221:
|
|
113
|
+
ensureVector3(entity, 'horizontalDirection').y = value as number
|
|
114
|
+
break
|
|
115
|
+
case 231:
|
|
116
|
+
ensureVector3(entity, 'horizontalDirection').z = value as number
|
|
117
|
+
break
|
|
118
|
+
|
|
119
|
+
case 212:
|
|
120
|
+
ensureVector3(entity, 'blockOffset').x = value as number
|
|
121
|
+
break
|
|
122
|
+
case 222:
|
|
123
|
+
ensureVector3(entity, 'blockOffset').y = value as number
|
|
124
|
+
break
|
|
125
|
+
case 232:
|
|
126
|
+
ensureVector3(entity, 'blockOffset').z = value as number
|
|
127
|
+
break
|
|
128
|
+
|
|
129
|
+
case 213:
|
|
130
|
+
ensureVector3(entity, 'annotationOffset').x = value as number
|
|
131
|
+
break
|
|
132
|
+
case 223:
|
|
133
|
+
ensureVector3(entity, 'annotationOffset').y = value as number
|
|
134
|
+
break
|
|
135
|
+
case 233:
|
|
136
|
+
ensureVector3(entity, 'annotationOffset').z = value as number
|
|
137
|
+
break
|
|
138
|
+
|
|
139
|
+
default:
|
|
140
|
+
Object.assign(entity, common(type, value))
|
|
141
|
+
break
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return entity
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: TYPE,
|
|
148
|
+
vertices: [],
|
|
149
|
+
} as LeaderEntity,
|
|
150
|
+
)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export default { TYPE, process }
|