4
4
* Time: 12:18 PM
5
5
*/
6
6
7
- var GCODE = { }
8
-
9
- GCODE . worker = ( function ( ) {
10
7
var gcode ;
11
8
var firstReport ;
12
9
var z_heights = { } ;
@@ -24,8 +21,8 @@ GCODE.worker = (function(){
24
21
var printTime = 0 ;
25
22
var layerHeight = 0 ;
26
23
var layerCnt = 0 ;
27
- var speeds = [ ] ;
28
- var speedsByLayer = { } ;
24
+ var speeds = { extrude : [ ] , retract : [ ] , move : [ ] } ;
25
+ var speedsByLayer = { extrude : { } , retract : { } , move : { } } ;
29
26
30
27
31
28
var sendLayerToParent = function ( layerNum , z , progress ) {
@@ -103,7 +100,7 @@ GCODE.worker = (function(){
103
100
for ( j = 0 ; j < cmds . length ; j ++ ) {
104
101
x_ok = false ;
105
102
y_ok = false ;
106
- if ( typeof ( cmds [ j ] . x ) !== 'undefined' && typeof ( cmds [ j ] . prevX ) !== 'undefined' && typeof ( cmds [ j ] . extrude ) !== 'undefined' && cmds [ j ] . extrude )
103
+ if ( typeof ( cmds [ j ] . x ) !== 'undefined' && typeof ( cmds [ j ] . prevX ) !== 'undefined' && typeof ( cmds [ j ] . extrude ) !== 'undefined' && cmds [ j ] . extrude && ! isNaN ( cmds [ j ] . x ) )
107
104
{
108
105
max . x = parseFloat ( max . x ) > parseFloat ( cmds [ j ] . x ) ?parseFloat ( max . x ) :parseFloat ( cmds [ j ] . x ) ;
109
106
max . x = parseFloat ( max . x ) > parseFloat ( cmds [ j ] . prevX ) ?parseFloat ( max . x ) :parseFloat ( cmds [ j ] . prevX ) ;
@@ -112,15 +109,15 @@ GCODE.worker = (function(){
112
109
x_ok = true ;
113
110
}
114
111
115
- if ( typeof ( cmds [ j ] . y ) !== 'undefined' && typeof ( cmds [ j ] . prevY ) !== 'undefined' && typeof ( cmds [ j ] . extrude ) !== 'undefined' && cmds [ j ] . extrude ) {
112
+ if ( typeof ( cmds [ j ] . y ) !== 'undefined' && typeof ( cmds [ j ] . prevY ) !== 'undefined' && typeof ( cmds [ j ] . extrude ) !== 'undefined' && cmds [ j ] . extrude && ! isNaN ( cmds [ j ] . y ) ) {
116
113
max . y = parseFloat ( max . y ) > parseFloat ( cmds [ j ] . y ) ?parseFloat ( max . y ) :parseFloat ( cmds [ j ] . y ) ;
117
114
max . y = parseFloat ( max . y ) > parseFloat ( cmds [ j ] . prevY ) ?parseFloat ( max . y ) :parseFloat ( cmds [ j ] . prevY ) ;
118
115
min . y = parseFloat ( min . y ) < parseFloat ( cmds [ j ] . y ) ?parseFloat ( min . y ) :parseFloat ( cmds [ j ] . y ) ;
119
116
min . y = parseFloat ( min . y ) < parseFloat ( cmds [ j ] . prevY ) ?parseFloat ( min . y ) :parseFloat ( cmds [ j ] . prevY ) ;
120
117
y_ok = true ;
121
118
}
122
119
123
- if ( typeof ( cmds [ j ] . prevZ ) !== 'undefined' && typeof ( cmds [ j ] . extrude ) !== 'undefined' && cmds [ j ] . extrude ) {
120
+ if ( typeof ( cmds [ j ] . prevZ ) !== 'undefined' && typeof ( cmds [ j ] . extrude ) !== 'undefined' && cmds [ j ] . extrude && ! isNaN ( cmds [ j ] . prevZ ) ) {
124
121
max . z = parseFloat ( max . z ) > parseFloat ( cmds [ j ] . prevZ ) ?parseFloat ( max . z ) :parseFloat ( cmds [ j ] . prevZ ) ;
125
122
min . z = parseFloat ( min . z ) < parseFloat ( cmds [ j ] . prevZ ) ?parseFloat ( min . z ) :parseFloat ( cmds [ j ] . prevZ ) ;
126
123
}
@@ -141,25 +138,29 @@ GCODE.worker = (function(){
141
138
printTime += Math . abs ( parseFloat ( cmds [ j ] . extrusion ) / ( cmds [ j ] . speed / 60 ) ) ;
142
139
}
143
140
144
- speedIndex = speeds . indexOf ( cmds [ j ] . speed ) ;
141
+ if ( cmds [ j ] . extrude && cmds [ j ] . retract === 0 ) {
142
+ type = 'extrude' ;
143
+ } else if ( cmds [ j ] . retract !== 0 ) {
144
+ type = 'retract' ;
145
+ } else if ( ! cmds [ j ] . extrude && cmds [ j ] . retract === 0 ) {
146
+ type = 'move' ;
147
+ // if(cmds[j].prevZ == '17.1'){
148
+ // self.postMessage({cmd: 'Got speed ' + cmds[j].speed + 'with line ' + cmds[j].gcodeLine});
149
+ // }
150
+ } else {
151
+ self . postMessage ( { cmd : 'unknown type of move' } ) ;
152
+ type = 'unknown' ;
153
+ }
154
+ speedIndex = speeds [ type ] . indexOf ( cmds [ j ] . speed ) ;
145
155
if ( speedIndex === - 1 ) {
146
- speeds . push ( cmds [ j ] . speed ) ;
147
- speedIndex = speeds . indexOf ( cmds [ j ] . speed ) ;
156
+ speeds [ type ] . push ( cmds [ j ] . speed ) ;
157
+ speedIndex = speeds [ type ] . indexOf ( cmds [ j ] . speed ) ;
148
158
}
149
- if ( typeof ( speedsByLayer [ cmds [ j ] . prevZ ] ) === 'undefined' ) {
150
- speedsByLayer [ cmds [ j ] . prevZ ] = [ ] ;
159
+ if ( typeof ( speedsByLayer [ type ] [ cmds [ j ] . prevZ ] ) === 'undefined' ) {
160
+ speedsByLayer [ type ] [ cmds [ j ] . prevZ ] = [ ] ;
151
161
}
152
- if ( speedsByLayer [ cmds [ j ] . prevZ ] . indexOf ( cmds [ j ] . speed ) === - 1 ) {
153
- if ( cmds [ j ] . extrude && cmds [ j ] . retract === 0 ) {
154
- type = 'extrude' ;
155
- } else if ( cmds [ j ] . retract !== 0 ) {
156
- type = 'retract' ;
157
- } else if ( ! cmds [ j ] . extrude && cmds [ j ] . retract === 0 ) {
158
- type = 'move' ;
159
- } else {
160
- type = 'unknown' ;
161
- }
162
- speedsByLayer [ cmds [ j ] . prevZ ] [ speedIndex ] = { speed : cmds [ j ] . speed , type : type } ;
162
+ if ( speedsByLayer [ type ] [ cmds [ j ] . prevZ ] . indexOf ( cmds [ j ] . speed ) === - 1 ) {
163
+ speedsByLayer [ type ] [ cmds [ j ] . prevZ ] [ speedIndex ] = cmds [ j ] . speed ;
163
164
}
164
165
165
166
}
@@ -171,7 +172,6 @@ GCODE.worker = (function(){
171
172
modelSize . x = Math . abs ( max . x - min . x ) ;
172
173
modelSize . y = Math . abs ( max . y - min . y ) ;
173
174
modelSize . z = Math . abs ( max . z - min . z ) ;
174
- self . postMessage ( 'max: ' + max . z + "min = " + min . z ) ;
175
175
layerHeight = ( max . z - min . z ) / ( layerCnt - 1 ) ;
176
176
177
177
sendAnalyzeDone ( ) ;
@@ -191,6 +191,7 @@ GCODE.worker = (function(){
191
191
x = undefined ;
192
192
y = undefined ;
193
193
z = undefined ;
194
+ retract = 0 ;
194
195
195
196
196
197
extrude = false ;
@@ -205,9 +206,15 @@ GCODE.worker = (function(){
205
206
switch ( argChar = args [ j ] . charAt ( 0 ) . toLowerCase ( ) ) {
206
207
case 'x' :
207
208
x = args [ j ] . slice ( 1 ) ;
209
+ // if(x === prevX){
210
+ // x=undefined;
211
+ // }
208
212
break ;
209
213
case 'y' :
210
214
y = args [ j ] . slice ( 1 ) ;
215
+ // if(y===prevY){
216
+ // y=undefined;
217
+ // }
211
218
break ;
212
219
case 'z' :
213
220
z = args [ j ] . slice ( 1 ) ;
@@ -226,7 +233,7 @@ GCODE.worker = (function(){
226
233
prevZ = z ;
227
234
break ;
228
235
case 'e' || 'a' || 'b' || 'c' :
229
- numSlice = args [ j ] . slice ( 1 ) ;
236
+ numSlice = parseFloat ( args [ j ] . slice ( 1 ) ) . toFixed ( 3 ) ;
230
237
if ( ! extrudeRelative ) {
231
238
// absolute extrusion positioning
232
239
prev_extrude [ "abs" ] = parseFloat ( numSlice ) - parseFloat ( prev_extrude [ argChar ] ) ;
@@ -261,7 +268,8 @@ GCODE.worker = (function(){
261
268
}
262
269
}
263
270
if ( ! model [ layer ] ) model [ layer ] = [ ] ;
264
- if ( typeof ( x ) !== 'undefined' || typeof ( y ) !== 'undefined' || typeof ( z ) !== 'undefined' || retract != 0 ) model [ layer ] [ model [ layer ] . length ] = { x : x , y : y , z : z , extrude : extrude , retract : retract , extrusion : ( extrude || retract ) ?prev_extrude [ "abs" ] :0 , prevX : prevX , prevY : prevY , prevZ : prevZ , speed : lastF , gcodeLine : i } ;
271
+ if ( typeof ( x ) !== 'undefined' || typeof ( y ) !== 'undefined' || typeof ( z ) !== 'undefined' || retract != 0 ) model [ layer ] [ model [ layer ] . length ] = { x : Number ( x ) , y : Number ( y ) , z : Number ( z ) , extrude : extrude , retract : Number ( retract ) , noMove : false , extrusion : ( extrude || retract ) ?Number ( prev_extrude [ "abs" ] ) :0 , prevX : Number ( prevX ) , prevY : Number ( prevY ) , prevZ : Number ( prevZ ) , speed : Number ( lastF ) , gcodeLine : Number ( i ) } ;
272
+ //{x: x, y: y, z: z, extrude: extrude, retract: retract, noMove: false, extrusion: (extrude||retract)?prev_extrude["abs"]:0, prevX: prevX, prevY: prevY, prevZ: prevZ, speed: lastF, gcodeLine: i};
265
273
if ( typeof ( x ) !== 'undefined' ) prevX = x ;
266
274
if ( typeof ( y ) !== 'undefined' ) prevY = y ;
267
275
} else if ( gcode [ i ] . match ( / ^ (?: M 8 2 ) / i) ) {
@@ -299,14 +307,14 @@ GCODE.worker = (function(){
299
307
}
300
308
}
301
309
if ( ! model [ layer ] ) model [ layer ] = [ ] ;
302
- if ( typeof ( x ) !== 'undefined' || typeof ( y ) !== 'undefined' || typeof ( z ) !== 'undefined' ) model [ layer ] [ model [ layer ] . length ] = { x : x , y : y , z : z , extrude : extrude , retract : retract , noMove : true , extrusion : ( extrude || retract ) ?prev_extrude [ "abs" ] :0 , prevX : prevX , prevY : prevY , prevZ : prevZ , speed : lastF , gcodeLine : i } ;
310
+ if ( typeof ( x ) !== 'undefined' || typeof ( y ) !== 'undefined' || typeof ( z ) !== 'undefined' ) model [ layer ] [ model [ layer ] . length ] = { x : parseFloat ( x ) , y : parseFloat ( y ) , z : parseFloat ( z ) , extrude : extrude , retract : parseFloat ( retract ) , noMove : true , extrusion : ( extrude || retract ) ?parseFloat ( prev_extrude [ "abs" ] ) :0 , prevX : parseFloat ( prevX ) , prevY : parseFloat ( prevY ) , prevZ : parseFloat ( prevZ ) , speed : parseFloat ( lastF ) , gcodeLine : parseFloat ( i ) } ;
303
311
} else if ( gcode [ i ] . match ( / ^ (?: G 2 8 ) / i) ) {
304
312
x = 0 , y = 0 , z = 0 , prevZ = 0 , extrude = false ;
305
313
if ( typeof ( prevX ) === 'undefined' ) { prevX = 0 ; }
306
314
if ( typeof ( prevY ) === 'undefined' ) { prevY = 0 ; }
307
315
308
316
if ( ! model [ layer ] ) model [ layer ] = [ ] ;
309
- if ( typeof ( x ) !== 'undefined' || typeof ( y ) !== 'undefined' || typeof ( z ) !== 'undefined' ) model [ layer ] [ model [ layer ] . length ] = { x : x , y : y , z : z , extrude : extrude , retract : retract , extrusion : ( extrude || retract ) ?prev_extrude [ "abs" ] :0 , prevX : prevX , prevY : prevY , prevZ : prevZ , speed : lastF , gcodeLine : i } ;
317
+ if ( typeof ( x ) !== 'undefined' || typeof ( y ) !== 'undefined' || typeof ( z ) !== 'undefined' ) model [ layer ] [ model [ layer ] . length ] = { x : x , y : y , z : z , extrude : extrude , retract : retract , noMove : false , extrusion : ( extrude || retract ) ?prev_extrude [ "abs" ] :0 , prevX : prevX , prevY : prevY , prevZ : prevZ , speed : lastF , gcodeLine : i } ;
310
318
}
311
319
if ( typeof ( sendLayer ) !== "undefined" ) {
312
320
sendLayerToParent ( sendLayer , sendLayerZ , i / gcode . length * 100 ) ;
@@ -319,45 +327,48 @@ GCODE.worker = (function(){
319
327
} ;
320
328
321
329
322
- return {
323
- parseGCode : function ( message ) {
330
+ var parseGCode = function ( message ) {
324
331
gcode = message . gcode ;
325
332
firstReport = message . options . firstReport ;
326
333
327
334
328
335
doParse ( ) ;
336
+ gcode = [ ] ;
329
337
self . postMessage ( {
330
338
"cmd" : "returnModel" ,
331
339
"msg" : {
332
340
// model: model
333
341
}
334
342
} ) ;
335
343
336
- } ,
337
- runAnalyze : function ( message ) {
338
- analyzeModel ( ) ;
339
- } ,
340
- setOption : function ( options ) {
344
+ } ;
345
+
346
+ var runAnalyze = function ( message ) {
347
+ analyzeModel ( ) ;
348
+ model = [ ] ;
349
+ z_heights = [ ] ;
350
+ filamentByLayer = [ ] ;
351
+ speeds = [ ] ;
352
+ speedsByLayer = [ ] ;
353
+ } ;
354
+ var setOption = function ( options ) {
341
355
for ( var opt in options ) {
342
356
gCodeOptions [ opt ] = options [ opt ] ;
343
357
}
344
- }
345
- }
346
- } ( ) ) ;
347
-
358
+ } ;
348
359
349
360
onmessage = function ( e ) {
350
361
var data = e . data ;
351
-
362
+ // for some reason firefox doesn't garbage collect when something inside closures is deleted, so we delete and recreate whole object eaech time
352
363
switch ( data . cmd ) {
353
364
case 'parseGCode' :
354
- GCODE . worker . parseGCode ( data . msg ) ;
365
+ parseGCode ( data . msg ) ;
355
366
break ;
356
367
case 'setOption' :
357
- GCODE . worker . setOption ( data . msg ) ;
368
+ setOption ( data . msg ) ;
358
369
break ;
359
370
case 'analyzeModel' :
360
- GCODE . worker . runAnalyze ( data . msg ) ;
371
+ runAnalyze ( data . msg ) ;
361
372
break ;
362
373
363
374
default :
0 commit comments