fl-web-component 2.0.19-beta.3 → 2.1.1-beta.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 (34) hide show
  1. package/dist/fl-web-component.common.js +4417 -687
  2. package/dist/fl-web-component.common.js.map +1 -1
  3. package/dist/fl-web-component.css +1 -1
  4. package/package.json +1 -1
  5. package/packages/components/com-flcanvas/components/entityFormatting.js +134 -1
  6. package/packages/components/com-flcanvas/index.vue +335 -239
  7. package/packages/components/com-graphics/index.vue +333 -24
  8. package/src/utils/dxf-parser/AutoCadColorIndex.js +265 -0
  9. package/src/utils/dxf-parser/DimStyleCodes.js +33 -0
  10. package/src/utils/dxf-parser/DxfArrayScanner.js +151 -0
  11. package/src/utils/dxf-parser/DxfParser.js +918 -0
  12. package/src/utils/dxf-parser/ExtendedDataParser.js +117 -0
  13. package/src/utils/dxf-parser/LICENSE +21 -0
  14. package/src/utils/dxf-parser/ParseHelpers.js +140 -0
  15. package/src/utils/dxf-parser/README.md +8 -0
  16. package/src/utils/dxf-parser/entities/3dface.js +83 -0
  17. package/src/utils/dxf-parser/entities/arc.js +38 -0
  18. package/src/utils/dxf-parser/entities/attdef.js +89 -0
  19. package/src/utils/dxf-parser/entities/attribute.js +109 -0
  20. package/src/utils/dxf-parser/entities/circle.js +43 -0
  21. package/src/utils/dxf-parser/entities/dimension.js +71 -0
  22. package/src/utils/dxf-parser/entities/ellipse.js +48 -0
  23. package/src/utils/dxf-parser/entities/hatch.js +348 -0
  24. package/src/utils/dxf-parser/entities/insert.js +57 -0
  25. package/src/utils/dxf-parser/entities/line.js +34 -0
  26. package/src/utils/dxf-parser/entities/lwpolyline.js +103 -0
  27. package/src/utils/dxf-parser/entities/mtext.js +57 -0
  28. package/src/utils/dxf-parser/entities/point.js +35 -0
  29. package/src/utils/dxf-parser/entities/polyline.js +92 -0
  30. package/src/utils/dxf-parser/entities/solid.js +40 -0
  31. package/src/utils/dxf-parser/entities/spline.js +70 -0
  32. package/src/utils/dxf-parser/entities/text.js +50 -0
  33. package/src/utils/dxf-parser/entities/vertex.js +62 -0
  34. package/src/utils/threejs/measure-clear-distance.js +1 -1
@@ -0,0 +1,918 @@
1
+ import DxfArrayScanner from "./DxfArrayScanner.js";
2
+ import AUTO_CAD_COLOR_INDEX from "./AutoCadColorIndex.js";
3
+
4
+ import Face from "./entities/3dface.js";
5
+ import Arc from "./entities/arc.js";
6
+ import AttDef from "./entities/attdef.js";
7
+ import Attribute from "./entities/attribute.js"
8
+ import Circle from "./entities/circle.js";
9
+ import Dimension from "./entities/dimension.js";
10
+ import Ellipse from "./entities/ellipse.js";
11
+ import Insert from "./entities/insert.js";
12
+ import Line from "./entities/line.js";
13
+ import LWPolyline from "./entities/lwpolyline.js";
14
+ import MText from "./entities/mtext.js";
15
+ import Point from "./entities/point.js";
16
+ import Polyline from "./entities/polyline.js";
17
+ import Solid from "./entities/solid.js";
18
+ import Spline from "./entities/spline.js";
19
+ import Text from "./entities/text.js";
20
+ import Hatch from "./entities/hatch.js";
21
+ import dimStyleCodes from "./DimStyleCodes.js";
22
+ //import Vertex from "./entities/.js";
23
+
24
+ import log from 'loglevel';
25
+
26
+ //log.setLevel('trace');
27
+ //log.setLevel('debug');
28
+ //log.setLevel('info');
29
+ //log.setLevel('warn');
30
+ log.setLevel('error');
31
+ //log.setLevel('silent');
32
+
33
+ function registerDefaultEntityHandlers(dxfParser) {
34
+ // Supported entities here (some entity code is still being refactored into this flow)
35
+ dxfParser.registerEntityHandler(Face);
36
+ dxfParser.registerEntityHandler(Arc);
37
+ dxfParser.registerEntityHandler(AttDef);
38
+ dxfParser.registerEntityHandler(Attribute);
39
+ dxfParser.registerEntityHandler(Circle);
40
+ dxfParser.registerEntityHandler(Dimension);
41
+ dxfParser.registerEntityHandler(Ellipse);
42
+ dxfParser.registerEntityHandler(Insert);
43
+ dxfParser.registerEntityHandler(Line);
44
+ dxfParser.registerEntityHandler(LWPolyline);
45
+ dxfParser.registerEntityHandler(MText);
46
+ dxfParser.registerEntityHandler(Point);
47
+ dxfParser.registerEntityHandler(Polyline);
48
+ dxfParser.registerEntityHandler(Solid);
49
+ dxfParser.registerEntityHandler(Spline);
50
+ dxfParser.registerEntityHandler(Text);
51
+ dxfParser.registerEntityHandler(Hatch);
52
+ //dxfParser.registerEntityHandler(require('./entities/vertex'));
53
+ }
54
+
55
+ export default function DxfParser() {
56
+ this._entityHandlers = {};
57
+
58
+ registerDefaultEntityHandlers(this);
59
+ }
60
+
61
+ DxfParser.prototype.parse = function(source, done) {
62
+ throw new Error("read() not implemented. Use readSync()");
63
+ };
64
+
65
+ DxfParser.prototype.registerEntityHandler = function(handlerType) {
66
+ var instance = new handlerType();
67
+ this._entityHandlers[handlerType.ForEntityName] = instance;
68
+ }
69
+
70
+ DxfParser.prototype.parseSync = function(source) {
71
+ if(typeof(source) === 'string') {
72
+ return this._parse(source);
73
+ }else {
74
+ console.error('Cannot read DXF source of type `' + typeof(source));
75
+ return null;
76
+ }
77
+ };
78
+
79
+ DxfParser.prototype.parseStream = function(stream, done) {
80
+
81
+ var dxfString = "";
82
+ var self = this;
83
+
84
+ stream.on('data', onData);
85
+ stream.on('end', onEnd);
86
+ stream.on('error', onError);
87
+
88
+ function onData(chunk) {
89
+ dxfString += chunk;
90
+ }
91
+
92
+ function onEnd() {
93
+ try {
94
+ var dxf = self._parse(dxfString);
95
+ } catch(err) {
96
+ return done(err);
97
+ }
98
+ done(null, dxf);
99
+ }
100
+
101
+ function onError(err) {
102
+ done(err);
103
+ }
104
+ };
105
+
106
+ DxfParser.prototype._parse = function(dxfString) {
107
+ var scanner, curr, dxf = {}, lastHandle = 0;
108
+ var dxfLinesArray = dxfString.split(/\r\n|\r|\n/g);
109
+
110
+ scanner = new DxfArrayScanner(dxfLinesArray);
111
+ if (!scanner.hasNext()) {
112
+ throw Error('Empty file');
113
+ }
114
+
115
+ var self = this;
116
+
117
+ var parseAll = function() {
118
+ curr = scanner.next();
119
+ while(!scanner.isEOF()) {
120
+ if(curr.code === 0 && curr.value === 'SECTION') {
121
+ curr = scanner.next();
122
+
123
+ // Be sure we are reading a section code
124
+ if (curr.code !== 2) {
125
+ console.error('Unexpected code %s after 0:SECTION', debugCode(curr));
126
+ curr = scanner.next();
127
+ continue;
128
+ }
129
+
130
+ if (curr.value === 'HEADER') {
131
+ log.debug('> HEADER');
132
+ dxf.header = parseHeader();
133
+ log.debug('<');
134
+ } else if (curr.value === 'BLOCKS') {
135
+ log.debug('> BLOCKS');
136
+ dxf.blocks = parseBlocks();
137
+ log.debug('<');
138
+ } else if(curr.value === 'ENTITIES') {
139
+ log.debug('> ENTITIES');
140
+ dxf.entities = parseEntities(false);
141
+ log.debug('<');
142
+ } else if(curr.value === 'TABLES') {
143
+ log.debug('> TABLES');
144
+ dxf.tables = parseTables();
145
+ log.debug('<');
146
+ } else if(curr.value === 'EOF') {
147
+ log.debug('EOF');
148
+ } else {
149
+ log.warn('Skipping section \'%s\'', curr.value);
150
+ }
151
+ } else {
152
+ curr = scanner.next();
153
+ }
154
+ // If is a new section
155
+ }
156
+ };
157
+
158
+ var groupIs = function(code, value) {
159
+ return curr.code === code && curr.value === value;
160
+ };
161
+
162
+ /**
163
+ *
164
+ * @return {object} header
165
+ */
166
+ var parseHeader = function() {
167
+ // interesting variables:
168
+ // $ACADVER, $VIEWDIR, $VIEWSIZE, $VIEWCTR, $TDCREATE, $TDUPDATE
169
+ // http://www.autodesk.com/techpubs/autocad/acadr14/dxf/header_section_al_u05_c.htm
170
+ // Also see VPORT table entries
171
+ var currVarName = null, currVarValue = null;
172
+ var header = {};
173
+ // loop through header variables
174
+ curr = scanner.next();
175
+
176
+ while(true) {
177
+ if(groupIs(0, 'ENDSEC')) {
178
+ if (currVarName != null) header[currVarName] = currVarValue;
179
+ break;
180
+ } else if(curr.code === 9) {
181
+ if (currVarName != null) header[currVarName] = currVarValue;
182
+ currVarName = curr.value;
183
+ // Filter here for particular variables we are interested in
184
+ } else {
185
+ if(curr.code === 10) {
186
+ currVarValue = { x: curr.value };
187
+ } else if(curr.code === 20) {
188
+ currVarValue.y = curr.value;
189
+ } else if(curr.code === 30) {
190
+ currVarValue.z = curr.value;
191
+ } else {
192
+ currVarValue = curr.value;
193
+ }
194
+ }
195
+ curr = scanner.next();
196
+ }
197
+ // console.log(util.inspect(header, { colors: true, depth: null }));
198
+ curr = scanner.next(); // swallow up ENDSEC
199
+ return header;
200
+ };
201
+
202
+
203
+ /**
204
+ *
205
+ */
206
+ var parseBlocks = function() {
207
+ var blocks = {}, block;
208
+
209
+ curr = scanner.next();
210
+
211
+ while(curr.value !== 'EOF') {
212
+ if(groupIs(0, 'ENDSEC')) {
213
+ break;
214
+ }
215
+
216
+ if(groupIs(0, 'BLOCK')) {
217
+ log.debug('block {');
218
+ block = parseBlock();
219
+ log.debug('}');
220
+ ensureHandle(block);
221
+ if(!block.name)
222
+ log.error('block with handle "' + block.handle + '" is missing a name.');
223
+ else
224
+ blocks[block.name] = block;
225
+ } else {
226
+ logUnhandledGroup(curr);
227
+ curr = scanner.next();
228
+ }
229
+ }
230
+ return blocks;
231
+ };
232
+
233
+ var parseBlock = function() {
234
+ var block = {};
235
+ curr = scanner.next();
236
+
237
+ while(curr.value !== 'EOF') {
238
+ switch(curr.code) {
239
+ case 1:
240
+ block.xrefPath = curr.value;
241
+ curr = scanner.next();
242
+ break;
243
+ case 2:
244
+ block.name = curr.value;
245
+ curr = scanner.next();
246
+ break;
247
+ case 3:
248
+ block.name2 = curr.value;
249
+ curr = scanner.next();
250
+ break;
251
+ case 5:
252
+ block.handle = curr.value;
253
+ curr = scanner.next();
254
+ break;
255
+ case 8:
256
+ block.layer = curr.value;
257
+ curr = scanner.next();
258
+ break;
259
+ case 10:
260
+ block.position = parsePoint();
261
+ curr = scanner.next();
262
+ break;
263
+ case 67:
264
+ block.inPaperSpace = (curr.value && curr.value == 1) ? true : false;
265
+ curr = scanner.next();
266
+ break;
267
+ case 70:
268
+ if (curr.value != 0) {
269
+ //if(curr.value & BLOCK_ANONYMOUS_FLAG) console.log(' Anonymous block');
270
+ //if(curr.value & BLOCK_NON_CONSTANT_FLAG) console.log(' Non-constant attributes');
271
+ //if(curr.value & BLOCK_XREF_FLAG) console.log(' Is xref');
272
+ //if(curr.value & BLOCK_XREF_OVERLAY_FLAG) console.log(' Is xref overlay');
273
+ //if(curr.value & BLOCK_EXTERNALLY_DEPENDENT_FLAG) console.log(' Is externally dependent');
274
+ //if(curr.value & BLOCK_RESOLVED_OR_DEPENDENT_FLAG) console.log(' Is resolved xref or dependent of an xref');
275
+ //if(curr.value & BLOCK_REFERENCED_XREF) console.log(' This definition is a referenced xref');
276
+ block.type = curr.value;
277
+ }
278
+ curr = scanner.next();
279
+ break;
280
+ case 100:
281
+ // ignore class markers
282
+ curr = scanner.next();
283
+ break;
284
+ case 330:
285
+ block.ownerHandle = curr.value;
286
+ curr = scanner.next();
287
+ break;
288
+ case 0:
289
+ if(curr.value == 'ENDBLK')
290
+ break;
291
+ block.entities = parseEntities(true);
292
+ break;
293
+ default:
294
+ logUnhandledGroup(curr);
295
+ curr = scanner.next();
296
+ }
297
+
298
+ if(groupIs(0, 'ENDBLK')) {
299
+ curr = scanner.next();
300
+ break;
301
+ }
302
+ }
303
+ return block;
304
+ };
305
+
306
+ /**
307
+ * parseTables
308
+ * @return {Object} Object representing tables
309
+ */
310
+ var parseTables = function() {
311
+ var tables = {};
312
+ curr = scanner.next();
313
+ while(curr.value !== 'EOF') {
314
+ if(groupIs(0, 'ENDSEC'))
315
+ break;
316
+
317
+ if(groupIs(0, 'TABLE')) {
318
+ curr = scanner.next();
319
+
320
+ var tableDefinition = tableDefinitions[curr.value];
321
+ if(tableDefinition) {
322
+ log.debug(curr.value + ' Table {');
323
+ tables[tableDefinitions[curr.value].tableName] = parseTable();
324
+ log.debug('}');
325
+ } else {
326
+ log.debug('Unhandled Table ' + curr.value);
327
+ }
328
+ } else {
329
+ // else ignored
330
+ curr = scanner.next();
331
+ }
332
+ }
333
+
334
+ curr = scanner.next();
335
+ return tables;
336
+ };
337
+
338
+ const END_OF_TABLE_VALUE = 'ENDTAB';
339
+
340
+ var parseTable = function() {
341
+ var tableDefinition = tableDefinitions[curr.value],
342
+ table = {},
343
+ expectedCount = 0,
344
+ actualCount;
345
+
346
+ curr = scanner.next();
347
+ while(!groupIs(0, END_OF_TABLE_VALUE)) {
348
+
349
+ switch(curr.code) {
350
+ case 5:
351
+ table.handle = curr.value;
352
+ curr = scanner.next();
353
+ break;
354
+ case 330:
355
+ table.ownerHandle = curr.value;
356
+ curr = scanner.next();
357
+ break;
358
+ case 100:
359
+ if(curr.value === 'AcDbSymbolTable') {
360
+ // ignore
361
+ curr = scanner.next();
362
+ }else{
363
+ logUnhandledGroup(curr);
364
+ curr = scanner.next();
365
+ }
366
+ break;
367
+ case 70:
368
+ expectedCount = curr.value;
369
+ curr = scanner.next();
370
+ break;
371
+ case 0:
372
+ if(curr.value === tableDefinition.dxfSymbolName) {
373
+ table[tableDefinition.tableRecordsProperty] = tableDefinition.parseTableRecords();
374
+ } else {
375
+ logUnhandledGroup(curr);
376
+ curr = scanner.next();
377
+ }
378
+ break;
379
+ default:
380
+ logUnhandledGroup(curr);
381
+ curr = scanner.next();
382
+ }
383
+ }
384
+ var tableRecords = table[tableDefinition.tableRecordsProperty];
385
+ if (tableRecords) {
386
+ if(tableRecords.constructor === Array){
387
+ actualCount = tableRecords.length;
388
+ } else if(typeof(tableRecords) === 'object') {
389
+ actualCount = Object.keys(tableRecords).length;
390
+ }
391
+ if(expectedCount !== actualCount) {
392
+ log.warn(`Parsed ${actualCount} ${tableDefinition.dxfSymbolName}'s but expected ${expectedCount}`);
393
+ }
394
+ } else {
395
+ table[tableDefinition.tableRecordsProperty] = []
396
+ }
397
+ curr = scanner.next();
398
+ return table;
399
+ };
400
+
401
+ var parseViewPortRecords = function() {
402
+ var viewPorts = [], // Multiple table entries may have the same name indicating a multiple viewport configuration
403
+ viewPort = {};
404
+
405
+ log.debug('ViewPort {');
406
+ curr = scanner.next();
407
+ while(!groupIs(0, END_OF_TABLE_VALUE)) {
408
+
409
+ switch(curr.code) {
410
+ case 2: // layer name
411
+ viewPort.name = curr.value;
412
+ curr = scanner.next();
413
+ break;
414
+ case 10:
415
+ viewPort.lowerLeftCorner = parsePoint();
416
+ curr = scanner.next();
417
+ break;
418
+ case 11:
419
+ viewPort.upperRightCorner = parsePoint();
420
+ curr = scanner.next();
421
+ break;
422
+ case 12:
423
+ viewPort.center = parsePoint();
424
+ curr = scanner.next();
425
+ break;
426
+ case 13:
427
+ viewPort.snapBasePoint = parsePoint();
428
+ curr = scanner.next();
429
+ break;
430
+ case 14:
431
+ viewPort.snapSpacing = parsePoint();
432
+ curr = scanner.next();
433
+ break;
434
+ case 15:
435
+ viewPort.gridSpacing = parsePoint();
436
+ curr = scanner.next();
437
+ break;
438
+ case 16:
439
+ viewPort.viewDirectionFromTarget = parsePoint();
440
+ curr = scanner.next();
441
+ break;
442
+ case 17:
443
+ viewPort.viewTarget = parsePoint();
444
+ curr = scanner.next();
445
+ break;
446
+ case 42:
447
+ viewPort.lensLength = curr.value;
448
+ curr = scanner.next();
449
+ break;
450
+ case 43:
451
+ viewPort.frontClippingPlane = curr.value;
452
+ curr = scanner.next();
453
+ break;
454
+ case 44:
455
+ viewPort.backClippingPlane = curr.value;
456
+ curr = scanner.next();
457
+ break;
458
+ case 45:
459
+ viewPort.viewHeight = curr.value;
460
+ curr = scanner.next();
461
+ break;
462
+ case 50:
463
+ viewPort.snapRotationAngle = curr.value;
464
+ curr = scanner.next();
465
+ break;
466
+ case 51:
467
+ viewPort.viewTwistAngle = curr.value;
468
+ curr = scanner.next();
469
+ break;
470
+ case 79:
471
+ viewPort.orthographicType = curr.value;
472
+ curr = scanner.next();
473
+ break;
474
+ case 110:
475
+ viewPort.ucsOrigin = parsePoint();
476
+ curr = scanner.next();
477
+ break;
478
+ case 111:
479
+ viewPort.ucsXAxis = parsePoint();
480
+ curr = scanner.next();
481
+ break;
482
+ case 112:
483
+ viewPort.ucsYAxis = parsePoint();
484
+ curr = scanner.next();
485
+ break;
486
+ case 110:
487
+ viewPort.ucsOrigin = parsePoint();
488
+ curr = scanner.next();
489
+ break;
490
+ case 281:
491
+ viewPort.renderMode = curr.value;
492
+ curr = scanner.next();
493
+ break;
494
+ case 281:
495
+ // 0 is one distant light, 1 is two distant lights
496
+ viewPort.defaultLightingType = curr.value;
497
+ curr = scanner.next();
498
+ break;
499
+ case 292:
500
+ viewPort.defaultLightingOn = curr.value;
501
+ curr = scanner.next();
502
+ break;
503
+ case 330:
504
+ viewPort.ownerHandle = curr.value;
505
+ curr = scanner.next();
506
+ break;
507
+ case 63: // These are all ambient color. Perhaps should be a gradient when multiple are set.
508
+ case 421:
509
+ case 431:
510
+ viewPort.ambientColor = curr.value;
511
+ curr = scanner.next();
512
+ break;
513
+ case 0:
514
+ // New ViewPort
515
+ if(curr.value === 'VPORT') {
516
+ log.debug('}');
517
+ viewPorts.push(viewPort);
518
+ log.debug('ViewPort {');
519
+ viewPort = {};
520
+ curr = scanner.next();
521
+ }
522
+ break;
523
+ default:
524
+ logUnhandledGroup(curr);
525
+ curr = scanner.next();
526
+ break;
527
+ }
528
+ }
529
+ // Note: do not call scanner.next() here,
530
+ // parseTable() needs the current group
531
+ log.debug('}');
532
+ viewPorts.push(viewPort);
533
+
534
+ return viewPorts;
535
+ };
536
+
537
+ var parseLineTypes = function() {
538
+ var ltypes = {},
539
+ ltypeName,
540
+ ltype = {},
541
+ length;
542
+
543
+ log.debug('LType {');
544
+ curr = scanner.next();
545
+ while(!groupIs(0, 'ENDTAB')) {
546
+
547
+ switch(curr.code) {
548
+ case 2:
549
+ ltype.name = curr.value;
550
+ ltypeName = curr.value;
551
+ curr = scanner.next();
552
+ break;
553
+ case 3:
554
+ ltype.description = curr.value;
555
+ curr = scanner.next();
556
+ break;
557
+ case 73: // Number of elements for this line type (dots, dashes, spaces);
558
+ length = curr.value;
559
+ if(length > 0) ltype.pattern = [];
560
+ curr = scanner.next();
561
+ break;
562
+ case 40: // total pattern length
563
+ ltype.patternLength = curr.value;
564
+ curr = scanner.next();
565
+ break;
566
+ case 49:
567
+ ltype.pattern.push(curr.value);
568
+ curr = scanner.next();
569
+ break;
570
+ case 0:
571
+ log.debug('}');
572
+ if (length > 0 && length !== ltype.pattern.length) {
573
+ log.warn('lengths do not match on LTYPE pattern');
574
+ }
575
+ ltypes[ltypeName] = ltype;
576
+ ltype = {};
577
+ log.debug('LType {');
578
+ curr = scanner.next();
579
+ break;
580
+ default:
581
+ curr = scanner.next();
582
+ }
583
+ }
584
+
585
+ log.debug('}');
586
+ ltypes[ltypeName] = ltype;
587
+ return ltypes;
588
+ };
589
+
590
+ var parseLayers = function() {
591
+ var layers = {},
592
+ layerName,
593
+ layer = {};
594
+
595
+ log.debug('Layer {');
596
+ curr = scanner.next();
597
+ while(!groupIs(0, 'ENDTAB')) {
598
+
599
+ switch(curr.code) {
600
+ case 2: // layer name
601
+ layer.name = curr.value;
602
+ layerName = curr.value;
603
+ curr = scanner.next();
604
+ break;
605
+ case 62: // color, visibility
606
+ layer.visible = curr.value >= 0;
607
+ // TODO 0 and 256 are BYBLOCK and BYLAYER respectively. Need to handle these values for layers?.
608
+ layer.colorIndex = Math.abs(curr.value);
609
+ layer.color = getAcadColor(layer.colorIndex);
610
+ curr = scanner.next();
611
+ break;
612
+ case 70: // frozen layer
613
+ layer.frozen = ((curr.value & 1) !== 0 || (curr.value & 2) !== 0);
614
+ curr = scanner.next();
615
+ break;
616
+ case 420: // TrueColor Color
617
+ layer.color = curr.value;
618
+ curr = scanner.next();
619
+ break;
620
+ case 0:
621
+ // New Layer
622
+ if(curr.value === 'LAYER') {
623
+ log.debug('}');
624
+ layers[layerName] = layer;
625
+ log.debug('Layer {');
626
+ layer = {};
627
+ layerName = undefined;
628
+ curr = scanner.next();
629
+ }
630
+ break;
631
+ default:
632
+ logUnhandledGroup(curr);
633
+ curr = scanner.next();
634
+ break;
635
+ }
636
+ }
637
+ // Note: do not call scanner.next() here,
638
+ // parseLayerTable() needs the current group
639
+ log.debug('}');
640
+ layers[layerName] = layer;
641
+
642
+ return layers;
643
+ };
644
+
645
+ var parseDimStyles = function() {
646
+ var dimStyles = {},
647
+ styleName,
648
+ style = {};
649
+
650
+ log.debug('DimStyle {');
651
+ curr = scanner.next();
652
+ while(!groupIs(0, 'ENDTAB')) {
653
+
654
+ if (dimStyleCodes.has(curr.code)) {
655
+ style[dimStyleCodes.get(curr.code)] = curr.value
656
+ curr = scanner.next();
657
+ } else {
658
+ switch(curr.code) {
659
+ case 2: // style name
660
+ style.name = curr.value;
661
+ styleName = curr.value;
662
+ curr = scanner.next();
663
+ break;
664
+ case 0:
665
+ // New style
666
+ if(curr.value === 'DIMSTYLE') {
667
+ log.debug('}');
668
+ dimStyles[styleName] = style;
669
+ log.debug('DimStyle {');
670
+ style = {};
671
+ styleName = undefined;
672
+ curr = scanner.next();
673
+ }
674
+ break;
675
+ default:
676
+ logUnhandledGroup(curr);
677
+ curr = scanner.next();
678
+ break;
679
+ }
680
+ }
681
+ }
682
+ // Note: do not call scanner.next() here,
683
+ // parseLayerTable() needs the current group
684
+ log.debug('}');
685
+ dimStyles[styleName] = style;
686
+
687
+ return dimStyles;
688
+ };
689
+
690
+ var parseStyles = function () {
691
+ var styles = {};
692
+ var style = {};
693
+ var styleName;
694
+
695
+ log.debug('Style {');
696
+ curr = scanner.next();
697
+ while (!groupIs(0, END_OF_TABLE_VALUE)) {
698
+ switch (curr.code) {
699
+ case 100:
700
+ style.subClassMarker = curr.value;
701
+ curr = scanner.next();
702
+ break;
703
+ case 2:
704
+ style.styleName = curr.value;
705
+ styleName = curr.value;
706
+ curr = scanner.next();
707
+ break;
708
+ case 70:
709
+ style.standardFlag = curr.value;
710
+ curr = scanner.next();
711
+ break;
712
+ case 40:
713
+ style.fixedTextHeight = curr.value;
714
+ curr = scanner.next();
715
+ break;
716
+ case 41:
717
+ style.widthFactor = curr.value;
718
+ curr = scanner.next();
719
+ break;
720
+ case 50:
721
+ style.obliqueAngle = curr.value;
722
+ curr = scanner.next();
723
+ break;
724
+ case 71:
725
+ style.textGenerationFlag = curr.value;
726
+ curr = scanner.next();
727
+ break;
728
+ case 42:
729
+ style.lastHeight = curr.value;
730
+ curr = scanner.next();
731
+ break;
732
+ case 3:
733
+ style.font = curr.value;
734
+ curr = scanner.next();
735
+ break;
736
+ case 4:
737
+ style.bigFont = curr.value;
738
+ curr = scanner.next();
739
+ break;
740
+ case 1071:
741
+ style.extendedFont = curr.value;
742
+ curr = scanner.next();
743
+ break;
744
+ case 0:
745
+ if (curr.value === 'STYLE') {
746
+ log.debug('}');
747
+ styles[styleName] = style;
748
+ log.debug('Style {');
749
+ style = {};
750
+ styleName = undefined;
751
+ curr = scanner.next();
752
+ }
753
+ break;
754
+ default:
755
+ logUnhandledGroup(curr);
756
+ curr = scanner.next();
757
+ break;
758
+ }
759
+ }
760
+ log.debug('}');
761
+ styles[styleName] = style;
762
+ return styles;
763
+ };
764
+
765
+ var tableDefinitions = {
766
+ VPORT: {
767
+ tableRecordsProperty: 'viewPorts',
768
+ tableName: 'viewPort',
769
+ dxfSymbolName: 'VPORT',
770
+ parseTableRecords: parseViewPortRecords
771
+ },
772
+ LTYPE: {
773
+ tableRecordsProperty: 'lineTypes',
774
+ tableName: 'lineType',
775
+ dxfSymbolName: 'LTYPE',
776
+ parseTableRecords: parseLineTypes
777
+ },
778
+ LAYER: {
779
+ tableRecordsProperty: 'layers',
780
+ tableName: 'layer',
781
+ dxfSymbolName: 'LAYER',
782
+ parseTableRecords: parseLayers
783
+ },
784
+ DIMSTYLE: {
785
+ tableRecordsProperty: 'dimStyles',
786
+ tableName: 'dimstyle',
787
+ dxfSymbolName: 'DIMSTYLE',
788
+ parseTableRecords: parseDimStyles
789
+ },
790
+ STYLE: {
791
+ tableRecordsProperty: 'styles',
792
+ tableName: 'style',
793
+ dxfSymbolName: 'STYLE',
794
+ parseTableRecords: parseStyles,
795
+ },
796
+ };
797
+
798
+ /**
799
+ * Is called after the parser first reads the 0:ENTITIES group. The scanner
800
+ * should be on the start of the first entity already.
801
+ * @return {Array} the resulting entities
802
+ */
803
+ var parseEntities = function(forBlock) {
804
+ var entities = [];
805
+
806
+ var endingOnValue = forBlock ? 'ENDBLK' : 'ENDSEC';
807
+
808
+ if (!forBlock) {
809
+ curr = scanner.next();
810
+ }
811
+ while(true) {
812
+
813
+ if(curr.code === 0) {
814
+ if(curr.value === endingOnValue) {
815
+ break;
816
+ }
817
+
818
+ var entity;
819
+ var handler = self._entityHandlers[curr.value];
820
+ if (handler != null) {
821
+ log.debug(curr.value + ' {');
822
+ entity = handler.parseEntity(scanner, curr);
823
+ curr = scanner.lastReadGroup;
824
+ log.debug('}');
825
+ } else {
826
+ log.warn('Unhandled entity ' + curr.value);
827
+ curr = scanner.next();
828
+ continue;
829
+ }
830
+ ensureHandle(entity);
831
+ entities.push(entity);
832
+ } else {
833
+ // ignored lines from unsupported entity
834
+ curr = scanner.next();
835
+ }
836
+ }
837
+ if (endingOnValue == 'ENDSEC') {
838
+ curr = scanner.next(); // swallow up ENDSEC, but not ENDBLK
839
+ }
840
+ return entities;
841
+ };
842
+
843
+ /**
844
+ * Parses a 2D or 3D point, returning it as an object with x, y, and
845
+ * (sometimes) z property if it is 3D. It is assumed the current group
846
+ * is x of the point being read in, and scanner.next() will return the
847
+ * y. The parser will determine if there is a z point automatically.
848
+ * @return {Object} The 2D or 3D point as an object with x, y[, z]
849
+ */
850
+ var parsePoint = function() {
851
+ var point = {},
852
+ code = curr.code;
853
+
854
+ point.x = curr.value;
855
+
856
+ code += 10;
857
+ curr = scanner.next();
858
+ if(curr.code != code)
859
+ throw new Error('Expected code for point value to be ' + code +
860
+ ' but got ' + curr.code + '.');
861
+ point.y = curr.value;
862
+
863
+ code += 10;
864
+ curr = scanner.next();
865
+ if(curr.code != code)
866
+ {
867
+ scanner.rewind();
868
+ return point;
869
+ }
870
+ point.z = curr.value;
871
+
872
+ return point;
873
+ };
874
+
875
+ var ensureHandle = function(entity) {
876
+ if (!entity) {
877
+ throw new TypeError('entity cannot be undefined or null');
878
+ }
879
+
880
+ if (!entity.handle) {
881
+ entity.handle = lastHandle++;
882
+ }
883
+ }
884
+
885
+ parseAll();
886
+ return dxf;
887
+ };
888
+
889
+ function logUnhandledGroup(curr) {
890
+ log.debug('unhandled group ' + debugCode(curr));
891
+ }
892
+
893
+
894
+ function debugCode(curr) {
895
+ return curr.code + ':' + curr.value;
896
+ }
897
+
898
+ /**
899
+ * Returns the truecolor value of the given AutoCad color index value
900
+ * @return {Number} truecolor value as a number
901
+ */
902
+ function getAcadColor(index) {
903
+ return AUTO_CAD_COLOR_INDEX[index];
904
+ }
905
+
906
+ const BLOCK_ANONYMOUS_FLAG = 1;
907
+ const BLOCK_NON_CONSTANT_FLAG = 2;
908
+ const BLOCK_XREF_FLAG = 4;
909
+ const BLOCK_XREF_OVERLAY_FLAG = 8;
910
+ const BLOCK_EXTERNALLY_DEPENDENT_FLAG = 16;
911
+ const BLOCK_RESOLVED_OR_DEPENDENT_FLAG = 32;
912
+ const BLOCK_REFERENCED_XREF = 64;
913
+
914
+
915
+ /* Notes */
916
+ // Code 6 of an entity indicates inheritance of properties (eg. color).
917
+ // BYBLOCK means inherits from block
918
+ // BYLAYER (default) mean inherits from layer