@jscad/dxf-deserializer 2.3.22 → 3.0.0-alpha.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/CHANGELOG.md +10 -169
- package/README.md +3 -1
- package/dist/jscad-dxf-deserializer.es.js +7 -0
- package/dist/jscad-dxf-deserializer.min.js +7 -0
- package/package.json +20 -10
- package/rollup.config.js +27 -0
- package/src/DxfReader.js +241 -0
- package/{autocad.js → src/autocad.js} +4 -17
- package/{colorindex2014.js → src/colorindex2014.js} +1 -3
- package/{colorindex2017.js → src/colorindex2017.js} +1 -3
- package/{helpers.js → src/helpers.js} +4 -19
- package/{index.js → src/index.js} +61 -68
- package/{instantiate.js → src/instantiate.js} +54 -67
- package/{translate.js → src/translate.js} +50 -70
- package/tests/test-2d-entities.js +39 -38
- package/tests/test-2d-translation.js +17 -17
- package/tests/test-3d-entities.js +18 -18
- package/tests/test-3d-translation.js +6 -6
- package/tests/test-DxfReader.js +8 -7
- package/tests/test-dxf-versions.js +12 -11
- package/tests/test-dxf.js +6 -5
- package/DxfReader.js +0 -250
package/DxfReader.js
DELETED
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
## License
|
|
3
|
-
|
|
4
|
-
Copyright (c) 2017 Z3 Development https://github.com/z3dev
|
|
5
|
-
|
|
6
|
-
All code released under MIT license
|
|
7
|
-
|
|
8
|
-
Thanks to @issacs for the sax js library, and inspiration for this reader
|
|
9
|
-
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
// DXF reader to emit groups of interest to handlers
|
|
13
|
-
|
|
14
|
-
;(function (dxf) { // wrapper for non-node envs
|
|
15
|
-
dxf.reader = function (options) { return new DxfReader(options) }
|
|
16
|
-
|
|
17
|
-
dxf.STATES = [
|
|
18
|
-
'start',
|
|
19
|
-
'end',
|
|
20
|
-
'error'
|
|
21
|
-
]
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Class DxfReader
|
|
25
|
-
* A class to hold state while reading DXF formatted data.
|
|
26
|
-
* @param {Object} [options] - options for parsing
|
|
27
|
-
* @param {Boolean} [options.track=true] - track position for error reporting
|
|
28
|
-
* @param {Boolean} [options.strict=false] - obey strict DXF specifications
|
|
29
|
-
* @constructor
|
|
30
|
-
*
|
|
31
|
-
* @example
|
|
32
|
-
* const dxfPath = path.resolve(__dirname, 'circle10.dxf')
|
|
33
|
-
* let src = fs.readFileSync(dxfPath, 'UTF8')
|
|
34
|
-
* let reader = dxf.reader({track: true})
|
|
35
|
-
* // setup state handling
|
|
36
|
-
* reader.on('error',handleError)
|
|
37
|
-
* reader.on('start',handleStart)
|
|
38
|
-
* reader.on('end' ,handleEnd)
|
|
39
|
-
* // setup handling for groups of interest, skip the rest
|
|
40
|
-
* reader.absorb(0,handleEntity)
|
|
41
|
-
* // start the reader
|
|
42
|
-
* reader.write(src).close()
|
|
43
|
-
*/
|
|
44
|
-
function DxfReader (options) {
|
|
45
|
-
const reader = this
|
|
46
|
-
reader.options = options || {}
|
|
47
|
-
|
|
48
|
-
reader.trackPosition = (reader.options.track !== false)
|
|
49
|
-
if (reader.trackPosition) {
|
|
50
|
-
reader.line = reader.column = reader.c = 0
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
DxfReader.prototype = {
|
|
55
|
-
// set a handler for the given state
|
|
56
|
-
// see dxf.STATES above
|
|
57
|
-
on: function (state, callback) {
|
|
58
|
-
// verify the state
|
|
59
|
-
// set the callback
|
|
60
|
-
const reader = this
|
|
61
|
-
reader['on' + state] = callback
|
|
62
|
-
},
|
|
63
|
-
|
|
64
|
-
// set a handler for the given group and value
|
|
65
|
-
absorb: function (group, callback) {
|
|
66
|
-
if (this.absorbers === undefined) {
|
|
67
|
-
this.absorbers = new Map()
|
|
68
|
-
}
|
|
69
|
-
this.absorbers.set(group, callback)
|
|
70
|
-
},
|
|
71
|
-
|
|
72
|
-
// write the given data into the reader, initiating parsing
|
|
73
|
-
write: function (data) {
|
|
74
|
-
const reader = this
|
|
75
|
-
parse(reader, data)
|
|
76
|
-
return reader
|
|
77
|
-
},
|
|
78
|
-
|
|
79
|
-
// close and clear all state
|
|
80
|
-
close: function () {
|
|
81
|
-
const reader = this
|
|
82
|
-
reader.isclosed = true
|
|
83
|
-
return reader
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
//
|
|
88
|
-
// emit the start of processing to the onstart handler if any
|
|
89
|
-
//
|
|
90
|
-
const emitstart = (reader) => emitstate(reader, 'onstart', reader.data)
|
|
91
|
-
|
|
92
|
-
//
|
|
93
|
-
// emit the group (code and value) to asorbers
|
|
94
|
-
//
|
|
95
|
-
const emitgroup = (reader, group, value) => {
|
|
96
|
-
// console.log(group+": "+value)
|
|
97
|
-
// emit this group to all listeners
|
|
98
|
-
if (reader.absorbers !== undefined) {
|
|
99
|
-
const absorber = reader.absorbers.get(group)
|
|
100
|
-
if (absorber !== undefined) {
|
|
101
|
-
absorber(reader, group, value)
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
//
|
|
107
|
-
// wrap and emit the given error to the onerror handler if any
|
|
108
|
-
//
|
|
109
|
-
const emiterror = (reader, er) => {
|
|
110
|
-
// closeText(reader)
|
|
111
|
-
if (reader.trackPosition) {
|
|
112
|
-
er += `
|
|
113
|
-
Line: ${reader.line}
|
|
114
|
-
Column: ${reader.column}
|
|
115
|
-
Char: ${reader.c}`
|
|
116
|
-
}
|
|
117
|
-
er = new Error(er)
|
|
118
|
-
reader.error = er
|
|
119
|
-
return emitstate(reader, 'onerror', er)
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
//
|
|
123
|
-
// emit the end of processing to the onend handler if any
|
|
124
|
-
//
|
|
125
|
-
const emitend = (reader) => emitstate(reader, 'onend', reader.data)
|
|
126
|
-
|
|
127
|
-
const emitstate = (reader, state, data) => {
|
|
128
|
-
const onhandler = state.toString()
|
|
129
|
-
reader[onhandler] && reader[onhandler](reader, data)
|
|
130
|
-
return reader
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
//
|
|
134
|
-
// parse the given data in the context of the given reader
|
|
135
|
-
//
|
|
136
|
-
const parse = (reader, data) => {
|
|
137
|
-
// check reader state
|
|
138
|
-
if (reader.error) {
|
|
139
|
-
throw reader.error // throw the last error
|
|
140
|
-
}
|
|
141
|
-
if (reader.isclosed) {
|
|
142
|
-
return emiterror(reader, 'Cannot write after close')
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
emitstart(reader)
|
|
146
|
-
|
|
147
|
-
if (data === null) {
|
|
148
|
-
return emitend(reader)
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// initial state to initiate parsing
|
|
152
|
-
reader.group = null
|
|
153
|
-
reader.value = null
|
|
154
|
-
reader.error = null
|
|
155
|
-
|
|
156
|
-
reader.position = 0
|
|
157
|
-
reader.line = 0
|
|
158
|
-
reader.column = 0
|
|
159
|
-
|
|
160
|
-
// use or convert the data to String
|
|
161
|
-
let i = 0
|
|
162
|
-
let c = ''
|
|
163
|
-
let l = ''
|
|
164
|
-
while (reader.error === null) {
|
|
165
|
-
c = charAt(data, i++)
|
|
166
|
-
if (!c) {
|
|
167
|
-
break
|
|
168
|
-
}
|
|
169
|
-
if (reader.trackPosition) {
|
|
170
|
-
reader.position++
|
|
171
|
-
if (c === '\n') {
|
|
172
|
-
reader.line++
|
|
173
|
-
reader.column = 0
|
|
174
|
-
} else {
|
|
175
|
-
reader.column++
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
// dxf files are parsed line by line
|
|
179
|
-
if (c === '\n') {
|
|
180
|
-
parseLine(reader, l)
|
|
181
|
-
l = ''
|
|
182
|
-
} else {
|
|
183
|
-
l += c
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
// emit state change
|
|
187
|
-
emitend(reader)
|
|
188
|
-
return reader
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/** Parse the given line in the context of the given reader, emitting group value pairs
|
|
192
|
-
* @param reader {DxfReader} - context DxfReader to use
|
|
193
|
-
* @param line {String} - line to parse
|
|
194
|
-
*/
|
|
195
|
-
const parseLine = (reader, line) => {
|
|
196
|
-
line = line.trim()
|
|
197
|
-
if (reader.group === null) {
|
|
198
|
-
setDxfGroup(reader, line)
|
|
199
|
-
reader.value = null
|
|
200
|
-
} else {
|
|
201
|
-
setDxfValue(reader, line)
|
|
202
|
-
}
|
|
203
|
-
// handle group and value pairs
|
|
204
|
-
if (reader.group !== null && reader.value !== null) {
|
|
205
|
-
// emit events for group and value pairs
|
|
206
|
-
emitgroup(reader, reader.group, reader.value)
|
|
207
|
-
|
|
208
|
-
reader.group = null
|
|
209
|
-
reader.value = null
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/** Parse the given line in the context of the given reader, and update the group
|
|
214
|
-
* @param reader {DxfReader} - context DxfReader to use
|
|
215
|
-
* @param line {String} - line to parse
|
|
216
|
-
*/
|
|
217
|
-
const setDxfGroup = (reader, line) => {
|
|
218
|
-
// groups are numeric
|
|
219
|
-
const code = parseInt(line)
|
|
220
|
-
if (isNaN(code)) {
|
|
221
|
-
emiterror(reader, 'Invalid group (int)')
|
|
222
|
-
reader.group = null
|
|
223
|
-
} else {
|
|
224
|
-
reader.group = code
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/** Parse the given line in the context of the given reader, and update the (group) value
|
|
229
|
-
* @param reader {DxfReader} - context DxfReader to use
|
|
230
|
-
* @param line {String} - line to parse
|
|
231
|
-
*/
|
|
232
|
-
const setDxfValue = (reader, line) => {
|
|
233
|
-
if (reader.options.strict) {
|
|
234
|
-
// TODO evaluate the value based on DXF specifications
|
|
235
|
-
reader.value = line
|
|
236
|
-
} else {
|
|
237
|
-
reader.value = line
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
//
|
|
242
|
-
// helper function to return expected values
|
|
243
|
-
//
|
|
244
|
-
const charAt = (data, i) => {
|
|
245
|
-
if (data && data.length > i) {
|
|
246
|
-
return data.charAt(i)
|
|
247
|
-
}
|
|
248
|
-
return ''
|
|
249
|
-
}
|
|
250
|
-
})(typeof exports === 'undefined' ? this.dxf = {} : exports)
|