Statistics
| Revision:

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

History | View | Annotate | Download (63.3 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

    
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

    
64
        protected ByteBuffer bb;
65

    
66
        private static Logger logger = Logger.getLogger(DwgFileV14Reader.class
67
                        .getName());
68

    
69

    
70
        /**
71
         * Reads the DWG version 15 format
72
         * 
73
         * @param dwgFile
74
         *            Represents the DWG file that we want to read
75
         * @throws IOException
76
         *             When DWG file path is wrong
77
         */
78
        public void read(DwgFile dwgFile, ByteBuffer bb) throws IOException {
79
                this.dwgFile = dwgFile;
80
                this.bb = bb;
81
                try {
82
                        readDwgSectionOffsets();
83
                        readHeaders();
84
                        readDwgClasses();
85
                        readDwgObjectOffsets();
86
                        readDwgObjects();
87
                } catch (Exception e) {
88
                        logger.error(e);
89
                }
90

    
91
        }
92

    
93
        /**
94
         * It reads all HEADER section of a DWG 13-14 file.
95
         * 
96
         * This method must be called only for debug purposes because we dont the
97
         * meaning (or the practical application) of the fields readed with it
98
         * 
99
         * TODO Pasarlo a la clase abstracta comun que se haga de las versiones 15,
100
         * 13-14 (la cabecera es la misma practicamente)
101
         * 
102
         *  
103
         */
104
        protected void readHeaders() {
105

    
106
                int offset = dwgFile.getDwgSectionOffset("HEADERS");
107
                bb.position(offset);
108

    
109
                //1? leemos el sentinnel inicial
110
                bb.order(ByteOrder.nativeOrder());
111
                byte[] sentinel = new byte[16];
112
                bb.get(sentinel);
113

    
114
                if (sentinel[0] != 0xcf)
115
                        logger.warn("sentinel[0] != 0xcf");
116
                if (sentinel[1] != 0x7b)
117
                        logger.warn("sentinel[1] != 0x7b");
118
                if (sentinel[2] != 0x1f)
119
                        logger.warn("sentinel[2] != 0x1f");
120
                if (sentinel[3] != 0x23)
121
                        logger.warn("sentinel[3] != 0x23");
122
                if (sentinel[4] != 0xfd)
123
                        logger.warn("sentinel[4] != 0xfd");
124
                if (sentinel[5] != 0xde)
125
                        logger.warn("sentinel[5] != 0xde");
126
                if (sentinel[6] != 0x38)
127
                        logger.warn("sentinel[6] != 0x38");
128
                if (sentinel[7] != 0xa9)
129
                        logger.warn("sentinel[7] != 0xa9");
130
                if (sentinel[8] != 0x5f)
131
                        logger.warn("sentinel[8] != 0x5f");
132
                if (sentinel[9] != 0x7c)
133
                        logger.warn("sentinel[9] != 0x7c");
134
                if (sentinel[10] != 0x68)
135
                        logger.warn("sentinel[10] != 0x68");
136
                if (sentinel[11] != 0xb8)
137
                        logger.warn("sentinel[11] != 0xb8");
138
                if (sentinel[12] != 0x4e)
139
                        logger.warn("sentinel[12] != 0x4e");
140
                if (sentinel[13] != 0x6d)
141
                        logger.warn("sentinel[13] != 0x6d");
142
                if (sentinel[14] != 0x33)
143
                        logger.warn("sentinel[14] != 0x33");
144
                if (sentinel[15] != 0x5f)
145
                        logger.warn("sentinel[15] != 0x5f");
146

    
147
                //2? seguidamente leemos los datos
148
                bb.order(ByteOrder.LITTLE_ENDIAN);
149
                int size = bb.getInt();
150

    
151
                bb.order(ByteOrder.nativeOrder());
152
                byte[] data = new byte[size];
153
                bb.get(data);
154

    
155
                int[] intData = DwgUtil.toIntArray(data);
156

    
157
                //3? a continuacion el CRC de la seccion HEADER
158
                bb.order(ByteOrder.LITTLE_ENDIAN);
159
                short crc = bb.getShort();
160

    
161
                //Por ultimo, el sentinnel final
162
                bb.order(ByteOrder.nativeOrder());
163
                byte[] lastSentinnel = new byte[16];
164
                bb.get(lastSentinnel);
165
                if (lastSentinnel[0] != 0x30)
166
                        logger.warn("lastSentinnel[0] != 0x30");
167
                if (lastSentinnel[1] != 0x84)
168
                        logger.warn("lastSentinnel[1] != 0x84");
169
                if (lastSentinnel[2] != 0xe0)
170
                        logger.warn("lastSentinnel[2] != 0xe0");
171
                if (lastSentinnel[3] != 0xdc)
172
                        logger.warn("lastSentinnel[3] != 0xdc");
173
                if (lastSentinnel[4] != 0x02)
174
                        logger.warn("lastSentinnel[4] != 0x02");
175
                if (lastSentinnel[5] != 0x21)
176
                        logger.warn("lastSentinnel[5] != 0x21");
177
                if (lastSentinnel[6] != 0xc7)
178
                        logger.warn("lastSentinnel[6] != 0xc7");
179
                if (lastSentinnel[7] != 0x56)
180
                        logger.warn("lastSentinnel[7] != 0x56");
181
                if (lastSentinnel[8] != 0xa0)
182
                        logger.warn("lastSentinnel[8] != 0xa0");
183
                if (lastSentinnel[9] != 0x83)
184
                        logger.warn("lastSentinnel[9] != 0x83");
185
                if (lastSentinnel[10] != 0x97)
186
                        logger.warn("lastSentinnel[10] != 0x97");
187
                if (lastSentinnel[11] != 0x47)
188
                        logger.warn("lastSentinnel[11] != 0x47");
189
                if (lastSentinnel[12] != 0xb1)
190
                        logger.warn("lastSentinnel[12] != 0xb1");
191
                if (lastSentinnel[13] != 0x92)
192
                        logger.warn("lastSentinnel[13] != 0x92");
193
                if (lastSentinnel[14] != 0xcc)
194
                        logger.warn("lastSentinnel[14] != 0xcc");
195
                if (lastSentinnel[15] != 0xa0)
196
                        logger.warn("lastSentinnel[15] != 0xa0");
197

    
198
                //Ahora interpretamos los datos en bruto
199
                int bitPos = 0;
200
                try {
201
                        List val = DwgUtil.getBitDouble(intData, bitPos);
202
                        bitPos = ((Integer) val.get(0)).intValue();
203
                        dwgFile.setHeader("VAL1", val.get(1));
204

    
205
                        val = DwgUtil.getBitDouble(intData, bitPos);
206
                        bitPos = ((Integer) val.get(0)).intValue();
207
                        dwgFile.setHeader("VAL2", val.get(1));
208

    
209
                        val = DwgUtil.getBitDouble(intData, bitPos);
210
                        bitPos = ((Integer) val.get(0)).intValue();
211
                        dwgFile.setHeader("VAL3", val.get(1));
212

    
213
                        val = DwgUtil.getBitDouble(intData, bitPos);
214
                        bitPos = ((Integer) val.get(0)).intValue();
215
                        dwgFile.setHeader("VAL4", val.get(1));
216

    
217
                        val = DwgUtil.getTextString(intData, bitPos);
218
                        bitPos = ((Integer) val.get(0)).intValue();
219
                        dwgFile.setHeader("STRING1", val.get(1));
220

    
221
                        val = DwgUtil.getTextString(intData, bitPos);
222
                        bitPos = ((Integer) val.get(0)).intValue();
223
                        dwgFile.setHeader("STRING2", val.get(1));
224

    
225
                        val = DwgUtil.getTextString(intData, bitPos);
226
                        bitPos = ((Integer) val.get(0)).intValue();
227
                        dwgFile.setHeader("STRING3", val.get(1));
228

    
229
                        val = DwgUtil.getTextString(intData, bitPos);
230
                        bitPos = ((Integer) val.get(0)).intValue();
231
                        dwgFile.setHeader("STRING4", val.get(1));
232

    
233
                        val = DwgUtil.getBitLong(intData, bitPos);
234
                        bitPos = ((Integer) val.get(0)).intValue();
235
                        dwgFile.setHeader("LONG1", val.get(1));
236

    
237
                        val = DwgUtil.getBitLong(intData, bitPos);
238
                        bitPos = ((Integer) val.get(0)).intValue();
239
                        dwgFile.setHeader("LONG2", val.get(1));
240

    
241
                        val = DwgUtil.getBitShort(intData, bitPos);
242
                        bitPos = ((Integer) val.get(0)).intValue();
243
                        dwgFile.setHeader("SHORT1", val.get(1));
244

    
245
                        
246
                        val = DwgUtil.getHandle(intData, bitPos);
247
                        bitPos = ((Integer) val.get(0)).intValue();
248
                        dwgFile.setHeader("HANDLE1", val.get(1));
249

    
250
                        val = DwgUtil.testBit(intData, bitPos);
251
                        bitPos = ((Integer) val.get(0)).intValue();
252
                        dwgFile.setHeader("DIMASO", val.get(1));
253

    
254
                        val = DwgUtil.testBit(intData, bitPos);
255
                        bitPos = ((Integer) val.get(0)).intValue();
256
                        dwgFile.setHeader("DIMSHO", val.get(1));
257

    
258
                        val = DwgUtil.testBit(intData, bitPos);
259
                        bitPos = ((Integer) val.get(0)).intValue();
260
                        dwgFile.setHeader("DIMSAV", val.get(1));
261

    
262
                        val = DwgUtil.testBit(intData, bitPos);
263
                        bitPos = ((Integer) val.get(0)).intValue();
264
                        dwgFile.setHeader("PLINEGEN", val.get(1));
265

    
266
                        val = DwgUtil.testBit(intData, bitPos);
267
                        bitPos = ((Integer) val.get(0)).intValue();
268
                        dwgFile.setHeader("ORTHOMODE", val.get(1));
269

    
270
                        val = DwgUtil.testBit(intData, bitPos);
271
                        bitPos = ((Integer) val.get(0)).intValue();
272
                        dwgFile.setHeader("REGENMODE", val.get(1));
273

    
274
                        val = DwgUtil.testBit(intData, bitPos);
275
                        bitPos = ((Integer) val.get(0)).intValue();
276
                        dwgFile.setHeader("FILLMODE", val.get(1));
277

    
278
                        val = DwgUtil.testBit(intData, bitPos);
279
                        bitPos = ((Integer) val.get(0)).intValue();
280
                        dwgFile.setHeader("QTEXTMODE", val.get(1));
281

    
282
                        val = DwgUtil.testBit(intData, bitPos);
283
                        bitPos = ((Integer) val.get(0)).intValue();
284
                        dwgFile.setHeader("PSLTSCALE", val.get(1));
285

    
286
                        val = DwgUtil.testBit(intData, bitPos);
287
                        bitPos = ((Integer) val.get(0)).intValue();
288
                        dwgFile.setHeader("LIMCHECK", val.get(1));
289

    
290
                        val = DwgUtil.testBit(intData, bitPos);
291
                        bitPos = ((Integer) val.get(0)).intValue();
292
                        dwgFile.setHeader("BLIPMODE", val.get(1));
293

    
294
                        val = DwgUtil.testBit(intData, bitPos);
295
                        bitPos = ((Integer) val.get(0)).intValue();
296
                        dwgFile.setHeader("USER_TIMER", val.get(1));
297

    
298
                        val = DwgUtil.testBit(intData, bitPos);
299
                        bitPos = ((Integer) val.get(0)).intValue();
300
                        dwgFile.setHeader("SKPOLY", val.get(1));
301

    
302
                        val = DwgUtil.testBit(intData, bitPos);
303
                        bitPos = ((Integer) val.get(0)).intValue();
304
                        dwgFile.setHeader("ANGDIR", val.get(1));
305

    
306
                        val = DwgUtil.testBit(intData, bitPos);
307
                        bitPos = ((Integer) val.get(0)).intValue();
308
                        dwgFile.setHeader("SPLFRAME", val.get(1));
309

    
310
                        val = DwgUtil.testBit(intData, bitPos);
311
                        bitPos = ((Integer) val.get(0)).intValue();
312
                        dwgFile.setHeader("ATTREQ", val.get(1));
313

    
314
                        val = DwgUtil.testBit(intData, bitPos);
315
                        bitPos = ((Integer) val.get(0)).intValue();
316
                        dwgFile.setHeader("ATTDIA", val.get(1));
317

    
318
                        val = DwgUtil.testBit(intData, bitPos);
319
                        bitPos = ((Integer) val.get(0)).intValue();
320
                        dwgFile.setHeader("MIRRTEXT", val.get(1));
321

    
322
                        val = DwgUtil.testBit(intData, bitPos);
323
                        bitPos = ((Integer) val.get(0)).intValue();
324
                        dwgFile.setHeader("WORLDVIEW", val.get(1));
325

    
326
                        val = DwgUtil.testBit(intData, bitPos);
327
                        bitPos = ((Integer) val.get(0)).intValue();
328
                        dwgFile.setHeader("WIREFRAME", val.get(1));
329

    
330
                        val = DwgUtil.testBit(intData, bitPos);
331
                        bitPos = ((Integer) val.get(0)).intValue();
332
                        dwgFile.setHeader("TILEMODE", val.get(1));
333

    
334
                        val = DwgUtil.testBit(intData, bitPos);
335
                        bitPos = ((Integer) val.get(0)).intValue();
336
                        dwgFile.setHeader("PLIMCHECK", val.get(1));
337

    
338
                        val = DwgUtil.testBit(intData, bitPos);
339
                        bitPos = ((Integer) val.get(0)).intValue();
340
                        dwgFile.setHeader("VISRETAIN", val.get(1));
341

    
342
                        val = DwgUtil.testBit(intData, bitPos);
343
                        bitPos = ((Integer) val.get(0)).intValue();
344
                        dwgFile.setHeader("DELOBJ", val.get(1));
345

    
346
                        val = DwgUtil.testBit(intData, bitPos);
347
                        bitPos = ((Integer) val.get(0)).intValue();
348
                        dwgFile.setHeader("DISPSILH", val.get(1));
349

    
350
                        val = DwgUtil.testBit(intData, bitPos);
351
                        bitPos = ((Integer) val.get(0)).intValue();
352
                        dwgFile.setHeader("PELLISE", val.get(1));
353

    
354
                        val = DwgUtil.getBitShort(intData, bitPos);
355
                        bitPos = ((Integer) val.get(0)).intValue();
356
                        if (dwgFile.getDwgVersion() == "R14")
357
                                dwgFile.setHeader("PROXYGRAPH", val.get(1));
358
                        else
359
                                dwgFile.setHeader("SAVEIMAGES", val.get(1));
360

    
361
                        val = DwgUtil.getBitShort(intData, bitPos);
362
                        bitPos = ((Integer) val.get(0)).intValue();
363
                        dwgFile.setHeader("DRAGMODE", val.get(1));
364

    
365
                        val = DwgUtil.getBitShort(intData, bitPos);
366
                        bitPos = ((Integer) val.get(0)).intValue();
367
                        dwgFile.setHeader("TREEDEPTH", val.get(1));
368

    
369
                        val = DwgUtil.getBitShort(intData, bitPos);
370
                        bitPos = ((Integer) val.get(0)).intValue();
371
                        dwgFile.setHeader("LUNITS", val.get(1));
372

    
373
                        val = DwgUtil.getBitShort(intData, bitPos);
374
                        bitPos = ((Integer) val.get(0)).intValue();
375
                        dwgFile.setHeader("LUPREC", val.get(1));
376

    
377
                        val = DwgUtil.getBitShort(intData, bitPos);
378
                        bitPos = ((Integer) val.get(0)).intValue();
379
                        dwgFile.setHeader("AUNITS", val.get(1));
380

    
381
                        val = DwgUtil.getBitShort(intData, bitPos);
382
                        bitPos = ((Integer) val.get(0)).intValue();
383
                        dwgFile.setHeader("AUPREC", val.get(1));
384

    
385
                        val = DwgUtil.getBitShort(intData, bitPos);
386
                        bitPos = ((Integer) val.get(0)).intValue();
387
                        dwgFile.setHeader("OSMODE", val.get(1));
388

    
389
                        val = DwgUtil.getBitShort(intData, bitPos);
390
                        bitPos = ((Integer) val.get(0)).intValue();
391
                        dwgFile.setHeader("ATTMODE", val.get(1));
392

    
393
                        val = DwgUtil.getBitShort(intData, bitPos);
394
                        bitPos = ((Integer) val.get(0)).intValue();
395
                        dwgFile.setHeader("COORDS", val.get(1));
396

    
397
                        val = DwgUtil.getBitShort(intData, bitPos);
398
                        bitPos = ((Integer) val.get(0)).intValue();
399
                        dwgFile.setHeader("PDMODE", val.get(1));
400

    
401
                        val = DwgUtil.getBitShort(intData, bitPos);
402
                        bitPos = ((Integer) val.get(0)).intValue();
403
                        dwgFile.setHeader("PICKSTYLE", val.get(1));
404

    
405
                        val = DwgUtil.getBitShort(intData, bitPos);
406
                        bitPos = ((Integer) val.get(0)).intValue();
407
                        dwgFile.setHeader("USERI1", val.get(1));
408

    
409
                        val = DwgUtil.getBitShort(intData, bitPos);
410
                        bitPos = ((Integer) val.get(0)).intValue();
411
                        dwgFile.setHeader("USERI2", val.get(1));
412

    
413
                        val = DwgUtil.getBitShort(intData, bitPos);
414
                        bitPos = ((Integer) val.get(0)).intValue();
415
                        dwgFile.setHeader("USERI3", val.get(1));
416

    
417
                        val = DwgUtil.getBitShort(intData, bitPos);
418
                        bitPos = ((Integer) val.get(0)).intValue();
419
                        dwgFile.setHeader("USERI4", val.get(1));
420

    
421
                        val = DwgUtil.getBitShort(intData, bitPos);
422
                        bitPos = ((Integer) val.get(0)).intValue();
423
                        dwgFile.setHeader("USERI5", val.get(1));
424

    
425
                        val = DwgUtil.getBitShort(intData, bitPos);
426
                        bitPos = ((Integer) val.get(0)).intValue();
427
                        dwgFile.setHeader("SPLINESEGS", val.get(1));
428

    
429
                        val = DwgUtil.getBitShort(intData, bitPos);
430
                        bitPos = ((Integer) val.get(0)).intValue();
431
                        dwgFile.setHeader("SURFU", val.get(1));
432

    
433
                        val = DwgUtil.getBitShort(intData, bitPos);
434
                        bitPos = ((Integer) val.get(0)).intValue();
435
                        dwgFile.setHeader("SURFV", val.get(1));
436

    
437
                        val = DwgUtil.getBitShort(intData, bitPos);
438
                        bitPos = ((Integer) val.get(0)).intValue();
439
                        dwgFile.setHeader("SURFTYPE", val.get(1));
440

    
441
                        val = DwgUtil.getBitShort(intData, bitPos);
442
                        bitPos = ((Integer) val.get(0)).intValue();
443
                        dwgFile.setHeader("SURFTAB1", val.get(1));
444

    
445
                        val = DwgUtil.getBitShort(intData, bitPos);
446
                        bitPos = ((Integer) val.get(0)).intValue();
447
                        dwgFile.setHeader("SURFTAB2", val.get(1));
448

    
449
                        val = DwgUtil.getBitShort(intData, bitPos);
450
                        bitPos = ((Integer) val.get(0)).intValue();
451
                        dwgFile.setHeader("SPLINETYPE", val.get(1));
452

    
453
                        val = DwgUtil.getBitShort(intData, bitPos);
454
                        bitPos = ((Integer) val.get(0)).intValue();
455
                        dwgFile.setHeader("SHADEDGE", val.get(1));
456

    
457
                        val = DwgUtil.getBitShort(intData, bitPos);
458
                        bitPos = ((Integer) val.get(0)).intValue();
459
                        dwgFile.setHeader("SHADEDIF", val.get(1));
460

    
461
                        val = DwgUtil.getBitShort(intData, bitPos);
462
                        bitPos = ((Integer) val.get(0)).intValue();
463
                        dwgFile.setHeader("UNITMODE", val.get(1));
464

    
465
                        val = DwgUtil.getBitShort(intData, bitPos);
466
                        bitPos = ((Integer) val.get(0)).intValue();
467
                        dwgFile.setHeader("MAXACTVP", val.get(1));
468

    
469
                        val = DwgUtil.getBitShort(intData, bitPos);
470
                        bitPos = ((Integer) val.get(0)).intValue();
471
                        dwgFile.setHeader("ISOLINES", val.get(1));
472

    
473
                        val = DwgUtil.getBitShort(intData, bitPos);
474
                        bitPos = ((Integer) val.get(0)).intValue();
475
                        dwgFile.setHeader("CMLJUST", val.get(1));
476

    
477
                        val = DwgUtil.getBitShort(intData, bitPos);
478
                        bitPos = ((Integer) val.get(0)).intValue();
479
                        dwgFile.setHeader("TEXTQLTY", val.get(1));
480

    
481
                        val = DwgUtil.getBitDouble(intData, bitPos);
482
                        bitPos = ((Integer) val.get(0)).intValue();
483
                        dwgFile.setHeader("LTSCALE", val.get(1));
484

    
485
                        val = DwgUtil.getBitDouble(intData, bitPos);
486
                        bitPos = ((Integer) val.get(0)).intValue();
487
                        dwgFile.setHeader("TEXTSIZE", val.get(1));
488

    
489
                        val = DwgUtil.getBitDouble(intData, bitPos);
490
                        bitPos = ((Integer) val.get(0)).intValue();
491
                        dwgFile.setHeader("TRACEWID", val.get(1));
492

    
493
                        val = DwgUtil.getBitDouble(intData, bitPos);
494
                        bitPos = ((Integer) val.get(0)).intValue();
495
                        dwgFile.setHeader("SKETCHINC", val.get(1));
496

    
497
                        val = DwgUtil.getBitDouble(intData, bitPos);
498
                        bitPos = ((Integer) val.get(0)).intValue();
499
                        dwgFile.setHeader("FILLETRAD", val.get(1));
500

    
501
                        val = DwgUtil.getBitDouble(intData, bitPos);
502
                        bitPos = ((Integer) val.get(0)).intValue();
503
                        dwgFile.setHeader("THICKNESS", val.get(1));
504

    
505
                        val = DwgUtil.getBitDouble(intData, bitPos);
506
                        bitPos = ((Integer) val.get(0)).intValue();
507
                        dwgFile.setHeader("ANGBASE", val.get(1));
508

    
509
                        val = DwgUtil.getBitDouble(intData, bitPos);
510
                        bitPos = ((Integer) val.get(0)).intValue();
511
                        dwgFile.setHeader("PDSIZE", val.get(1));
512

    
513
                        val = DwgUtil.getBitDouble(intData, bitPos);
514
                        bitPos = ((Integer) val.get(0)).intValue();
515
                        dwgFile.setHeader("PLINEWID", val.get(1));
516

    
517
                        val = DwgUtil.getBitDouble(intData, bitPos);
518
                        bitPos = ((Integer) val.get(0)).intValue();
519
                        dwgFile.setHeader("USERR1", val.get(1));
520

    
521
                        val = DwgUtil.getBitDouble(intData, bitPos);
522
                        bitPos = ((Integer) val.get(0)).intValue();
523
                        dwgFile.setHeader("USERR2", val.get(1));
524

    
525
                        val = DwgUtil.getBitDouble(intData, bitPos);
526
                        bitPos = ((Integer) val.get(0)).intValue();
527
                        dwgFile.setHeader("USERR3", val.get(1));
528

    
529
                        val = DwgUtil.getBitDouble(intData, bitPos);
530
                        bitPos = ((Integer) val.get(0)).intValue();
531
                        dwgFile.setHeader("USERR4", val.get(1));
532

    
533
                        val = DwgUtil.getBitDouble(intData, bitPos);
534
                        bitPos = ((Integer) val.get(0)).intValue();
535
                        dwgFile.setHeader("USERR5", val.get(1));
536

    
537
                        val = DwgUtil.getBitDouble(intData, bitPos);
538
                        bitPos = ((Integer) val.get(0)).intValue();
539
                        dwgFile.setHeader("CHAMFERA", val.get(1));
540

    
541
                        val = DwgUtil.getBitDouble(intData, bitPos);
542
                        bitPos = ((Integer) val.get(0)).intValue();
543
                        dwgFile.setHeader("CHAMFERB", val.get(1));
544

    
545
                        val = DwgUtil.getBitDouble(intData, bitPos);
546
                        bitPos = ((Integer) val.get(0)).intValue();
547
                        dwgFile.setHeader("CHAMFERC", val.get(1));
548

    
549
                        val = DwgUtil.getBitDouble(intData, bitPos);
550
                        bitPos = ((Integer) val.get(0)).intValue();
551
                        dwgFile.setHeader("CHAMFERD", val.get(1));
552

    
553
                        val = DwgUtil.getBitDouble(intData, bitPos);
554
                        bitPos = ((Integer) val.get(0)).intValue();
555
                        dwgFile.setHeader("FACETRES", val.get(1));
556

    
557
                        val = DwgUtil.getBitDouble(intData, bitPos);
558
                        bitPos = ((Integer) val.get(0)).intValue();
559
                        dwgFile.setHeader("CMLSCALE", val.get(1));
560

    
561
                        val = DwgUtil.getBitDouble(intData, bitPos);
562
                        bitPos = ((Integer) val.get(0)).intValue();
563
                        dwgFile.setHeader("CELTSCALE", val.get(1));
564

    
565
                        val = DwgUtil.getTextString(intData, bitPos);
566
                        bitPos = ((Integer) val.get(0)).intValue();
567
                        dwgFile.setHeader("MENUNAME", val.get(1));
568

    
569
                        int[] tdcreate = new int[2];
570
                        val = DwgUtil.getBitLong(intData, bitPos);
571
                        bitPos = ((Integer) val.get(0)).intValue();
572
                        tdcreate[0] = ((Integer) val.get(1)).intValue();
573
                        val = DwgUtil.getBitLong(intData, bitPos);
574
                        bitPos = ((Integer) val.get(0)).intValue();
575
                        tdcreate[1] = ((Integer) val.get(1)).intValue();
576
                        dwgFile.setHeader("TDCREATE", tdcreate);
577

    
578
                        int[] tdupdate = new int[2];
579
                        val = DwgUtil.getBitLong(intData, bitPos);
580
                        bitPos = ((Integer) val.get(0)).intValue();
581
                        tdupdate[0] = ((Integer) val.get(1)).intValue();
582
                        val = DwgUtil.getBitLong(intData, bitPos);
583
                        bitPos = ((Integer) val.get(0)).intValue();
584
                        tdupdate[1] = ((Integer) val.get(1)).intValue();
585
                        dwgFile.setHeader("TDUPDATE", tdupdate);
586

    
587
                        int[] tdindwg = new int[2];
588
                        val = DwgUtil.getBitLong(intData, bitPos);
589
                        bitPos = ((Integer) val.get(0)).intValue();
590
                        tdindwg[0] = ((Integer) val.get(1)).intValue();
591
                        val = DwgUtil.getBitLong(intData, bitPos);
592
                        bitPos = ((Integer) val.get(0)).intValue();
593
                        tdindwg[1] = ((Integer) val.get(1)).intValue();
594
                        dwgFile.setHeader("TDINDWG", tdindwg);
595

    
596
                        int[] tdusrtime = new int[2];
597
                        val = DwgUtil.getBitLong(intData, bitPos);
598
                        bitPos = ((Integer) val.get(0)).intValue();
599
                        tdusrtime[0] = ((Integer) val.get(1)).intValue();
600
                        val = DwgUtil.getBitLong(intData, bitPos);
601
                        bitPos = ((Integer) val.get(0)).intValue();
602
                        tdusrtime[1] = ((Integer) val.get(1)).intValue();
603
                        dwgFile.setHeader("TDUSRTIME", tdusrtime);
604

    
605
                        val = DwgUtil.getBitShort(intData, bitPos);
606
                        bitPos = ((Integer) val.get(0)).intValue();
607
                        dwgFile.setHeader("CECOLOR", val.get(1));
608

    
609
                        val = DwgUtil.getHandle(intData, bitPos);
610
                        bitPos = ((Integer) val.get(0)).intValue();
611
                        int intHandle = DwgUtil.handleToInt(val);
612
                        dwgFile.setHeader("HANDSEED", new Integer(intHandle));
613

    
614
                        //creo que CLAYER marca la capa actualmente seleccionada en el menu
615
                        // de
616
                        // autocad
617

    
618
                        val = DwgUtil.getHandle(intData, bitPos);
619
                        bitPos = ((Integer) val.get(0)).intValue();
620
                        intHandle = DwgUtil.handleToInt(val);
621
                        dwgFile.setHeader("CLAYER", new Integer(intHandle));
622

    
623
                        val = DwgUtil.getHandle(intData, bitPos);
624
                        bitPos = ((Integer) val.get(0)).intValue();
625
                        intHandle = DwgUtil.handleToInt(val);
626
                        dwgFile.setHeader("TEXSTYLE", 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("CELLTYPE", 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("DIMSTYLE", 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("CMLSTYLE", new Integer(intHandle));
642

    
643
                        double[] spaces1 = new double[3];
644
                        val = DwgUtil.getBitDouble(intData, bitPos);
645
                        bitPos = ((Integer) val.get(0)).intValue();
646
                        spaces1[0] = ((Double) val.get(1)).doubleValue();
647
                        val = DwgUtil.getBitDouble(intData, bitPos);
648
                        bitPos = ((Integer) val.get(0)).intValue();
649
                        spaces1[1] = ((Double) val.get(1)).doubleValue();
650
                        val = DwgUtil.getBitDouble(intData, bitPos);
651
                        bitPos = ((Integer) val.get(0)).intValue();
652
                        spaces1[2] = ((Double) val.get(1)).doubleValue();
653
                        dwgFile.setHeader("PSPACE_INSBASE", spaces1);
654

    
655
                        double[] spaces2 = new double[3];
656
                        val = DwgUtil.getBitDouble(intData, bitPos);
657
                        bitPos = ((Integer) val.get(0)).intValue();
658
                        spaces2[0] = ((Double) val.get(1)).doubleValue();
659
                        val = DwgUtil.getBitDouble(intData, bitPos);
660
                        bitPos = ((Integer) val.get(0)).intValue();
661
                        spaces2[1] = ((Double) val.get(1)).doubleValue();
662
                        val = DwgUtil.getBitDouble(intData, bitPos);
663
                        bitPos = ((Integer) val.get(0)).intValue();
664
                        spaces2[2] = ((Double) val.get(1)).doubleValue();
665
                        dwgFile.setHeader("PSPACE_EXTMIN", spaces2);
666

    
667
                        double[] spaces3 = new double[3];
668
                        val = DwgUtil.getBitDouble(intData, bitPos);
669
                        bitPos = ((Integer) val.get(0)).intValue();
670
                        spaces3[0] = ((Double) val.get(1)).doubleValue();
671
                        val = DwgUtil.getBitDouble(intData, bitPos);
672
                        bitPos = ((Integer) val.get(0)).intValue();
673
                        spaces3[1] = ((Double) val.get(1)).doubleValue();
674
                        val = DwgUtil.getBitDouble(intData, bitPos);
675
                        bitPos = ((Integer) val.get(0)).intValue();
676
                        spaces3[2] = ((Double) val.get(1)).doubleValue();
677
                        dwgFile.setHeader("PSPACE_EXTMAX", spaces2);
678

    
679
                        double[] spaces4 = new double[2];
680
                        val = DwgUtil.getRawDouble(intData, bitPos);
681
                        bitPos = ((Integer) val.get(0)).intValue();
682
                        spaces4[0] = ((Double) val.get(1)).doubleValue();
683
                        val = DwgUtil.getRawDouble(intData, bitPos);
684
                        bitPos = ((Integer) val.get(0)).intValue();
685
                        spaces4[1] = ((Double) val.get(1)).doubleValue();
686
                        dwgFile.setHeader("PSPACE_LIMMIN", spaces4);
687

    
688
                        double[] spaces5 = new double[2];
689
                        val = DwgUtil.getRawDouble(intData, bitPos);
690
                        bitPos = ((Integer) val.get(0)).intValue();
691
                        spaces5[0] = ((Double) val.get(1)).doubleValue();
692
                        val = DwgUtil.getRawDouble(intData, bitPos);
693
                        bitPos = ((Integer) val.get(0)).intValue();
694
                        spaces5[1] = ((Double) val.get(1)).doubleValue();
695
                        dwgFile.setHeader("PSPACE_LIMMAX", spaces5);
696

    
697
                        val = DwgUtil.getBitDouble(intData, bitPos);
698
                        bitPos = ((Integer) val.get(0)).intValue();
699
                        dwgFile.setHeader("PSPACE_ELEVATION", val.get(1));
700

    
701
                        double[] spaces6 = new double[6];
702
                        val = DwgUtil.getBitDouble(intData, bitPos);
703
                        bitPos = ((Integer) val.get(0)).intValue();
704
                        spaces6[0] = ((Double) val.get(1)).doubleValue();
705
                        val = DwgUtil.getBitDouble(intData, bitPos);
706
                        bitPos = ((Integer) val.get(0)).intValue();
707
                        spaces6[1] = ((Double) val.get(1)).doubleValue();
708
                        val = DwgUtil.getBitDouble(intData, bitPos);
709
                        bitPos = ((Integer) val.get(0)).intValue();
710
                        spaces6[2] = ((Double) val.get(1)).doubleValue();
711
                        dwgFile.setHeader("PSPACE_UCSORG", spaces6);
712

    
713
                        double[] spaces7 = new double[6];
714
                        val = DwgUtil.getBitDouble(intData, bitPos);
715
                        bitPos = ((Integer) val.get(0)).intValue();
716
                        spaces7[0] = ((Double) val.get(1)).doubleValue();
717
                        val = DwgUtil.getBitDouble(intData, bitPos);
718
                        bitPos = ((Integer) val.get(0)).intValue();
719
                        spaces7[1] = ((Double) val.get(1)).doubleValue();
720
                        val = DwgUtil.getBitDouble(intData, bitPos);
721
                        bitPos = ((Integer) val.get(0)).intValue();
722
                        spaces7[2] = ((Double) val.get(1)).doubleValue();
723
                        dwgFile.setHeader("PSPACE_UCSXDIR", spaces7);
724

    
725
                        double[] spaces8 = new double[6];
726
                        val = DwgUtil.getBitDouble(intData, bitPos);
727
                        bitPos = ((Integer) val.get(0)).intValue();
728
                        spaces8[0] = ((Double) val.get(1)).doubleValue();
729
                        val = DwgUtil.getBitDouble(intData, bitPos);
730
                        bitPos = ((Integer) val.get(0)).intValue();
731
                        spaces8[1] = ((Double) val.get(1)).doubleValue();
732
                        val = DwgUtil.getBitDouble(intData, bitPos);
733
                        bitPos = ((Integer) val.get(0)).intValue();
734
                        spaces8[2] = ((Double) val.get(1)).doubleValue();
735
                        dwgFile.setHeader("PSPACE_UCSYDIR", spaces8);
736

    
737
                        val = DwgUtil.getHandle(intData, bitPos);
738
                        bitPos = ((Integer) val.get(0)).intValue();
739
                        intHandle = DwgUtil.handleToInt(val);
740
                        dwgFile.setHeader("PSPACE_UCSNAME", new Integer(intHandle));
741

    
742
                        double[] spaces9 = new double[6];
743
                        val = DwgUtil.getBitDouble(intData, bitPos);
744
                        bitPos = ((Integer) val.get(0)).intValue();
745
                        spaces9[0] = ((Double) val.get(1)).doubleValue();
746
                        val = DwgUtil.getBitDouble(intData, bitPos);
747
                        bitPos = ((Integer) val.get(0)).intValue();
748
                        spaces9[1] = ((Double) val.get(1)).doubleValue();
749
                        val = DwgUtil.getBitDouble(intData, bitPos);
750
                        bitPos = ((Integer) val.get(0)).intValue();
751
                        spaces9[2] = ((Double) val.get(1)).doubleValue();
752
                        dwgFile.setHeader("MSPACE_INSBASE", spaces9);
753

    
754
                        double[] spaces10 = new double[6];
755
                        val = DwgUtil.getBitDouble(intData, bitPos);
756
                        bitPos = ((Integer) val.get(0)).intValue();
757
                        spaces10[0] = ((Double) val.get(1)).doubleValue();
758
                        val = DwgUtil.getBitDouble(intData, bitPos);
759
                        bitPos = ((Integer) val.get(0)).intValue();
760
                        spaces10[1] = ((Double) val.get(1)).doubleValue();
761
                        val = DwgUtil.getBitDouble(intData, bitPos);
762
                        bitPos = ((Integer) val.get(0)).intValue();
763
                        spaces10[2] = ((Double) val.get(1)).doubleValue();
764
                        dwgFile.setHeader("MSPACE_EXTMIN", spaces10);
765

    
766
                        double[] spaces11 = new double[3];
767
                        val = DwgUtil.getBitDouble(intData, bitPos);
768
                        bitPos = ((Integer) val.get(0)).intValue();
769
                        spaces11[0] = ((Double) val.get(1)).doubleValue();
770
                        val = DwgUtil.getBitDouble(intData, bitPos);
771
                        bitPos = ((Integer) val.get(0)).intValue();
772
                        spaces11[1] = ((Double) val.get(1)).doubleValue();
773
                        val = DwgUtil.getBitDouble(intData, bitPos);
774
                        bitPos = ((Integer) val.get(0)).intValue();
775
                        spaces11[2] = ((Double) val.get(1)).doubleValue();
776
                        dwgFile.setHeader("MSPACE_EXTMAX", spaces11);
777

    
778
                        double[] spaces12 = new double[2];
779
                        val = DwgUtil.getRawDouble(intData, bitPos);
780
                        bitPos = ((Integer) val.get(0)).intValue();
781
                        spaces12[0] = ((Double) val.get(1)).doubleValue();
782
                        val = DwgUtil.getRawDouble(intData, bitPos);
783
                        bitPos = ((Integer) val.get(0)).intValue();
784
                        spaces12[1] = ((Double) val.get(1)).doubleValue();
785
                        dwgFile.setHeader("MSPACE_LIMMIN", spaces12);
786

    
787
                        double[] spaces13 = new double[2];
788
                        val = DwgUtil.getRawDouble(intData, bitPos);
789
                        bitPos = ((Integer) val.get(0)).intValue();
790
                        spaces13[0] = ((Double) val.get(1)).doubleValue();
791
                        val = DwgUtil.getRawDouble(intData, bitPos);
792
                        bitPos = ((Integer) val.get(0)).intValue();
793
                        spaces13[1] = ((Double) val.get(1)).doubleValue();
794
                        dwgFile.setHeader("MSPACE_LIMMAX", spaces13);
795

    
796
                        val = DwgUtil.getBitDouble(intData, bitPos);
797
                        bitPos = ((Integer) val.get(0)).intValue();
798
                        dwgFile.setHeader("MSPACE_ELEVATION", (Double) val.get(1));
799

    
800
                        double[] spaces14 = new double[3];
801
                        val = DwgUtil.getBitDouble(intData, bitPos);
802
                        bitPos = ((Integer) val.get(0)).intValue();
803
                        spaces14[0] = ((Double) val.get(1)).doubleValue();
804
                        val = DwgUtil.getBitDouble(intData, bitPos);
805
                        bitPos = ((Integer) val.get(0)).intValue();
806
                        spaces14[1] = ((Double) val.get(1)).doubleValue();
807
                        val = DwgUtil.getBitDouble(intData, bitPos);
808
                        bitPos = ((Integer) val.get(0)).intValue();
809
                        spaces14[2] = ((Double) val.get(1)).doubleValue();
810
                        dwgFile.setHeader("MSPACE_UCSORG", spaces14);
811

    
812
                        double[] spaces15 = new double[3];
813
                        val = DwgUtil.getBitDouble(intData, bitPos);
814
                        bitPos = ((Integer) val.get(0)).intValue();
815
                        spaces15[0] = ((Double) val.get(1)).doubleValue();
816
                        val = DwgUtil.getBitDouble(intData, bitPos);
817
                        bitPos = ((Integer) val.get(0)).intValue();
818
                        spaces15[1] = ((Double) val.get(1)).doubleValue();
819
                        val = DwgUtil.getBitDouble(intData, bitPos);
820
                        bitPos = ((Integer) val.get(0)).intValue();
821
                        spaces15[2] = ((Double) val.get(1)).doubleValue();
822
                        dwgFile.setHeader("MSPACE_UCSXDIR", spaces15);
823

    
824
                        double[] spaces16 = new double[3];
825
                        val = DwgUtil.getBitDouble(intData, bitPos);
826
                        bitPos = ((Integer) val.get(0)).intValue();
827
                        spaces16[0] = ((Double) val.get(1)).doubleValue();
828
                        val = DwgUtil.getBitDouble(intData, bitPos);
829
                        bitPos = ((Integer) val.get(0)).intValue();
830
                        spaces16[1] = ((Double) val.get(1)).doubleValue();
831
                        val = DwgUtil.getBitDouble(intData, bitPos);
832
                        bitPos = ((Integer) val.get(0)).intValue();
833
                        spaces16[2] = ((Double) val.get(1)).doubleValue();
834
                        dwgFile.setHeader("MSPACE_UCSYDIR", spaces16);
835

    
836
                        val = DwgUtil.getHandle(intData, bitPos);
837
                        bitPos = ((Integer) val.get(0)).intValue();
838
                        intHandle = DwgUtil.handleToInt(val);
839
                        dwgFile.setHeader("MSPACE_UCSNAME", new Integer(intHandle));
840

    
841
                        val = DwgUtil.testBit(intData, bitPos);
842
                        bitPos = ((Integer) val.get(0)).intValue();
843
                        dwgFile.setHeader("DIMTOL", val.get(1));
844

    
845
                        val = DwgUtil.testBit(intData, bitPos);
846
                        bitPos = ((Integer) val.get(0)).intValue();
847
                        dwgFile.setHeader("DIMLIM", val.get(1));
848

    
849
                        val = DwgUtil.testBit(intData, bitPos);
850
                        bitPos = ((Integer) val.get(0)).intValue();
851
                        dwgFile.setHeader("DIMTIH", val.get(1));
852

    
853
                        val = DwgUtil.testBit(intData, bitPos);
854
                        bitPos = ((Integer) val.get(0)).intValue();
855
                        dwgFile.setHeader("DIMTOH", val.get(1));
856

    
857
                        val = DwgUtil.testBit(intData, bitPos);
858
                        bitPos = ((Integer) val.get(0)).intValue();
859
                        dwgFile.setHeader("DIMSE1", val.get(1));
860

    
861
                        val = DwgUtil.testBit(intData, bitPos);
862
                        bitPos = ((Integer) val.get(0)).intValue();
863
                        dwgFile.setHeader("DIMTSE2", val.get(1));
864

    
865
                        val = DwgUtil.testBit(intData, bitPos);
866
                        bitPos = ((Integer) val.get(0)).intValue();
867
                        dwgFile.setHeader("DIMALT", val.get(1));
868

    
869
                        val = DwgUtil.testBit(intData, bitPos);
870
                        bitPos = ((Integer) val.get(0)).intValue();
871
                        dwgFile.setHeader("DIMTOFL", val.get(1));
872

    
873
                        val = DwgUtil.testBit(intData, bitPos);
874
                        bitPos = ((Integer) val.get(0)).intValue();
875
                        dwgFile.setHeader("DIMSAH", val.get(1));
876

    
877
                        val = DwgUtil.testBit(intData, bitPos);
878
                        bitPos = ((Integer) val.get(0)).intValue();
879
                        dwgFile.setHeader("DIMTIX", val.get(1));
880

    
881
                        val = DwgUtil.testBit(intData, bitPos);
882
                        bitPos = ((Integer) val.get(0)).intValue();
883
                        dwgFile.setHeader("DIMSOXD", val.get(1));
884

    
885
                        val = DwgUtil.getRawChar(intData, bitPos);
886
                        bitPos = ((Integer) val.get(0)).intValue();
887
                        dwgFile.setHeader("DIMALTD", val.get(1));
888

    
889
                        val = DwgUtil.getRawChar(intData, bitPos);
890
                        bitPos = ((Integer) val.get(0)).intValue();
891
                        dwgFile.setHeader("DIMZIN", val.get(1));
892

    
893
                        val = DwgUtil.testBit(intData, bitPos);
894
                        bitPos = ((Integer) val.get(0)).intValue();
895
                        dwgFile.setHeader("DIMSD1", val.get(1));
896

    
897
                        val = DwgUtil.testBit(intData, bitPos);
898
                        bitPos = ((Integer) val.get(0)).intValue();
899
                        dwgFile.setHeader("DIMSD2", val.get(1));
900

    
901
                        val = DwgUtil.getRawChar(intData, bitPos);
902
                        bitPos = ((Integer) val.get(0)).intValue();
903
                        dwgFile.setHeader("DIMTOLJ", val.get(1));
904

    
905
                        val = DwgUtil.getRawChar(intData, bitPos);
906
                        bitPos = ((Integer) val.get(0)).intValue();
907
                        dwgFile.setHeader("DIMJUST", val.get(1));
908

    
909
                        val = DwgUtil.getRawChar(intData, bitPos);
910
                        bitPos = ((Integer) val.get(0)).intValue();
911
                        dwgFile.setHeader("DIMFINT", val.get(1));
912

    
913
                        val = DwgUtil.testBit(intData, bitPos);
914
                        bitPos = ((Integer) val.get(0)).intValue();
915
                        dwgFile.setHeader("DIMUPT", val.get(1));
916

    
917
                        val = DwgUtil.getRawChar(intData, bitPos);
918
                        bitPos = ((Integer) val.get(0)).intValue();
919
                        dwgFile.setHeader("DIMZIN", val.get(1));
920

    
921
                        val = DwgUtil.getRawChar(intData, bitPos);
922
                        bitPos = ((Integer) val.get(0)).intValue();
923
                        dwgFile.setHeader("DIMALTZ", val.get(1));
924

    
925
                        val = DwgUtil.getRawChar(intData, bitPos);
926
                        bitPos = ((Integer) val.get(0)).intValue();
927
                        dwgFile.setHeader("DIMALTTZ", val.get(1));
928

    
929
                        val = DwgUtil.getRawChar(intData, bitPos);
930
                        bitPos = ((Integer) val.get(0)).intValue();
931
                        dwgFile.setHeader("DIMTAD", val.get(1));
932

    
933
                        val = DwgUtil.getBitShort(intData, bitPos);
934
                        bitPos = ((Integer) val.get(0)).intValue();
935
                        dwgFile.setHeader("DIMUNIT", val.get(1));
936

    
937
                        val = DwgUtil.getBitShort(intData, bitPos);
938
                        bitPos = ((Integer) val.get(0)).intValue();
939
                        dwgFile.setHeader("DIMAUNIT", val.get(1));
940

    
941
                        val = DwgUtil.getBitShort(intData, bitPos);
942
                        bitPos = ((Integer) val.get(0)).intValue();
943
                        dwgFile.setHeader("DIMDEC", val.get(1));
944

    
945
                        val = DwgUtil.getBitShort(intData, bitPos);
946
                        bitPos = ((Integer) val.get(0)).intValue();
947
                        dwgFile.setHeader("DIMTDEC", val.get(1));
948

    
949
                        val = DwgUtil.getBitShort(intData, bitPos);
950
                        bitPos = ((Integer) val.get(0)).intValue();
951
                        dwgFile.setHeader("DIMALTU", val.get(1));
952

    
953
                        val = DwgUtil.getBitShort(intData, bitPos);
954
                        bitPos = ((Integer) val.get(0)).intValue();
955
                        dwgFile.setHeader("DIMALTTD", val.get(1));
956

    
957
                        val = DwgUtil.getHandle(intData, bitPos);
958
                        bitPos = ((Integer) val.get(0)).intValue();
959
                        intHandle = DwgUtil.handleToInt(val);
960
                        dwgFile.setHeader("DIMTXSTY", new Integer(intHandle));
961

    
962
                        val = DwgUtil.getBitDouble(intData, bitPos);
963
                        bitPos = ((Integer) val.get(0)).intValue();
964
                        dwgFile.setHeader("DIMSCALE", val.get(1));
965

    
966
                        val = DwgUtil.getBitDouble(intData, bitPos);
967
                        bitPos = ((Integer) val.get(0)).intValue();
968
                        dwgFile.setHeader("DIMASZ", val.get(1));
969

    
970
                        val = DwgUtil.getBitDouble(intData, bitPos);
971
                        bitPos = ((Integer) val.get(0)).intValue();
972
                        dwgFile.setHeader("DIMEXO", val.get(1));
973

    
974
                        val = DwgUtil.getBitDouble(intData, bitPos);
975
                        bitPos = ((Integer) val.get(0)).intValue();
976
                        dwgFile.setHeader("DIMDLI", val.get(1));
977

    
978
                        val = DwgUtil.getBitDouble(intData, bitPos);
979
                        bitPos = ((Integer) val.get(0)).intValue();
980
                        dwgFile.setHeader("DIMEXE", val.get(1));
981

    
982
                        val = DwgUtil.getBitDouble(intData, bitPos);
983
                        bitPos = ((Integer) val.get(0)).intValue();
984
                        dwgFile.setHeader("DIMAND", val.get(1));
985

    
986
                        val = DwgUtil.getBitDouble(intData, bitPos);
987
                        bitPos = ((Integer) val.get(0)).intValue();
988
                        dwgFile.setHeader("DIMDLE", val.get(1));
989

    
990
                        val = DwgUtil.getBitDouble(intData, bitPos);
991
                        bitPos = ((Integer) val.get(0)).intValue();
992
                        dwgFile.setHeader("DIMTP", val.get(1));
993

    
994
                        val = DwgUtil.getBitDouble(intData, bitPos);
995
                        bitPos = ((Integer) val.get(0)).intValue();
996
                        dwgFile.setHeader("DIMTM", val.get(1));
997

    
998
                        val = DwgUtil.getBitDouble(intData, bitPos);
999
                        bitPos = ((Integer) val.get(0)).intValue();
1000
                        dwgFile.setHeader("DIMTXT", val.get(1));
1001

    
1002
                        val = DwgUtil.getBitDouble(intData, bitPos);
1003
                        bitPos = ((Integer) val.get(0)).intValue();
1004
                        dwgFile.setHeader("DIMCEN", val.get(1));
1005

    
1006
                        val = DwgUtil.getBitDouble(intData, bitPos);
1007
                        bitPos = ((Integer) val.get(0)).intValue();
1008
                        dwgFile.setHeader("DIMSZ", val.get(1));
1009

    
1010
                        val = DwgUtil.getBitDouble(intData, bitPos);
1011
                        bitPos = ((Integer) val.get(0)).intValue();
1012
                        dwgFile.setHeader("DIMALTF", val.get(1));
1013

    
1014
                        val = DwgUtil.getBitDouble(intData, bitPos);
1015
                        bitPos = ((Integer) val.get(0)).intValue();
1016
                        dwgFile.setHeader("DIMLFAC", val.get(1));
1017

    
1018
                        val = DwgUtil.getBitDouble(intData, bitPos);
1019
                        bitPos = ((Integer) val.get(0)).intValue();
1020
                        dwgFile.setHeader("DIMTVP", val.get(1));
1021

    
1022
                        val = DwgUtil.getBitDouble(intData, bitPos);
1023
                        bitPos = ((Integer) val.get(0)).intValue();
1024
                        dwgFile.setHeader("DIMTFAC", val.get(1));
1025

    
1026
                        val = DwgUtil.getBitDouble(intData, bitPos);
1027
                        bitPos = ((Integer) val.get(0)).intValue();
1028
                        dwgFile.setHeader("DIMGAP", val.get(1));
1029

    
1030
                        val = DwgUtil.getTextString(intData, bitPos);
1031
                        bitPos = ((Integer) val.get(0)).intValue();
1032
                        dwgFile.setHeader("DIMPOST", val.get(1));
1033

    
1034
                        val = DwgUtil.getTextString(intData, bitPos);
1035
                        bitPos = ((Integer) val.get(0)).intValue();
1036
                        dwgFile.setHeader("DIMAPOST", val.get(1));
1037

    
1038
                        val = DwgUtil.getTextString(intData, bitPos);
1039
                        bitPos = ((Integer) val.get(0)).intValue();
1040
                        dwgFile.setHeader("DIMBLK", val.get(1));
1041

    
1042
                        val = DwgUtil.getTextString(intData, bitPos);
1043
                        bitPos = ((Integer) val.get(0)).intValue();
1044
                        dwgFile.setHeader("DIMBLK1", val.get(1));
1045

    
1046
                        val = DwgUtil.getTextString(intData, bitPos);
1047
                        bitPos = ((Integer) val.get(0)).intValue();
1048
                        dwgFile.setHeader("DIMBLK2", val.get(1));
1049

    
1050
                        val = DwgUtil.getBitShort(intData, bitPos);
1051
                        bitPos = ((Integer) val.get(0)).intValue();
1052
                        dwgFile.setHeader("DIMCLRD", val.get(1));
1053

    
1054
                        val = DwgUtil.getBitShort(intData, bitPos);
1055
                        bitPos = ((Integer) val.get(0)).intValue();
1056
                        dwgFile.setHeader("DIMCLRE", val.get(1));
1057

    
1058
                        val = DwgUtil.getBitShort(intData, bitPos);
1059
                        bitPos = ((Integer) val.get(0)).intValue();
1060
                        dwgFile.setHeader("DIMCLRT", val.get(1));
1061

    
1062
                        val = DwgUtil.getHandle(intData, bitPos);
1063
                        bitPos = ((Integer) val.get(0)).intValue();
1064
                        intHandle = DwgUtil.handleToInt(val);
1065
                        dwgFile.setHeader("BLOCK_CONTROL_OBJECT", new Integer(intHandle));
1066

    
1067
                        val = DwgUtil.getHandle(intData, bitPos);
1068
                        bitPos = ((Integer) val.get(0)).intValue();
1069
                        intHandle = DwgUtil.handleToInt(val);
1070
                        dwgFile.setHeader("LAYER_CONTROL_OBJECT", new Integer(intHandle));
1071

    
1072
                        val = DwgUtil.getHandle(intData, bitPos);
1073
                        bitPos = ((Integer) val.get(0)).intValue();
1074
                        intHandle = DwgUtil.handleToInt(val);
1075
                        dwgFile.setHeader("STYLE_CONTROL_OBJECT", new Integer(intHandle));
1076

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

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

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

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

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

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

    
1111
                        val = DwgUtil.getHandle(intData, bitPos);
1112
                        bitPos = ((Integer) val.get(0)).intValue();
1113
                        intHandle = DwgUtil.handleToInt(val);
1114
                        dwgFile.setHeader("VIEWPORT_ENTITY_HEADER", new Integer(intHandle));
1115

    
1116
                        val = DwgUtil.getHandle(intData, bitPos);
1117
                        bitPos = ((Integer) val.get(0)).intValue();
1118
                        intHandle = DwgUtil.handleToInt(val);
1119
                        dwgFile.setHeader("ACAD_GROUP_DICTIONARY", new Integer(intHandle));
1120

    
1121
                        val = DwgUtil.getHandle(intData, bitPos);
1122
                        bitPos = ((Integer) val.get(0)).intValue();
1123
                        intHandle = DwgUtil.handleToInt(val);
1124
                        dwgFile.setHeader("ACAD_MLINE_DICTIONARY", new Integer(intHandle));
1125

    
1126
                        val = DwgUtil.getHandle(intData, bitPos);
1127
                        bitPos = ((Integer) val.get(0)).intValue();
1128
                        intHandle = DwgUtil.handleToInt(val);
1129
                        dwgFile
1130
                                        .setHeader("NAMED_OBJECT_DICTIONARY",
1131
                                                        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
         * It read the SECTIONS from the header of the DWG file
1169
         * 
1170
         * TODO Mover esto a una clase abstracta Reader, pues es similar para DWG 15
1171
         * (o hacer que esta herede de DWG 15)
1172
         * 
1173
         * 
1174
         *  
1175
         */
1176
        protected void readDwgSectionOffsets() {
1177
                //6 primeros bytes: version de autocad
1178

    
1179
                //7 siguientes bytes: 6 ceros y un 1 (0000001)
1180
                //No obstante, la especificaci?n Python dice que los bytes que lee
1181
                //con _buf.fromfile(handle, 7) son bytes de la maquina. REVISAR
1182

    
1183
                /*
1184
                 * Asi se hace copiando integramente Python. Ver si funciona NIO byte[]
1185
                 * chunk = {bb.get(), bb.get(), bb.get(), bb.get(), bb.get(), bb.get(),
1186
                 * bb.get()};
1187
                 */
1188

    
1189
                bb.position(6);
1190

    
1191
                bb.order(ByteOrder.nativeOrder());
1192
                byte[] chunk = new byte[7];
1193
                bb.get(chunk);
1194

    
1195
                if (chunk[0] != 0)
1196
                        logger.warn("chunk[0] != 0");
1197
                if (chunk[1] != 0)
1198
                        logger.warn("chunk[1] != 0");
1199
                if (chunk[2] != 0)
1200
                        logger.warn("chunk[2] != 0");
1201
                if (chunk[3] != 0)
1202
                        logger.warn("chunk[3] != 0");
1203
                if (chunk[4] != 0)
1204
                        logger.warn("chunk[4] != 0");
1205
                if (chunk[5] != 0)
1206
                        logger.warn("chunk[5] != 0");
1207
                if (chunk[6] != 0)
1208
                        logger.warn("chunk[6] != 0");
1209

    
1210
                /*
1211
                 *  
1212
                 */
1213

    
1214
                //Siempre que en python una lectura se haga as? '<'+loquesea
1215
                //hay que poner little_endian. Si no, se dejan los de la maquina
1216
                // (y si aparece > se pone big endian)
1217
                bb.order(ByteOrder.LITTLE_ENDIAN);
1218
                byte _ub1 = bb.get();
1219
                byte _ub2 = bb.get();
1220
                int imageSeeker = bb.getInt();
1221
                /*
1222
                 * TRATAMIENTO DEL IMAGE_SEEKER: LECTURA DE IMAGENES BMP y WMF
1223
                 * incrustadas if _image_seeker != 0: _offsets['IMAGE'] = _image_seeker
1224
                 * _offset = handle.tell() _bmpdata, _wmfdata = read_image(handle,
1225
                 * _image_seeker) handle.seek(_offset, 0) print "image seeker to %#x" %
1226
                 * _image_seeker print "offset at %#x" % handle.tell()
1227
                 */
1228

    
1229
                bb.position(19);//en realidad ya hemos leido 20 bytes
1230

    
1231
                short codePage = bb.getShort();
1232
                int count = bb.getInt();
1233

    
1234
                for (int i = 0; i < count; i++) {
1235

    
1236
                        byte rec = bb.get();
1237
                        int seek = bb.getInt();
1238
                        int size = bb.getInt();
1239

    
1240
                        String sectionName = "";
1241
                        switch (rec) {
1242
                        case 0:
1243
                                sectionName = "HEADERS";
1244
                                break;
1245

    
1246
                        case 1:
1247
                                sectionName = "CLASSES";
1248
                                break;
1249

    
1250
                        case 2:
1251
                                sectionName = "OBJECTS";
1252
                                break;
1253
                        case 3:
1254
                                sectionName = "UNKNOWN";
1255
                                break;
1256
                        case 4:
1257
                                sectionName = "R14DATA";
1258
                                break;
1259
                        case 5:
1260
                                sectionName = "R14_REC5";
1261
                                break;
1262
                        default:
1263
                                logger.warn("Seccion con codigo desconocido:" + rec);
1264
                                break;
1265

    
1266
                        }//switch
1267
                        dwgFile.addDwgSectionOffset(sectionName, seek, size);
1268
                }//for
1269

    
1270
                //finalmente se lee el CRC
1271
                short _crc = bb.getShort();
1272
                logger.info("CRC=" + _crc);
1273

    
1274
                //Seguidamente aparece una seccion fija de 16 bytes
1275
                //Esto hay que leerlo como "bytes de la maquina"
1276
                //TODO Ver si esto afecta
1277
                bb.order(ByteOrder.nativeOrder());
1278

    
1279
                byte[] c2 = new byte[16];
1280
                bb.get(c2);
1281
                if (c2[0] != 0x95)
1282
                        logger.warn("c2[0] != 0x95");
1283
                if (c2[1] != 0xa0)
1284
                        logger.warn("c2[1] != 0xa0");
1285
                if (c2[2] != 0x4e)
1286
                        logger.warn("c2[2] != 0x4e");
1287
                if (c2[3] != 0x28)
1288
                        logger.warn("c2[3] != 0x28");
1289
                if (c2[4] != 0x99)
1290
                        logger.warn("c2[4] != 0x99");
1291
                if (c2[5] != 0x82)
1292
                        logger.warn("c2[5] != 0x82");
1293
                if (c2[6] != 0x1a)
1294
                        logger.warn("c2[6] != 0x1a");
1295
                if (c2[7] != 0xe5)
1296
                        logger.warn("c2[7] != 0xe5");
1297
                if (c2[8] != 0x5e)
1298
                        logger.warn("c2[8] != 0x5e");
1299
                if (c2[9] != 0x41)
1300
                        logger.warn("c2[9] != 0x41");
1301
                if (c2[10] != 0xe0)
1302
                        logger.warn("c2[10] != 0xe0");
1303
                if (c2[11] != 0x5f)
1304
                        logger.warn("c2[11] != 0x5f");
1305
                if (c2[12] != 0x9d)
1306
                        logger.warn("c2[12] != 0x9d");
1307
                if (c2[13] != 0x3a)
1308
                        logger.warn("c2[13] != 0x3a");
1309
                if (c2[14] != 0x4d)
1310
                        logger.warn("c2[14] != 0x4d");
1311
                if (c2[15] != 0x00)
1312
                        logger.warn("c2[15] != 0x00");
1313
        }
1314

    
1315
        /*
1316
         * TODO Probar, y si no va, meter el codigo del lector de V15 (es SIMILAR,
1317
         * llevar a clase abstracta comun)
1318
         */
1319
        protected void readDwgObjectOffsets() throws Exception {
1320
                int offset = dwgFile.getDwgSectionOffset("OBJECTS");
1321
                bb.position(offset);
1322
                while (true) {
1323
                        bb.order(ByteOrder.BIG_ENDIAN);
1324
                        short size = bb.getShort();
1325
                        if (size == 2)
1326
                                break;
1327
                        //TODO Cuando en Python no pone < ni >, es nativeOrder o
1328
                        // little_endian??
1329
                        //                        bb.order(ByteOrder.LITTLE_ENDIAN);
1330
                        bb.order(ByteOrder.nativeOrder());
1331
                        byte[] dataBytes = new byte[size];
1332
                        bb.get(dataBytes);
1333

    
1334
                        /*
1335
                         * TODO Creo q esto no hace falta, al estar en bytes nativos (no en
1336
                         * LITTLE_ENDIAN) int[] data =
1337
                         * DwgUtil.bytesToMachineBytes(dataBytes);
1338
                         */
1339
                        int[] data = DwgUtil.toIntArray(dataBytes);
1340
                        /*
1341
                         * the spec says 'last_handle' and 'last_loc' are initialized
1342
                         * outside the outer for loop - postings on OpenDWG forum say these
1343
                         * variables must be initialized for each section
1344
                         */
1345
                        int lastHandle = 0;
1346
                        int lastLoc = 0;
1347
                        int bitPos = 0;
1348
                        int bitMax = (size - 2) * 8;//se quitan 2 bytes por el CRC final
1349
                        while (bitPos < bitMax) {
1350
                                List v = DwgUtil.getModularChar(data, bitPos);
1351
                                bitPos = ((Integer) v.get(0)).intValue();
1352
                                lastHandle = lastHandle + ((Integer) v.get(1)).intValue();
1353
                                v = DwgUtil.getModularChar(data, bitPos);
1354
                                bitPos = ((Integer) v.get(0)).intValue();
1355
                                lastLoc = lastLoc + ((Integer) v.get(1)).intValue();
1356
                                dwgFile.addDwgObjectOffset(lastHandle, lastLoc);
1357
                        }//while
1358
                }//while
1359
        }
1360

    
1361
        protected void readDwgClasses() throws Exception {
1362
                int offset = dwgFile.getDwgSectionOffset("CLASSES");
1363
                bb.position(offset);
1364
                //1? leemos el sentinnel inicial
1365
                bb.order(ByteOrder.nativeOrder());
1366
                byte[] sentinel = new byte[16];
1367
                bb.get(sentinel);
1368
                if (sentinel[0] != 0x8d)
1369
                        logger.warn("sentinel[0] != 0x8d");
1370
                if (sentinel[1] != 0xa1)
1371
                        logger.warn("sentinel[1] != 0xa1");
1372
                if (sentinel[2] != 0xc4)
1373
                        logger.warn("sentinel[2] != 0xc4");
1374
                if (sentinel[3] != 0xb8)
1375
                        logger.warn("sentinel[3] != 0xb8");
1376
                if (sentinel[4] != 0xc4)
1377
                        logger.warn("sentinel[4] != 0xc4");
1378
                if (sentinel[5] != 0xa9)
1379
                        logger.warn("sentinel[5] != 0xa9");
1380
                if (sentinel[6] != 0xf8)
1381
                        logger.warn("sentinel[6] != 0xf8");
1382
                if (sentinel[7] != 0xc5)
1383
                        logger.warn("sentinel[7] != 0xc5");
1384
                if (sentinel[8] != 0xc0)
1385
                        logger.warn("sentinel[8] != 0xc0");
1386
                if (sentinel[9] != 0xdc)
1387
                        logger.warn("sentinel[9] != 0xdc");
1388
                if (sentinel[10] != 0xf4)
1389
                        logger.warn("sentinel[10] != 0xf4");
1390
                if (sentinel[11] != 0x5f)
1391
                        logger.warn("sentinel[11] != 0x5f");
1392
                if (sentinel[12] != 0xe7)
1393
                        logger.warn("sentinel[12] != 0xe7");
1394
                if (sentinel[13] != 0xcf)
1395
                        logger.warn("sentinel[13] != 0xcf");
1396
                if (sentinel[14] != 0xb6)
1397
                        logger.warn("sentinel[14] != 0xb6");
1398
                if (sentinel[15] != 0x8a)
1399
                        logger.warn("sentinel[15] != 0x8a");
1400

    
1401
                bb.order(ByteOrder.LITTLE_ENDIAN);
1402
                int size = bb.getInt();
1403
                byte[] data = new byte[size];
1404
                bb.get(data);
1405
                int[] intData = DwgUtil.toIntArray(data);
1406
                short crc = bb.getShort();
1407

    
1408
                int maxBit = size * 8;
1409
                int bitPos = 0;
1410
                List val = null;
1411
                while ((bitPos + 8) < maxBit) {
1412
                        val = DwgUtil.getBitShort(intData, bitPos);
1413
                        bitPos = ((Integer) val.get(0)).intValue();
1414
                        int classNum = ((Integer) val.get(1)).intValue();
1415

    
1416
                        val = DwgUtil.getBitShort(intData, bitPos);
1417
                        bitPos = ((Integer) val.get(0)).intValue();
1418
                        int version = ((Integer) val.get(1)).intValue();
1419

    
1420
                        val = DwgUtil.getTextString(intData, bitPos);
1421
                        bitPos = ((Integer) val.get(0)).intValue();
1422
                        String appName = (String) val.get(1);
1423

    
1424
                        val = DwgUtil.getTextString(intData, bitPos);
1425
                        bitPos = ((Integer) val.get(0)).intValue();
1426
                        String cPlusPlusName = (String) val.get(1);
1427

    
1428
                        val = DwgUtil.getTextString(intData, bitPos);
1429
                        bitPos = ((Integer) val.get(0)).intValue();
1430
                        String dxfName = (String) val.get(1);
1431

    
1432
                        val = DwgUtil.testBit(intData, bitPos);
1433
                        bitPos = ((Integer) val.get(0)).intValue();
1434
                        boolean isZombie = ((Boolean) val.get(1)).booleanValue();
1435

    
1436
                        val = DwgUtil.getBitShort(intData, bitPos);
1437
                        bitPos = ((Integer) val.get(0)).intValue();
1438
                        int id = ((Integer) val.get(1)).intValue();
1439

    
1440
                        DwgClass dwgClass = new DwgClass(classNum, version, appName,
1441
                                        cPlusPlusName, dxfName, isZombie, id);
1442
                        dwgFile.addDwgClass(dwgClass);
1443

    
1444
                }//while
1445
                //                Por ultimo, el sentinnel final
1446
                bb.order(ByteOrder.nativeOrder());
1447
                byte[] lastSentinnel = new byte[16];
1448
                bb.get(lastSentinnel);
1449
                if (lastSentinnel[0] != 0x72)
1450
                        logger.warn("lastSentinnel[0] != 0x72");
1451
                if (lastSentinnel[1] != 0x5e)
1452
                        logger.warn("lastSentinnel[1] != 0x5e");
1453
                if (lastSentinnel[2] != 0x3b)
1454
                        logger.warn("lastSentinnel[2] != 0x3b");
1455
                if (lastSentinnel[3] != 0x47)
1456
                        logger.warn("lastSentinnel[3] != 0x47");
1457
                if (lastSentinnel[4] != 0x3b)
1458
                        logger.warn("lastSentinnel[4] != 0x3b");
1459
                if (lastSentinnel[5] != 0x56)
1460
                        logger.warn("lastSentinnel[5] != 0x56");
1461
                if (lastSentinnel[6] != 0x07)
1462
                        logger.warn("lastSentinnel[6] != 0x07");
1463
                if (lastSentinnel[7] != 0x3a)
1464
                        logger.warn("lastSentinnel[7] != 0x3a");
1465
                if (lastSentinnel[8] != 0x3f)
1466
                        logger.warn("lastSentinnel[8] != 0x3f");
1467
                if (lastSentinnel[9] != 0x23)
1468
                        logger.warn("lastSentinnel[9] != 0x23");
1469
                if (lastSentinnel[10] != 0x0b)
1470
                        logger.warn("lastSentinnel[10] != 0x0b");
1471
                if (lastSentinnel[11] != 0xa0)
1472
                        logger.warn("lastSentinnel[11] != 0xa0");
1473
                if (lastSentinnel[12] != 0x18)
1474
                        logger.warn("lastSentinnel[12] != 0x18");
1475
                if (lastSentinnel[13] != 0x30)
1476
                        logger.warn("lastSentinnel[13] != 0x30");
1477
                if (lastSentinnel[14] != 0x49)
1478
                        logger.warn("lastSentinnel[14] != 0x49");
1479
                if (lastSentinnel[15] != 0x75)
1480
                        logger.warn("lastSentinnel[15] != 0x75");
1481
        }
1482

    
1483
        /**
1484
         * Reads all the object referenced in the object map section of the DWG file
1485
         * (using their object file obsets)
1486
         */
1487
        protected void readDwgObjects() {
1488
                logger.info("Vamos a leer " + dwgFile.getDwgObjectOffsets().size()
1489
                                + " objetos");
1490

    
1491
                for (int i = 0; i < dwgFile.getDwgObjectOffsets().size(); i++) {
1492
                        DwgObjectOffset doo = (DwgObjectOffset) dwgFile
1493
                                        .getDwgObjectOffsets().get(i);
1494
                        DwgObject obj = readDwgObject(doo.getOffset(), i);
1495
                        if (obj != null && obj.getClass() != DwgObject.class) {
1496
                                dwgFile.addDwgObject(obj);
1497
                        }
1498
                }//for
1499
        }
1500

    
1501
        /**
1502
         * Return a dwg object from its index in the dwg file
1503
         * 
1504
         * @param index
1505
         *            of the requested dwg object in the dwg file
1506
         *  
1507
         */
1508
        public DwgObject getDwgObjectByIndex(int index) {
1509
                DwgObjectOffset doo = (DwgObjectOffset) dwgFile.getDwgObjectOffsets()
1510
                                .get(index);
1511
                return readDwgObject(doo.getOffset(), index);
1512
        }
1513
        
1514
        void dumpEntity(int[] intData){
1515
                String outtxt= "int[] data = new int[]{";
1516
                for(int z = 0; z < intData.length -1; z++){
1517
                        outtxt += intData[z] + ",";
1518
                }
1519
                outtxt += intData[intData.length -1] + "}";
1520
                logger.info(outtxt);
1521
        }
1522

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

    
1532
        protected DwgObject readDwgObject(int offset, int index) {
1533
                DwgObject obj = null;
1534
                try {
1535
                        bb.position(offset);
1536
                        int size = DwgUtil.getModularShort(bb);
1537
                        bb.order(ByteOrder.nativeOrder());
1538
                        byte[] data = new byte[size];
1539
                        bb.get(data);
1540
                        int[] intData = DwgUtil.toIntArray(data);
1541
                        int bitPos = 0;
1542
                        List val = DwgUtil.getBitShort(intData, bitPos);
1543
                        bitPos = ((Integer) val.get(0)).intValue();
1544
                        int type = ((Integer) val.get(1)).intValue();
1545

    
1546
                        obj = DwgObjectFactory.getInstance().create(type, index);
1547
                        if (obj == null) {
1548
                                if (type >= 500) {
1549
                                        int newIndex = type - 500;
1550
                                        if (newIndex < (dwgFile.getDwgClasses().size() - 1)) {
1551
                                                DwgClass dwgClass = (DwgClass) dwgFile.getDwgClasses()
1552
                                                                .get(newIndex);
1553
                                                String dxfEntityName = dwgClass.getDxfName();
1554
                                                obj = DwgObjectFactory.getInstance().create(
1555
                                                                dxfEntityName, index);
1556
                                                if (obj == null) {
1557
                                                        logger.info(dxfEntityName
1558
                                                                        + " todavia no est? implementado");
1559
                                                        return null;
1560
                                                }//if
1561
                                        }//if newIndex
1562
                                        else{
1563
                                                return null;
1564
                                        }
1565
                                }else {
1566
                                        logger.info("Encontrado tipo " + type);
1567
                                        return null;
1568
                                }
1569
                        }//if obj == null
1570
                        obj.setVersion(dwgFile.getDwgVersion());
1571

    
1572
                        DwgHandleReference hr = new DwgHandleReference();
1573
                        bitPos = hr.read(intData, bitPos);
1574
                        obj.setHandle(hr);
1575

    
1576
                        //TODO Si funciona, mover el metodo de esta clase a DwgUtil
1577
                        val = readExtendedData(intData, bitPos);
1578
                        bitPos = ((Integer) val.get(0)).intValue();
1579
                        List extData = (List) val.get(1);
1580
                        obj.setExtendedData(extData);
1581

    
1582
                        //Graphics data
1583
                        boolean gflag = false;
1584
                        gflag = obj.isGraphicsFlag();
1585
                        if (gflag) {
1586
                                val = DwgUtil.testBit(intData, bitPos);
1587
                                bitPos = ((Integer) val.get(0)).intValue();
1588
                                boolean hasGraphicsData = ((Boolean) val.get(1))
1589
                                                .booleanValue();
1590
                                //si hay imagen asociada, se lee por completo
1591
                                if (hasGraphicsData) {
1592
                                        val = DwgUtil.getRawLong(intData, bitPos);
1593
                                        bitPos = ((Integer) val.get(0)).intValue();
1594
                                        size = ((Integer) val.get(1)).intValue();
1595
                                        int bgSize = size * 8;
1596
                                        Integer giData = (Integer) DwgUtil.getBits(intData,
1597
                                                        bgSize, bitPos);
1598
                                        obj.setGraphicData(giData.intValue());
1599
                                        bitPos = bitPos + bgSize;
1600
                                }
1601
                        }//if gflag
1602

    
1603
                        //size in bits
1604
                        val = DwgUtil.getRawLong(intData, bitPos);
1605
                        bitPos = ((Integer) val.get(0)).intValue();
1606
                        int sizeInBits = ((Integer) val.get(1)).intValue();
1607
                        obj.setSizeInBits(sizeInBits);
1608

    
1609
                        readSpecificObject(obj, intData, bitPos);
1610

    
1611
                        return obj;
1612

    
1613
                } catch (Exception e) {
1614
                        e.printStackTrace();
1615
                        return null;
1616
                }
1617
        }
1618

    
1619
        /*
1620
         * TODO Esto est? pesimamente dise?ado. Cada objeto DwgObject debe tener un
1621
         * metodo readSpecificObject(data,bitPos)
1622
         *  
1623
         */
1624
        protected void readSpecificObject(DwgObject obj, int[] data, int bitPos)
1625
                        throws Exception {
1626
                DwgObjectReaderPool pool = DwgObjectReaderPool.getInstance();
1627
                IDwgObjectReader reader = pool.get(obj, "1314");
1628
                if (reader != null) {
1629
                        reader.setFileReader(this);
1630
                        reader.readSpecificObj(data, bitPos, obj);
1631
                } else {
1632
                        logger.info("No se ha implementado la lectura de "
1633
                                        + obj.getClass().getName() + ", code=" + obj.getType());
1634
                }
1635
        }
1636

    
1637
        /*
1638
         * TODO En DwgUtil se dice que este metodo tiene graves errores. Intento de
1639
         * reimplementarlo a partir del codigo Python original
1640
         */
1641
        List readExtendedData(int[] data, int bitPos) throws Exception {
1642
                List solution = new ArrayList();
1643
                //TODO Ver si el array est? bien, o hay que cambiarlo por un
1644
                // stringbuffer
1645
                List extendedData = new ArrayList();
1646
                int size;
1647
                List val;
1648
                while (true) {//TODO VER SI HAY PROBLEMAS DE NO SALIDA
1649

    
1650
                        val = DwgUtil.getBitShort(data, bitPos);
1651
                        bitPos = ((Integer) val.get(0)).intValue();
1652
                        size = ((Integer) val.get(1)).intValue();
1653
                        if (size == 0)
1654
                                break;
1655

    
1656
                        DwgHandleReference hr = new DwgHandleReference();
1657
                        bitPos = hr.read(data, bitPos);
1658
//                        logger.debug("Handle del EXTENDED ENTITY DATA:" + hr.getCode()
1659
//                                        + " " + hr.getOffset());
1660

    
1661
                        int count = 0;
1662
                        while (count < size) {
1663
                                val = DwgUtil.getRawChar(data, bitPos);
1664
                                bitPos = ((Integer) val.get(0)).intValue();
1665
                                int codeByte = ((Integer) val.get(1)).intValue();
1666
                                count++;
1667
                                if (codeByte == 0x0) {
1668
                                        val = DwgUtil.getRawChar(data, bitPos);
1669
                                        bitPos = ((Integer) val.get(0)).intValue();
1670
                                        int slen = ((Integer) val.get(1)).intValue();
1671
                                        val = DwgUtil.getRawShort(data, bitPos);
1672
                                        bitPos = ((Integer) val.get(0)).intValue();
1673
                                        int codePage = ((Integer) val.get(1)).intValue();
1674
//                                        logger.debug("Extended Data (0x0): code page = "
1675
//                                                                        + codePage);
1676
                                        char[] chars = new char[slen];
1677
                                        for (int i = 0; i < slen; i++) {
1678
                                                val = DwgUtil.getRawChar(data, bitPos);
1679
                                                bitPos = ((Integer) val.get(0)).intValue();
1680
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
1681
                                        }//for
1682
                                        String str = new String(chars);
1683
//                                        logger.debug("Chars:" + str);
1684
                                        extendedData.add(str);
1685
                                        count += (3 + slen);
1686
                                } else if (codeByte == 0x1) {
1687
                                        logger.debug("Invalid extended data code byte: 0x1");
1688
                                } else if (codeByte == 0x2) {
1689
                                        val = DwgUtil.getRawChar(data, bitPos);
1690
                                        bitPos = ((Integer) val.get(0)).intValue();
1691
                                        int character = ((Integer) val.get(1)).intValue();
1692
                                        if (character == 0x0)
1693
                                                extendedData.add("{");
1694
                                        else if (character == 0x1)
1695
                                                extendedData.add("}");
1696
                                        else {
1697
                                                logger.warn("Invalid extended data char:" + character);
1698
                                        }
1699
                                        count++;
1700
                                } else if (codeByte == 0x3) {
1701
                                        char[] chars = new char[8];
1702
                                        for (int i = 0; i < 8; i++) {
1703
                                                val = DwgUtil.getRawChar(data, bitPos);
1704
                                                bitPos = ((Integer) val.get(0)).intValue();
1705
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
1706
                                        }
1707
                                        String str = new String(chars);
1708
//                                        logger.debug("Chars:" + str);
1709
                                        extendedData.add(str);
1710
                                        count += 8;
1711
                                } else if (codeByte == 0x4) {
1712
                                        //binary chunk in extended data
1713
                                        val = DwgUtil.getRawChar(data, bitPos);
1714
                                        bitPos = ((Integer) val.get(0)).intValue();
1715
                                        int length = ((Integer) val.get(1)).intValue();
1716
                                        char[] chars = new char[length];
1717
                                        for (int i = 0; i < length; i++) {
1718
                                                val = DwgUtil.getRawChar(data, bitPos);
1719
                                                bitPos = ((Integer) val.get(0)).intValue();
1720
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
1721
                                        }
1722
                                        String str = new String(chars);
1723
//                                        logger.debug("Chars:" + str);
1724
                                        extendedData.add(str);
1725
                                        count += (1 + length);
1726
                                } else if (codeByte == 0x5) {
1727
                                        //entity handle reference
1728
                                        char[] chars = new char[8];
1729
                                        for (int i = 0; i < 8; i++) {
1730
                                                val = DwgUtil.getRawChar(data, bitPos);
1731
                                                bitPos = ((Integer) val.get(0)).intValue();
1732
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
1733
                                        }
1734
                                        String str = new String(chars);
1735
//                                        logger.debug("Chars:" + str);
1736
                                        extendedData.add(str);
1737
                                        count += 8;
1738
                                } else if ((codeByte >= 0xa) && (codeByte <= 0xd)) {
1739
                                        //three doubles
1740
                                        double[] dValues = new double[3];
1741
                                        val = DwgUtil.getRawDouble(data, bitPos);
1742
                                        bitPos = ((Integer) val.get(0)).intValue();
1743
                                        dValues[0] = ((Double) val.get(1)).doubleValue();
1744

    
1745
                                        val = DwgUtil.getRawDouble(data, bitPos);
1746
                                        bitPos = ((Integer) val.get(0)).intValue();
1747
                                        dValues[1] = ((Double) val.get(1)).doubleValue();
1748

    
1749
                                        val = DwgUtil.getRawDouble(data, bitPos);
1750
                                        bitPos = ((Integer) val.get(0)).intValue();
1751
                                        dValues[2] = ((Double) val.get(1)).doubleValue();
1752

    
1753
//                                        logger.debug("Doubles:" + dValues);
1754
                                        extendedData.add(dValues);
1755
                                        count += 24;
1756
                                } else if ((codeByte >= 0x28) && (codeByte <= 0x2a)) {
1757
                                        //one double
1758
                                        val = DwgUtil.getRawDouble(data, bitPos);
1759
                                        bitPos = ((Integer) val.get(0)).intValue();
1760
                                        double value = ((Double) val.get(1)).doubleValue();
1761
//                                        logger.debug("Double value:" + value);
1762
                                        extendedData.add(val.get(1));
1763
                                        count += 8;
1764
                                } else if (codeByte == 0x46) {
1765
                                        //a short value
1766
                                        val = DwgUtil.getRawShort(data, bitPos);
1767
                                        bitPos = ((Integer) val.get(0)).intValue();
1768
                                        int value = ((Integer) val.get(1)).intValue();
1769
//                                        logger.debug("Short value:" + value);
1770
                                        extendedData.add(val.get(1));
1771
                                        count += 2;
1772
                                } else if (codeByte == 0x47) {
1773
                                        //int value
1774
                                        val = DwgUtil.getRawLong(data, bitPos);
1775
                                        bitPos = ((Integer) val.get(0)).intValue();
1776
                                        int value = ((Integer) val.get(1)).intValue();
1777
//                                        logger.debug("Int value:" + value);
1778
                                        extendedData.add(val.get(1));
1779
                                        count += 4;
1780
                                } else {
1781
                                        logger.debug("Unexpected code byte in EXTENDED DATA "
1782
                                                        + codeByte);
1783
                                }
1784
                        }//while
1785
                }//while
1786
                solution.add(new Integer(bitPos));
1787
                solution.add(extendedData);
1788
                return solution;
1789
        }
1790

    
1791
        /*
1792
         * (non-Javadoc)
1793
         * 
1794
         * @see com.iver.cit.jdwglib.dwg.readers.IDwgFileReader#readObjectHeader(int[],
1795
         *      int, com.iver.cit.jdwglib.dwg.DwgObject)
1796
         */
1797
        public int readObjectHeader(int[] data, int offset, DwgObject dwgObject) {
1798
                int bitPos = offset;
1799
                Integer mode = (Integer) DwgUtil.getBits(data, 2, bitPos);
1800
                bitPos += 2;
1801
                dwgObject.setMode(mode.intValue());
1802

    
1803
                List val = DwgUtil.getBitShort(data, bitPos);
1804
                bitPos = ((Integer) val.get(0)).intValue();
1805
                int rnum = ((Integer) val.get(1)).intValue();
1806
                dwgObject.setNumReactors(rnum);
1807
                
1808

    
1809
                val = DwgUtil.testBit(data, bitPos);
1810
                bitPos = ((Integer) val.get(0)).intValue();
1811
                boolean isLyrByLineType = ((Boolean) val.get(1)).booleanValue();
1812
                //TODO En la 15 es un flag, no un boolean. REVISAR
1813
                dwgObject.setLyrByLineType(isLyrByLineType);
1814

    
1815
                val = DwgUtil.testBit(data, bitPos);
1816
                bitPos = ((Integer) val.get(0)).intValue();
1817
                boolean noLinks = ((Boolean) val.get(1)).booleanValue();
1818
                dwgObject.setNoLinks(noLinks);
1819

    
1820
                val = DwgUtil.getBitShort(data, bitPos);
1821
                bitPos = ((Integer) val.get(0)).intValue();
1822
                int color = ((Integer) val.get(1)).intValue();
1823
                dwgObject.setColor(color);
1824

    
1825
                val = DwgUtil.getBitDouble(data, bitPos);
1826
                bitPos = ((Integer) val.get(0)).intValue();
1827
                float ltscale = ((Double) val.get(1)).floatValue();
1828
                //TODO tampoco se setea en la 15 (en su lugar, un flag de ints)
1829
                val = DwgUtil.getBitShort(data, bitPos);
1830
                bitPos = ((Integer) val.get(0)).intValue();
1831
                int invis = ((Integer) val.get(1)).intValue();
1832

    
1833
                return bitPos;
1834
        }
1835

    
1836
        /*
1837
         * 
1838
         * (non-Javadoc)
1839
         * 
1840
         * @see com.iver.cit.jdwglib.dwg.readers.IDwgFileReader#readObjectTailer(int[],
1841
         *      int, com.iver.cit.jdwglib.dwg.DwgObject)
1842
         */
1843
        public int readObjectTailer(int[] data, int offset, DwgObject dwgObject)
1844
                        throws RuntimeException, CorruptedDwgEntityException {
1845
                int bitPos = offset;
1846
                List val = null;
1847

    
1848
                /*
1849
                 * Subentity ref handle. Esto se aplica sobre VERTEX, ATTRIB, SEQEND
1850
                 */
1851
                if (dwgObject.getMode() == 0x0) {
1852
                        DwgHandleReference subEntityHandle = new DwgHandleReference();
1853
                        bitPos = subEntityHandle.read(data, bitPos);
1854
                        dwgObject.setSubEntityHandle(subEntityHandle);
1855
                }
1856

    
1857
                /*
1858
                 * Reactors handles DwgObject
1859
                 */
1860
                DwgHandleReference reactorHandle;
1861
                for (int i = 0; i < dwgObject.getNumReactors(); i++) {
1862
                        reactorHandle = new DwgHandleReference();
1863
                        bitPos = reactorHandle.read(data, bitPos);
1864
                        dwgObject.addReactorHandle(reactorHandle);
1865
                }
1866

    
1867
                /*
1868
                 * XDICOBJHANDLE
1869
                 */
1870
                DwgHandleReference xDicObjHandle = new DwgHandleReference();
1871
                bitPos = xDicObjHandle.read(data, bitPos);
1872
                dwgObject.setXDicObjHandle(xDicObjHandle);
1873

    
1874
                //          TODO Hasta aqui igual que en la 15
1875

    
1876
                /*
1877
                 * Layer Handle code
1878
                 */
1879

    
1880
                DwgHandleReference layerHandle = new DwgHandleReference();
1881
                bitPos = layerHandle.read(data, bitPos);
1882
                dwgObject.setLayerHandle(layerHandle);
1883

    
1884
                if (!dwgObject.isLyrByLineType()) {
1885
                        DwgHandleReference lineTypeHandle = new DwgHandleReference();
1886
                        bitPos = lineTypeHandle.read(data, bitPos);
1887
                        dwgObject.setLineTypeHandle(lineTypeHandle);
1888
                }
1889
                String cadena = "";
1890
                if (!dwgObject.isNoLinks()) {
1891

    
1892
                        /*
1893
                         * Previous Handle
1894
                         */
1895
                        DwgHandleReference previousHandle = new DwgHandleReference();
1896
                        bitPos = previousHandle.read(data, bitPos);
1897
                        dwgObject.setPreviousHandle(previousHandle);
1898

    
1899
                        /*
1900
                         * Next Handle
1901
                         */
1902
                        DwgHandleReference nextHandle = new DwgHandleReference();
1903
                        bitPos = nextHandle.read(data, bitPos);
1904
                        dwgObject.setNextHandle(nextHandle);
1905
                }
1906
                return bitPos;
1907
        }
1908

    
1909
}