Statistics
| Revision:

root / trunk / libraries / libDwg / src / com / iver / cit / jdwglib / dwg / readers / DwgFileV14Reader.java @ 10183

History | View | Annotate | Download (65.2 KB)

1
/* jdwglib. Java Library for reading Dwg files.
2
 * 
3
 * Author: Jose Morell Rama (jose.morell@gmail.com).
4
 * Port from the Pythoncad Dwg library by Art Haas.
5
 *
6
 * Copyright (C) 2005 Jose Morell, IVER TI S.A. and Generalitat Valenciana
7
 *
8
 * This program is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU General Public License
10
 * as published by the Free Software Foundation; either version 2
11
 * of the License, or (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program; if not, write to the Free Software
20
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
21
 *
22
 * For more information, contact:
23
 *
24
 * Jose Morell (jose.morell@gmail.com)
25
 * 
26
 * or
27
 *
28
 * IVER TI S.A.
29
 *  C/Salamanca, 50
30
 *  46005 Valencia
31
 *  Spain
32
 *  +34 963163400
33
 *  dac@iver.es
34
 */
35
package com.iver.cit.jdwglib.dwg.readers;
36

    
37
import java.io.IOException;
38
import java.nio.ByteBuffer;
39
import java.nio.ByteOrder;
40
import java.util.ArrayList;
41
import java.util.List;
42

    
43
import org.apache.log4j.Logger;
44

    
45
import com.iver.cit.jdwglib.dwg.CorruptedDwgEntityException;
46
import com.iver.cit.jdwglib.dwg.DwgClass;
47
import com.iver.cit.jdwglib.dwg.DwgFile;
48
import com.iver.cit.jdwglib.dwg.DwgHandleReference;
49
import com.iver.cit.jdwglib.dwg.DwgObject;
50
import com.iver.cit.jdwglib.dwg.DwgObjectFactory;
51
import com.iver.cit.jdwglib.dwg.DwgObjectOffset;
52
import com.iver.cit.jdwglib.dwg.DwgUtil;
53
import com.iver.cit.jdwglib.dwg.objects.DwgLwPolyline;
54

    
55
/**
56
 * The DwgFileV14Reader reads the DWG version 14 format
57
 * 
58
 * @author jmorell
59
 */
60
public class DwgFileV14Reader implements IDwgFileReader {
61

    
62
        protected DwgFile dwgFile;
63
        protected ByteBuffer bb;
64
        
65
        private boolean debug = true;
66
        
67
        private static Logger logger = Logger.
68
                getLogger(DwgFileV14Reader.class.getName());
69
        
70
        
71
        int numPolylinesWrong = 0;
72
        
73
        /**
74
         * Reads the DWG version 15 format
75
         * 
76
         * @param dwgFile Represents the DWG file that we want to read
77
     * @throws IOException When DWG file path is wrong
78
         */
79
        public void read(DwgFile dwgFile, ByteBuffer bb) throws IOException {
80
                this.dwgFile = dwgFile;
81
                this.bb = bb;
82
                try {
83
                        readDwgSectionOffsets();
84
                        if(debug){
85
                                readHeaders();
86
                                readDwgClasses();
87
                        }        
88
                        readDwgObjectOffsets();                
89
                        readDwgObjects();
90
                } catch (Exception e) {
91
                        e.printStackTrace();
92
                        logger.error(e);
93
                }
94
                
95
        }
96
        
97
        /**
98
         * It reads all HEADER section of a DWG 13-14 file.
99
         * 
100
         * This method must be called only for debug purposes because we dont the meaning
101
         * (or the practical application) of the fields readed with it
102
         * 
103
         * TODO Pasarlo a la clase abstracta comun que se haga de las versiones 15, 13-14
104
         * (la cabecera es la misma practicamente)
105
         * 
106
         * 
107
         * */
108
        protected void readHeaders(){
109
                
110
                int offset = dwgFile.getDwgSectionOffset("HEADERS");
111
                bb.position(offset);
112
                
113
                
114
                //1? leemos el sentinnel inicial
115
                bb.order(ByteOrder.nativeOrder());
116
                byte[] sentinel = new byte[16];
117
                bb.get(sentinel);
118
                
119
                if(sentinel[0] != 0xcf)
120
                        logger.warn("sentinel[0] != 0xcf");
121
                if(sentinel[1] != 0x7b)
122
                        logger.warn("sentinel[1] != 0x7b");
123
                if(sentinel[2] != 0x1f)
124
                        logger.warn("sentinel[2] != 0x1f");
125
                if(sentinel[3] != 0x23)
126
                        logger.warn("sentinel[3] != 0x23");
127
                if(sentinel[4] != 0xfd)
128
                        logger.warn("sentinel[4] != 0xfd");
129
                if(sentinel[5] != 0xde)
130
                        logger.warn("sentinel[5] != 0xde");
131
                if(sentinel[6] != 0x38)
132
                        logger.warn("sentinel[6] != 0x38");
133
                if(sentinel[7] != 0xa9)
134
                        logger.warn("sentinel[7] != 0xa9");
135
                if(sentinel[8] != 0x5f)
136
                        logger.warn("sentinel[8] != 0x5f");
137
                if(sentinel[9] != 0x7c)
138
                        logger.warn("sentinel[9] != 0x7c");
139
                if(sentinel[10] != 0x68)
140
                        logger.warn("sentinel[10] != 0x68");
141
                if(sentinel[11] != 0xb8)
142
                        logger.warn("sentinel[11] != 0xb8");
143
                if(sentinel[12] != 0x4e)
144
                        logger.warn("sentinel[12] != 0x4e");
145
                if(sentinel[13] != 0x6d)
146
                        logger.warn("sentinel[13] != 0x6d");
147
                if(sentinel[14] != 0x33)
148
                        logger.warn("sentinel[14] != 0x33");
149
                if(sentinel[15] != 0x5f)
150
                        logger.warn("sentinel[15] != 0x5f");
151
        
152
                
153
                //2? seguidamente leemos los datos
154
                bb.order(ByteOrder.LITTLE_ENDIAN);
155
                int size = bb.getInt();
156
                
157
                bb.order(ByteOrder.nativeOrder());
158
                byte[] data = new byte[size];
159
                bb.get(data);
160
                
161
                int[] intData = DwgUtil.toIntArray(data);
162
                
163
                
164
                //3? a continuacion el CRC de la seccion HEADER
165
                bb.order(ByteOrder.LITTLE_ENDIAN);
166
                short crc = bb.getShort();
167
                
168
                //Por ultimo, el sentinnel final
169
                bb.order(ByteOrder.nativeOrder());
170
                byte[] lastSentinnel = new byte[16];
171
                bb.get(lastSentinnel);
172
                if(lastSentinnel[0] != 0x30)
173
                        logger.warn("lastSentinnel[0] != 0x30");
174
                if(lastSentinnel[1] != 0x84)
175
                        logger.warn("lastSentinnel[1] != 0x84");
176
                if(lastSentinnel[2] != 0xe0)
177
                        logger.warn("lastSentinnel[2] != 0xe0");
178
                if(lastSentinnel[3] != 0xdc)
179
                        logger.warn("lastSentinnel[3] != 0xdc");
180
                if(lastSentinnel[4] != 0x02)
181
                        logger.warn("lastSentinnel[4] != 0x02");
182
                if(lastSentinnel[5] != 0x21)
183
                        logger.warn("lastSentinnel[5] != 0x21");
184
                if(lastSentinnel[6] != 0xc7)
185
                        logger.warn("lastSentinnel[6] != 0xc7");
186
                if(lastSentinnel[7] != 0x56)
187
                        logger.warn("lastSentinnel[7] != 0x56");
188
                if(lastSentinnel[8] != 0xa0)
189
                        logger.warn("lastSentinnel[8] != 0xa0");
190
                if(lastSentinnel[9] != 0x83)
191
                        logger.warn("lastSentinnel[9] != 0x83");
192
                if(lastSentinnel[10] != 0x97)
193
                        logger.warn("lastSentinnel[10] != 0x97");
194
                if(lastSentinnel[11] != 0x47)
195
                        logger.warn("lastSentinnel[11] != 0x47");
196
                if(lastSentinnel[12] != 0xb1)
197
                        logger.warn("lastSentinnel[12] != 0xb1");
198
                if(lastSentinnel[13] != 0x92)
199
                        logger.warn("lastSentinnel[13] != 0x92");
200
                if(lastSentinnel[14] != 0xcc)
201
                        logger.warn("lastSentinnel[14] != 0xcc");
202
                if(lastSentinnel[15] != 0xa0)
203
                        logger.warn("lastSentinnel[15] != 0xa0");
204
                
205
                //Ahora interpretamos los datos en bruto
206
                int bitPos = 0;
207
                try {
208
                        List val = DwgUtil.getBitDouble(intData, bitPos);
209
                        bitPos = ((Integer)val.get(0)).intValue();
210
                        dwgFile.setHeader("VAL1", val.get(1));
211

    
212
                        val = DwgUtil.getBitDouble(intData, bitPos);
213
                        bitPos = ((Integer)val.get(0)).intValue();
214
                        dwgFile.setHeader("VAL2", val.get(1));
215
                        
216
                        val = DwgUtil.getBitDouble(intData, bitPos);
217
                        bitPos = ((Integer)val.get(0)).intValue();
218
                        dwgFile.setHeader("VAL3", val.get(1));
219
                        
220
                        val = DwgUtil.getBitDouble(intData, bitPos);
221
                        bitPos = ((Integer)val.get(0)).intValue();
222
                        dwgFile.setHeader("VAL4", val.get(1));
223
                        
224
                        val = DwgUtil.getTextString(intData, bitPos);
225
                        bitPos = ((Integer)val.get(0)).intValue();
226
                        dwgFile.setHeader("STRING1", val.get(1));
227
                        
228
                        val = DwgUtil.getTextString(intData, bitPos);
229
                        bitPos = ((Integer)val.get(0)).intValue();
230
                        dwgFile.setHeader("STRING2", val.get(1));
231
                        
232
                        val = DwgUtil.getTextString(intData, bitPos);
233
                        bitPos = ((Integer)val.get(0)).intValue();
234
                        dwgFile.setHeader("STRING3", val.get(1));
235
                        
236
                        val = DwgUtil.getTextString(intData, bitPos);
237
                        bitPos = ((Integer)val.get(0)).intValue();
238
                        dwgFile.setHeader("STRING4", val.get(1));
239
                        
240
                        val = DwgUtil.getBitLong(intData, bitPos);
241
                        bitPos = ((Integer)val.get(0)).intValue();
242
                        dwgFile.setHeader("LONG1", val.get(1));
243
                        
244
                        val = DwgUtil.getBitLong(intData, bitPos);
245
                        bitPos = ((Integer)val.get(0)).intValue();
246
                        dwgFile.setHeader("LONG2", val.get(1));
247
                        
248
                        val = DwgUtil.getBitShort(intData, bitPos);
249
                        bitPos = ((Integer)val.get(0)).intValue();
250
                        dwgFile.setHeader("SHORT1", val.get(1));
251

    
252
                        //TODO Los handle se leen asi??
253
                        val = DwgUtil.getHandle(intData, bitPos);
254
                        bitPos = ((Integer)val.get(0)).intValue();
255
                        dwgFile.setHeader("HANDLE1", val.get(1));
256
                        
257
                        val = DwgUtil.testBit(intData, bitPos);
258
                        bitPos = ((Integer)val.get(0)).intValue();
259
                        dwgFile.setHeader("DIMASO", val.get(1));
260
                        
261
                        val = DwgUtil.testBit(intData, bitPos);
262
                        bitPos = ((Integer)val.get(0)).intValue();
263
                        dwgFile.setHeader("DIMSHO", val.get(1));
264
                        
265
                        val = DwgUtil.testBit(intData, bitPos);
266
                        bitPos = ((Integer)val.get(0)).intValue();
267
                        dwgFile.setHeader("DIMSAV", val.get(1));
268
                        
269
                        val = DwgUtil.testBit(intData, bitPos);
270
                        bitPos = ((Integer)val.get(0)).intValue();
271
                        dwgFile.setHeader("PLINEGEN", val.get(1));
272
                        
273
                        val = DwgUtil.testBit(intData, bitPos);
274
                        bitPos = ((Integer)val.get(0)).intValue();
275
                        dwgFile.setHeader("ORTHOMODE", val.get(1));
276
                        
277
                        val = DwgUtil.testBit(intData, bitPos);
278
                        bitPos = ((Integer)val.get(0)).intValue();
279
                        dwgFile.setHeader("REGENMODE", val.get(1));
280
                        
281
                        val = DwgUtil.testBit(intData, bitPos);
282
                        bitPos = ((Integer)val.get(0)).intValue();
283
                        dwgFile.setHeader("FILLMODE", val.get(1));
284
                        
285
                        val = DwgUtil.testBit(intData, bitPos);
286
                        bitPos = ((Integer)val.get(0)).intValue();
287
                        dwgFile.setHeader("QTEXTMODE", val.get(1));
288
                        
289
                        val = DwgUtil.testBit(intData, bitPos);
290
                        bitPos = ((Integer)val.get(0)).intValue();
291
                        dwgFile.setHeader("PSLTSCALE", val.get(1));
292
                        
293
                        val = DwgUtil.testBit(intData, bitPos);
294
                        bitPos = ((Integer)val.get(0)).intValue();
295
                        dwgFile.setHeader("LIMCHECK", val.get(1));
296
                        
297
                        val = DwgUtil.testBit(intData, bitPos);
298
                        bitPos = ((Integer)val.get(0)).intValue();
299
                        dwgFile.setHeader("BLIPMODE", val.get(1));
300
                        
301
                        val = DwgUtil.testBit(intData, bitPos);
302
                        bitPos = ((Integer)val.get(0)).intValue();
303
                        dwgFile.setHeader("USER_TIMER", val.get(1));
304
                        
305
                        val = DwgUtil.testBit(intData, bitPos);
306
                        bitPos = ((Integer)val.get(0)).intValue();
307
                        dwgFile.setHeader("SKPOLY", val.get(1));
308
                        
309
                        val = DwgUtil.testBit(intData, bitPos);
310
                        bitPos = ((Integer)val.get(0)).intValue();
311
                        dwgFile.setHeader("ANGDIR", val.get(1));
312
                        
313
                        val = DwgUtil.testBit(intData, bitPos);
314
                        bitPos = ((Integer)val.get(0)).intValue();
315
                        dwgFile.setHeader("SPLFRAME", val.get(1));
316
                        
317
                        val = DwgUtil.testBit(intData, bitPos);
318
                        bitPos = ((Integer)val.get(0)).intValue();
319
                        dwgFile.setHeader("ATTREQ", val.get(1));
320
                        
321
                        val = DwgUtil.testBit(intData, bitPos);
322
                        bitPos = ((Integer)val.get(0)).intValue();
323
                        dwgFile.setHeader("ATTDIA", val.get(1));
324
                        
325
                        val = DwgUtil.testBit(intData, bitPos);
326
                        bitPos = ((Integer)val.get(0)).intValue();
327
                        dwgFile.setHeader("MIRRTEXT", val.get(1));
328
                        
329
                        val = DwgUtil.testBit(intData, bitPos);
330
                        bitPos = ((Integer)val.get(0)).intValue();
331
                        dwgFile.setHeader("WORLDVIEW", val.get(1));
332
                        
333
                        val = DwgUtil.testBit(intData, bitPos);
334
                        bitPos = ((Integer)val.get(0)).intValue();
335
                        dwgFile.setHeader("WIREFRAME", val.get(1));
336
                        
337
                        val = DwgUtil.testBit(intData, bitPos);
338
                        bitPos = ((Integer)val.get(0)).intValue();
339
                        dwgFile.setHeader("TILEMODE", val.get(1));
340
                        
341
                        val = DwgUtil.testBit(intData, bitPos);
342
                        bitPos = ((Integer)val.get(0)).intValue();
343
                        dwgFile.setHeader("PLIMCHECK", val.get(1));
344
                        
345
                        val = DwgUtil.testBit(intData, bitPos);
346
                        bitPos = ((Integer)val.get(0)).intValue();
347
                        dwgFile.setHeader("VISRETAIN", val.get(1));
348
                        
349
                        val = DwgUtil.testBit(intData, bitPos);
350
                        bitPos = ((Integer)val.get(0)).intValue();
351
                        dwgFile.setHeader("DELOBJ", val.get(1));
352
                        
353
                        val = DwgUtil.testBit(intData, bitPos);
354
                        bitPos = ((Integer)val.get(0)).intValue();
355
                        dwgFile.setHeader("DISPSILH", val.get(1));
356
                        
357
                        val = DwgUtil.testBit(intData, bitPos);
358
                        bitPos = ((Integer)val.get(0)).intValue();
359
                        dwgFile.setHeader("PELLISE", val.get(1));
360
                        
361
                        val = DwgUtil.getBitShort(intData, bitPos);
362
                        bitPos = ((Integer)val.get(0)).intValue();
363
                        if(dwgFile.getDwgVersion() == "R14")
364
                                dwgFile.setHeader("PROXYGRAPH", val.get(1));
365
                        else
366
                                dwgFile.setHeader("SAVEIMAGES", val.get(1));
367
                        
368
                        val = DwgUtil.getBitShort(intData, bitPos);
369
                        bitPos = ((Integer)val.get(0)).intValue();
370
                        dwgFile.setHeader("DRAGMODE", val.get(1));
371
                        
372
                        val = DwgUtil.getBitShort(intData, bitPos);
373
                        bitPos = ((Integer)val.get(0)).intValue();
374
                        dwgFile.setHeader("TREEDEPTH", val.get(1));
375
                        
376
                        val = DwgUtil.getBitShort(intData, bitPos);
377
                        bitPos = ((Integer)val.get(0)).intValue();
378
                        dwgFile.setHeader("LUNITS", val.get(1));
379
                        
380
                        val = DwgUtil.getBitShort(intData, bitPos);
381
                        bitPos = ((Integer)val.get(0)).intValue();
382
                        dwgFile.setHeader("LUPREC", val.get(1));
383
                        
384
                        val = DwgUtil.getBitShort(intData, bitPos);
385
                        bitPos = ((Integer)val.get(0)).intValue();
386
                        dwgFile.setHeader("AUNITS", val.get(1));
387
                        
388
                        val = DwgUtil.getBitShort(intData, bitPos);
389
                        bitPos = ((Integer)val.get(0)).intValue();
390
                        dwgFile.setHeader("AUPREC", val.get(1));
391
                        
392
                        val = DwgUtil.getBitShort(intData, bitPos);
393
                        bitPos = ((Integer)val.get(0)).intValue();
394
                        dwgFile.setHeader("OSMODE", val.get(1));
395
                        
396
                        val = DwgUtil.getBitShort(intData, bitPos);
397
                        bitPos = ((Integer)val.get(0)).intValue();
398
                        dwgFile.setHeader("ATTMODE", val.get(1));
399
                        
400
                        val = DwgUtil.getBitShort(intData, bitPos);
401
                        bitPos = ((Integer)val.get(0)).intValue();
402
                        dwgFile.setHeader("COORDS", val.get(1));
403
                        
404
                        val = DwgUtil.getBitShort(intData, bitPos);
405
                        bitPos = ((Integer)val.get(0)).intValue();
406
                        dwgFile.setHeader("PDMODE", val.get(1));
407
                        
408
                        val = DwgUtil.getBitShort(intData, bitPos);
409
                        bitPos = ((Integer)val.get(0)).intValue();
410
                        dwgFile.setHeader("PICKSTYLE", val.get(1));
411
                        
412
                        val = DwgUtil.getBitShort(intData, bitPos);
413
                        bitPos = ((Integer)val.get(0)).intValue();
414
                        dwgFile.setHeader("USERI1", val.get(1));
415
                        
416
                        val = DwgUtil.getBitShort(intData, bitPos);
417
                        bitPos = ((Integer)val.get(0)).intValue();
418
                        dwgFile.setHeader("USERI2", val.get(1));
419
                        
420
                        val = DwgUtil.getBitShort(intData, bitPos);
421
                        bitPos = ((Integer)val.get(0)).intValue();
422
                        dwgFile.setHeader("USERI3", val.get(1));
423
                        
424
                        val = DwgUtil.getBitShort(intData, bitPos);
425
                        bitPos = ((Integer)val.get(0)).intValue();
426
                        dwgFile.setHeader("USERI4", val.get(1));
427
                        
428
                        val = DwgUtil.getBitShort(intData, bitPos);
429
                        bitPos = ((Integer)val.get(0)).intValue();
430
                        dwgFile.setHeader("USERI5", val.get(1));
431
                        
432
                        val = DwgUtil.getBitShort(intData, bitPos);
433
                        bitPos = ((Integer)val.get(0)).intValue();
434
                        dwgFile.setHeader("SPLINESEGS", val.get(1));
435
                        
436
                        val = DwgUtil.getBitShort(intData, bitPos);
437
                        bitPos = ((Integer)val.get(0)).intValue();
438
                        dwgFile.setHeader("SURFU", val.get(1));
439
                        
440
                        val = DwgUtil.getBitShort(intData, bitPos);
441
                        bitPos = ((Integer)val.get(0)).intValue();
442
                        dwgFile.setHeader("SURFV", val.get(1));
443
                        
444
                        val = DwgUtil.getBitShort(intData, bitPos);
445
                        bitPos = ((Integer)val.get(0)).intValue();
446
                        dwgFile.setHeader("SURFTYPE", val.get(1));
447
                        
448
                        val = DwgUtil.getBitShort(intData, bitPos);
449
                        bitPos = ((Integer)val.get(0)).intValue();
450
                        dwgFile.setHeader("SURFTAB1", val.get(1));
451
                        
452
                        val = DwgUtil.getBitShort(intData, bitPos);
453
                        bitPos = ((Integer)val.get(0)).intValue();
454
                        dwgFile.setHeader("SURFTAB2", val.get(1));
455
                        
456
                        val = DwgUtil.getBitShort(intData, bitPos);
457
                        bitPos = ((Integer)val.get(0)).intValue();
458
                        dwgFile.setHeader("SPLINETYPE", val.get(1));
459
                        
460
                        val = DwgUtil.getBitShort(intData, bitPos);
461
                        bitPos = ((Integer)val.get(0)).intValue();
462
                        dwgFile.setHeader("SHADEDGE", val.get(1));
463
                        
464
                        val = DwgUtil.getBitShort(intData, bitPos);
465
                        bitPos = ((Integer)val.get(0)).intValue();
466
                        dwgFile.setHeader("SHADEDIF", val.get(1));
467
                        
468
                        val = DwgUtil.getBitShort(intData, bitPos);
469
                        bitPos = ((Integer)val.get(0)).intValue();
470
                        dwgFile.setHeader("UNITMODE", val.get(1));
471
                        
472
                        val = DwgUtil.getBitShort(intData, bitPos);
473
                        bitPos = ((Integer)val.get(0)).intValue();
474
                        dwgFile.setHeader("MAXACTVP", val.get(1));
475
                        
476
                        val = DwgUtil.getBitShort(intData, bitPos);
477
                        bitPos = ((Integer)val.get(0)).intValue();
478
                        dwgFile.setHeader("ISOLINES", val.get(1));
479
                        
480
                        val = DwgUtil.getBitShort(intData, bitPos);
481
                        bitPos = ((Integer)val.get(0)).intValue();
482
                        dwgFile.setHeader("CMLJUST", val.get(1));
483
                        
484
                        val = DwgUtil.getBitShort(intData, bitPos);
485
                        bitPos = ((Integer)val.get(0)).intValue();
486
                        dwgFile.setHeader("TEXTQLTY", val.get(1));
487
                        
488
                        val = DwgUtil.getBitDouble(intData, bitPos);
489
                        bitPos = ((Integer)val.get(0)).intValue();
490
                        dwgFile.setHeader("LTSCALE", val.get(1));
491
                        
492
                        val = DwgUtil.getBitDouble(intData, bitPos);
493
                        bitPos = ((Integer)val.get(0)).intValue();
494
                        dwgFile.setHeader("TEXTSIZE", val.get(1));
495
                        
496
                        val = DwgUtil.getBitDouble(intData, bitPos);
497
                        bitPos = ((Integer)val.get(0)).intValue();
498
                        dwgFile.setHeader("TRACEWID", val.get(1));
499
                        
500
                        val = DwgUtil.getBitDouble(intData, bitPos);
501
                        bitPos = ((Integer)val.get(0)).intValue();
502
                        dwgFile.setHeader("SKETCHINC", val.get(1));
503
                        
504
                        val = DwgUtil.getBitDouble(intData, bitPos);
505
                        bitPos = ((Integer)val.get(0)).intValue();
506
                        dwgFile.setHeader("FILLETRAD", val.get(1));
507
                        
508
                        val = DwgUtil.getBitDouble(intData, bitPos);
509
                        bitPos = ((Integer)val.get(0)).intValue();
510
                        dwgFile.setHeader("THICKNESS", val.get(1));
511
                        
512
                        val = DwgUtil.getBitDouble(intData, bitPos);
513
                        bitPos = ((Integer)val.get(0)).intValue();
514
                        dwgFile.setHeader("ANGBASE", val.get(1));
515
                        
516
                        val = DwgUtil.getBitDouble(intData, bitPos);
517
                        bitPos = ((Integer)val.get(0)).intValue();
518
                        dwgFile.setHeader("PDSIZE", val.get(1));
519
                        
520
                        val = DwgUtil.getBitDouble(intData, bitPos);
521
                        bitPos = ((Integer)val.get(0)).intValue();
522
                        dwgFile.setHeader("PLINEWID", val.get(1));
523
                        
524
                        val = DwgUtil.getBitDouble(intData, bitPos);
525
                        bitPos = ((Integer)val.get(0)).intValue();
526
                        dwgFile.setHeader("USERR1", val.get(1));
527
                        
528
                        val = DwgUtil.getBitDouble(intData, bitPos);
529
                        bitPos = ((Integer)val.get(0)).intValue();
530
                        dwgFile.setHeader("USERR2", val.get(1));
531
                        
532
                        val = DwgUtil.getBitDouble(intData, bitPos);
533
                        bitPos = ((Integer)val.get(0)).intValue();
534
                        dwgFile.setHeader("USERR3", val.get(1));
535
                        
536
                        val = DwgUtil.getBitDouble(intData, bitPos);
537
                        bitPos = ((Integer)val.get(0)).intValue();
538
                        dwgFile.setHeader("USERR4", val.get(1));
539
                        
540
                        val = DwgUtil.getBitDouble(intData, bitPos);
541
                        bitPos = ((Integer)val.get(0)).intValue();
542
                        dwgFile.setHeader("USERR5", val.get(1));
543
                        
544
                        val = DwgUtil.getBitDouble(intData, bitPos);
545
                        bitPos = ((Integer)val.get(0)).intValue();
546
                        dwgFile.setHeader("CHAMFERA", val.get(1));
547
                        
548
                        val = DwgUtil.getBitDouble(intData, bitPos);
549
                        bitPos = ((Integer)val.get(0)).intValue();
550
                        dwgFile.setHeader("CHAMFERB", val.get(1));
551
                        
552
                        val = DwgUtil.getBitDouble(intData, bitPos);
553
                        bitPos = ((Integer)val.get(0)).intValue();
554
                        dwgFile.setHeader("CHAMFERC", val.get(1));
555
                        
556
                        val = DwgUtil.getBitDouble(intData, bitPos);
557
                        bitPos = ((Integer)val.get(0)).intValue();
558
                        dwgFile.setHeader("CHAMFERD", val.get(1));
559
                        
560
                        val = DwgUtil.getBitDouble(intData, bitPos);
561
                        bitPos = ((Integer)val.get(0)).intValue();
562
                        dwgFile.setHeader("FACETRES", val.get(1));
563
                        
564
                        val = DwgUtil.getBitDouble(intData, bitPos);
565
                        bitPos = ((Integer)val.get(0)).intValue();
566
                        dwgFile.setHeader("CMLSCALE", val.get(1));
567
                        
568
                        val = DwgUtil.getBitDouble(intData, bitPos);
569
                        bitPos = ((Integer)val.get(0)).intValue();
570
                        dwgFile.setHeader("CELTSCALE", val.get(1));
571
                        
572
                        val = DwgUtil.getTextString(intData, bitPos);
573
                        bitPos = ((Integer)val.get(0)).intValue();
574
                        dwgFile.setHeader("MENUNAME", val.get(1));
575
                        
576
                        int[] tdcreate = new int[2];
577
                        val = DwgUtil.getBitLong(intData, bitPos);
578
                        bitPos = ((Integer)val.get(0)).intValue();
579
                        tdcreate[0] = ((Integer) val.get(1)).intValue();
580
                        val = DwgUtil.getBitLong(intData, bitPos);
581
                        bitPos = ((Integer)val.get(0)).intValue();
582
                        tdcreate[1] = ((Integer) val.get(1)).intValue();
583
                        dwgFile.setHeader("TDCREATE", tdcreate);
584
                        
585
                        int[] tdupdate = new int[2];
586
                        val = DwgUtil.getBitLong(intData, bitPos);
587
                        bitPos = ((Integer)val.get(0)).intValue();
588
                        tdupdate[0] = ((Integer) val.get(1)).intValue();
589
                        val = DwgUtil.getBitLong(intData, bitPos);
590
                        bitPos = ((Integer)val.get(0)).intValue();
591
                        tdupdate[1] = ((Integer) val.get(1)).intValue();
592
                        dwgFile.setHeader("TDUPDATE", tdupdate);
593
                        
594
                        int[] tdindwg = new int[2];
595
                        val = DwgUtil.getBitLong(intData, bitPos);
596
                        bitPos = ((Integer)val.get(0)).intValue();
597
                        tdindwg[0] = ((Integer) val.get(1)).intValue();
598
                        val = DwgUtil.getBitLong(intData, bitPos);
599
                        bitPos = ((Integer)val.get(0)).intValue();
600
                        tdindwg[1] = ((Integer) val.get(1)).intValue();
601
                        dwgFile.setHeader("TDINDWG", tdindwg);
602
                        
603
                        int[] tdusrtime = new int[2];
604
                        val = DwgUtil.getBitLong(intData, bitPos);
605
                        bitPos = ((Integer)val.get(0)).intValue();
606
                        tdusrtime[0] = ((Integer) val.get(1)).intValue();
607
                        val = DwgUtil.getBitLong(intData, bitPos);
608
                        bitPos = ((Integer)val.get(0)).intValue();
609
                        tdusrtime[1] = ((Integer) val.get(1)).intValue();
610
                        dwgFile.setHeader("TDUSRTIME", tdusrtime);
611
                        
612
                        val = DwgUtil.getBitShort(intData, bitPos);
613
                        bitPos = ((Integer)val.get(0)).intValue();
614
                        dwgFile.setHeader("CECOLOR", val.get(1));
615
                        
616
                        val = DwgUtil.getHandle(intData, bitPos);
617
                        bitPos = ((Integer)val.get(0)).intValue();
618
                        int intHandle = DwgUtil.handleToInt(val);
619
                        dwgFile.setHeader("HANDSEED", new Integer(intHandle));
620

    
621
        //creo que CLAYER marca la capa actualmente seleccionada en el menu de autocad                
622
                        
623
                        val = DwgUtil.getHandle(intData, bitPos);
624
                        bitPos = ((Integer)val.get(0)).intValue();
625
                        intHandle = DwgUtil.handleToInt(val);
626
                        dwgFile.setHeader("CLAYER", new Integer(intHandle));
627
                        
628
                        val = DwgUtil.getHandle(intData, bitPos);
629
                        bitPos = ((Integer)val.get(0)).intValue();
630
                        intHandle = DwgUtil.handleToInt(val);
631
                        dwgFile.setHeader("TEXSTYLE", new Integer(intHandle));
632
                        
633
                        val = DwgUtil.getHandle(intData, bitPos);
634
                        bitPos = ((Integer)val.get(0)).intValue();
635
                        intHandle = DwgUtil.handleToInt(val);
636
                        dwgFile.setHeader("CELLTYPE", new Integer(intHandle));
637

    
638
                        val = DwgUtil.getHandle(intData, bitPos);
639
                        bitPos = ((Integer)val.get(0)).intValue();
640
                        intHandle = DwgUtil.handleToInt(val);
641
                        dwgFile.setHeader("DIMSTYLE", new Integer(intHandle));
642
                        
643
                        val = DwgUtil.getHandle(intData, bitPos);
644
                        bitPos = ((Integer)val.get(0)).intValue();
645
                        intHandle = DwgUtil.handleToInt(val);
646
                        dwgFile.setHeader("CMLSTYLE", new Integer(intHandle));
647

    
648
                        double[] spaces1 = new double[3];
649
                        val = DwgUtil.getBitDouble(intData, bitPos);
650
                        bitPos = ((Integer)val.get(0)).intValue();
651
                        spaces1[0] = ((Double)val.get(1)).doubleValue();
652
                        val = DwgUtil.getBitDouble(intData, bitPos);
653
                        bitPos = ((Integer)val.get(0)).intValue();
654
                        spaces1[1] = ((Double)val.get(1)).doubleValue();
655
                        val = DwgUtil.getBitDouble(intData, bitPos);
656
                        bitPos = ((Integer)val.get(0)).intValue();
657
                        spaces1[2] = ((Double)val.get(1)).doubleValue();
658
                        dwgFile.setHeader("PSPACE_INSBASE", spaces1);
659
                        
660
                        double[] spaces2 = new double[3];
661
                        val = DwgUtil.getBitDouble(intData, bitPos);
662
                        bitPos = ((Integer)val.get(0)).intValue();
663
                        spaces2[0] = ((Double)val.get(1)).doubleValue();
664
                        val = DwgUtil.getBitDouble(intData, bitPos);
665
                        bitPos = ((Integer)val.get(0)).intValue();
666
                        spaces2[1] = ((Double)val.get(1)).doubleValue();
667
                        val = DwgUtil.getBitDouble(intData, bitPos);
668
                        bitPos = ((Integer)val.get(0)).intValue();
669
                        spaces2[2] = ((Double)val.get(1)).doubleValue();
670
                        dwgFile.setHeader("PSPACE_EXTMIN", spaces2);
671
                        
672
                        double[] spaces3 = new double[3];
673
                        val = DwgUtil.getBitDouble(intData, bitPos);
674
                        bitPos = ((Integer)val.get(0)).intValue();
675
                        spaces3[0] = ((Double)val.get(1)).doubleValue();
676
                        val = DwgUtil.getBitDouble(intData, bitPos);
677
                        bitPos = ((Integer)val.get(0)).intValue();
678
                        spaces3[1] = ((Double)val.get(1)).doubleValue();
679
                        val = DwgUtil.getBitDouble(intData, bitPos);
680
                        bitPos = ((Integer)val.get(0)).intValue();
681
                        spaces3[2] = ((Double)val.get(1)).doubleValue();
682
                        dwgFile.setHeader("PSPACE_EXTMAX", spaces2);
683
                        
684
                        double[] spaces4 = new double[2];
685
                        val = DwgUtil.getRawDouble(intData, bitPos);
686
                        bitPos = ((Integer)val.get(0)).intValue();
687
                        spaces4[0] = ((Double)val.get(1)).doubleValue();
688
                        val = DwgUtil.getRawDouble(intData, bitPos);
689
                        bitPos = ((Integer)val.get(0)).intValue();
690
                        spaces4[1] = ((Double)val.get(1)).doubleValue();
691
                        dwgFile.setHeader("PSPACE_LIMMIN", spaces4);
692
                        
693
                        double[] spaces5 = new double[2];
694
                        val = DwgUtil.getRawDouble(intData, bitPos);
695
                        bitPos = ((Integer)val.get(0)).intValue();
696
                        spaces5[0] = ((Double)val.get(1)).doubleValue();
697
                        val = DwgUtil.getRawDouble(intData, bitPos);
698
                        bitPos = ((Integer)val.get(0)).intValue();
699
                        spaces5[1] = ((Double)val.get(1)).doubleValue();
700
                        dwgFile.setHeader("PSPACE_LIMMAX", spaces5);
701
                        
702
                        
703
                        val = DwgUtil.getBitDouble(intData, bitPos);
704
                        bitPos = ((Integer)val.get(0)).intValue();
705
                        dwgFile.setHeader("PSPACE_ELEVATION", val.get(1));
706
                        
707
                        double[] spaces6 = new double[6];
708
                        val = DwgUtil.getBitDouble(intData, bitPos);
709
                        bitPos = ((Integer)val.get(0)).intValue();
710
                        spaces6[0] = ((Double)val.get(1)).doubleValue();
711
                        val = DwgUtil.getBitDouble(intData, bitPos);
712
                        bitPos = ((Integer)val.get(0)).intValue();
713
                        spaces6[1] = ((Double)val.get(1)).doubleValue();
714
                        val = DwgUtil.getBitDouble(intData, bitPos);
715
                        bitPos = ((Integer)val.get(0)).intValue();
716
                        spaces6[2] = ((Double)val.get(1)).doubleValue();
717
                        dwgFile.setHeader("PSPACE_UCSORG", spaces6);
718
                        
719
                        double[] spaces7 = new double[6];
720
                        val = DwgUtil.getBitDouble(intData, bitPos);
721
                        bitPos = ((Integer)val.get(0)).intValue();
722
                        spaces7[0] = ((Double)val.get(1)).doubleValue();
723
                        val = DwgUtil.getBitDouble(intData, bitPos);
724
                        bitPos = ((Integer)val.get(0)).intValue();
725
                        spaces7[1] = ((Double)val.get(1)).doubleValue();
726
                        val = DwgUtil.getBitDouble(intData, bitPos);
727
                        bitPos = ((Integer)val.get(0)).intValue();
728
                        spaces7[2] = ((Double)val.get(1)).doubleValue();
729
                        dwgFile.setHeader("PSPACE_UCSXDIR", spaces7);
730
                        
731
                        double[] spaces8 = new double[6];
732
                        val = DwgUtil.getBitDouble(intData, bitPos);
733
                        bitPos = ((Integer)val.get(0)).intValue();
734
                        spaces8[0] = ((Double)val.get(1)).doubleValue();
735
                        val = DwgUtil.getBitDouble(intData, bitPos);
736
                        bitPos = ((Integer)val.get(0)).intValue();
737
                        spaces8[1] = ((Double)val.get(1)).doubleValue();
738
                        val = DwgUtil.getBitDouble(intData, bitPos);
739
                        bitPos = ((Integer)val.get(0)).intValue();
740
                        spaces8[2] = ((Double)val.get(1)).doubleValue();
741
                        dwgFile.setHeader("PSPACE_UCSYDIR", spaces8);
742
                        
743
                        val = DwgUtil.getHandle(intData, bitPos);
744
                        bitPos = ((Integer)val.get(0)).intValue();
745
                        intHandle = DwgUtil.handleToInt(val);
746
                        dwgFile.setHeader("PSPACE_UCSNAME", new Integer(intHandle));
747
                        
748
                        double[] spaces9 = new double[6];
749
                        val = DwgUtil.getBitDouble(intData, bitPos);
750
                        bitPos = ((Integer)val.get(0)).intValue();
751
                        spaces9[0] = ((Double)val.get(1)).doubleValue();
752
                        val = DwgUtil.getBitDouble(intData, bitPos);
753
                        bitPos = ((Integer)val.get(0)).intValue();
754
                        spaces9[1] = ((Double)val.get(1)).doubleValue();
755
                        val = DwgUtil.getBitDouble(intData, bitPos);
756
                        bitPos = ((Integer)val.get(0)).intValue();
757
                        spaces9[2] = ((Double)val.get(1)).doubleValue();
758
                        dwgFile.setHeader("MSPACE_INSBASE", spaces9);
759
                        
760
                        double[] spaces10 = new double[6];
761
                        val = DwgUtil.getBitDouble(intData, bitPos);
762
                        bitPos = ((Integer)val.get(0)).intValue();
763
                        spaces10[0] = ((Double)val.get(1)).doubleValue();
764
                        val = DwgUtil.getBitDouble(intData, bitPos);
765
                        bitPos = ((Integer)val.get(0)).intValue();
766
                        spaces10[1] = ((Double)val.get(1)).doubleValue();
767
                        val = DwgUtil.getBitDouble(intData, bitPos);
768
                        bitPos = ((Integer)val.get(0)).intValue();
769
                        spaces10[2] = ((Double)val.get(1)).doubleValue();
770
                        dwgFile.setHeader("MSPACE_EXTMIN", spaces10);
771
                        
772
                        double[] spaces11 = new double[3];
773
                        val = DwgUtil.getBitDouble(intData, bitPos);
774
                        bitPos = ((Integer)val.get(0)).intValue();
775
                        spaces11[0] = ((Double)val.get(1)).doubleValue();
776
                        val = DwgUtil.getBitDouble(intData, bitPos);
777
                        bitPos = ((Integer)val.get(0)).intValue();
778
                        spaces11[1] = ((Double)val.get(1)).doubleValue();
779
                        val = DwgUtil.getBitDouble(intData, bitPos);
780
                        bitPos = ((Integer)val.get(0)).intValue();
781
                        spaces11[2] = ((Double)val.get(1)).doubleValue();
782
                        dwgFile.setHeader("MSPACE_EXTMAX", spaces11);
783
                        
784
                        double[] spaces12= new double[2];
785
                        val = DwgUtil.getRawDouble(intData, bitPos);
786
                        bitPos = ((Integer)val.get(0)).intValue();
787
                        spaces12[0] = ((Double)val.get(1)).doubleValue();
788
                        val = DwgUtil.getRawDouble(intData, bitPos);
789
                        bitPos = ((Integer)val.get(0)).intValue();
790
                        spaces12[1] = ((Double)val.get(1)).doubleValue();
791
                        dwgFile.setHeader("MSPACE_LIMMIN", spaces12);
792
                        
793
                        double[] spaces13= new double[2];
794
                        val = DwgUtil.getRawDouble(intData, bitPos);
795
                        bitPos = ((Integer)val.get(0)).intValue();
796
                        spaces13[0] = ((Double)val.get(1)).doubleValue();
797
                        val = DwgUtil.getRawDouble(intData, bitPos);
798
                        bitPos = ((Integer)val.get(0)).intValue();
799
                        spaces13[1] = ((Double)val.get(1)).doubleValue();
800
                        dwgFile.setHeader("MSPACE_LIMMAX", spaces13);
801
                        
802
                        val = DwgUtil.getBitDouble(intData, bitPos);
803
                        bitPos = ((Integer)val.get(0)).intValue();
804
                        dwgFile.setHeader("MSPACE_ELEVATION", (Double)val.get(1));
805
                        
806
                        double[] spaces14 = new double[3];
807
                        val = DwgUtil.getBitDouble(intData, bitPos);
808
                        bitPos = ((Integer)val.get(0)).intValue();
809
                        spaces14[0] = ((Double)val.get(1)).doubleValue();
810
                        val = DwgUtil.getBitDouble(intData, bitPos);
811
                        bitPos = ((Integer)val.get(0)).intValue();
812
                        spaces14[1] = ((Double)val.get(1)).doubleValue();
813
                        val = DwgUtil.getBitDouble(intData, bitPos);
814
                        bitPos = ((Integer)val.get(0)).intValue();
815
                        spaces14[2] = ((Double)val.get(1)).doubleValue();
816
                        dwgFile.setHeader("MSPACE_UCSORG", spaces14);
817
                        
818
                        double[] spaces15 = new double[3];
819
                        val = DwgUtil.getBitDouble(intData, bitPos);
820
                        bitPos = ((Integer)val.get(0)).intValue();
821
                        spaces15[0] = ((Double)val.get(1)).doubleValue();
822
                        val = DwgUtil.getBitDouble(intData, bitPos);
823
                        bitPos = ((Integer)val.get(0)).intValue();
824
                        spaces15[1] = ((Double)val.get(1)).doubleValue();
825
                        val = DwgUtil.getBitDouble(intData, bitPos);
826
                        bitPos = ((Integer)val.get(0)).intValue();
827
                        spaces15[2] = ((Double)val.get(1)).doubleValue();
828
                        dwgFile.setHeader("MSPACE_UCSXDIR", spaces15);
829
                        
830
                        double[] spaces16 = new double[3];
831
                        val = DwgUtil.getBitDouble(intData, bitPos);
832
                        bitPos = ((Integer)val.get(0)).intValue();
833
                        spaces16[0] = ((Double)val.get(1)).doubleValue();
834
                        val = DwgUtil.getBitDouble(intData, bitPos);
835
                        bitPos = ((Integer)val.get(0)).intValue();
836
                        spaces16[1] = ((Double)val.get(1)).doubleValue();
837
                        val = DwgUtil.getBitDouble(intData, bitPos);
838
                        bitPos = ((Integer)val.get(0)).intValue();
839
                        spaces16[2] = ((Double)val.get(1)).doubleValue();
840
                        dwgFile.setHeader("MSPACE_UCSYDIR", spaces16);
841
                        
842
                        val = DwgUtil.getHandle(intData, bitPos);
843
                        bitPos = ((Integer)val.get(0)).intValue();
844
                        intHandle = DwgUtil.handleToInt(val);
845
                        dwgFile.setHeader("MSPACE_UCSNAME", new Integer(intHandle));
846

    
847
                        val = DwgUtil.testBit(intData, bitPos);
848
                        bitPos = ((Integer)val.get(0)).intValue();
849
                        dwgFile.setHeader("DIMTOL", val.get(1));
850
                        
851
                        val = DwgUtil.testBit(intData, bitPos);
852
                        bitPos = ((Integer)val.get(0)).intValue();
853
                        dwgFile.setHeader("DIMLIM", val.get(1));
854
                        
855
                        val = DwgUtil.testBit(intData, bitPos);
856
                        bitPos = ((Integer)val.get(0)).intValue();
857
                        dwgFile.setHeader("DIMTIH", val.get(1));
858
                        
859
                        val = DwgUtil.testBit(intData, bitPos);
860
                        bitPos = ((Integer)val.get(0)).intValue();
861
                        dwgFile.setHeader("DIMTOH", val.get(1));
862
                        
863
                        val = DwgUtil.testBit(intData, bitPos);
864
                        bitPos = ((Integer)val.get(0)).intValue();
865
                        dwgFile.setHeader("DIMSE1", val.get(1));
866
                        
867
                        val = DwgUtil.testBit(intData, bitPos);
868
                        bitPos = ((Integer)val.get(0)).intValue();
869
                        dwgFile.setHeader("DIMTSE2", val.get(1));
870
                        
871
                        val = DwgUtil.testBit(intData, bitPos);
872
                        bitPos = ((Integer)val.get(0)).intValue();
873
                        dwgFile.setHeader("DIMALT", val.get(1));
874
                        
875
                        val = DwgUtil.testBit(intData, bitPos);
876
                        bitPos = ((Integer)val.get(0)).intValue();
877
                        dwgFile.setHeader("DIMTOFL", val.get(1));
878
                        
879
                        val = DwgUtil.testBit(intData, bitPos);
880
                        bitPos = ((Integer)val.get(0)).intValue();
881
                        dwgFile.setHeader("DIMSAH", val.get(1));
882
                        
883
                        val = DwgUtil.testBit(intData, bitPos);
884
                        bitPos = ((Integer)val.get(0)).intValue();
885
                        dwgFile.setHeader("DIMTIX", val.get(1));
886
                        
887
                        val = DwgUtil.testBit(intData, bitPos);
888
                        bitPos = ((Integer)val.get(0)).intValue();
889
                        dwgFile.setHeader("DIMSOXD", val.get(1));
890
                        
891
                        val = DwgUtil.getRawChar(intData, bitPos);
892
                        bitPos = ((Integer)val.get(0)).intValue();
893
                        dwgFile.setHeader("DIMALTD", val.get(1));
894
                        
895
                        val = DwgUtil.getRawChar(intData, bitPos);
896
                        bitPos = ((Integer)val.get(0)).intValue();
897
                        dwgFile.setHeader("DIMZIN", val.get(1));
898
                        
899
                        val = DwgUtil.testBit(intData, bitPos);
900
                        bitPos = ((Integer)val.get(0)).intValue();
901
                        dwgFile.setHeader("DIMSD1", val.get(1));
902
                        
903
                        val = DwgUtil.testBit(intData, bitPos);
904
                        bitPos = ((Integer)val.get(0)).intValue();
905
                        dwgFile.setHeader("DIMSD2", val.get(1));
906
                        
907
                        val = DwgUtil.getRawChar(intData, bitPos);
908
                        bitPos = ((Integer)val.get(0)).intValue();
909
                        dwgFile.setHeader("DIMTOLJ", val.get(1));
910
                        
911
                        val = DwgUtil.getRawChar(intData, bitPos);
912
                        bitPos = ((Integer)val.get(0)).intValue();
913
                        dwgFile.setHeader("DIMJUST", val.get(1));
914
                        
915
                        val = DwgUtil.getRawChar(intData, bitPos);
916
                        bitPos = ((Integer)val.get(0)).intValue();
917
                        dwgFile.setHeader("DIMFINT", val.get(1));
918
                        
919
                        val = DwgUtil.testBit(intData, bitPos);
920
                        bitPos = ((Integer)val.get(0)).intValue();
921
                        dwgFile.setHeader("DIMUPT", val.get(1));
922
                        
923
                        val = DwgUtil.getRawChar(intData, bitPos);
924
                        bitPos = ((Integer)val.get(0)).intValue();
925
                        dwgFile.setHeader("DIMZIN", val.get(1));
926
                        
927
                        val = DwgUtil.getRawChar(intData, bitPos);
928
                        bitPos = ((Integer)val.get(0)).intValue();
929
                        dwgFile.setHeader("DIMALTZ", val.get(1));
930
                        
931
                        val = DwgUtil.getRawChar(intData, bitPos);
932
                        bitPos = ((Integer)val.get(0)).intValue();
933
                        dwgFile.setHeader("DIMALTTZ", val.get(1));
934
                        
935
                        val = DwgUtil.getRawChar(intData, bitPos);
936
                        bitPos = ((Integer)val.get(0)).intValue();
937
                        dwgFile.setHeader("DIMTAD", val.get(1));
938
                        
939
                        val = DwgUtil.getBitShort(intData, bitPos);
940
                        bitPos = ((Integer)val.get(0)).intValue();
941
                        dwgFile.setHeader("DIMUNIT", val.get(1));
942
                        
943
                        val = DwgUtil.getBitShort(intData, bitPos);
944
                        bitPos = ((Integer)val.get(0)).intValue();
945
                        dwgFile.setHeader("DIMAUNIT", val.get(1));
946
                        
947
                        val = DwgUtil.getBitShort(intData, bitPos);
948
                        bitPos = ((Integer)val.get(0)).intValue();
949
                        dwgFile.setHeader("DIMDEC", val.get(1));
950
                        
951
                        val = DwgUtil.getBitShort(intData, bitPos);
952
                        bitPos = ((Integer)val.get(0)).intValue();
953
                        dwgFile.setHeader("DIMTDEC", val.get(1));
954
                        
955
                        val = DwgUtil.getBitShort(intData, bitPos);
956
                        bitPos = ((Integer)val.get(0)).intValue();
957
                        dwgFile.setHeader("DIMALTU", val.get(1));
958
                        
959
                        val = DwgUtil.getBitShort(intData, bitPos);
960
                        bitPos = ((Integer)val.get(0)).intValue();
961
                        dwgFile.setHeader("DIMALTTD", val.get(1));
962
                        
963
                        val = DwgUtil.getHandle(intData, bitPos);
964
                        bitPos = ((Integer)val.get(0)).intValue();
965
                        intHandle = DwgUtil.handleToInt(val);
966
                        dwgFile.setHeader("DIMTXSTY", new Integer(intHandle));
967

    
968
                        val = DwgUtil.getBitDouble(intData, bitPos);
969
                        bitPos = ((Integer)val.get(0)).intValue();
970
                        dwgFile.setHeader("DIMSCALE", val.get(1));
971
                        
972
                        val = DwgUtil.getBitDouble(intData, bitPos);
973
                        bitPos = ((Integer)val.get(0)).intValue();
974
                        dwgFile.setHeader("DIMASZ", val.get(1));
975
                        
976
                        val = DwgUtil.getBitDouble(intData, bitPos);
977
                        bitPos = ((Integer)val.get(0)).intValue();
978
                        dwgFile.setHeader("DIMEXO", val.get(1));
979
                        
980
                        val = DwgUtil.getBitDouble(intData, bitPos);
981
                        bitPos = ((Integer)val.get(0)).intValue();
982
                        dwgFile.setHeader("DIMDLI", val.get(1));
983
                        
984
                        val = DwgUtil.getBitDouble(intData, bitPos);
985
                        bitPos = ((Integer)val.get(0)).intValue();
986
                        dwgFile.setHeader("DIMEXE", val.get(1));
987
                        
988
                        val = DwgUtil.getBitDouble(intData, bitPos);
989
                        bitPos = ((Integer)val.get(0)).intValue();
990
                        dwgFile.setHeader("DIMAND", val.get(1));
991
                        
992
                        val = DwgUtil.getBitDouble(intData, bitPos);
993
                        bitPos = ((Integer)val.get(0)).intValue();
994
                        dwgFile.setHeader("DIMDLE", val.get(1));
995
                        
996
                        val = DwgUtil.getBitDouble(intData, bitPos);
997
                        bitPos = ((Integer)val.get(0)).intValue();
998
                        dwgFile.setHeader("DIMTP", val.get(1));
999
                        
1000
                        val = DwgUtil.getBitDouble(intData, bitPos);
1001
                        bitPos = ((Integer)val.get(0)).intValue();
1002
                        dwgFile.setHeader("DIMTM", val.get(1));
1003
                        
1004
                        val = DwgUtil.getBitDouble(intData, bitPos);
1005
                        bitPos = ((Integer)val.get(0)).intValue();
1006
                        dwgFile.setHeader("DIMTXT", val.get(1));
1007
                        
1008
                        val = DwgUtil.getBitDouble(intData, bitPos);
1009
                        bitPos = ((Integer)val.get(0)).intValue();
1010
                        dwgFile.setHeader("DIMCEN", val.get(1));
1011
                        
1012
                        val = DwgUtil.getBitDouble(intData, bitPos);
1013
                        bitPos = ((Integer)val.get(0)).intValue();
1014
                        dwgFile.setHeader("DIMSZ", val.get(1));
1015
                        
1016
                        val = DwgUtil.getBitDouble(intData, bitPos);
1017
                        bitPos = ((Integer)val.get(0)).intValue();
1018
                        dwgFile.setHeader("DIMALTF", val.get(1));
1019
                        
1020
                        val = DwgUtil.getBitDouble(intData, bitPos);
1021
                        bitPos = ((Integer)val.get(0)).intValue();
1022
                        dwgFile.setHeader("DIMLFAC", val.get(1));
1023
                        
1024
                        val = DwgUtil.getBitDouble(intData, bitPos);
1025
                        bitPos = ((Integer)val.get(0)).intValue();
1026
                        dwgFile.setHeader("DIMTVP", val.get(1));
1027
                        
1028
                        val = DwgUtil.getBitDouble(intData, bitPos);
1029
                        bitPos = ((Integer)val.get(0)).intValue();
1030
                        dwgFile.setHeader("DIMTFAC", val.get(1));
1031
                        
1032
                        val = DwgUtil.getBitDouble(intData, bitPos);
1033
                        bitPos = ((Integer)val.get(0)).intValue();
1034
                        dwgFile.setHeader("DIMGAP", val.get(1));
1035
                        
1036
                        val = DwgUtil.getTextString(intData, bitPos);
1037
                        bitPos = ((Integer)val.get(0)).intValue();
1038
                        dwgFile.setHeader("DIMPOST", val.get(1));
1039
                        
1040
                        val = DwgUtil.getTextString(intData, bitPos);
1041
                        bitPos = ((Integer)val.get(0)).intValue();
1042
                        dwgFile.setHeader("DIMAPOST", val.get(1));
1043
                        
1044
                        val = DwgUtil.getTextString(intData, bitPos);
1045
                        bitPos = ((Integer)val.get(0)).intValue();
1046
                        dwgFile.setHeader("DIMBLK", val.get(1));
1047
                        
1048
                        val = DwgUtil.getTextString(intData, bitPos);
1049
                        bitPos = ((Integer)val.get(0)).intValue();
1050
                        dwgFile.setHeader("DIMBLK1", val.get(1));
1051
                        
1052
                        val = DwgUtil.getTextString(intData, bitPos);
1053
                        bitPos = ((Integer)val.get(0)).intValue();
1054
                        dwgFile.setHeader("DIMBLK2", val.get(1));
1055
                        
1056
                        val = DwgUtil.getBitShort(intData, bitPos);
1057
                        bitPos = ((Integer)val.get(0)).intValue();
1058
                        dwgFile.setHeader("DIMCLRD", val.get(1));
1059
                        
1060
                        val = DwgUtil.getBitShort(intData, bitPos);
1061
                        bitPos = ((Integer)val.get(0)).intValue();
1062
                        dwgFile.setHeader("DIMCLRE", val.get(1));
1063
                        
1064
                        val = DwgUtil.getBitShort(intData, bitPos);
1065
                        bitPos = ((Integer)val.get(0)).intValue();
1066
                        dwgFile.setHeader("DIMCLRT", val.get(1));
1067
                        
1068
                        val = DwgUtil.getHandle(intData, bitPos);
1069
                        bitPos = ((Integer)val.get(0)).intValue();
1070
                        intHandle = DwgUtil.handleToInt(val);
1071
                        dwgFile.setHeader("BLOCK_CONTROL_OBJECT", new Integer(intHandle));
1072
                        
1073
                        val = DwgUtil.getHandle(intData, bitPos);
1074
                        bitPos = ((Integer)val.get(0)).intValue();
1075
                        intHandle = DwgUtil.handleToInt(val);
1076
                        dwgFile.setHeader("LAYER_CONTROL_OBJECT", new Integer(intHandle));
1077

    
1078
                        val = DwgUtil.getHandle(intData, bitPos);
1079
                        bitPos = ((Integer)val.get(0)).intValue();
1080
                        intHandle = DwgUtil.handleToInt(val);
1081
                        dwgFile.setHeader("STYLE_CONTROL_OBJECT", new Integer(intHandle));
1082

    
1083
                        val = DwgUtil.getHandle(intData, bitPos);
1084
                        bitPos = ((Integer)val.get(0)).intValue();
1085
                        intHandle = DwgUtil.handleToInt(val);
1086
                        dwgFile.setHeader("LINETYPE_CONTROL_OBJECT", new Integer(intHandle));
1087

    
1088
                        val = DwgUtil.getHandle(intData, bitPos);
1089
                        bitPos = ((Integer)val.get(0)).intValue();
1090
                        intHandle = DwgUtil.handleToInt(val);
1091
                        dwgFile.setHeader("VIEW_CONTROL_OBJECT", new Integer(intHandle));
1092

    
1093
                        val = DwgUtil.getHandle(intData, bitPos);
1094
                        bitPos = ((Integer)val.get(0)).intValue();
1095
                        intHandle = DwgUtil.handleToInt(val);
1096
                        dwgFile.setHeader("UCS_CONTROL_OBJECT", new Integer(intHandle));
1097

    
1098
                        val = DwgUtil.getHandle(intData, bitPos);
1099
                        bitPos = ((Integer)val.get(0)).intValue();
1100
                        intHandle = DwgUtil.handleToInt(val);
1101
                        dwgFile.setHeader("VPORT_CONTROL_OBJECT", new Integer(intHandle));
1102

    
1103
                        val = DwgUtil.getHandle(intData, bitPos);
1104
                        bitPos = ((Integer)val.get(0)).intValue();
1105
                        intHandle = DwgUtil.handleToInt(val);
1106
                        dwgFile.setHeader("APPID_CONTROL_OBJECT", new Integer(intHandle));
1107
                        
1108
                        val = DwgUtil.getHandle(intData, bitPos);
1109
                        bitPos = ((Integer)val.get(0)).intValue();
1110
                        intHandle = DwgUtil.handleToInt(val);
1111
                        dwgFile.setHeader("DIMSTYLE_CONTROL_OBJECT", new Integer(intHandle));
1112

    
1113
                        val = DwgUtil.getHandle(intData, bitPos);
1114
                        bitPos = ((Integer)val.get(0)).intValue();
1115
                        intHandle = DwgUtil.handleToInt(val);
1116
                        dwgFile.setHeader("VIEWPORT_ENTITY_HEADER", new Integer(intHandle));
1117
                        
1118
                        val = DwgUtil.getHandle(intData, bitPos);
1119
                        bitPos = ((Integer)val.get(0)).intValue();
1120
                        intHandle = DwgUtil.handleToInt(val);
1121
                        dwgFile.setHeader("ACAD_GROUP_DICTIONARY", new Integer(intHandle));
1122
                        
1123
                        val = DwgUtil.getHandle(intData, bitPos);
1124
                        bitPos = ((Integer)val.get(0)).intValue();
1125
                        intHandle = DwgUtil.handleToInt(val);
1126
                        dwgFile.setHeader("ACAD_MLINE_DICTIONARY", new Integer(intHandle));
1127
                        
1128
                        val = DwgUtil.getHandle(intData, bitPos);
1129
                        bitPos = ((Integer)val.get(0)).intValue();
1130
                        intHandle = DwgUtil.handleToInt(val);
1131
                        dwgFile.setHeader("NAMED_OBJECT_DICTIONARY", new Integer(intHandle));
1132
                        
1133
                        val = DwgUtil.getHandle(intData, bitPos);
1134
                        bitPos = ((Integer)val.get(0)).intValue();
1135
                        intHandle = DwgUtil.handleToInt(val);
1136
                        dwgFile.setHeader("PAPER_BLOCK_RECORD", new Integer(intHandle));
1137
                        
1138
                        val = DwgUtil.getHandle(intData, bitPos);
1139
                        bitPos = ((Integer)val.get(0)).intValue();
1140
                        intHandle = DwgUtil.handleToInt(val);
1141
                        dwgFile.setHeader("MODEL_BLOCK_RECORD", new Integer(intHandle));
1142
                        
1143
                        val = DwgUtil.getHandle(intData, bitPos);
1144
                        bitPos = ((Integer)val.get(0)).intValue();
1145
                        intHandle = DwgUtil.handleToInt(val);
1146
                        dwgFile.setHeader("LTYPE_BYLAYER", new Integer(intHandle));
1147
                        
1148
                        val = DwgUtil.getHandle(intData, bitPos);
1149
                        bitPos = ((Integer)val.get(0)).intValue();
1150
                        intHandle = DwgUtil.handleToInt(val);
1151
                        dwgFile.setHeader("LTYPE_BYBLOCK", new Integer(intHandle));
1152
                        
1153
                        val = DwgUtil.getHandle(intData, bitPos);
1154
                        bitPos = ((Integer)val.get(0)).intValue();
1155
                        intHandle = DwgUtil.handleToInt(val);
1156
                        dwgFile.setHeader("LTYPE_CONTINUOUS", new Integer(intHandle));
1157
                        
1158
//                    # remaing bits are unknown, and they end with possible
1159
//                    # padding bits so that 16-bit CRC value after the data
1160
//                    # is on a byte boundary - ignore them for now ...          
1161
                        
1162
                } catch (Exception e) {
1163
                        logger.error(e);
1164
                }             
1165
        }
1166
        
1167
        
1168
        /**
1169
         * It read the SECTIONS from the header of the DWG file
1170
         * 
1171
         * TODO Mover esto a una clase abstracta Reader, pues es similar
1172
         * para DWG 15 (o hacer que esta herede de DWG 15)
1173
         * 
1174
         * 
1175
         * 
1176
         * */
1177
        protected void readDwgSectionOffsets() {
1178
                //6 primeros bytes: version de autocad
1179
                
1180
                //7 siguientes bytes: 6 ceros y un 1 (0000001)
1181
                //No obstante, la especificaci?n Python dice que los bytes que lee
1182
                //con _buf.fromfile(handle, 7)  son bytes de la maquina. REVISAR
1183
                
1184
                /*Asi se hace copiando integramente Python. Ver si funciona NIO
1185
                byte[] chunk = {bb.get(), 
1186
                                                bb.get(),
1187
                                                bb.get(),
1188
                                                bb.get(),
1189
                                                bb.get(),
1190
                                                bb.get(),
1191
                                                bb.get()};
1192
                */
1193
                
1194
                bb.position(6);
1195
                
1196
                bb.order(ByteOrder.nativeOrder());
1197
                byte[] chunk = new byte[7];
1198
                bb.get(chunk);
1199
                
1200
                
1201
                if(chunk[0] != 0)
1202
                        logger.warn("chunk[0] != 0");
1203
                if(chunk[1] != 0)
1204
                        logger.warn("chunk[1] != 0");
1205
                if(chunk[2] != 0)
1206
                        logger.warn("chunk[2] != 0");
1207
                if(chunk[3] != 0)
1208
                        logger.warn("chunk[3] != 0");
1209
                if(chunk[4] != 0)
1210
                        logger.warn("chunk[4] != 0");
1211
                if(chunk[5] != 0)
1212
                        logger.warn("chunk[5] != 0");
1213
                if(chunk[6] != 0)
1214
                        logger.warn("chunk[6] != 0");
1215
                
1216
                 
1217
                  /*
1218
                   * 
1219
                   * */
1220
                
1221
                  //Siempre que en python una lectura se haga as? '<'+loquesea
1222
                  //hay que poner little_endian. Si no, se dejan los de la maquina
1223
                  // (y si aparece > se pone big endian)
1224
                  bb.order(ByteOrder.LITTLE_ENDIAN);
1225
                  byte _ub1 = bb.get();
1226
                  byte _ub2 = bb.get();
1227
                  int imageSeeker = bb.getInt(); 
1228
                  /*
1229
                   TRATAMIENTO DEL IMAGE_SEEKER: LECTURA DE IMAGENES BMP y WMF incrustadas
1230
                  if _image_seeker != 0:
1231
                _offsets['IMAGE'] = _image_seeker
1232
                _offset = handle.tell()
1233
                _bmpdata, _wmfdata = read_image(handle, _image_seeker)
1234
                handle.seek(_offset, 0)  
1235
              print "image seeker to %#x" % _image_seeker
1236
              print "offset at %#x" % handle.tell()
1237
              */
1238
                  
1239
                  
1240
                bb.position(19);//en realidad ya hemos leido 20 bytes
1241
                
1242
                short codePage = bb.getShort();
1243
                int count = bb.getInt();
1244
                
1245
                for (int i=0; i<count; i++) {
1246
                        
1247
                        byte rec = bb.get();
1248
                        int seek = bb.getInt();
1249
                        int size = bb.getInt();
1250
                        
1251
                        String sectionName = "";
1252
                        switch(rec){
1253
                        case 0:
1254
                                sectionName = "HEADERS";
1255
                                break;
1256
                        
1257
                        case 1:
1258
                                sectionName = "CLASSES";
1259
                                break;
1260
                                
1261
                        case 2:
1262
                                sectionName = "OBJECTS";
1263
                                break;
1264
                        case 3:
1265
                                sectionName = "UNKNOWN";
1266
                                break;
1267
                        case 4:
1268
                                sectionName = "R14DATA";
1269
                                break;
1270
                        case 5:
1271
                                sectionName = "R14_REC5";
1272
                                break;
1273
                        default:
1274
                                logger.warn("Seccion con codigo desconocido:"+rec);
1275
                                break;
1276
                        
1277
                        }//switch
1278
                        dwgFile.addDwgSectionOffset(sectionName, seek, size);
1279
                }//for
1280
                
1281
                
1282
                //finalmente se lee el CRC
1283
                short _crc = bb.getShort();
1284
                logger.info("CRC="+ _crc);
1285
                
1286
                
1287
                
1288
                //Seguidamente aparece una seccion fija de 16 bytes
1289
                //Esto hay que leerlo como "bytes de la maquina"
1290
                //TODO Ver si esto afecta
1291
                bb.order(ByteOrder.nativeOrder());
1292
                
1293
                byte[] c2 = new byte[16];
1294
                bb.get(c2);
1295
                if(c2[0] != 0x95)
1296
                        logger.warn("c2[0] != 0x95");
1297
                if(c2[1] != 0xa0)
1298
                        logger.warn("c2[1] != 0xa0");
1299
                if(c2[2] != 0x4e)
1300
                        logger.warn("c2[2] != 0x4e");
1301
                if(c2[3] != 0x28)
1302
                        logger.warn("c2[3] != 0x28");
1303
                if(c2[4] != 0x99)
1304
                        logger.warn("c2[4] != 0x99");
1305
                if(c2[5] != 0x82)
1306
                        logger.warn("c2[5] != 0x82");
1307
                if(c2[6] != 0x1a)
1308
                        logger.warn("c2[6] != 0x1a");
1309
                if(c2[7] != 0xe5)
1310
                        logger.warn("c2[7] != 0xe5");
1311
                if(c2[8] != 0x5e)
1312
                        logger.warn("c2[8] != 0x5e");
1313
                if(c2[9] != 0x41)
1314
                        logger.warn("c2[9] != 0x41");
1315
                if(c2[10] != 0xe0)
1316
                        logger.warn("c2[10] != 0xe0");
1317
                if(c2[11] != 0x5f)
1318
                        logger.warn("c2[11] != 0x5f");
1319
                if(c2[12] != 0x9d)
1320
                        logger.warn("c2[12] != 0x9d");
1321
                if(c2[13] != 0x3a)
1322
                        logger.warn("c2[13] != 0x3a");
1323
                if(c2[14] != 0x4d)
1324
                        logger.warn("c2[14] != 0x4d");
1325
                if(c2[15] != 0x00)
1326
                        logger.warn("c2[15] != 0x00");
1327
        }
1328
        
1329
        /*
1330
         * TODO Probar, y si no va, meter el codigo del lector de V15
1331
         * (es SIMILAR, llevar a clase abstracta comun)
1332
         * */
1333
        protected void readDwgObjectOffsets() throws Exception {
1334
                int offset = dwgFile.getDwgSectionOffset("OBJECTS");
1335
                bb.position(offset);
1336
                while (true) {
1337
                        bb.order(ByteOrder.BIG_ENDIAN);
1338
                        short size = bb.getShort();
1339
                        if (size==2) 
1340
                                break;
1341
//TODO Cuando en Python no pone < ni >, es nativeOrder o little_endian??                        
1342
//                        bb.order(ByteOrder.LITTLE_ENDIAN);
1343
                        bb.order(ByteOrder.nativeOrder());
1344
                        byte[] dataBytes = new byte[size];
1345
                        bb.get(dataBytes);
1346
                        
1347
                        
1348
                        /*TODO Creo q esto no hace falta, al estar en bytes nativos
1349
                         * (no en LITTLE_ENDIAN)
1350
                        int[] data = DwgUtil.bytesToMachineBytes(dataBytes);
1351
                        */
1352
                        int[] data = DwgUtil.toIntArray(dataBytes);
1353
                        /*
1354
                        the spec says 'last_handle' and 'last_loc' are initialized outside
1355
                    the outer for loop - postings on OpenDWG forum say these variables
1356
                     must be initialized for each section
1357
                      */
1358
                        int lastHandle=0;
1359
                        int lastLoc=0;
1360
                        int bitPos=0;
1361
                        int bitMax= (size - 2) * 8;//se quitan 2 bytes por el CRC final
1362
                        while (bitPos < bitMax) {
1363
                                List v = DwgUtil.getModularChar(data, bitPos);
1364
                                bitPos = ((Integer)v.get(0)).intValue();
1365
                                lastHandle = lastHandle + ((Integer)v.get(1)).intValue();
1366
                                v = DwgUtil.getModularChar(data, bitPos);
1367
                                bitPos = ((Integer)v.get(0)).intValue();
1368
                                lastLoc = lastLoc + ((Integer)v.get(1)).intValue();
1369
                                dwgFile.addDwgObjectOffset(lastHandle, lastLoc);
1370
                        }//while
1371
                }//while
1372
        }
1373
        
1374
        
1375
        protected void readDwgClasses() throws Exception {
1376
                int offset = dwgFile.getDwgSectionOffset("CLASSES");
1377
                bb.position(offset);
1378
                //1? leemos el sentinnel inicial
1379
                bb.order(ByteOrder.nativeOrder());
1380
                byte[] sentinel = new byte[16];
1381
                bb.get(sentinel);
1382
                if(sentinel[0] != 0x8d)
1383
                        logger.warn("sentinel[0] != 0x8d");
1384
                if(sentinel[1] != 0xa1)
1385
                        logger.warn("sentinel[1] != 0xa1");
1386
                if(sentinel[2] != 0xc4)
1387
                        logger.warn("sentinel[2] != 0xc4");
1388
                if(sentinel[3] != 0xb8)
1389
                        logger.warn("sentinel[3] != 0xb8");
1390
                if(sentinel[4] != 0xc4)
1391
                        logger.warn("sentinel[4] != 0xc4");
1392
                if(sentinel[5] != 0xa9)
1393
                        logger.warn("sentinel[5] != 0xa9");
1394
                if(sentinel[6] != 0xf8)
1395
                        logger.warn("sentinel[6] != 0xf8");
1396
                if(sentinel[7] != 0xc5)
1397
                        logger.warn("sentinel[7] != 0xc5");
1398
                if(sentinel[8] != 0xc0)
1399
                        logger.warn("sentinel[8] != 0xc0");
1400
                if(sentinel[9] != 0xdc)
1401
                        logger.warn("sentinel[9] != 0xdc");
1402
                if(sentinel[10] != 0xf4)
1403
                        logger.warn("sentinel[10] != 0xf4");
1404
                if(sentinel[11] != 0x5f)
1405
                        logger.warn("sentinel[11] != 0x5f");
1406
                if(sentinel[12] != 0xe7)
1407
                        logger.warn("sentinel[12] != 0xe7");
1408
                if(sentinel[13] != 0xcf)
1409
                        logger.warn("sentinel[13] != 0xcf");
1410
                if(sentinel[14] != 0xb6)
1411
                        logger.warn("sentinel[14] != 0xb6");
1412
                if(sentinel[15] != 0x8a)
1413
                        logger.warn("sentinel[15] != 0x8a");
1414
                
1415
                bb.order(ByteOrder.LITTLE_ENDIAN);
1416
                int size = bb.getInt();
1417
                byte[] data = new byte[size];
1418
                bb.get(data);
1419
                int[] intData = DwgUtil.toIntArray(data);
1420
                short crc = bb.getShort();
1421
                
1422
                int maxBit = size * 8;
1423
                int bitPos = 0;
1424
                List val = null;
1425
                while ( (bitPos + 8) < maxBit){
1426
                        val = DwgUtil.getBitShort(intData, bitPos);
1427
                        bitPos = ((Integer)val.get(0)).intValue();
1428
                        int classNum = ((Integer)val.get(1)).intValue();
1429
                        
1430
                        val = DwgUtil.getBitShort(intData, bitPos);
1431
                        bitPos = ((Integer)val.get(0)).intValue();
1432
                        int version = ((Integer)val.get(1)).intValue();
1433
                        
1434
                        val = DwgUtil.getTextString(intData, bitPos);
1435
                        bitPos = ((Integer)val.get(0)).intValue();
1436
                        String appName = (String)val.get(1);
1437
                        
1438
                        val = DwgUtil.getTextString(intData, bitPos);
1439
                        bitPos = ((Integer)val.get(0)).intValue();
1440
                        String cPlusPlusName = (String)val.get(1);
1441
                        
1442
                        val = DwgUtil.getTextString(intData, bitPos);
1443
                        bitPos = ((Integer)val.get(0)).intValue();
1444
                        String dxfName = (String)val.get(1);
1445
                        
1446
                        val = DwgUtil.testBit(intData, bitPos);
1447
                        bitPos = ((Integer)val.get(0)).intValue();
1448
                        boolean isZombie = ((Boolean)val.get(1)).booleanValue();
1449
                        
1450
                        val = DwgUtil.getBitShort(intData, bitPos);
1451
                        bitPos = ((Integer)val.get(0)).intValue();
1452
                        int id = ((Integer)val.get(1)).intValue();
1453
                        
1454
                        DwgClass dwgClass = new DwgClass(classNum, version, appName, 
1455
                                                                cPlusPlusName, dxfName, isZombie, id);
1456
                        dwgFile.addDwgClass(dwgClass);
1457
                        
1458
                }//while
1459
//                Por ultimo, el sentinnel final
1460
                bb.order(ByteOrder.nativeOrder());
1461
                byte[] lastSentinnel = new byte[16];
1462
                bb.get(lastSentinnel);
1463
                if(lastSentinnel[0] != 0x72)
1464
                        logger.warn("lastSentinnel[0] != 0x72");
1465
                if(lastSentinnel[1] != 0x5e)
1466
                        logger.warn("lastSentinnel[1] != 0x5e");
1467
                if(lastSentinnel[2] != 0x3b)
1468
                        logger.warn("lastSentinnel[2] != 0x3b");
1469
                if(lastSentinnel[3] != 0x47)
1470
                        logger.warn("lastSentinnel[3] != 0x47");
1471
                if(lastSentinnel[4] != 0x3b)
1472
                        logger.warn("lastSentinnel[4] != 0x3b");
1473
                if(lastSentinnel[5] != 0x56)
1474
                        logger.warn("lastSentinnel[5] != 0x56");
1475
                if(lastSentinnel[6] != 0x07)
1476
                        logger.warn("lastSentinnel[6] != 0x07");
1477
                if(lastSentinnel[7] != 0x3a)
1478
                        logger.warn("lastSentinnel[7] != 0x3a");
1479
                if(lastSentinnel[8] != 0x3f)
1480
                        logger.warn("lastSentinnel[8] != 0x3f");
1481
                if(lastSentinnel[9] != 0x23)
1482
                        logger.warn("lastSentinnel[9] != 0x23");
1483
                if(lastSentinnel[10] != 0x0b)
1484
                        logger.warn("lastSentinnel[10] != 0x0b");
1485
                if(lastSentinnel[11] != 0xa0)
1486
                        logger.warn("lastSentinnel[11] != 0xa0");
1487
                if(lastSentinnel[12] != 0x18)
1488
                        logger.warn("lastSentinnel[12] != 0x18");
1489
                if(lastSentinnel[13] != 0x30)
1490
                        logger.warn("lastSentinnel[13] != 0x30");
1491
                if(lastSentinnel[14] != 0x49)
1492
                        logger.warn("lastSentinnel[14] != 0x49");
1493
                if(lastSentinnel[15] != 0x75)
1494
                        logger.warn("lastSentinnel[15] != 0x75");
1495
        }
1496
        
1497
        
1498

    
1499
        /**
1500
         * Reads all the object referenced in the object map section of the
1501
         * DWG file (using their object file obsets)
1502
         * */
1503
        protected void readDwgObjects() {
1504
                logger.info("Vamos a leer "+dwgFile.getDwgObjectOffsets().size()+" objetos");
1505

    
1506
                for (int i=0; i<dwgFile.getDwgObjectOffsets().size(); i++) {
1507
                        DwgObjectOffset doo = (DwgObjectOffset)dwgFile.getDwgObjectOffsets().get(i);
1508
                        DwgObject obj = readDwgObject(doo.getOffset(), i);
1509
                        if(obj != null && obj.getClass() != DwgObject.class){
1510
                                dwgFile.addDwgObject(obj);
1511
                        }
1512
                }//for
1513
                System.out.println("####LWPolyline erroneas:"+numPolylinesWrong+"####");
1514
                System.out.println("####################################");
1515
        }
1516
        
1517
        /**
1518
         * Return a dwg object from its index in the dwg file
1519
         * @param index of the requested dwg object in the dwg file
1520
         * 
1521
         * */
1522
        public DwgObject getDwgObjectByIndex(int index){
1523
                DwgObjectOffset doo = (DwgObjectOffset)dwgFile.getDwgObjectOffsets().get(index);
1524
                return readDwgObject(doo.getOffset(), index);
1525
        }
1526
        
1527

    
1528
        /**
1529
         * Reads a dwg drawing entity (dwg object) given its offset in the file
1530
         * 
1531
         * @param offset offset of the dwg object in the file
1532
         * @param index order of the entity in the objects map (1, 2, etc.)
1533
         * */
1534

    
1535
        
1536
        protected DwgObject readDwgObject(int offset, int index) {
1537
                DwgObject obj = null;
1538
                try {
1539
                        bb.position(offset);
1540
                        int size = DwgUtil.getModularShort(bb);
1541
                        bb.order(ByteOrder.nativeOrder());
1542
                        byte[] data = new byte[size];
1543
                        bb.get(data);
1544
                        int[] intData = DwgUtil.toIntArray(data);
1545
                        int bitPos = 0;
1546
                        List val = DwgUtil.getBitShort(intData, bitPos);
1547
                        bitPos = ((Integer)val.get(0)).intValue();
1548
                        int type = ((Integer)val.get(1)).intValue();
1549
                        
1550
                        obj = DwgObjectFactory.
1551
                                                                getInstance().
1552
                                                                create(type, index);
1553
                        obj.setVersion(dwgFile.getDwgVersion());
1554
                        obj.setDwgFile(this.dwgFile);//TODO Esto lo quitamos de aqu?
1555

    
1556
        
1557
                        DwgHandleReference hr = new DwgHandleReference();
1558
                        bitPos = hr.read(intData, bitPos);
1559
                        obj.setHandle(hr);
1560
                        
1561
//TODO Si funciona, mover el metodo de esta clase a DwgUtil 
1562
                    val = readExtendedData(intData, bitPos);
1563
                    bitPos = ((Integer)val.get(0)).intValue();
1564
                    List extData = (List)val.get(1);
1565
                    obj.setExtendedData(extData);
1566
                    
1567
                    //Graphics data 
1568
                    boolean gflag = false;
1569
                    gflag = obj.isGraphicsFlag();           
1570
                    if (gflag) {
1571
                            val = DwgUtil.testBit(intData, bitPos);
1572
                            bitPos = ((Integer)val.get(0)).intValue();
1573
                            boolean hasGraphicsData = ((Boolean)val.get(1)).booleanValue();
1574
                           //si hay imagen asociada, se lee por completo
1575
                            if (hasGraphicsData) {
1576
                                    val = DwgUtil.getRawLong(intData, bitPos);
1577
                                    bitPos = ((Integer)val.get(0)).intValue();
1578
                                    size = ((Integer)val.get(1)).intValue();
1579
                                    int bgSize = size * 8;
1580
                                        Integer giData = (Integer)DwgUtil.getBits(intData, bgSize, bitPos);
1581
                                        obj.setGraphicData(giData.intValue());
1582
                                        bitPos = bitPos + bgSize;
1583
                            }
1584
                    }//if gflag
1585
                    
1586
                    
1587
                    //size in bits
1588
                    val = DwgUtil.getRawLong(intData, bitPos);
1589
                    bitPos = ((Integer)val.get(0)).intValue();
1590
                    int sizeInBits = ((Integer)val.get(1)).intValue();
1591
                    obj.setSizeInBits(sizeInBits);
1592
                    
1593
                    if(obj.getClass() != DwgObject.class){
1594
                            //El objeto ha sido reconocido
1595
                            readSpecificObject(obj, intData, bitPos);
1596
                    }else{
1597
                            if(type >= 500){
1598
                                    /*
1599
                                     * Pag 46 de la spec: restamos 500 al tipo y nos da un ?ndice
1600
                                     * a la tabla de clases (CLASSES section)
1601
                                     * 
1602
                                     * Filtro aquellos que sean mayores de 500 porque todav?a
1603
                                     * nos quedan por implementar muchas entidades DWG (para no confundirlas)
1604
                                     * 
1605
                                     * */
1606
                                    int newIndex = type - 500;
1607
                                    
1608
                                    if(newIndex < (dwgFile.getDwgClasses().size() - 1)){
1609
                                            DwgClass dwgClass = (DwgClass) dwgFile.getDwgClasses().get(newIndex);
1610
                                            String dxfEntityName = dwgClass.getDxfName();
1611
                                            DwgObject dwg = DwgObjectFactory.getInstance().
1612
                                                                                create(dxfEntityName, index);
1613
                                            if(dwg == null){
1614
                                                    System.out.println(dxfEntityName+" todavia no est? implementado");
1615
                                                    return null;
1616
                                            }
1617
                                            dwg.setVersion(obj.getVersion());
1618
                                            dwg.setHandle(obj.getHandle());
1619
                                            dwg.setExtendedData(obj.getExtendedData());
1620
                                            dwg.setSizeInBits(obj.getSizeInBits());
1621
                                            dwg.setGraphicData(obj.getGraphicData());
1622
                                            obj = dwg;
1623
                                            readSpecificObject(obj, intData, bitPos);
1624
                                            
1625
                                            
1626
                                            
1627
                                    }
1628
                            }//if type 500
1629
                            else{
1630
                                    //Resulta que algunos tipos, sin ser mayor que 500, si que
1631
                                    //se hacen coincidir con entradas en la object class.
1632
                                    /*
1633
                                     * Foro de OpenDesign:
1634
                                     * 
1635
                                     * Starting with A2k, some of the entity types that used to be 
1636
                                     * proxies have been given fixed type values. &nbsp;These are:
1637
                                                     OLE2FRAME - 74
1638
                                                     LWPOLYLINE - 77
1639
                                                     HATCH - 78
1640
                                     * */        
1641
                                    System.out.println("Encontrado tipo "+type);
1642
                            }
1643
                    }//if DwgObject.class        
1644
                                                   
1645
                    return obj;
1646
                    
1647
            } catch (Exception e) {
1648
//                logger.warn("Exception capturada. Probablemente se ha encontrado un" +
1649
//                                "objeto con type non fixed");
1650
                    if(obj instanceof DwgLwPolyline){
1651
                            numPolylinesWrong++;
1652
                    }
1653
                e.printStackTrace();
1654
                return null;
1655
            }
1656
        }
1657
        
1658
        
1659
        /*
1660
         * TODO Esto est? pesimamente dise?ado.
1661
         * Cada objeto DwgObject debe tener un metodo
1662
         * readSpecificObject(data,bitPos)
1663
         * 
1664
         * */
1665
        protected void readSpecificObject(DwgObject obj, int[] data, int bitPos) throws Exception {
1666
                DwgObjectReaderPool pool = DwgObjectReaderPool.getInstance();
1667
                IDwgObjectReader reader = pool.get(obj, "1314");
1668
                if(reader != null){
1669
                        reader.setFileReader(this);
1670
                        reader.readSpecificObj(data, bitPos, obj);
1671
                }else{
1672
                        System.out.println("No se ha implementado la lectura de "+obj.getClass().getName()+", code="+obj.getType());
1673
                }
1674
        }
1675
        /*
1676
         * TODO 
1677
         * En DwgUtil se dice que este metodo tiene graves errores.
1678
         * Intento de reimplementarlo a partir del codigo Python original
1679
         * */
1680
        List readExtendedData(int[] data, int bitPos) throws Exception {
1681
                List solution = new ArrayList();
1682
                //TODO Ver si el array est? bien, o hay que cambiarlo por un stringbuffer
1683
                List extendedData = new ArrayList();
1684
                int size;
1685
                List val;
1686
                while(true){//TODO VER SI HAY PROBLEMAS DE NO SALIDA
1687
                        
1688
                        val = DwgUtil.getBitShort(data, bitPos);
1689
                        bitPos = ((Integer) val.get(0)).intValue();
1690
                        size = ((Integer) val.get(1)).intValue();
1691
                        if(size == 0)
1692
                                break;
1693
                        
1694
                        DwgHandleReference hr = new DwgHandleReference();
1695
                        bitPos = hr.read(data, bitPos);
1696
                        logger.debug("Handle del EXTENDED ENTITY DATA:"+hr.getCode()+" "+hr.getOffset());
1697

    
1698
                        int count = 0;
1699
                        while(count < size){
1700
                                val = DwgUtil.getRawChar(data, bitPos);
1701
                                bitPos = ((Integer) val.get(0)).intValue();
1702
                                int codeByte = ((Integer) val.get(1)).intValue();
1703
                                count++;
1704
                                if(codeByte == 0x0){
1705
                                        val = DwgUtil.getRawChar(data, bitPos);
1706
                                        bitPos = ((Integer) val.get(0)).intValue();
1707
                                        int slen = ((Integer) val.get(1)).intValue();
1708
                                        val = DwgUtil.getRawShort(data, bitPos);
1709
                                        bitPos = ((Integer) val.get(0)).intValue();
1710
                                        int codePage = ((Integer) val.get(1)).intValue();
1711
                                        logger.debug("Extended Data (0x0): code page = " + codePage);
1712
                                        char[] chars = new char[slen];
1713
                                        for(int i = 0; i < slen; i++){
1714
                                                val = DwgUtil.getRawChar(data, bitPos);
1715
                                                bitPos = ((Integer) val.get(0)).intValue();
1716
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
1717
                                        }//for
1718
                                        String str = new String(chars);
1719
                                        logger.debug("Chars:"+str);
1720
                                        extendedData.add(str);
1721
                                        count += (3 + slen);
1722
                                }else if(codeByte == 0x1){
1723
                                                logger.debug("Invalid extended data code byte: 0x1");
1724
                                }else if(codeByte == 0x2){
1725
                                        val = DwgUtil.getRawChar(data, bitPos);
1726
                                        bitPos = ((Integer) val.get(0)).intValue();
1727
                                        int character = ((Integer)val.get(1)).intValue();
1728
                                        if(character == 0x0)
1729
                                                extendedData.add("{");
1730
                                        else if(character == 0x1)
1731
                                                extendedData.add("}");
1732
                                        else{
1733
                                                logger.warn("Invalid extended data char:"+character);
1734
                                        }
1735
                                        count++;  
1736
                                } else if(codeByte == 0x3){
1737
                                        char[] chars = new char[8];
1738
                                        for(int i = 0; i < 8; i++){
1739
                                                val = DwgUtil.getRawChar(data, bitPos);
1740
                                                bitPos = ((Integer) val.get(0)).intValue();
1741
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
1742
                                        }
1743
                                        String str = new String(chars);
1744
                                        logger.debug("Chars:"+str);
1745
                                        extendedData.add(str);
1746
                                        count += 8;
1747
                                }else if(codeByte == 0x4){
1748
                                        //binary chunk in extended data
1749
                                        val = DwgUtil.getRawChar(data, bitPos);
1750
                                        bitPos = ((Integer) val.get(0)).intValue();
1751
                                        int length = ((Integer) val.get(1)).intValue();
1752
                                        char[] chars = new char[length];
1753
                                        for(int i = 0; i < length; i++){
1754
                                                val = DwgUtil.getRawChar(data, bitPos);
1755
                                                bitPos = ((Integer) val.get(0)).intValue();
1756
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
1757
                                        }
1758
                                        String str = new String(chars);
1759
                                        logger.debug("Chars:"+str);
1760
                                        extendedData.add(str);
1761
                                        count += (1 + length);
1762
                                }else if(codeByte == 0x5){
1763
                                        //entity handle reference
1764
                                        char[] chars = new char[8];
1765
                                        for(int i = 0; i < 8; i++){
1766
                                                val = DwgUtil.getRawChar(data, bitPos);
1767
                                                bitPos = ((Integer) val.get(0)).intValue();
1768
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
1769
                                        }
1770
                                        String str = new String(chars);
1771
                                        logger.debug("Chars:"+str);
1772
                                        extendedData.add(str);
1773
                                        count += 8;
1774
                                }else if( (codeByte >= 0xa) && (codeByte <= 0xd)){
1775
                                        //three doubles
1776
                                        double[] dValues = new double[3];  
1777
                                        val = DwgUtil.getRawDouble(data, bitPos);
1778
                                        bitPos = ((Integer) val.get(0)).intValue();
1779
                                        dValues[0] =  ((Double) val.get(1)).doubleValue();
1780
                                        
1781
                                        val = DwgUtil.getRawDouble(data, bitPos);
1782
                                        bitPos = ((Integer) val.get(0)).intValue();
1783
                                        dValues[1] =  ((Double) val.get(1)).doubleValue();
1784
                                        
1785
                                        val = DwgUtil.getRawDouble(data, bitPos);
1786
                                        bitPos = ((Integer) val.get(0)).intValue();
1787
                                        dValues[2] =  ((Double) val.get(1)).doubleValue();
1788
                                        
1789
                                        logger.debug("Doubles:"+dValues);
1790
                                        extendedData.add(dValues);
1791
                                        count += 24;
1792
                                }else if( (codeByte >= 0x28) && (codeByte <= 0x2a)){
1793
                                        //one double
1794
                                        val = DwgUtil.getRawDouble(data, bitPos);
1795
                                        bitPos = ((Integer) val.get(0)).intValue();
1796
                                        double value =  ((Double) val.get(1)).doubleValue();
1797
                                        logger.debug("Double value:"+ value);
1798
                                        extendedData.add(val.get(1));
1799
                                        count += 8;
1800
                                }else if(codeByte == 0x46){
1801
                                        //a short value
1802
                                        val = DwgUtil.getRawShort(data, bitPos);
1803
                                        bitPos = ((Integer) val.get(0)).intValue();
1804
                                        int value = ((Integer) val.get(1)).intValue();
1805
                                        logger.debug("Short value:"+value);
1806
                                        extendedData.add(val.get(1));
1807
                                        count += 2;
1808
                                }else if(codeByte == 0x47){
1809
                                        //int value
1810
                                        val = DwgUtil.getRawLong(data, bitPos);
1811
                                        bitPos = ((Integer) val.get(0)).intValue();
1812
                                        int value = ((Integer) val.get(1)).intValue();
1813
                                        logger.debug("Int value:"+value);
1814
                                        extendedData.add(val.get(1));
1815
                                        count += 4;
1816
                                }else{
1817
                                        logger.debug("Unexpected code byte in EXTENDED DATA "+codeByte);
1818
                                }
1819
                        }//while
1820
                }//while
1821
                solution.add(new Integer(bitPos));
1822
                solution.add(extendedData);
1823
                return solution;
1824
        }
1825

    
1826
        /* (non-Javadoc)
1827
         * @see com.iver.cit.jdwglib.dwg.readers.IDwgFileReader#readObjectHeader(int[], int, com.iver.cit.jdwglib.dwg.DwgObject)
1828
         */
1829
        public int readObjectHeader(int[] data, int offset, DwgObject dwgObject) {
1830
                int bitPos = offset;
1831
                Integer mode = (Integer)DwgUtil.getBits(data, 2, bitPos);
1832
            bitPos += 2;
1833
            dwgObject.setMode(mode.intValue());
1834
            
1835
            List val = DwgUtil.getBitLong(data, bitPos);
1836
            bitPos = ((Integer)val.get(0)).intValue();
1837
            int rnum = ((Integer)val.get(1)).intValue();
1838
            dwgObject.setNumReactors(rnum);
1839
            //TODO hasta aqui igual que en Dwg 15
1840
            
1841
            val = DwgUtil.testBit(data, bitPos);
1842
            bitPos = ((Integer)val.get(0)).intValue();
1843
            boolean isLyrByLineType = ((Boolean)val.get(1)).booleanValue();
1844
            //TODO En la 15 es un flag, no un boolean. REVISAR
1845
            dwgObject.setLyrByLineType(isLyrByLineType);
1846
            
1847
            val = DwgUtil.testBit(data, bitPos);
1848
            bitPos = ((Integer)val.get(0)).intValue();
1849
            boolean noLinks = ((Boolean)val.get(1)).booleanValue();
1850
            dwgObject.setNoLinks(noLinks);
1851
            
1852
            val = DwgUtil.getBitShort(data, bitPos);
1853
            bitPos = ((Integer)val.get(0)).intValue();
1854
            int color = ((Integer)val.get(1)).intValue();
1855
            dwgObject.setColor(color);
1856
            
1857
            val = DwgUtil.getBitDouble(data, bitPos);
1858
            bitPos = ((Integer)val.get(0)).intValue();
1859
            float ltscale = ((Double)val.get(1)).floatValue();
1860
            //TODO tampoco se setea en la 15 (en su lugar, un flag de ints)
1861
            val = DwgUtil.getBitShort(data, bitPos);
1862
            bitPos = ((Integer)val.get(0)).intValue();
1863
            int invis = ((Integer)val.get(1)).intValue();
1864
            
1865
                return bitPos;        
1866
        }
1867

    
1868
        /* 
1869
         * 
1870
         * (non-Javadoc)
1871
         * @see com.iver.cit.jdwglib.dwg.readers.IDwgFileReader#readObjectTailer(int[], int, com.iver.cit.jdwglib.dwg.DwgObject)
1872
         */
1873
        public int readObjectTailer(int[] data, int offset, DwgObject dwgObject) throws RuntimeException, CorruptedDwgEntityException {
1874
                int bitPos = offset;
1875
                List val = null;
1876
                
1877
                /*
1878
                 * Subentity ref handle.
1879
                 * Esto se aplica sobre VERTEX, ATTRIB, SEQEND
1880
                 * */
1881
                if (dwgObject.getMode()==0x0) {
1882
                    DwgHandleReference subEntityHandle = new DwgHandleReference();
1883
                    bitPos = subEntityHandle.read(data, bitPos);
1884
                    dwgObject.setSubEntityHandle(subEntityHandle);
1885
                }
1886
                
1887
                /*
1888
                 * Reactors handles
1889
                 * DwgObject
1890
                 */
1891
                DwgHandleReference reactorHandle;
1892
                for (int i = 0; i < dwgObject.getNumReactors(); i++) {
1893
                        reactorHandle = new DwgHandleReference();
1894
                        bitPos = reactorHandle.read(data, bitPos);
1895
                        dwgObject.addReactorHandle(reactorHandle);
1896
                }
1897
                
1898
                /*
1899
                 * XDICOBJHANDLE
1900
                 */
1901
                DwgHandleReference xDicObjHandle = new DwgHandleReference();
1902
                bitPos = xDicObjHandle.read(data, bitPos);
1903
                dwgObject.setXDicObjHandle(xDicObjHandle);
1904

    
1905
                //          TODO Hasta aqui igual que en la 15
1906

    
1907
                /*
1908
                 * Layer Handle code
1909
                 */
1910
                
1911
                DwgHandleReference layerHandle = new DwgHandleReference();
1912
                bitPos = layerHandle.read(data, bitPos);
1913
                dwgObject.setLayerHandle(layerHandle);
1914

    
1915
                if(! dwgObject.isLyrByLineType()){
1916
                        DwgHandleReference lineTypeHandle = new DwgHandleReference();
1917
                        bitPos = lineTypeHandle.read(data, bitPos);
1918
                        dwgObject.setLineTypeHandle(lineTypeHandle);
1919
                }
1920
                String cadena = "";
1921
                if(! dwgObject.isNoLinks()){
1922

    
1923
                        /*
1924
                         * Previous Handle 
1925
                         */
1926
                        DwgHandleReference previousHandle = new DwgHandleReference();
1927
                        bitPos = previousHandle.read(data, bitPos);
1928
                        dwgObject.setPreviousHandle(previousHandle);
1929

    
1930
                        /*
1931
                         * Next Handle 
1932
                         */
1933
                        DwgHandleReference nextHandle = new DwgHandleReference();
1934
                        bitPos = nextHandle.read(data, bitPos);
1935
                        dwgObject.setNextHandle(nextHandle);
1936
                }
1937
                return bitPos;
1938
        }
1939
        
1940
}