Statistics
| Revision:

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

History | View | Annotate | Download (63.4 KB)

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

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

    
43
import org.apache.log4j.Logger;
44

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

    
54

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

    
62
        protected DwgFile dwgFile;
63

    
64
        protected ByteBuffer bb;
65

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

    
69

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

    
92
        }
93

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
246
                        //TODO REFACTORIZAR ESTO PARA USAR DWGHANDLEREFERENCE
247

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1129
                        val = DwgUtil.getHandle(intData, bitPos);
1130
                        bitPos = ((Integer) val.get(0)).intValue();
1131
                        intHandle = DwgUtil.handleToInt(val);
1132
                        dwgFile
1133
                                        .setHeader("NAMED_OBJECT_DICTIONARY",
1134
                                                        new Integer(intHandle));
1135

    
1136
                        val = DwgUtil.getHandle(intData, bitPos);
1137
                        bitPos = ((Integer) val.get(0)).intValue();
1138
                        intHandle = DwgUtil.handleToInt(val);
1139
                        dwgFile.setHeader("PAPER_BLOCK_RECORD", new Integer(intHandle));
1140

    
1141
                        val = DwgUtil.getHandle(intData, bitPos);
1142
                        bitPos = ((Integer) val.get(0)).intValue();
1143
                        intHandle = DwgUtil.handleToInt(val);
1144
                        dwgFile.setHeader("MODEL_BLOCK_RECORD", new Integer(intHandle));
1145

    
1146
                        val = DwgUtil.getHandle(intData, bitPos);
1147
                        bitPos = ((Integer) val.get(0)).intValue();
1148
                        intHandle = DwgUtil.handleToInt(val);
1149
                        dwgFile.setHeader("LTYPE_BYLAYER", new Integer(intHandle));
1150

    
1151
                        val = DwgUtil.getHandle(intData, bitPos);
1152
                        bitPos = ((Integer) val.get(0)).intValue();
1153
                        intHandle = DwgUtil.handleToInt(val);
1154
                        dwgFile.setHeader("LTYPE_BYBLOCK", new Integer(intHandle));
1155

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

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

    
1165
                } catch (Exception e) {
1166
                        logger.error(e);
1167
                }
1168
        }
1169

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

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

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

    
1192
                bb.position(6);
1193

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

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

    
1213
                /*
1214
                 *  
1215
                 */
1216

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

    
1232
                bb.position(19);//en realidad ya hemos leido 20 bytes
1233

    
1234
                short codePage = bb.getShort();
1235
                int count = bb.getInt();
1236

    
1237
                for (int i = 0; i < count; i++) {
1238

    
1239
                        byte rec = bb.get();
1240
                        int seek = bb.getInt();
1241
                        int size = bb.getInt();
1242

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

    
1249
                        case 1:
1250
                                sectionName = "CLASSES";
1251
                                break;
1252

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1612
                        readSpecificObject(obj, intData, bitPos);
1613

    
1614
                        return obj;
1615

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1836
                return bitPos;
1837
        }
1838

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

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

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

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

    
1877
                //          TODO Hasta aqui igual que en la 15
1878

    
1879
                /*
1880
                 * Layer Handle code
1881
                 */
1882

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

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

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

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

    
1912
}