Statistics
| Revision:

root / trunk / org.gvsig.dwg / org.gvsig.dwg.lib / src / main / java / org / gvsig / dwg / lib / readers / DwgFileV14Reader.java @ 5

History | View | Annotate | Download (65.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 org.gvsig.dwg.lib.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.gvsig.dwg.lib.CorruptedDwgEntityException;
44
import org.gvsig.dwg.lib.DwgClass;
45
import org.gvsig.dwg.lib.DwgFile;
46
import org.gvsig.dwg.lib.DwgHandleReference;
47
import org.gvsig.dwg.lib.DwgObject;
48
import org.gvsig.dwg.lib.DwgObjectFactory;
49
import org.gvsig.dwg.lib.DwgObjectOffset;
50
import org.gvsig.dwg.lib.DwgUtil;
51
import org.gvsig.dwg.lib.objects.DwgPolyline2D;
52
import org.gvsig.dwg.lib.objects.DwgPolyline3D;
53
import org.slf4j.Logger;
54
import org.slf4j.LoggerFactory;
55

    
56

    
57

    
58
/**
59
 * The DwgFileV14Reader reads the DWG version 14 format
60
 *
61
 * @author jmorell
62
 */
63
public class DwgFileV14Reader implements IDwgFileReader {
64

    
65
        protected DwgFile dwgFile;
66

    
67
        protected ByteBuffer bb;
68

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

    
94
        }
95

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

    
109
                int offset = dwgFile.getDwgSectionOffset("HEADERS");
110
                bb.position(offset);
111

    
112
                //1� leemos el sentinnel inicial
113
                bb.order(ByteOrder.nativeOrder());
114
                byte[] sentinel = new byte[16];
115
                bb.get(sentinel);
116

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

    
150
                //2� seguidamente leemos los datos
151
                bb.order(ByteOrder.LITTLE_ENDIAN);
152
                int size = bb.getInt();
153

    
154
                bb.order(ByteOrder.nativeOrder());
155
                byte[] data = new byte[size];
156
                bb.get(data);
157

    
158
                int[] intData = DwgUtil.toIntArray(data);
159

    
160
                //3� a continuacion el CRC de la seccion HEADER
161
                bb.order(ByteOrder.LITTLE_ENDIAN);
162
                short crc = bb.getShort();
163

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

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

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

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

    
216
                        val = DwgUtil.getBitDouble(intData, bitPos);
217
                        bitPos = ((Integer) val.get(0)).intValue();
218
                        dwgFile.setHeader("VAL4", val.get(1));
219

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

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

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

    
232
                        val = DwgUtil.getTextString(intData, bitPos);
233
                        bitPos = ((Integer) val.get(0)).intValue();
234
                        dwgFile.setHeader("STRING4", val.get(1));
235

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

    
240
                        val = DwgUtil.getBitLong(intData, bitPos);
241
                        bitPos = ((Integer) val.get(0)).intValue();
242
                        dwgFile.setHeader("LONG2", val.get(1));
243

    
244
                        val = DwgUtil.getBitShort(intData, bitPos);
245
                        bitPos = ((Integer) val.get(0)).intValue();
246
                        dwgFile.setHeader("SHORT1", val.get(1));
247

    
248
                        //TODO REFACTORIZAR ESTO PARA USAR DWGHANDLEREFERENCE
249

    
250
                        //TODO Los handle se leen asi??
251
                        val = DwgUtil.getHandle(intData, bitPos);
252
                        bitPos = ((Integer) val.get(0)).intValue();
253
                        dwgFile.setHeader("HANDLE1", val.get(1));
254

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
355
                        val = DwgUtil.testBit(intData, bitPos);
356
                        bitPos = ((Integer) val.get(0)).intValue();
357
                        dwgFile.setHeader("PELLISE", val.get(1));
358

    
359
                        val = DwgUtil.getBitShort(intData, bitPos);
360
                        bitPos = ((Integer) val.get(0)).intValue();
361
                        if (dwgFile.getDwgVersion() == "R14")
362
                                dwgFile.setHeader("PROXYGRAPH", val.get(1));
363
                        else
364
                                dwgFile.setHeader("SAVEIMAGES", val.get(1));
365

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
482
                        val = DwgUtil.getBitShort(intData, bitPos);
483
                        bitPos = ((Integer) val.get(0)).intValue();
484
                        dwgFile.setHeader("TEXTQLTY", val.get(1));
485

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
566
                        val = DwgUtil.getBitDouble(intData, bitPos);
567
                        bitPos = ((Integer) val.get(0)).intValue();
568
                        dwgFile.setHeader("CELTSCALE", val.get(1));
569

    
570
                        val = DwgUtil.getTextString(intData, bitPos);
571
                        bitPos = ((Integer) val.get(0)).intValue();
572
                        dwgFile.setHeader("MENUNAME", val.get(1));
573

    
574
                        int[] tdcreate = new int[2];
575
                        val = DwgUtil.getBitLong(intData, bitPos);
576
                        bitPos = ((Integer) val.get(0)).intValue();
577
                        tdcreate[0] = ((Integer) val.get(1)).intValue();
578
                        val = DwgUtil.getBitLong(intData, bitPos);
579
                        bitPos = ((Integer) val.get(0)).intValue();
580
                        tdcreate[1] = ((Integer) val.get(1)).intValue();
581
                        dwgFile.setHeader("TDCREATE", tdcreate);
582

    
583
                        int[] tdupdate = new int[2];
584
                        val = DwgUtil.getBitLong(intData, bitPos);
585
                        bitPos = ((Integer) val.get(0)).intValue();
586
                        tdupdate[0] = ((Integer) val.get(1)).intValue();
587
                        val = DwgUtil.getBitLong(intData, bitPos);
588
                        bitPos = ((Integer) val.get(0)).intValue();
589
                        tdupdate[1] = ((Integer) val.get(1)).intValue();
590
                        dwgFile.setHeader("TDUPDATE", tdupdate);
591

    
592
                        int[] tdindwg = new int[2];
593
                        val = DwgUtil.getBitLong(intData, bitPos);
594
                        bitPos = ((Integer) val.get(0)).intValue();
595
                        tdindwg[0] = ((Integer) val.get(1)).intValue();
596
                        val = DwgUtil.getBitLong(intData, bitPos);
597
                        bitPos = ((Integer) val.get(0)).intValue();
598
                        tdindwg[1] = ((Integer) val.get(1)).intValue();
599
                        dwgFile.setHeader("TDINDWG", tdindwg);
600

    
601
                        int[] tdusrtime = new int[2];
602
                        val = DwgUtil.getBitLong(intData, bitPos);
603
                        bitPos = ((Integer) val.get(0)).intValue();
604
                        tdusrtime[0] = ((Integer) val.get(1)).intValue();
605
                        val = DwgUtil.getBitLong(intData, bitPos);
606
                        bitPos = ((Integer) val.get(0)).intValue();
607
                        tdusrtime[1] = ((Integer) val.get(1)).intValue();
608
                        dwgFile.setHeader("TDUSRTIME", tdusrtime);
609

    
610
                        val = DwgUtil.getBitShort(intData, bitPos);
611
                        bitPos = ((Integer) val.get(0)).intValue();
612
                        dwgFile.setHeader("CECOLOR", val.get(1));
613

    
614
                        val = DwgUtil.getHandle(intData, bitPos);
615
                        bitPos = ((Integer) val.get(0)).intValue();
616
                        int intHandle = DwgUtil.handleToInt(val);
617
                        dwgFile.setHeader("HANDSEED", new Integer(intHandle));
618

    
619
                        //creo que CLAYER marca la capa actualmente seleccionada en el menu
620
                        // de
621
                        // autocad
622

    
623
                        val = DwgUtil.getHandle(intData, bitPos);
624
                        bitPos = ((Integer) val.get(0)).intValue();
625
                        intHandle = DwgUtil.handleToInt(val);
626
                        dwgFile.setHeader("CLAYER", new Integer(intHandle));
627

    
628
                        val = DwgUtil.getHandle(intData, bitPos);
629
                        bitPos = ((Integer) val.get(0)).intValue();
630
                        intHandle = DwgUtil.handleToInt(val);
631
                        dwgFile.setHeader("TEXSTYLE", new Integer(intHandle));
632

    
633
                        val = DwgUtil.getHandle(intData, bitPos);
634
                        bitPos = ((Integer) val.get(0)).intValue();
635
                        intHandle = DwgUtil.handleToInt(val);
636
                        dwgFile.setHeader("CELLTYPE", new Integer(intHandle));
637

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

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

    
648
                        double[] spaces1 = new double[3];
649
                        val = DwgUtil.getBitDouble(intData, bitPos);
650
                        bitPos = ((Integer) val.get(0)).intValue();
651
                        spaces1[0] = ((Double) val.get(1)).doubleValue();
652
                        val = DwgUtil.getBitDouble(intData, bitPos);
653
                        bitPos = ((Integer) val.get(0)).intValue();
654
                        spaces1[1] = ((Double) val.get(1)).doubleValue();
655
                        val = DwgUtil.getBitDouble(intData, bitPos);
656
                        bitPos = ((Integer) val.get(0)).intValue();
657
                        spaces1[2] = ((Double) val.get(1)).doubleValue();
658
                        dwgFile.setHeader("PSPACE_INSBASE", spaces1);
659

    
660
                        double[] spaces2 = new double[3];
661
                        val = DwgUtil.getBitDouble(intData, bitPos);
662
                        bitPos = ((Integer) val.get(0)).intValue();
663
                        spaces2[0] = ((Double) val.get(1)).doubleValue();
664
                        val = DwgUtil.getBitDouble(intData, bitPos);
665
                        bitPos = ((Integer) val.get(0)).intValue();
666
                        spaces2[1] = ((Double) val.get(1)).doubleValue();
667
                        val = DwgUtil.getBitDouble(intData, bitPos);
668
                        bitPos = ((Integer) val.get(0)).intValue();
669
                        spaces2[2] = ((Double) val.get(1)).doubleValue();
670
                        dwgFile.setHeader("PSPACE_EXTMIN", spaces2);
671

    
672
                        double[] spaces3 = new double[3];
673
                        val = DwgUtil.getBitDouble(intData, bitPos);
674
                        bitPos = ((Integer) val.get(0)).intValue();
675
                        spaces3[0] = ((Double) val.get(1)).doubleValue();
676
                        val = DwgUtil.getBitDouble(intData, bitPos);
677
                        bitPos = ((Integer) val.get(0)).intValue();
678
                        spaces3[1] = ((Double) val.get(1)).doubleValue();
679
                        val = DwgUtil.getBitDouble(intData, bitPos);
680
                        bitPos = ((Integer) val.get(0)).intValue();
681
                        spaces3[2] = ((Double) val.get(1)).doubleValue();
682
                        dwgFile.setHeader("PSPACE_EXTMAX", spaces2);
683

    
684
                        double[] spaces4 = new double[2];
685
                        val = DwgUtil.getRawDouble(intData, bitPos);
686
                        bitPos = ((Integer) val.get(0)).intValue();
687
                        spaces4[0] = ((Double) val.get(1)).doubleValue();
688
                        val = DwgUtil.getRawDouble(intData, bitPos);
689
                        bitPos = ((Integer) val.get(0)).intValue();
690
                        spaces4[1] = ((Double) val.get(1)).doubleValue();
691
                        dwgFile.setHeader("PSPACE_LIMMIN", spaces4);
692

    
693
                        double[] spaces5 = new double[2];
694
                        val = DwgUtil.getRawDouble(intData, bitPos);
695
                        bitPos = ((Integer) val.get(0)).intValue();
696
                        spaces5[0] = ((Double) val.get(1)).doubleValue();
697
                        val = DwgUtil.getRawDouble(intData, bitPos);
698
                        bitPos = ((Integer) val.get(0)).intValue();
699
                        spaces5[1] = ((Double) val.get(1)).doubleValue();
700
                        dwgFile.setHeader("PSPACE_LIMMAX", spaces5);
701

    
702
                        val = DwgUtil.getBitDouble(intData, bitPos);
703
                        bitPos = ((Integer) val.get(0)).intValue();
704
                        dwgFile.setHeader("PSPACE_ELEVATION", val.get(1));
705

    
706
                        double[] spaces6 = new double[3];
707
                        val = DwgUtil.getBitDouble(intData, bitPos);
708
                        bitPos = ((Integer) val.get(0)).intValue();
709
                        spaces6[0] = ((Double) val.get(1)).doubleValue();
710
                        val = DwgUtil.getBitDouble(intData, bitPos);
711
                        bitPos = ((Integer) val.get(0)).intValue();
712
                        spaces6[1] = ((Double) val.get(1)).doubleValue();
713
                        val = DwgUtil.getBitDouble(intData, bitPos);
714
                        bitPos = ((Integer) val.get(0)).intValue();
715
                        spaces6[2] = ((Double) val.get(1)).doubleValue();
716
                        dwgFile.setHeader("PSPACE_UCSORG", spaces6);
717

    
718
                        double[] spaces7 = new double[3];
719
                        val = DwgUtil.getBitDouble(intData, bitPos);
720
                        bitPos = ((Integer) val.get(0)).intValue();
721
                        spaces7[0] = ((Double) val.get(1)).doubleValue();
722
                        val = DwgUtil.getBitDouble(intData, bitPos);
723
                        bitPos = ((Integer) val.get(0)).intValue();
724
                        spaces7[1] = ((Double) val.get(1)).doubleValue();
725
                        val = DwgUtil.getBitDouble(intData, bitPos);
726
                        bitPos = ((Integer) val.get(0)).intValue();
727
                        spaces7[2] = ((Double) val.get(1)).doubleValue();
728
                        dwgFile.setHeader("PSPACE_UCSXDIR", spaces7);
729

    
730
                        double[] spaces8 = new double[3];
731
                        val = DwgUtil.getBitDouble(intData, bitPos);
732
                        bitPos = ((Integer) val.get(0)).intValue();
733
                        spaces8[0] = ((Double) val.get(1)).doubleValue();
734
                        val = DwgUtil.getBitDouble(intData, bitPos);
735
                        bitPos = ((Integer) val.get(0)).intValue();
736
                        spaces8[1] = ((Double) val.get(1)).doubleValue();
737
                        val = DwgUtil.getBitDouble(intData, bitPos);
738
                        bitPos = ((Integer) val.get(0)).intValue();
739
                        spaces8[2] = ((Double) val.get(1)).doubleValue();
740
                        dwgFile.setHeader("PSPACE_UCSYDIR", spaces8);
741

    
742
                        val = DwgUtil.getHandle(intData, bitPos);
743
                        bitPos = ((Integer) val.get(0)).intValue();
744
                        intHandle = DwgUtil.handleToInt(val);
745
                        dwgFile.setHeader("PSPACE_UCSNAME", new Integer(intHandle));
746

    
747
                        double[] spaces9 = new double[3];
748
                        val = DwgUtil.getBitDouble(intData, bitPos);
749
                        bitPos = ((Integer) val.get(0)).intValue();
750
                        spaces9[0] = ((Double) val.get(1)).doubleValue();
751
                        val = DwgUtil.getBitDouble(intData, bitPos);
752
                        bitPos = ((Integer) val.get(0)).intValue();
753
                        spaces9[1] = ((Double) val.get(1)).doubleValue();
754
                        val = DwgUtil.getBitDouble(intData, bitPos);
755
                        bitPos = ((Integer) val.get(0)).intValue();
756
                        spaces9[2] = ((Double) val.get(1)).doubleValue();
757
                        dwgFile.setHeader("MSPACE_INSBASE", spaces9);
758

    
759
                        double[] spaces10 = new double[3];
760
                        val = DwgUtil.getBitDouble(intData, bitPos);
761
                        bitPos = ((Integer) val.get(0)).intValue();
762
                        spaces10[0] = ((Double) val.get(1)).doubleValue();
763
                        val = DwgUtil.getBitDouble(intData, bitPos);
764
                        bitPos = ((Integer) val.get(0)).intValue();
765
                        spaces10[1] = ((Double) val.get(1)).doubleValue();
766
                        val = DwgUtil.getBitDouble(intData, bitPos);
767
                        bitPos = ((Integer) val.get(0)).intValue();
768
                        spaces10[2] = ((Double) val.get(1)).doubleValue();
769
                        dwgFile.setHeader("MSPACE_EXTMIN", spaces10);
770

    
771
                        double[] spaces11 = new double[3];
772
                        val = DwgUtil.getBitDouble(intData, bitPos);
773
                        bitPos = ((Integer) val.get(0)).intValue();
774
                        spaces11[0] = ((Double) val.get(1)).doubleValue();
775
                        val = DwgUtil.getBitDouble(intData, bitPos);
776
                        bitPos = ((Integer) val.get(0)).intValue();
777
                        spaces11[1] = ((Double) val.get(1)).doubleValue();
778
                        val = DwgUtil.getBitDouble(intData, bitPos);
779
                        bitPos = ((Integer) val.get(0)).intValue();
780
                        spaces11[2] = ((Double) val.get(1)).doubleValue();
781
                        dwgFile.setHeader("MSPACE_EXTMAX", spaces11);
782

    
783
                        double[] spaces12 = new double[2];
784
                        val = DwgUtil.getRawDouble(intData, bitPos);
785
                        bitPos = ((Integer) val.get(0)).intValue();
786
                        spaces12[0] = ((Double) val.get(1)).doubleValue();
787
                        val = DwgUtil.getRawDouble(intData, bitPos);
788
                        bitPos = ((Integer) val.get(0)).intValue();
789
                        spaces12[1] = ((Double) val.get(1)).doubleValue();
790
                        dwgFile.setHeader("MSPACE_LIMMIN", spaces12);
791

    
792
                        double[] spaces13 = new double[2];
793
                        val = DwgUtil.getRawDouble(intData, bitPos);
794
                        bitPos = ((Integer) val.get(0)).intValue();
795
                        spaces13[0] = ((Double) val.get(1)).doubleValue();
796
                        val = DwgUtil.getRawDouble(intData, bitPos);
797
                        bitPos = ((Integer) val.get(0)).intValue();
798
                        spaces13[1] = ((Double) val.get(1)).doubleValue();
799
                        dwgFile.setHeader("MSPACE_LIMMAX", spaces13);
800

    
801
                        val = DwgUtil.getBitDouble(intData, bitPos);
802
                        bitPos = ((Integer) val.get(0)).intValue();
803
                        dwgFile.setHeader("MSPACE_ELEVATION", (Double) val.get(1));
804

    
805
                        double[] spaces14 = new double[3];
806
                        val = DwgUtil.getBitDouble(intData, bitPos);
807
                        bitPos = ((Integer) val.get(0)).intValue();
808
                        spaces14[0] = ((Double) val.get(1)).doubleValue();
809
                        val = DwgUtil.getBitDouble(intData, bitPos);
810
                        bitPos = ((Integer) val.get(0)).intValue();
811
                        spaces14[1] = ((Double) val.get(1)).doubleValue();
812
                        val = DwgUtil.getBitDouble(intData, bitPos);
813
                        bitPos = ((Integer) val.get(0)).intValue();
814
                        spaces14[2] = ((Double) val.get(1)).doubleValue();
815
                        dwgFile.setHeader("MSPACE_UCSORG", spaces14);
816

    
817
                        double[] spaces15 = new double[3];
818
                        val = DwgUtil.getBitDouble(intData, bitPos);
819
                        bitPos = ((Integer) val.get(0)).intValue();
820
                        spaces15[0] = ((Double) val.get(1)).doubleValue();
821
                        val = DwgUtil.getBitDouble(intData, bitPos);
822
                        bitPos = ((Integer) val.get(0)).intValue();
823
                        spaces15[1] = ((Double) val.get(1)).doubleValue();
824
                        val = DwgUtil.getBitDouble(intData, bitPos);
825
                        bitPos = ((Integer) val.get(0)).intValue();
826
                        spaces15[2] = ((Double) val.get(1)).doubleValue();
827
                        dwgFile.setHeader("MSPACE_UCSXDIR", spaces15);
828

    
829
                        double[] spaces16 = new double[3];
830
                        val = DwgUtil.getBitDouble(intData, bitPos);
831
                        bitPos = ((Integer) val.get(0)).intValue();
832
                        spaces16[0] = ((Double) val.get(1)).doubleValue();
833
                        val = DwgUtil.getBitDouble(intData, bitPos);
834
                        bitPos = ((Integer) val.get(0)).intValue();
835
                        spaces16[1] = ((Double) val.get(1)).doubleValue();
836
                        val = DwgUtil.getBitDouble(intData, bitPos);
837
                        bitPos = ((Integer) val.get(0)).intValue();
838
                        spaces16[2] = ((Double) val.get(1)).doubleValue();
839
                        dwgFile.setHeader("MSPACE_UCSYDIR", spaces16);
840

    
841
                        val = DwgUtil.getHandle(intData, bitPos);
842
                        bitPos = ((Integer) val.get(0)).intValue();
843
                        intHandle = DwgUtil.handleToInt(val);
844
                        dwgFile.setHeader("MSPACE_UCSNAME", new Integer(intHandle));
845

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

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

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

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

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

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

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

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

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

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

    
886
                        val = DwgUtil.testBit(intData, bitPos);
887
                        bitPos = ((Integer) val.get(0)).intValue();
888
                        dwgFile.setHeader("DIMSOXD", val.get(1));
889

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

    
894
                        val = DwgUtil.getRawChar(intData, bitPos);
895
                        bitPos = ((Integer) val.get(0)).intValue();
896
                        dwgFile.setHeader("DIMZIN", val.get(1));
897

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

    
902
                        val = DwgUtil.testBit(intData, bitPos);
903
                        bitPos = ((Integer) val.get(0)).intValue();
904
                        dwgFile.setHeader("DIMSD2", val.get(1));
905

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

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

    
914
                        val = DwgUtil.getRawChar(intData, bitPos);
915
                        bitPos = ((Integer) val.get(0)).intValue();
916
                        dwgFile.setHeader("DIMFINT", val.get(1));
917

    
918
                        val = DwgUtil.testBit(intData, bitPos);
919
                        bitPos = ((Integer) val.get(0)).intValue();
920
                        dwgFile.setHeader("DIMUPT", val.get(1));
921

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

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

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

    
934
                        val = DwgUtil.getRawChar(intData, bitPos);
935
                        bitPos = ((Integer) val.get(0)).intValue();
936
                        dwgFile.setHeader("DIMTAD", val.get(1));
937

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

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

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

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

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

    
958
                        val = DwgUtil.getBitShort(intData, bitPos);
959
                        bitPos = ((Integer) val.get(0)).intValue();
960
                        dwgFile.setHeader("DIMALTTD", val.get(1));
961

    
962
                        val = DwgUtil.getHandle(intData, bitPos);
963
                        bitPos = ((Integer) val.get(0)).intValue();
964
                        intHandle = DwgUtil.handleToInt(val);
965
                        dwgFile.setHeader("DIMTXSTY", new Integer(intHandle));
966

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1031
                        val = DwgUtil.getBitDouble(intData, bitPos);
1032
                        bitPos = ((Integer) val.get(0)).intValue();
1033
                        dwgFile.setHeader("DIMGAP", val.get(1));
1034

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

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

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

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

    
1051
                        val = DwgUtil.getTextString(intData, bitPos);
1052
                        bitPos = ((Integer) val.get(0)).intValue();
1053
                        dwgFile.setHeader("DIMBLK2", val.get(1));
1054

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

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

    
1063
                        val = DwgUtil.getBitShort(intData, bitPos);
1064
                        bitPos = ((Integer) val.get(0)).intValue();
1065
                        dwgFile.setHeader("DIMCLRT", val.get(1));
1066

    
1067
                        val = DwgUtil.getHandle(intData, bitPos);
1068
                        bitPos = ((Integer) val.get(0)).intValue();
1069
                        intHandle = DwgUtil.handleToInt(val);
1070
                        dwgFile.setHeader("BLOCK_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("LAYER_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.setHeader("STYLE_CONTROL_OBJECT", new Integer(intHandle));
1081

    
1082
                        val = DwgUtil.getHandle(intData, bitPos);
1083
                        bitPos = ((Integer) val.get(0)).intValue();
1084
                        intHandle = DwgUtil.handleToInt(val);
1085
                        dwgFile
1086
                                        .setHeader("LINETYPE_CONTROL_OBJECT",
1087
                                                        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("VIEW_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("UCS_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("VPORT_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.setHeader("APPID_CONTROL_OBJECT", new Integer(intHandle));
1108

    
1109
                        val = DwgUtil.getHandle(intData, bitPos);
1110
                        bitPos = ((Integer) val.get(0)).intValue();
1111
                        intHandle = DwgUtil.handleToInt(val);
1112
                        dwgFile
1113
                                        .setHeader("DIMSTYLE_CONTROL_OBJECT",
1114
                                                        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("VIEWPORT_ENTITY_HEADER", 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_GROUP_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.setHeader("ACAD_MLINE_DICTIONARY", new Integer(intHandle));
1130

    
1131
                        val = DwgUtil.getHandle(intData, bitPos);
1132
                        bitPos = ((Integer) val.get(0)).intValue();
1133
                        intHandle = DwgUtil.handleToInt(val);
1134
                        dwgFile
1135
                                        .setHeader("NAMED_OBJECT_DICTIONARY",
1136
                                                        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("PAPER_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("MODEL_BLOCK_RECORD", 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_BYLAYER", 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_BYBLOCK", new Integer(intHandle));
1157

    
1158
                        val = DwgUtil.getHandle(intData, bitPos);
1159
                        bitPos = ((Integer) val.get(0)).intValue();
1160
                        intHandle = DwgUtil.handleToInt(val);
1161
                        dwgFile.setHeader("LTYPE_CONTINUOUS", new Integer(intHandle));
1162

    
1163
                        //                    # remaing bits are unknown, and they end with possible
1164
                        //                    # padding bits so that 16-bit CRC value after the data
1165
                        //                    # is on a byte boundary - ignore them for now ...
1166

    
1167
                } catch (Exception e) {
1168
                        logger.error(e.getMessage());
1169
                }
1170
        }
1171

    
1172
        /**
1173
         * It read the SECTIONS from the header of the DWG file
1174
         *
1175
         * TODO Mover esto a una clase abstracta Reader, pues es similar para DWG 15
1176
         * (o hacer que esta herede de DWG 15)
1177
         *
1178
         *
1179
         *
1180
         */
1181
        protected void readDwgSectionOffsets() {
1182
                //6 primeros bytes: version de autocad
1183

    
1184
                //7 siguientes bytes: 6 ceros y un 1 (0000001)
1185
                //No obstante, la especificaci�n Python dice que los bytes que lee
1186
                //con _buf.fromfile(handle, 7) son bytes de la maquina. REVISAR
1187

    
1188
                /*
1189
                 * Asi se hace copiando integramente Python. Ver si funciona NIO byte[]
1190
                 * chunk = {bb.get(), bb.get(), bb.get(), bb.get(), bb.get(), bb.get(),
1191
                 * bb.get()};
1192
                 */
1193

    
1194
                bb.position(6);
1195

    
1196
                bb.order(ByteOrder.nativeOrder());
1197
                byte[] chunk = new byte[7];
1198
                bb.get(chunk);
1199

    
1200
                if (chunk[0] != 0)
1201
                        logger.warn("chunk[0] != 0");
1202
                if (chunk[1] != 0)
1203
                        logger.warn("chunk[1] != 0");
1204
                if (chunk[2] != 0)
1205
                        logger.warn("chunk[2] != 0");
1206
                if (chunk[3] != 0)
1207
                        logger.warn("chunk[3] != 0");
1208
                if (chunk[4] != 0)
1209
                        logger.warn("chunk[4] != 0");
1210
                if (chunk[5] != 0)
1211
                        logger.warn("chunk[5] != 0");
1212
                if (chunk[6] != 0)
1213
                        logger.warn("chunk[6] != 0");
1214

    
1215
                /*
1216
                 *
1217
                 */
1218

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

    
1234
                bb.position(19);//en realidad ya hemos leido 20 bytes
1235

    
1236
                short codePage = bb.getShort();
1237
                int count = bb.getInt();
1238

    
1239
                for (int i = 0; i < count; i++) {
1240

    
1241
                        byte rec = bb.get();
1242
                        int seek = bb.getInt();
1243
                        int size = bb.getInt();
1244

    
1245
                        String sectionName = "";
1246
                        switch (rec) {
1247
                        case 0:
1248
                                sectionName = "HEADERS";
1249
                                break;
1250

    
1251
                        case 1:
1252
                                sectionName = "CLASSES";
1253
                                break;
1254

    
1255
                        case 2:
1256
                                sectionName = "OBJECTS";
1257
                                break;
1258
                        case 3:
1259
                                sectionName = "UNKNOWN";
1260
                                break;
1261
                        case 4:
1262
                                sectionName = "R14DATA";
1263
                                break;
1264
                        case 5:
1265
                                sectionName = "R14_REC5";
1266
                                break;
1267
                        default:
1268
                                logger.warn("Seccion con codigo desconocido:" + rec);
1269
                                break;
1270

    
1271
                        }//switch
1272
                        dwgFile.addDwgSectionOffset(sectionName, seek, size);
1273
                }//for
1274

    
1275
                //finalmente se lee el CRC
1276
                short _crc = bb.getShort();
1277
                logger.info("CRC=" + _crc);
1278

    
1279
                //Seguidamente aparece una seccion fija de 16 bytes
1280
                //Esto hay que leerlo como "bytes de la maquina"
1281
                //TODO Ver si esto afecta
1282
                bb.order(ByteOrder.nativeOrder());
1283

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

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

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

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

    
1406
                bb.order(ByteOrder.LITTLE_ENDIAN);
1407
                int size = bb.getInt();
1408
                byte[] data = new byte[size];
1409
                bb.get(data);
1410
                int[] intData = DwgUtil.toIntArray(data);
1411
                short crc = bb.getShort();
1412

    
1413
                int maxBit = size * 8;
1414
                int bitPos = 0;
1415
                List val = null;
1416
                while ((bitPos + 8) < maxBit) {
1417
                        val = DwgUtil.getBitShort(intData, bitPos);
1418
                        bitPos = ((Integer) val.get(0)).intValue();
1419
                        int classNum = ((Integer) val.get(1)).intValue();
1420

    
1421
                        val = DwgUtil.getBitShort(intData, bitPos);
1422
                        bitPos = ((Integer) val.get(0)).intValue();
1423
                        int version = ((Integer) val.get(1)).intValue();
1424

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

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

    
1433
                        val = DwgUtil.getTextString(intData, bitPos);
1434
                        bitPos = ((Integer) val.get(0)).intValue();
1435
                        String dxfName = (String) val.get(1);
1436

    
1437
                        val = DwgUtil.testBit(intData, bitPos);
1438
                        bitPos = ((Integer) val.get(0)).intValue();
1439
                        boolean isZombie = ((Boolean) val.get(1)).booleanValue();
1440

    
1441
                        val = DwgUtil.getBitShort(intData, bitPos);
1442
                        bitPos = ((Integer) val.get(0)).intValue();
1443
                        int id = ((Integer) val.get(1)).intValue();
1444

    
1445
                        DwgClass dwgClass = new DwgClass(classNum, version, appName,
1446
                                        cPlusPlusName, dxfName, isZombie, id);
1447
                        dwgFile.addDwgClass(dwgClass);
1448

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

    
1488
        /**
1489
         * Reads all the object referenced in the object map section of the DWG file
1490
         * (using their object file obsets)
1491
         */
1492
        protected void readDwgObjects() {
1493
                logger.info("Vamos a leer " + dwgFile.getDwgObjectOffsets().size()
1494
                                + " objetos");
1495

    
1496
                for (int i = 0; i < dwgFile.getDwgObjectOffsets().size(); i++) {
1497
                        DwgObjectOffset doo = (DwgObjectOffset) dwgFile
1498
                                        .getDwgObjectOffsets().get(i);
1499
                        DwgObject obj = readDwgObject(doo.getOffset(), i);
1500
                        if (obj != null && obj.getClass() != DwgObject.class) {
1501
                                dwgFile.addDwgObject(obj);
1502
                        }
1503
                }//for
1504
        }
1505

    
1506
        /**
1507
         * Return a dwg object from its index in the dwg file
1508
         *
1509
         * @param index
1510
         *            of the requested dwg object in the dwg file
1511
         *
1512
         */
1513
        public DwgObject getDwgObjectByIndex(int index) {
1514
                DwgObjectOffset doo = (DwgObjectOffset) dwgFile.getDwgObjectOffsets()
1515
                                .get(index);
1516
                return readDwgObject(doo.getOffset(), index);
1517
        }
1518

    
1519
        void dumpEntity(int[] intData){
1520
                String outtxt= "int[] data = new int[]{";
1521
                for(int z = 0; z < intData.length -1; z++){
1522
                        outtxt += intData[z] + ",";
1523
                }
1524
                outtxt += intData[intData.length -1] + "}";
1525
                logger.info(outtxt);
1526
        }
1527

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

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

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

    
1577
                        DwgHandleReference hr = new DwgHandleReference();
1578
                        bitPos = hr.read(intData, bitPos);
1579
                        obj.setHandle(hr);
1580

    
1581
                        //TODO Si funciona, mover el metodo de esta clase a DwgUtil
1582
                        val = readExtendedData(intData, bitPos);
1583
                        bitPos = ((Integer) val.get(0)).intValue();
1584
                        List extData = (List) val.get(1);
1585
                        obj.setExtendedData(extData);
1586

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

    
1608
                        //size in bits
1609
                        val = DwgUtil.getRawLong(intData, bitPos);
1610
                        bitPos = ((Integer) val.get(0)).intValue();
1611
                        int sizeInBits = ((Integer) val.get(1)).intValue();
1612
                        obj.setSizeInBits(sizeInBits);
1613

    
1614
                        readSpecificObject(obj, intData, bitPos);
1615

    
1616
                        return obj;
1617

    
1618
                } catch (Exception e) {
1619
                        e.printStackTrace();
1620
                        return null;
1621
                }
1622
        }
1623

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

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

    
1655
                        val = DwgUtil.getBitShort(data, bitPos);
1656
                        bitPos = ((Integer) val.get(0)).intValue();
1657
                        size = ((Integer) val.get(1)).intValue();
1658
                        if (size == 0)
1659
                                break;
1660

    
1661
                        DwgHandleReference hr = new DwgHandleReference();
1662
                        bitPos = hr.read(data, bitPos);
1663
//                        logger.debug("Handle del EXTENDED ENTITY DATA:" + hr.getCode()
1664
//                                        + " " + hr.getOffset());
1665

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

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

    
1754
                                        val = DwgUtil.getRawDouble(data, bitPos);
1755
                                        bitPos = ((Integer) val.get(0)).intValue();
1756
                                        dValues[2] = ((Double) val.get(1)).doubleValue();
1757

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

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

    
1808
                List val = DwgUtil.getBitShort(data, bitPos);
1809
                bitPos = ((Integer) val.get(0)).intValue();
1810
                int rnum = ((Integer) val.get(1)).intValue();
1811
                dwgObject.setNumReactors(rnum);
1812

    
1813

    
1814
                val = DwgUtil.testBit(data, bitPos);
1815
                bitPos = ((Integer) val.get(0)).intValue();
1816
                boolean isLyrByLineType = ((Boolean) val.get(1)).booleanValue();
1817
                //TODO En la 15 es un flag, no un boolean. REVISAR
1818
                dwgObject.setLyrByLineType(isLyrByLineType);
1819

    
1820
                val = DwgUtil.testBit(data, bitPos);
1821
                bitPos = ((Integer) val.get(0)).intValue();
1822
                boolean noLinks = ((Boolean) val.get(1)).booleanValue();
1823
                dwgObject.setNoLinks(noLinks);
1824

    
1825
                val = DwgUtil.getBitShort(data, bitPos);
1826
                bitPos = ((Integer) val.get(0)).intValue();
1827
                int color = ((Integer) val.get(1)).intValue();
1828
                dwgObject.setColor(color);
1829

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

    
1838
                return bitPos;
1839
        }
1840

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

    
1853
                /*
1854
                 * Subentity ref handle. Esto se aplica sobre VERTEX, ATTRIB, SEQEND
1855
                 */
1856
                if (dwgObject.getMode() == 0x0) {
1857
                        DwgHandleReference subEntityHandle = new DwgHandleReference();
1858
                        bitPos = subEntityHandle.read(data, bitPos);
1859
                        dwgObject.setSubEntityHandle(subEntityHandle);
1860
                }
1861

    
1862
                /*
1863
                 * Reactors handles DwgObject
1864
                 */
1865
                DwgHandleReference reactorHandle;
1866
                for (int i = 0; i < dwgObject.getNumReactors(); i++) {
1867
                        reactorHandle = new DwgHandleReference();
1868
                        bitPos = reactorHandle.read(data, bitPos);
1869
                        dwgObject.addReactorHandle(reactorHandle);
1870
                }
1871

    
1872
                /*
1873
                 * XDICOBJHANDLE
1874
                 */
1875
                DwgHandleReference xDicObjHandle = new DwgHandleReference();
1876
                bitPos = xDicObjHandle.read(data, bitPos);
1877
                dwgObject.setXDicObjHandle(xDicObjHandle);
1878

    
1879
                //          TODO Hasta aqui igual que en la 15
1880

    
1881
                /*
1882
                 * Layer Handle code
1883
                 */
1884

    
1885
                DwgHandleReference layerHandle = new DwgHandleReference();
1886
                bitPos = layerHandle.read(data, bitPos);
1887
                dwgObject.setLayerHandle(layerHandle);
1888

    
1889
                if (!dwgObject.isLyrByLineType()) {
1890
                        DwgHandleReference lineTypeHandle = new DwgHandleReference();
1891
                        bitPos = lineTypeHandle.read(data, bitPos);
1892
                        dwgObject.setLineTypeHandle(lineTypeHandle);
1893
                }
1894
                String cadena = "";
1895
                if (!dwgObject.isNoLinks()) {
1896

    
1897
                        /*
1898
                         * Previous Handle
1899
                         */
1900
                        DwgHandleReference previousHandle = new DwgHandleReference();
1901
                        bitPos = previousHandle.read(data, bitPos);
1902
                        dwgObject.setPreviousHandle(previousHandle);
1903

    
1904
                        /*
1905
                         * Next Handle
1906
                         */
1907
                        DwgHandleReference nextHandle = new DwgHandleReference();
1908
                        bitPos = nextHandle.read(data, bitPos);
1909
                        dwgObject.setNextHandle(nextHandle);
1910
                }
1911
                return bitPos;
1912
        }
1913

    
1914
}