Statistics
| Revision:

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

History | View | Annotate | Download (75.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.HashMap;
42
import java.util.List;
43
import java.util.Map;
44

    
45
import org.apache.log4j.Logger;
46

    
47
import com.iver.cit.gvsig.fmap.drivers.dgn.ByteUtils;
48
import com.iver.cit.jdwglib.dwg.CorruptedDwgEntityException;
49
import com.iver.cit.jdwglib.dwg.DwgClass;
50
import com.iver.cit.jdwglib.dwg.DwgFile;
51
import com.iver.cit.jdwglib.dwg.DwgHandleReference;
52
import com.iver.cit.jdwglib.dwg.DwgObject;
53
import com.iver.cit.jdwglib.dwg.DwgObjectFactory;
54
import com.iver.cit.jdwglib.dwg.DwgObjectOffset;
55
import com.iver.cit.jdwglib.dwg.DwgUtil;
56
import com.iver.cit.jdwglib.dwg.objects.DwgArc;
57
import com.iver.cit.jdwglib.dwg.objects.DwgAttdef;
58
import com.iver.cit.jdwglib.dwg.objects.DwgAttrib;
59
import com.iver.cit.jdwglib.dwg.objects.DwgBlock;
60
import com.iver.cit.jdwglib.dwg.objects.DwgBlockControl;
61
import com.iver.cit.jdwglib.dwg.objects.DwgBlockHeader;
62
import com.iver.cit.jdwglib.dwg.objects.DwgCircle;
63
import com.iver.cit.jdwglib.dwg.objects.DwgEllipse;
64
import com.iver.cit.jdwglib.dwg.objects.DwgEndblk;
65
import com.iver.cit.jdwglib.dwg.objects.DwgInsert;
66
import com.iver.cit.jdwglib.dwg.objects.DwgLayer;
67
import com.iver.cit.jdwglib.dwg.objects.DwgLayerControl;
68
import com.iver.cit.jdwglib.dwg.objects.DwgLine;
69
import com.iver.cit.jdwglib.dwg.objects.DwgLwPolyline;
70
import com.iver.cit.jdwglib.dwg.objects.DwgMText;
71
import com.iver.cit.jdwglib.dwg.objects.DwgPoint;
72
import com.iver.cit.jdwglib.dwg.objects.DwgPolyline2D;
73
import com.iver.cit.jdwglib.dwg.objects.DwgPolyline3D;
74
import com.iver.cit.jdwglib.dwg.objects.DwgSeqend;
75
import com.iver.cit.jdwglib.dwg.objects.DwgSolid;
76
import com.iver.cit.jdwglib.dwg.objects.DwgSpline;
77
import com.iver.cit.jdwglib.dwg.objects.DwgText;
78
import com.iver.cit.jdwglib.dwg.objects.DwgVertex2D;
79
import com.iver.cit.jdwglib.dwg.objects.DwgVertex3D;
80

    
81
import freenet.support.HexUtil;
82

    
83
/**
84
 * The DwgFileV14Reader reads the DWG version 14 format
85
 * 
86
 * @author jmorell
87
 */
88
public class DwgFileV14Reader implements IDwgFileReader {
89

    
90
        protected DwgFile dwgFile;
91
        protected ByteBuffer bb;
92
        
93
        private boolean debug = false;
94
        
95
        private static Logger logger = Logger.
96
                getLogger(DwgFileV14Reader.class.getName());
97
        
98
        /**
99
         * Reads the DWG version 15 format
100
         * 
101
         * @param dwgFile Represents the DWG file that we want to read
102
     * @throws IOException When DWG file path is wrong
103
         */
104
        public void read(DwgFile dwgFile, ByteBuffer bb) throws IOException {
105
                this.dwgFile = dwgFile;
106
                this.bb = bb;
107
                try {
108
                        readDwgSectionOffsets();
109
                        if(debug){
110
                                readHeaders();
111
                                readDwgClasses();
112
                        }        
113
                        readDwgObjectOffsets();                
114
                        readDwgObjects();
115
                } catch (Exception e) {
116
                        logger.error(e);
117
                }
118
                
119
        }
120
        
121
        /**
122
         * It reads all HEADER section of a DWG 13-14 file.
123
         * 
124
         * This method must be called only for debug purposes because we dont the meaning
125
         * (or the practical application) of the fields readed with it
126
         * 
127
         * TODO Pasarlo a la clase abstracta comun que se haga de las versiones 15, 13-14
128
         * (la cabecera es la misma practicamente)
129
         * 
130
         * 
131
         * */
132
        protected void readHeaders(){
133
                
134
                int offset = dwgFile.getDwgSectionOffset("HEADERS");
135
                bb.position(offset);
136
                
137
                
138
                //1? leemos el sentinnel inicial
139
                bb.order(ByteOrder.nativeOrder());
140
                byte[] sentinel = new byte[16];
141
                bb.get(sentinel);
142
                
143
                if(sentinel[0] != 0xcf)
144
                        logger.warn("sentinel[0] != 0xcf");
145
                if(sentinel[1] != 0x7b)
146
                        logger.warn("sentinel[1] != 0x7b");
147
                if(sentinel[2] != 0x1f)
148
                        logger.warn("sentinel[2] != 0x1f");
149
                if(sentinel[3] != 0x23)
150
                        logger.warn("sentinel[3] != 0x23");
151
                if(sentinel[4] != 0xfd)
152
                        logger.warn("sentinel[4] != 0xfd");
153
                if(sentinel[5] != 0xde)
154
                        logger.warn("sentinel[5] != 0xde");
155
                if(sentinel[6] != 0x38)
156
                        logger.warn("sentinel[6] != 0x38");
157
                if(sentinel[7] != 0xa9)
158
                        logger.warn("sentinel[7] != 0xa9");
159
                if(sentinel[8] != 0x5f)
160
                        logger.warn("sentinel[8] != 0x5f");
161
                if(sentinel[9] != 0x7c)
162
                        logger.warn("sentinel[9] != 0x7c");
163
                if(sentinel[10] != 0x68)
164
                        logger.warn("sentinel[10] != 0x68");
165
                if(sentinel[11] != 0xb8)
166
                        logger.warn("sentinel[11] != 0xb8");
167
                if(sentinel[12] != 0x4e)
168
                        logger.warn("sentinel[12] != 0x4e");
169
                if(sentinel[13] != 0x6d)
170
                        logger.warn("sentinel[13] != 0x6d");
171
                if(sentinel[14] != 0x33)
172
                        logger.warn("sentinel[14] != 0x33");
173
                if(sentinel[15] != 0x5f)
174
                        logger.warn("sentinel[15] != 0x5f");
175
        
176
                
177
                //2? seguidamente leemos los datos
178
                bb.order(ByteOrder.LITTLE_ENDIAN);
179
                int size = bb.getInt();
180
                
181
                bb.order(ByteOrder.nativeOrder());
182
                byte[] data = new byte[size];
183
                bb.get(data);
184
                
185
                /*
186
                 * J.Morell hacia esto para leer los datos como int[]
187
                   int[] data = new int[size];
188
                        for (int i=0; i < size; i++) {
189
                                dataBytes[i] = bb.get();
190
                                dataMachValString[i] = HexUtil.bytesToHex(new byte[]{dataBytes[i]});
191
                                Integer dataMachValShort = Integer.decode("0x" + dataMachValString[i]);
192
                                data[i] = dataMachValShort.byteValue();
193
                                data[i] = ByteUtils.getUnsigned((byte)data[i]);
194
                        }
195
                 * TODO Hace falta esto????
196
                 * 
197
                 * */
198
                int[] intData = DwgUtil.toIntArray(data);
199
                
200
                
201
                //3? a continuacion el CRC de la seccion HEADER
202
                bb.order(ByteOrder.LITTLE_ENDIAN);
203
                short crc = bb.getShort();
204
                
205
                //Por ultimo, el sentinnel final
206
                bb.order(ByteOrder.nativeOrder());
207
                byte[] lastSentinnel = new byte[16];
208
                bb.get(lastSentinnel);
209
                if(lastSentinnel[0] != 0x30)
210
                        logger.warn("lastSentinnel[0] != 0x30");
211
                if(lastSentinnel[1] != 0x84)
212
                        logger.warn("lastSentinnel[1] != 0x84");
213
                if(lastSentinnel[2] != 0xe0)
214
                        logger.warn("lastSentinnel[2] != 0xe0");
215
                if(lastSentinnel[3] != 0xdc)
216
                        logger.warn("lastSentinnel[3] != 0xdc");
217
                if(lastSentinnel[4] != 0x02)
218
                        logger.warn("lastSentinnel[4] != 0x02");
219
                if(lastSentinnel[5] != 0x21)
220
                        logger.warn("lastSentinnel[5] != 0x21");
221
                if(lastSentinnel[6] != 0xc7)
222
                        logger.warn("lastSentinnel[6] != 0xc7");
223
                if(lastSentinnel[7] != 0x56)
224
                        logger.warn("lastSentinnel[7] != 0x56");
225
                if(lastSentinnel[8] != 0xa0)
226
                        logger.warn("lastSentinnel[8] != 0xa0");
227
                if(lastSentinnel[9] != 0x83)
228
                        logger.warn("lastSentinnel[9] != 0x83");
229
                if(lastSentinnel[10] != 0x97)
230
                        logger.warn("lastSentinnel[10] != 0x97");
231
                if(lastSentinnel[11] != 0x47)
232
                        logger.warn("lastSentinnel[11] != 0x47");
233
                if(lastSentinnel[12] != 0xb1)
234
                        logger.warn("lastSentinnel[12] != 0xb1");
235
                if(lastSentinnel[13] != 0x92)
236
                        logger.warn("lastSentinnel[13] != 0x92");
237
                if(lastSentinnel[14] != 0xcc)
238
                        logger.warn("lastSentinnel[14] != 0xcc");
239
                if(lastSentinnel[15] != 0xa0)
240
                        logger.warn("lastSentinnel[15] != 0xa0");
241
                
242
                //Ahora interpretamos los datos en bruto
243
                int bitPos = 0;
244
                try {
245
                        List val = DwgUtil.getBitDouble(intData, bitPos);
246
                        bitPos = ((Integer)val.get(0)).intValue();
247
                        dwgFile.setHeader("VAL1", val.get(1));
248

    
249
                        val = DwgUtil.getBitDouble(intData, bitPos);
250
                        bitPos = ((Integer)val.get(0)).intValue();
251
                        dwgFile.setHeader("VAL2", val.get(1));
252
                        
253
                        val = DwgUtil.getBitDouble(intData, bitPos);
254
                        bitPos = ((Integer)val.get(0)).intValue();
255
                        dwgFile.setHeader("VAL3", val.get(1));
256
                        
257
                        val = DwgUtil.getBitDouble(intData, bitPos);
258
                        bitPos = ((Integer)val.get(0)).intValue();
259
                        dwgFile.setHeader("VAL4", val.get(1));
260
                        
261
                        val = DwgUtil.getTextString(intData, bitPos);
262
                        bitPos = ((Integer)val.get(0)).intValue();
263
                        dwgFile.setHeader("STRING1", val.get(1));
264
                        
265
                        val = DwgUtil.getTextString(intData, bitPos);
266
                        bitPos = ((Integer)val.get(0)).intValue();
267
                        dwgFile.setHeader("STRING2", val.get(1));
268
                        
269
                        val = DwgUtil.getTextString(intData, bitPos);
270
                        bitPos = ((Integer)val.get(0)).intValue();
271
                        dwgFile.setHeader("STRING3", val.get(1));
272
                        
273
                        val = DwgUtil.getTextString(intData, bitPos);
274
                        bitPos = ((Integer)val.get(0)).intValue();
275
                        dwgFile.setHeader("STRING4", val.get(1));
276
                        
277
                        val = DwgUtil.getBitLong(intData, bitPos);
278
                        bitPos = ((Integer)val.get(0)).intValue();
279
                        dwgFile.setHeader("LONG1", val.get(1));
280
                        
281
                        val = DwgUtil.getBitLong(intData, bitPos);
282
                        bitPos = ((Integer)val.get(0)).intValue();
283
                        dwgFile.setHeader("LONG2", val.get(1));
284
                        
285
                        val = DwgUtil.getBitShort(intData, bitPos);
286
                        bitPos = ((Integer)val.get(0)).intValue();
287
                        dwgFile.setHeader("SHORT1", val.get(1));
288

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

    
658
        //creo que CLAYER marca la capa actualmente seleccionada en el menu de autocad                
659
                        
660
                        val = DwgUtil.getHandle(intData, bitPos);
661
                        bitPos = ((Integer)val.get(0)).intValue();
662
                        intHandle = DwgUtil.handleToInt(val);
663
                        dwgFile.setHeader("CLAYER", new Integer(intHandle));
664
                        
665
                        val = DwgUtil.getHandle(intData, bitPos);
666
                        bitPos = ((Integer)val.get(0)).intValue();
667
                        intHandle = DwgUtil.handleToInt(val);
668
                        dwgFile.setHeader("TEXSTYLE", new Integer(intHandle));
669
                        
670
                        val = DwgUtil.getHandle(intData, bitPos);
671
                        bitPos = ((Integer)val.get(0)).intValue();
672
                        intHandle = DwgUtil.handleToInt(val);
673
                        dwgFile.setHeader("CELLTYPE", new Integer(intHandle));
674

    
675
                        val = DwgUtil.getHandle(intData, bitPos);
676
                        bitPos = ((Integer)val.get(0)).intValue();
677
                        intHandle = DwgUtil.handleToInt(val);
678
                        dwgFile.setHeader("DIMSTYLE", new Integer(intHandle));
679
                        
680
                        val = DwgUtil.getHandle(intData, bitPos);
681
                        bitPos = ((Integer)val.get(0)).intValue();
682
                        intHandle = DwgUtil.handleToInt(val);
683
                        dwgFile.setHeader("CMLSTYLE", new Integer(intHandle));
684

    
685
                        double[] spaces1 = new double[3];
686
                        val = DwgUtil.getBitDouble(intData, bitPos);
687
                        bitPos = ((Integer)val.get(0)).intValue();
688
                        spaces1[0] = ((Double)val.get(1)).doubleValue();
689
                        val = DwgUtil.getBitDouble(intData, bitPos);
690
                        bitPos = ((Integer)val.get(0)).intValue();
691
                        spaces1[1] = ((Double)val.get(1)).doubleValue();
692
                        val = DwgUtil.getBitDouble(intData, bitPos);
693
                        bitPos = ((Integer)val.get(0)).intValue();
694
                        spaces1[2] = ((Double)val.get(1)).doubleValue();
695
                        dwgFile.setHeader("PSPACE_INSBASE", spaces1);
696
                        
697
                        double[] spaces2 = new double[3];
698
                        val = DwgUtil.getBitDouble(intData, bitPos);
699
                        bitPos = ((Integer)val.get(0)).intValue();
700
                        spaces2[0] = ((Double)val.get(1)).doubleValue();
701
                        val = DwgUtil.getBitDouble(intData, bitPos);
702
                        bitPos = ((Integer)val.get(0)).intValue();
703
                        spaces2[1] = ((Double)val.get(1)).doubleValue();
704
                        val = DwgUtil.getBitDouble(intData, bitPos);
705
                        bitPos = ((Integer)val.get(0)).intValue();
706
                        spaces2[2] = ((Double)val.get(1)).doubleValue();
707
                        dwgFile.setHeader("PSPACE_EXTMIN", spaces2);
708
                        
709
                        double[] spaces3 = new double[3];
710
                        val = DwgUtil.getBitDouble(intData, bitPos);
711
                        bitPos = ((Integer)val.get(0)).intValue();
712
                        spaces3[0] = ((Double)val.get(1)).doubleValue();
713
                        val = DwgUtil.getBitDouble(intData, bitPos);
714
                        bitPos = ((Integer)val.get(0)).intValue();
715
                        spaces3[1] = ((Double)val.get(1)).doubleValue();
716
                        val = DwgUtil.getBitDouble(intData, bitPos);
717
                        bitPos = ((Integer)val.get(0)).intValue();
718
                        spaces3[2] = ((Double)val.get(1)).doubleValue();
719
                        dwgFile.setHeader("PSPACE_EXTMAX", spaces2);
720
                        
721
                        double[] spaces4 = new double[2];
722
                        val = DwgUtil.getRawDouble(intData, bitPos);
723
                        bitPos = ((Integer)val.get(0)).intValue();
724
                        spaces4[0] = ((Double)val.get(1)).doubleValue();
725
                        val = DwgUtil.getRawDouble(intData, bitPos);
726
                        bitPos = ((Integer)val.get(0)).intValue();
727
                        spaces4[1] = ((Double)val.get(1)).doubleValue();
728
                        dwgFile.setHeader("PSPACE_LIMMIN", spaces4);
729
                        
730
                        double[] spaces5 = new double[2];
731
                        val = DwgUtil.getRawDouble(intData, bitPos);
732
                        bitPos = ((Integer)val.get(0)).intValue();
733
                        spaces5[0] = ((Double)val.get(1)).doubleValue();
734
                        val = DwgUtil.getRawDouble(intData, bitPos);
735
                        bitPos = ((Integer)val.get(0)).intValue();
736
                        spaces5[1] = ((Double)val.get(1)).doubleValue();
737
                        dwgFile.setHeader("PSPACE_LIMMAX", spaces5);
738
                        
739
                        
740
                        val = DwgUtil.getBitDouble(intData, bitPos);
741
                        bitPos = ((Integer)val.get(0)).intValue();
742
                        dwgFile.setHeader("PSPACE_ELEVATION", val.get(1));
743
                        
744
                        double[] spaces6 = new double[6];
745
                        val = DwgUtil.getBitDouble(intData, bitPos);
746
                        bitPos = ((Integer)val.get(0)).intValue();
747
                        spaces6[0] = ((Double)val.get(1)).doubleValue();
748
                        val = DwgUtil.getBitDouble(intData, bitPos);
749
                        bitPos = ((Integer)val.get(0)).intValue();
750
                        spaces6[1] = ((Double)val.get(1)).doubleValue();
751
                        val = DwgUtil.getBitDouble(intData, bitPos);
752
                        bitPos = ((Integer)val.get(0)).intValue();
753
                        spaces6[2] = ((Double)val.get(1)).doubleValue();
754
                        dwgFile.setHeader("PSPACE_UCSORG", spaces6);
755
                        
756
                        double[] spaces7 = new double[6];
757
                        val = DwgUtil.getBitDouble(intData, bitPos);
758
                        bitPos = ((Integer)val.get(0)).intValue();
759
                        spaces7[0] = ((Double)val.get(1)).doubleValue();
760
                        val = DwgUtil.getBitDouble(intData, bitPos);
761
                        bitPos = ((Integer)val.get(0)).intValue();
762
                        spaces7[1] = ((Double)val.get(1)).doubleValue();
763
                        val = DwgUtil.getBitDouble(intData, bitPos);
764
                        bitPos = ((Integer)val.get(0)).intValue();
765
                        spaces7[2] = ((Double)val.get(1)).doubleValue();
766
                        dwgFile.setHeader("PSPACE_UCSXDIR", spaces7);
767
                        
768
                        double[] spaces8 = new double[6];
769
                        val = DwgUtil.getBitDouble(intData, bitPos);
770
                        bitPos = ((Integer)val.get(0)).intValue();
771
                        spaces8[0] = ((Double)val.get(1)).doubleValue();
772
                        val = DwgUtil.getBitDouble(intData, bitPos);
773
                        bitPos = ((Integer)val.get(0)).intValue();
774
                        spaces8[1] = ((Double)val.get(1)).doubleValue();
775
                        val = DwgUtil.getBitDouble(intData, bitPos);
776
                        bitPos = ((Integer)val.get(0)).intValue();
777
                        spaces8[2] = ((Double)val.get(1)).doubleValue();
778
                        dwgFile.setHeader("PSPACE_UCSYDIR", spaces8);
779
                        
780
                        val = DwgUtil.getHandle(intData, bitPos);
781
                        bitPos = ((Integer)val.get(0)).intValue();
782
                        intHandle = DwgUtil.handleToInt(val);
783
                        dwgFile.setHeader("PSPACE_UCSNAME", new Integer(intHandle));
784
                        
785
                        double[] spaces9 = new double[6];
786
                        val = DwgUtil.getBitDouble(intData, bitPos);
787
                        bitPos = ((Integer)val.get(0)).intValue();
788
                        spaces9[0] = ((Double)val.get(1)).doubleValue();
789
                        val = DwgUtil.getBitDouble(intData, bitPos);
790
                        bitPos = ((Integer)val.get(0)).intValue();
791
                        spaces9[1] = ((Double)val.get(1)).doubleValue();
792
                        val = DwgUtil.getBitDouble(intData, bitPos);
793
                        bitPos = ((Integer)val.get(0)).intValue();
794
                        spaces9[2] = ((Double)val.get(1)).doubleValue();
795
                        dwgFile.setHeader("MSPACE_INSBASE", spaces9);
796
                        
797
                        double[] spaces10 = new double[6];
798
                        val = DwgUtil.getBitDouble(intData, bitPos);
799
                        bitPos = ((Integer)val.get(0)).intValue();
800
                        spaces10[0] = ((Double)val.get(1)).doubleValue();
801
                        val = DwgUtil.getBitDouble(intData, bitPos);
802
                        bitPos = ((Integer)val.get(0)).intValue();
803
                        spaces10[1] = ((Double)val.get(1)).doubleValue();
804
                        val = DwgUtil.getBitDouble(intData, bitPos);
805
                        bitPos = ((Integer)val.get(0)).intValue();
806
                        spaces10[2] = ((Double)val.get(1)).doubleValue();
807
                        dwgFile.setHeader("MSPACE_EXTMIN", spaces10);
808
                        
809
                        double[] spaces11 = new double[3];
810
                        val = DwgUtil.getBitDouble(intData, bitPos);
811
                        bitPos = ((Integer)val.get(0)).intValue();
812
                        spaces11[0] = ((Double)val.get(1)).doubleValue();
813
                        val = DwgUtil.getBitDouble(intData, bitPos);
814
                        bitPos = ((Integer)val.get(0)).intValue();
815
                        spaces11[1] = ((Double)val.get(1)).doubleValue();
816
                        val = DwgUtil.getBitDouble(intData, bitPos);
817
                        bitPos = ((Integer)val.get(0)).intValue();
818
                        spaces11[2] = ((Double)val.get(1)).doubleValue();
819
                        dwgFile.setHeader("MSPACE_EXTMAX", spaces11);
820
                        
821
                        double[] spaces12= new double[2];
822
                        val = DwgUtil.getRawDouble(intData, bitPos);
823
                        bitPos = ((Integer)val.get(0)).intValue();
824
                        spaces12[0] = ((Double)val.get(1)).doubleValue();
825
                        val = DwgUtil.getRawDouble(intData, bitPos);
826
                        bitPos = ((Integer)val.get(0)).intValue();
827
                        spaces12[1] = ((Double)val.get(1)).doubleValue();
828
                        dwgFile.setHeader("MSPACE_LIMMIN", spaces12);
829
                        
830
                        double[] spaces13= new double[2];
831
                        val = DwgUtil.getRawDouble(intData, bitPos);
832
                        bitPos = ((Integer)val.get(0)).intValue();
833
                        spaces13[0] = ((Double)val.get(1)).doubleValue();
834
                        val = DwgUtil.getRawDouble(intData, bitPos);
835
                        bitPos = ((Integer)val.get(0)).intValue();
836
                        spaces13[1] = ((Double)val.get(1)).doubleValue();
837
                        dwgFile.setHeader("MSPACE_LIMMAX", spaces13);
838
                        
839
                        val = DwgUtil.getBitDouble(intData, bitPos);
840
                        bitPos = ((Integer)val.get(0)).intValue();
841
                        dwgFile.setHeader("MSPACE_ELEVATION", (Double)val.get(1));
842
                        
843
                        double[] spaces14 = new double[3];
844
                        val = DwgUtil.getBitDouble(intData, bitPos);
845
                        bitPos = ((Integer)val.get(0)).intValue();
846
                        spaces14[0] = ((Double)val.get(1)).doubleValue();
847
                        val = DwgUtil.getBitDouble(intData, bitPos);
848
                        bitPos = ((Integer)val.get(0)).intValue();
849
                        spaces14[1] = ((Double)val.get(1)).doubleValue();
850
                        val = DwgUtil.getBitDouble(intData, bitPos);
851
                        bitPos = ((Integer)val.get(0)).intValue();
852
                        spaces14[2] = ((Double)val.get(1)).doubleValue();
853
                        dwgFile.setHeader("MSPACE_UCSORG", spaces14);
854
                        
855
                        double[] spaces15 = new double[3];
856
                        val = DwgUtil.getBitDouble(intData, bitPos);
857
                        bitPos = ((Integer)val.get(0)).intValue();
858
                        spaces15[0] = ((Double)val.get(1)).doubleValue();
859
                        val = DwgUtil.getBitDouble(intData, bitPos);
860
                        bitPos = ((Integer)val.get(0)).intValue();
861
                        spaces15[1] = ((Double)val.get(1)).doubleValue();
862
                        val = DwgUtil.getBitDouble(intData, bitPos);
863
                        bitPos = ((Integer)val.get(0)).intValue();
864
                        spaces15[2] = ((Double)val.get(1)).doubleValue();
865
                        dwgFile.setHeader("MSPACE_UCSXDIR", spaces15);
866
                        
867
                        double[] spaces16 = new double[3];
868
                        val = DwgUtil.getBitDouble(intData, bitPos);
869
                        bitPos = ((Integer)val.get(0)).intValue();
870
                        spaces16[0] = ((Double)val.get(1)).doubleValue();
871
                        val = DwgUtil.getBitDouble(intData, bitPos);
872
                        bitPos = ((Integer)val.get(0)).intValue();
873
                        spaces16[1] = ((Double)val.get(1)).doubleValue();
874
                        val = DwgUtil.getBitDouble(intData, bitPos);
875
                        bitPos = ((Integer)val.get(0)).intValue();
876
                        spaces16[2] = ((Double)val.get(1)).doubleValue();
877
                        dwgFile.setHeader("MSPACE_UCSYDIR", spaces16);
878
                        
879
                        val = DwgUtil.getHandle(intData, bitPos);
880
                        bitPos = ((Integer)val.get(0)).intValue();
881
                        intHandle = DwgUtil.handleToInt(val);
882
                        dwgFile.setHeader("MSPACE_UCSNAME", new Integer(intHandle));
883

    
884
                        val = DwgUtil.testBit(intData, bitPos);
885
                        bitPos = ((Integer)val.get(0)).intValue();
886
                        dwgFile.setHeader("DIMTOL", val.get(1));
887
                        
888
                        val = DwgUtil.testBit(intData, bitPos);
889
                        bitPos = ((Integer)val.get(0)).intValue();
890
                        dwgFile.setHeader("DIMLIM", val.get(1));
891
                        
892
                        val = DwgUtil.testBit(intData, bitPos);
893
                        bitPos = ((Integer)val.get(0)).intValue();
894
                        dwgFile.setHeader("DIMTIH", val.get(1));
895
                        
896
                        val = DwgUtil.testBit(intData, bitPos);
897
                        bitPos = ((Integer)val.get(0)).intValue();
898
                        dwgFile.setHeader("DIMTOH", val.get(1));
899
                        
900
                        val = DwgUtil.testBit(intData, bitPos);
901
                        bitPos = ((Integer)val.get(0)).intValue();
902
                        dwgFile.setHeader("DIMSE1", val.get(1));
903
                        
904
                        val = DwgUtil.testBit(intData, bitPos);
905
                        bitPos = ((Integer)val.get(0)).intValue();
906
                        dwgFile.setHeader("DIMTSE2", val.get(1));
907
                        
908
                        val = DwgUtil.testBit(intData, bitPos);
909
                        bitPos = ((Integer)val.get(0)).intValue();
910
                        dwgFile.setHeader("DIMALT", val.get(1));
911
                        
912
                        val = DwgUtil.testBit(intData, bitPos);
913
                        bitPos = ((Integer)val.get(0)).intValue();
914
                        dwgFile.setHeader("DIMTOFL", val.get(1));
915
                        
916
                        val = DwgUtil.testBit(intData, bitPos);
917
                        bitPos = ((Integer)val.get(0)).intValue();
918
                        dwgFile.setHeader("DIMSAH", val.get(1));
919
                        
920
                        val = DwgUtil.testBit(intData, bitPos);
921
                        bitPos = ((Integer)val.get(0)).intValue();
922
                        dwgFile.setHeader("DIMTIX", val.get(1));
923
                        
924
                        val = DwgUtil.testBit(intData, bitPos);
925
                        bitPos = ((Integer)val.get(0)).intValue();
926
                        dwgFile.setHeader("DIMSOXD", val.get(1));
927
                        
928
                        val = DwgUtil.getRawChar(intData, bitPos);
929
                        bitPos = ((Integer)val.get(0)).intValue();
930
                        dwgFile.setHeader("DIMALTD", val.get(1));
931
                        
932
                        val = DwgUtil.getRawChar(intData, bitPos);
933
                        bitPos = ((Integer)val.get(0)).intValue();
934
                        dwgFile.setHeader("DIMZIN", val.get(1));
935
                        
936
                        val = DwgUtil.testBit(intData, bitPos);
937
                        bitPos = ((Integer)val.get(0)).intValue();
938
                        dwgFile.setHeader("DIMSD1", val.get(1));
939
                        
940
                        val = DwgUtil.testBit(intData, bitPos);
941
                        bitPos = ((Integer)val.get(0)).intValue();
942
                        dwgFile.setHeader("DIMSD2", val.get(1));
943
                        
944
                        val = DwgUtil.getRawChar(intData, bitPos);
945
                        bitPos = ((Integer)val.get(0)).intValue();
946
                        dwgFile.setHeader("DIMTOLJ", val.get(1));
947
                        
948
                        val = DwgUtil.getRawChar(intData, bitPos);
949
                        bitPos = ((Integer)val.get(0)).intValue();
950
                        dwgFile.setHeader("DIMJUST", val.get(1));
951
                        
952
                        val = DwgUtil.getRawChar(intData, bitPos);
953
                        bitPos = ((Integer)val.get(0)).intValue();
954
                        dwgFile.setHeader("DIMFINT", val.get(1));
955
                        
956
                        val = DwgUtil.testBit(intData, bitPos);
957
                        bitPos = ((Integer)val.get(0)).intValue();
958
                        dwgFile.setHeader("DIMUPT", val.get(1));
959
                        
960
                        val = DwgUtil.getRawChar(intData, bitPos);
961
                        bitPos = ((Integer)val.get(0)).intValue();
962
                        dwgFile.setHeader("DIMZIN", val.get(1));
963
                        
964
                        val = DwgUtil.getRawChar(intData, bitPos);
965
                        bitPos = ((Integer)val.get(0)).intValue();
966
                        dwgFile.setHeader("DIMALTZ", val.get(1));
967
                        
968
                        val = DwgUtil.getRawChar(intData, bitPos);
969
                        bitPos = ((Integer)val.get(0)).intValue();
970
                        dwgFile.setHeader("DIMALTTZ", val.get(1));
971
                        
972
                        val = DwgUtil.getRawChar(intData, bitPos);
973
                        bitPos = ((Integer)val.get(0)).intValue();
974
                        dwgFile.setHeader("DIMTAD", val.get(1));
975
                        
976
                        val = DwgUtil.getBitShort(intData, bitPos);
977
                        bitPos = ((Integer)val.get(0)).intValue();
978
                        dwgFile.setHeader("DIMUNIT", val.get(1));
979
                        
980
                        val = DwgUtil.getBitShort(intData, bitPos);
981
                        bitPos = ((Integer)val.get(0)).intValue();
982
                        dwgFile.setHeader("DIMAUNIT", val.get(1));
983
                        
984
                        val = DwgUtil.getBitShort(intData, bitPos);
985
                        bitPos = ((Integer)val.get(0)).intValue();
986
                        dwgFile.setHeader("DIMDEC", val.get(1));
987
                        
988
                        val = DwgUtil.getBitShort(intData, bitPos);
989
                        bitPos = ((Integer)val.get(0)).intValue();
990
                        dwgFile.setHeader("DIMTDEC", val.get(1));
991
                        
992
                        val = DwgUtil.getBitShort(intData, bitPos);
993
                        bitPos = ((Integer)val.get(0)).intValue();
994
                        dwgFile.setHeader("DIMALTU", val.get(1));
995
                        
996
                        val = DwgUtil.getBitShort(intData, bitPos);
997
                        bitPos = ((Integer)val.get(0)).intValue();
998
                        dwgFile.setHeader("DIMALTTD", val.get(1));
999
                        
1000
                        val = DwgUtil.getHandle(intData, bitPos);
1001
                        bitPos = ((Integer)val.get(0)).intValue();
1002
                        intHandle = DwgUtil.handleToInt(val);
1003
                        dwgFile.setHeader("DIMTXSTY", new Integer(intHandle));
1004

    
1005
                        val = DwgUtil.getBitDouble(intData, bitPos);
1006
                        bitPos = ((Integer)val.get(0)).intValue();
1007
                        dwgFile.setHeader("DIMSCALE", val.get(1));
1008
                        
1009
                        val = DwgUtil.getBitDouble(intData, bitPos);
1010
                        bitPos = ((Integer)val.get(0)).intValue();
1011
                        dwgFile.setHeader("DIMASZ", val.get(1));
1012
                        
1013
                        val = DwgUtil.getBitDouble(intData, bitPos);
1014
                        bitPos = ((Integer)val.get(0)).intValue();
1015
                        dwgFile.setHeader("DIMEXO", val.get(1));
1016
                        
1017
                        val = DwgUtil.getBitDouble(intData, bitPos);
1018
                        bitPos = ((Integer)val.get(0)).intValue();
1019
                        dwgFile.setHeader("DIMDLI", val.get(1));
1020
                        
1021
                        val = DwgUtil.getBitDouble(intData, bitPos);
1022
                        bitPos = ((Integer)val.get(0)).intValue();
1023
                        dwgFile.setHeader("DIMEXE", val.get(1));
1024
                        
1025
                        val = DwgUtil.getBitDouble(intData, bitPos);
1026
                        bitPos = ((Integer)val.get(0)).intValue();
1027
                        dwgFile.setHeader("DIMAND", val.get(1));
1028
                        
1029
                        val = DwgUtil.getBitDouble(intData, bitPos);
1030
                        bitPos = ((Integer)val.get(0)).intValue();
1031
                        dwgFile.setHeader("DIMDLE", val.get(1));
1032
                        
1033
                        val = DwgUtil.getBitDouble(intData, bitPos);
1034
                        bitPos = ((Integer)val.get(0)).intValue();
1035
                        dwgFile.setHeader("DIMTP", val.get(1));
1036
                        
1037
                        val = DwgUtil.getBitDouble(intData, bitPos);
1038
                        bitPos = ((Integer)val.get(0)).intValue();
1039
                        dwgFile.setHeader("DIMTM", val.get(1));
1040
                        
1041
                        val = DwgUtil.getBitDouble(intData, bitPos);
1042
                        bitPos = ((Integer)val.get(0)).intValue();
1043
                        dwgFile.setHeader("DIMTXT", val.get(1));
1044
                        
1045
                        val = DwgUtil.getBitDouble(intData, bitPos);
1046
                        bitPos = ((Integer)val.get(0)).intValue();
1047
                        dwgFile.setHeader("DIMCEN", val.get(1));
1048
                        
1049
                        val = DwgUtil.getBitDouble(intData, bitPos);
1050
                        bitPos = ((Integer)val.get(0)).intValue();
1051
                        dwgFile.setHeader("DIMSZ", val.get(1));
1052
                        
1053
                        val = DwgUtil.getBitDouble(intData, bitPos);
1054
                        bitPos = ((Integer)val.get(0)).intValue();
1055
                        dwgFile.setHeader("DIMALTF", val.get(1));
1056
                        
1057
                        val = DwgUtil.getBitDouble(intData, bitPos);
1058
                        bitPos = ((Integer)val.get(0)).intValue();
1059
                        dwgFile.setHeader("DIMLFAC", val.get(1));
1060
                        
1061
                        val = DwgUtil.getBitDouble(intData, bitPos);
1062
                        bitPos = ((Integer)val.get(0)).intValue();
1063
                        dwgFile.setHeader("DIMTVP", val.get(1));
1064
                        
1065
                        val = DwgUtil.getBitDouble(intData, bitPos);
1066
                        bitPos = ((Integer)val.get(0)).intValue();
1067
                        dwgFile.setHeader("DIMTFAC", val.get(1));
1068
                        
1069
                        val = DwgUtil.getBitDouble(intData, bitPos);
1070
                        bitPos = ((Integer)val.get(0)).intValue();
1071
                        dwgFile.setHeader("DIMGAP", val.get(1));
1072
                        
1073
                        val = DwgUtil.getTextString(intData, bitPos);
1074
                        bitPos = ((Integer)val.get(0)).intValue();
1075
                        dwgFile.setHeader("DIMPOST", val.get(1));
1076
                        
1077
                        val = DwgUtil.getTextString(intData, bitPos);
1078
                        bitPos = ((Integer)val.get(0)).intValue();
1079
                        dwgFile.setHeader("DIMAPOST", val.get(1));
1080
                        
1081
                        val = DwgUtil.getTextString(intData, bitPos);
1082
                        bitPos = ((Integer)val.get(0)).intValue();
1083
                        dwgFile.setHeader("DIMBLK", val.get(1));
1084
                        
1085
                        val = DwgUtil.getTextString(intData, bitPos);
1086
                        bitPos = ((Integer)val.get(0)).intValue();
1087
                        dwgFile.setHeader("DIMBLK1", val.get(1));
1088
                        
1089
                        val = DwgUtil.getTextString(intData, bitPos);
1090
                        bitPos = ((Integer)val.get(0)).intValue();
1091
                        dwgFile.setHeader("DIMBLK2", val.get(1));
1092
                        
1093
                        val = DwgUtil.getBitShort(intData, bitPos);
1094
                        bitPos = ((Integer)val.get(0)).intValue();
1095
                        dwgFile.setHeader("DIMCLRD", val.get(1));
1096
                        
1097
                        val = DwgUtil.getBitShort(intData, bitPos);
1098
                        bitPos = ((Integer)val.get(0)).intValue();
1099
                        dwgFile.setHeader("DIMCLRE", val.get(1));
1100
                        
1101
                        val = DwgUtil.getBitShort(intData, bitPos);
1102
                        bitPos = ((Integer)val.get(0)).intValue();
1103
                        dwgFile.setHeader("DIMCLRT", val.get(1));
1104
                        
1105
                        val = DwgUtil.getHandle(intData, bitPos);
1106
                        bitPos = ((Integer)val.get(0)).intValue();
1107
                        intHandle = DwgUtil.handleToInt(val);
1108
                        dwgFile.setHeader("BLOCK_CONTROL_OBJECT", new Integer(intHandle));
1109
                        
1110
                        val = DwgUtil.getHandle(intData, bitPos);
1111
                        bitPos = ((Integer)val.get(0)).intValue();
1112
                        intHandle = DwgUtil.handleToInt(val);
1113
                        dwgFile.setHeader("LAYER_CONTROL_OBJECT", new Integer(intHandle));
1114

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

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

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

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

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

    
1140
                        val = DwgUtil.getHandle(intData, bitPos);
1141
                        bitPos = ((Integer)val.get(0)).intValue();
1142
                        intHandle = DwgUtil.handleToInt(val);
1143
                        dwgFile.setHeader("APPID_CONTROL_OBJECT", new Integer(intHandle));
1144
                        
1145
                        val = DwgUtil.getHandle(intData, bitPos);
1146
                        bitPos = ((Integer)val.get(0)).intValue();
1147
                        intHandle = DwgUtil.handleToInt(val);
1148
                        dwgFile.setHeader("DIMSTYLE_CONTROL_OBJECT", new Integer(intHandle));
1149

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

    
1533
        /**
1534
         * Reads all the object referenced in the object map section of the
1535
         * DWG file (using their object file obsets)
1536
         * */
1537
        protected void readDwgObjects() {
1538
                
1539
                /*
1540
                 * Se utiliza las clases de la secci?n CLASSES para asociar a cada
1541
                 * tipo de objeto DWG (representado por su nombre DXF) con el identificador de
1542
                 * la clase
1543
                 * 
1544
                 * TODO Eliminar
1545
                 * 
1546
                 * */
1547
                Map vmap = new HashMap();
1548
                List dwgClasses = dwgFile.getDwgClasses();
1549
                for (int i = 0; i <= dwgClasses.size(); i++){
1550
                        DwgClass dwgClass = (DwgClass) dwgClasses.get(i);
1551
                        vmap.put(new Integer(dwgClass.getClassNum()), dwgClass.getDxfName());
1552
                        logger.info("Mapeando tipo "+dwgClass.getClassNum()+" con "+dwgClass.getDxfName());
1553
                }
1554
                
1555

    
1556
                for (int i=0; i<dwgFile.getDwgObjectOffsets().size(); i++) {
1557
                        DwgObjectOffset doo = (DwgObjectOffset)dwgFile.getDwgObjectOffsets().get(i);
1558
                        DwgObject obj = readDwgObject(doo.getOffset(), i);
1559
                        /*
1560
                        azabala: las entidades DWG no implementadas no nos aportan nada
1561
                        (aunque la sigo leyendo por si aparecen problemas de puntero de fichero)
1562
                        No considero por tanto los DwgObject
1563
                        if (obj != null) {
1564
                dwgFile.addDwgObject(obj);
1565
            }
1566
            */
1567
                        if(obj != null && obj.getClass() != DwgObject.class){
1568
                                dwgFile.addDwgObject(obj);
1569
                        }
1570
                }//for
1571
        }
1572
        
1573
        /**
1574
         * Return a dwg object from its index in the dwg file
1575
         * @param index of the requested dwg object in the dwg file
1576
         * 
1577
         * */
1578
        public DwgObject getDwgObjectByIndex(int index){
1579
                DwgObjectOffset doo = (DwgObjectOffset)dwgFile.getDwgObjectOffsets().get(index);
1580
                return readDwgObject(doo.getOffset(), index);
1581
        }
1582
        
1583

    
1584
        /**
1585
         * Reads a dwg drawing entity (dwg object) given its offset in the file
1586
         * 
1587
         * @param offset offset of the dwg object in the file
1588
         * @param index order of the entity in the objects map (1, 2, etc.)
1589
         * */
1590

    
1591
        
1592
        protected DwgObject readDwgObject(int offset, int index) {
1593
                try {
1594
                        bb.position(offset);
1595
                        int size = DwgUtil.getModularShort(bb);
1596
                        bb.order(ByteOrder.nativeOrder());
1597
                        //LITTLE ENDIAN es intel, mientras que el codigo Python hace
1598
                        //una lectura con bytes de la maquina (en un equipo no intel 
1599
                        //puede que no funcione
1600
//                        TODO bb.order(ByteOrder.LITTLE_ENDIAN);
1601
                        
1602
                        byte[] data = new byte[size];
1603
                        
1604
                        /*
1605
                         * TODO Ver si funciona lo mio (mas simple?)
1606
                        String[] dataMachValString = new String[size];
1607
                        int[] data = new int[size];
1608
                        for (int i=0; i < size; i++) {
1609
                                dataBytes[i] = bb.get();
1610
                                dataMachValString[i] = HexUtil.bytesToHex(new byte[]{dataBytes[i]});
1611
                                Integer dataMachValShort = Integer.decode("0x" + dataMachValString[i]);
1612
                                data[i] = dataMachValShort.byteValue();
1613
                                data[i] = ByteUtils.getUnsigned((byte)data[i]);
1614
                        }
1615
                        */
1616
                        bb.get(data);
1617
                        int[] intData = DwgUtil.toIntArray(data);
1618
                        
1619
                
1620
                        int bitPos = 0;
1621
                        List val = DwgUtil.getBitShort(intData, bitPos);
1622
                        bitPos = ((Integer)val.get(0)).intValue();
1623
                        int type = ((Integer)val.get(1)).intValue();
1624
                        
1625
                        DwgObject obj = DwgObjectFactory.
1626
                                                                getInstance().
1627
                                                                create(type, index);
1628
                   //TODO Hasta aqu? igual que el DWG 15
1629
                        
1630
                        
1631
//Esto no se lee en el 14, s? en el 15 (ver como se puede
1632
//meter herencia en esto
1633
                        
1634
//                    v = DwgUtil.getRawLong(data, bitPos);
1635
//                    bitPos = ((Integer)v.get(0)).intValue();
1636
//                    int objBSize = ((Integer)v.get(1)).intValue();
1637
//                    obj.setSizeInBits(objBSize);
1638
                    
1639
                        
1640
/*          TODO Ver si funciona mi metodo (mas simple)
1641
                    ArrayList entityHandle = new ArrayList();
1642
                    v = DwgUtil.getHandle(data, bitPos);
1643
                    bitPos = ((Integer)v.get(0)).intValue();
1644
                    for (int i=1;i<v.size();i++) {
1645
                            entityHandle.add(v.get(i));
1646
                    }
1647
                    obj.setHandle(DwgUtil.
1648
                                    handleBinToHandleInt(entityHandle));
1649
        */
1650
                        DwgHandleReference hr = new DwgHandleReference();
1651
                        bitPos = hr.read(intData, bitPos);
1652
                        obj.setHandle(hr);
1653
                        
1654
//TODO Si funciona, mover el metodo de esta clase a DwgUtil 
1655
                    val = readExtendedData(intData, bitPos);
1656
                    bitPos = ((Integer)val.get(0)).intValue();
1657
                    List extData = (List)val.get(1);
1658
                    obj.setExtendedData(extData);
1659
                    
1660
                    //Graphics data 
1661
                    boolean gflag = false;
1662
                    gflag = obj.isGraphicsFlag();           
1663
                    if (gflag) {
1664
                            val = DwgUtil.testBit(intData, bitPos);
1665
                            bitPos = ((Integer)val.get(0)).intValue();
1666
                            boolean hasGraphicsData = ((Boolean)val.get(1)).booleanValue();
1667
                           //si hay imagen asociada, se lee por completo
1668
                            if (hasGraphicsData) {
1669
                                    val = DwgUtil.getRawLong(intData, bitPos);
1670
                                    bitPos = ((Integer)val.get(0)).intValue();
1671
                                    size = ((Integer)val.get(1)).intValue();
1672
                                    int bgSize = size * 8;
1673
                                        Integer giData = (Integer)DwgUtil.getBits(intData, bgSize, bitPos);
1674
                                        obj.setGraphicData(giData.intValue());
1675
                                        bitPos = bitPos + bgSize;
1676
                            }
1677
                    }//if gflag
1678
                    
1679
                    
1680
                    //size in bits
1681
                    val = DwgUtil.getRawLong(intData, bitPos);
1682
                    bitPos = ((Integer)val.get(0)).intValue();
1683
                    int sizeInBits = ((Integer)val.get(1)).intValue();
1684
                    obj.setSizeInBits(sizeInBits);
1685
                    
1686
                    if(obj.getClass() != DwgObject.class){
1687
                            //El objeto ha sido reconocido
1688
                            readSpecificObject(obj, intData, bitPos);
1689
                    }else{
1690
                            if(type > 500){
1691
                                    /*
1692
                                     * Pag 46 de la spec: restamos 500 al tipo y nos da un ?ndice
1693
                                     * a la tabla de clases (CLASSES section)
1694
                                     * 
1695
                                     * Filtro aquellos que sean mayores de 500 porque todav?a
1696
                                     * nos quedan por implementar muchas entidades DWG (para no confundirlas)
1697
                                     * 
1698
                                     * */
1699
                                    int newIndex = type - 500;
1700
                                    if(newIndex < (dwgFile.getDwgClasses().size() - 1)){
1701
                                            DwgClass dwgClass = (DwgClass) dwgFile.getDwgClasses().get(index);
1702
                                            String dxfEntityName = dwgClass.getDxfName();
1703
                                            /*
1704
                                             * A partir del nombre de la entidad, la instanciamos
1705
                                             * y construimos un READER para ella.
1706
                                             * 
1707
                                             * Hay que a?adir un nuevo metodo para la factoria de DWG
1708
                                             * para que reciba un nombre de entidad DXF
1709
                                             * */
1710
                                    }
1711
                            }//if type 500
1712
                            else{
1713
                                    //Resulta que algunos tipos, sin ser mayor que 500, si que
1714
                                    //se hacen coincidir con entradas en la object class.
1715
                                    /*
1716
                                     * Foro de OpenDesign:
1717
                                     * 
1718
                                     * Starting with A2k, some of the entity types that used to be 
1719
                                     * proxies have been given fixed type values. &nbsp;These are:
1720
                                                     OLE2FRAME - 74
1721
                                                     LWPOLYLINE - 77
1722
                                                     HATCH - 78
1723
                                     * */        
1724
                            }
1725
                    }//if DwgObject.class        
1726
                                                   
1727
                    return obj;
1728
                    
1729
            } catch (Exception e) {
1730
//                logger.warn("Exception capturada. Probablemente se ha encontrado un" +
1731
//                                "objeto con type non fixed");
1732
                //e.printStackTrace();
1733
                return null;
1734
            }
1735
        }
1736
        
1737
        
1738
        /*
1739
         * TODO Esto est? pesimamente dise?ado.
1740
         * Cada objeto DwgObject debe tener un metodo
1741
         * readSpecificObject(data,bitPos)
1742
         * 
1743
         * */
1744
        protected void readSpecificObject(DwgObject obj, int[] data, int bitPos) throws Exception {
1745
                /*
1746
                if (obj.getType()==0x11) {
1747
                        ((DwgArc)obj).readDwgArcV15(data, bitPos);
1748
                } else if (obj.getType()==0x12) {
1749
                        ((DwgCircle)obj).readDwgCircleV15(data, bitPos);
1750
                } else if (obj.getType()==0x13) {
1751
                        ((DwgLine)obj).readDwgLineV15(data, bitPos);
1752
                } else if (obj.getType()==0x1B) {
1753
                        ((DwgPoint)obj).readDwgPointV15(data, bitPos);
1754
                } else if (obj.getType()==0x0F) {
1755
                        ((DwgPolyline2D)obj).readDwgPolyline2DV15(data, bitPos);
1756
                } else if (obj.getType()==0x10) {
1757
                        ((DwgPolyline3D)obj).readDwgPolyline3DV15(data, bitPos);
1758
                } else if (obj.getType()==0x0A) {
1759
                        ((DwgVertex2D)obj).readDwgVertex2DV15(data, bitPos);
1760
                } else if (obj.getType()==0x0B) {
1761
                        ((DwgVertex3D)obj).readDwgVertex3DV15(data, bitPos);
1762
                } else if (obj.getType()==0x6) {
1763
                        ((DwgSeqend)obj).readDwgSeqendV15(data, bitPos);
1764
                } else if (obj.getType()==0x1) {
1765
                        ((DwgText)obj).readDwgTextV15(data, bitPos);
1766
                } else if (obj.getType()==0x2) {
1767
                        ((DwgAttrib)obj).readDwgAttribV15(data, bitPos);
1768
                } else if (obj.getType()==0x3) {
1769
                        ((DwgAttdef)obj).readDwgAttdefV15(data, bitPos);
1770
                } else if (obj.getType()==0x4) {
1771
                        ((DwgBlock)obj).readDwgBlockV15(data, bitPos);
1772
                } else if (obj.getType()==0x5) {
1773
                        ((DwgEndblk)obj).readDwgEndblkV15(data, bitPos);
1774
                } else if (obj.getType()==0x30) {
1775
                        ((DwgBlockControl)obj).readDwgBlockControlV15(data, bitPos);
1776
                } else if (obj.getType()==0x31) {
1777
                        ((DwgBlockHeader)obj).readDwgBlockHeaderV15(data, bitPos);
1778
                } else if (obj.getType()==0x32) {
1779
                        ((DwgLayerControl)obj).readDwgLayerControlV15(data, bitPos);
1780
                } else if (obj.getType()==0x33) {
1781
                        ((DwgLayer)obj).readDwgLayerV15(data, bitPos);
1782
                } else if (obj.getType()==0x7) {
1783
                        ((DwgInsert)obj).readDwgInsertV15(data, bitPos);
1784
                } else if (obj.getType()==0x2C) {
1785
                        ((DwgMText)obj).readDwgMTextV15(data, bitPos);
1786
                } else if (obj.getType()==0x1F) {
1787
                        ((DwgSolid)obj).readDwgSolidV15(data, bitPos);
1788
                } else if (obj.getType()==0x23) {
1789
                        ((DwgEllipse)obj).readDwgEllipseV15(data, bitPos);
1790
                } else if (obj.getType()==0x24) {
1791
                        ((DwgSpline)obj).readDwgSplineV15(data, bitPos);
1792
                } else if (obj.getType()==0x14) {
1793
                        //logger.warn("... detectado un dim del tipo 0x14 ...");
1794
                } else if (obj.getType()==0x15) {
1795
                        //logger.warn("... detectado un dim del tipo 0x15 ...");
1796
                        //((DwgLinearDimension)obj).readDwgLinearDimensionV15(data, bitPos);
1797
                } else if (obj.getType()==0x16) {
1798
                        //logger.warn("... detectado un dim del tipo 0x16 ...");
1799
                } else if (obj.getType()==0x17) {
1800
                        //logger.warn("... detectado un dim del tipo 0x17 ...");
1801
                } else if (obj.getType()==0x18) {
1802
                        //logger.warn("... detectado un dim del tipo 0x18 ...");
1803
                } else if (obj.getType()==0x19) {
1804
                        //logger.warn("... detectado un dim del tipo 0x19 ...");
1805
                } else if (obj.getType()==0x1A) {
1806
                        //logger.warn("... detectado un dim del tipo 0x1A ...");
1807
                } else if (obj.getType()==0x4D) {
1808
                        ((DwgLwPolyline)obj).readDwgLwPolylineV15(data, bitPos);
1809
                } else if (obj.getType()==0x4E) {
1810
                        ((DwgLwPolyline)obj).readDwgLwPolylineV15(data, bitPos);
1811
                } else if (obj.getType()==0x4F) {
1812
                        ((DwgLwPolyline)obj).readDwgLwPolylineV15(data, bitPos);
1813
                } else if (obj.getType()==0x50) {
1814
                        ((DwgLwPolyline)obj).readDwgLwPolylineV15(data, bitPos);
1815
                } else if (obj.getType()==0x51) {
1816
                        ((DwgLwPolyline)obj).readDwgLwPolylineV15(data, bitPos);
1817
                } else if (obj.getType()==0x52) {
1818
                        ((DwgLwPolyline)obj).readDwgLwPolylineV15(data, bitPos);
1819
                } else if (obj.getType()==0x53) {
1820
                        ((DwgLwPolyline)obj).readDwgLwPolylineV15(data, bitPos);
1821
                } else {
1822
                        //logger.warn("Tipo de objeto pendiente de implementaci?n");
1823
                }
1824
                */
1825
        }
1826
        /*
1827
         * TODO 
1828
         * En DwgUtil se dice que este metodo tiene graves errores.
1829
         * Intento de reimplementarlo a partir del codigo Python original
1830
         * 
1831
         * 
1832
        _eexdata = []
1833
        while True:
1834
            _bitpos, _exsize = dwgutil.get_bit_short(_data, _bitpos)
1835
            # print "extended data size: %d" % _exsize
1836
            if _exsize == 0:
1837
                break
1838
            # print "bitpos: %d" % _bitpos
1839
            
1840
            _bitpos, _handle = dwgutil.get_handle(_data, _bitpos)
1841
            # print "eed handle: " + str(_handle)
1842
            _count = 0
1843
            _eedata = []
1844
            
1845
            while (_count < _exsize):
1846
                # print "count: %d" % _count
1847
                _bitpos, _cb = dwgutil.get_raw_char(_data, _bitpos)
1848
                # print "code byte: %#x" % _cb
1849
                _count = _count + 1
1850
                if _cb == 0x0:
1851
                    _bitpos, _slen = dwgutil.get_raw_char(_data, _bitpos)
1852
                    _bitpos, _cp = dwgutil.get_raw_short(_data, _bitpos)
1853
                    # print "code page: %d" % _cp
1854
                    _chars = []
1855
                    for _i in range(_slen):
1856
                        _bitpos, _char = dwgutil.get_raw_char(_data, _bitpos)
1857
                        _chars.append(chr(_char))
1858
                    _string = "".join(_chars)
1859
                    _eedata.append(_string)
1860
                    _count = _count + 3 + _slen
1861
                elif _cb == 0x1:
1862
                    raise ValueError, "Invalid EEX code byte: 0x1"
1863
                elif _cb == 0x2:
1864
                    _bitpos, _char = dwgutil.get_raw_char(_data, _bitpos)
1865
                    if _char == 0x0:
1866
                        _eedata.append("{")
1867
                    elif _char == 0x1:
1868
                        _eedata.append("}")
1869
                    else:
1870
                        raise ValueError, "Unexpected EEX char: %#02x" % _char
1871
                    _count = _count + 1
1872
                elif _cb == 0x3:
1873
                    # print "layer table reference"
1874
                    _chars = []
1875
                    for _i in range(8):
1876
                        _bitpos, _char = dwgutil.get_raw_char(_data, _bitpos)
1877
                        _chars.append(_char)
1878
                    _eedata.append(_chars)
1879
                    _count = _count + 8
1880
                elif _cb == 0x4:
1881
                    # print "binary chunk"
1882
                    _bitpos, _len = dwgutil.get_raw_char(_data, _bitpos)
1883
                    _chars = []
1884
                    for _i in range(_len):
1885
                        _bitpos, _char = dwgutil.get_raw_char(_data, _bitpos)
1886
                        _chars.append(_char)
1887
                    _eedata.append(_chars)
1888
                    _count = _count + 1 + _len
1889
                elif _cb == 0x5:
1890
                    # print "entity handle reference"
1891
                    _chars = []
1892
                    for _i in range(8):
1893
                        _bitpos, _char = dwgutil.get_raw_char(_data, _bitpos)
1894
                        _chars.append(_char)
1895
                    _eedata.append(_chars)
1896
                    _count = _count + 8
1897
                elif (0xa <= _cb <= 0xd):
1898
                    # print "three doubles"
1899
                    _bitpos, _d1 = dwgutil.get_raw_double(_data, _bitpos)
1900
                    _bitpos, _d2 = dwgutil.get_raw_double(_data, _bitpos)
1901
                    _bitpos, _d3 = dwgutil.get_raw_double(_data, _bitpos)
1902
                    _eedata.append((_d1, _d2, _d3))
1903
                    _count = _count + 24
1904
                elif (0x28 <= _cb <= 0x2a):
1905
                    # print "one double"
1906
                    _bitpos, _d = dwgutil.get_raw_double(_data, _bitpos)
1907
                    _eedata.append(_d)
1908
                    _count = _count + 8
1909
                elif _cb == 0x46:
1910
                    # print "short int"
1911
                    _bitpos, _short = dwgutil.get_raw_short(_data, _bitpos)
1912
                    _eedata.append(_short)
1913
                    _count = _count + 2
1914
                elif _cb == 0x47:
1915
                    # print "long int"
1916
                    _bitpos, _long = dwgutil.get_raw_long(_data, _bitpos)
1917
                    _eedata.append(_long)
1918
                    print "long: %d" % _long
1919
                    _count = _count + 4
1920
                else:
1921
                    raise ValueError, "Unexpected code byte: %#02x" % _cb
1922
         * 
1923
         * 
1924
         * */
1925
        List readExtendedData(int[] data, int bitPos) throws Exception {
1926
                List solution = new ArrayList();
1927
                //TODO Ver si el array est? bien, o hay que cambiarlo por un stringbuffer
1928
                List extendedData = new ArrayList();
1929
                int size;
1930
                List val;
1931
                while(true){//TODO VER SI HAY PROBLEMAS DE NO SALIDA
1932
                        
1933
                        val = DwgUtil.getBitShort(data, bitPos);
1934
                        bitPos = ((Integer) val.get(0)).intValue();
1935
                        size = ((Integer) val.get(1)).intValue();
1936
                        if(size == 0)
1937
                                break;
1938
                        
1939
                        DwgHandleReference hr = new DwgHandleReference();
1940
                        bitPos = hr.read(data, bitPos);
1941
                        logger.debug("Handle del EXTENDED ENTITY DATA:"+hr.getCode()+" "+hr.getOffset());
1942

    
1943
                        int count = 0;
1944
                        while(count < size){
1945
                                val = DwgUtil.getRawChar(data, bitPos);
1946
                                bitPos = ((Integer) val.get(0)).intValue();
1947
                                int codeByte = ((Integer) val.get(1)).intValue();
1948
                                count++;
1949
                                if(codeByte == 0x0){
1950
                                        val = DwgUtil.getRawChar(data, bitPos);
1951
                                        bitPos = ((Integer) val.get(0)).intValue();
1952
                                        int slen = ((Integer) val.get(1)).intValue();
1953
                                        val = DwgUtil.getRawShort(data, bitPos);
1954
                                        bitPos = ((Integer) val.get(0)).intValue();
1955
                                        int codePage = ((Integer) val.get(1)).intValue();
1956
                                        logger.debug("Extended Data (0x0): code page = " + codePage);
1957
                                        char[] chars = new char[slen];
1958
                                        for(int i = 0; i < slen; i++){
1959
                                                val = DwgUtil.getRawChar(data, bitPos);
1960
                                                bitPos = ((Integer) val.get(0)).intValue();
1961
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
1962
                                        }//for
1963
                                        String str = new String(chars);
1964
                                        logger.debug("Chars:"+str);
1965
                                        extendedData.add(str);
1966
                                        count += (3 + slen);
1967
                                }else if(codeByte == 0x1){
1968
                                                logger.debug("Invalid extended data code byte: 0x1");
1969
                                }else if(codeByte == 0x2){
1970
                                        val = DwgUtil.getRawChar(data, bitPos);
1971
                                        bitPos = ((Integer) val.get(0)).intValue();
1972
                                        int character = ((Integer)val.get(1)).intValue();
1973
                                        if(character == 0x0)
1974
                                                extendedData.add("{");
1975
                                        else if(character == 0x1)
1976
                                                extendedData.add("}");
1977
                                        else{
1978
                                                logger.warn("Invalid extended data char:"+character);
1979
                                        }
1980
                                        count++;  
1981
                                } else if(codeByte == 0x3){
1982
                                        char[] chars = new char[8];
1983
                                        for(int i = 0; i < 8; i++){
1984
                                                val = DwgUtil.getRawChar(data, bitPos);
1985
                                                bitPos = ((Integer) val.get(0)).intValue();
1986
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
1987
                                        }
1988
                                        String str = new String(chars);
1989
                                        logger.debug("Chars:"+str);
1990
                                        extendedData.add(str);
1991
                                        count += 8;
1992
                                }else if(codeByte == 0x4){
1993
                                        //binary chunk in extended data
1994
                                        val = DwgUtil.getRawChar(data, bitPos);
1995
                                        bitPos = ((Integer) val.get(0)).intValue();
1996
                                        int length = ((Integer) val.get(1)).intValue();
1997
                                        char[] chars = new char[length];
1998
                                        for(int i = 0; i < length; i++){
1999
                                                val = DwgUtil.getRawChar(data, bitPos);
2000
                                                bitPos = ((Integer) val.get(0)).intValue();
2001
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
2002
                                        }
2003
                                        String str = new String(chars);
2004
                                        logger.debug("Chars:"+str);
2005
                                        extendedData.add(str);
2006
                                        count += (1 + length);
2007
                                }else if(codeByte == 0x5){
2008
                                        //entity handle reference
2009
                                        char[] chars = new char[8];
2010
                                        for(int i = 0; i < 8; i++){
2011
                                                val = DwgUtil.getRawChar(data, bitPos);
2012
                                                bitPos = ((Integer) val.get(0)).intValue();
2013
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
2014
                                        }
2015
                                        String str = new String(chars);
2016
                                        logger.debug("Chars:"+str);
2017
                                        extendedData.add(str);
2018
                                        count += 8;
2019
                                }else if( (codeByte >= 0xa) && (codeByte <= 0xd)){
2020
                                        //three doubles
2021
                                        double[] dValues = new double[3];  
2022
                                        val = DwgUtil.getRawDouble(data, bitPos);
2023
                                        bitPos = ((Integer) val.get(0)).intValue();
2024
                                        dValues[0] =  ((Double) val.get(1)).doubleValue();
2025
                                        
2026
                                        val = DwgUtil.getRawDouble(data, bitPos);
2027
                                        bitPos = ((Integer) val.get(0)).intValue();
2028
                                        dValues[1] =  ((Double) val.get(1)).doubleValue();
2029
                                        
2030
                                        val = DwgUtil.getRawDouble(data, bitPos);
2031
                                        bitPos = ((Integer) val.get(0)).intValue();
2032
                                        dValues[2] =  ((Double) val.get(1)).doubleValue();
2033
                                        
2034
                                        logger.debug("Doubles:"+dValues);
2035
                                        extendedData.add(dValues);
2036
                                        count += 24;
2037
                                }else if( (codeByte >= 0x28) && (codeByte <= 0x2a)){
2038
                                        //one double
2039
                                        val = DwgUtil.getRawDouble(data, bitPos);
2040
                                        bitPos = ((Integer) val.get(0)).intValue();
2041
                                        double value =  ((Double) val.get(1)).doubleValue();
2042
                                        logger.debug("Double value:"+ value);
2043
                                        extendedData.add(val.get(1));
2044
                                        count += 8;
2045
                                }else if(codeByte == 0x46){
2046
                                        //a short value
2047
                                        val = DwgUtil.getRawShort(data, bitPos);
2048
                                        bitPos = ((Integer) val.get(0)).intValue();
2049
                                        int value = ((Integer) val.get(1)).intValue();
2050
                                        logger.debug("Short value:"+value);
2051
                                        extendedData.add(val.get(1));
2052
                                        count += 2;
2053
                                }else if(codeByte == 0x47){
2054
                                        //int value
2055
                                        val = DwgUtil.getRawLong(data, bitPos);
2056
                                        bitPos = ((Integer) val.get(0)).intValue();
2057
                                        int value = ((Integer) val.get(1)).intValue();
2058
                                        logger.debug("Int value:"+value);
2059
                                        extendedData.add(val.get(1));
2060
                                        count += 4;
2061
                                }else{
2062
                                        logger.debug("Unexpected code byte in EXTENDED DATA "+codeByte);
2063
                                }
2064
                        }//while
2065
                }//while
2066
                solution.add(new Integer(bitPos));
2067
                solution.add(extendedData);
2068
                return solution;
2069
        }
2070

    
2071
        /* (non-Javadoc)
2072
         * @see com.iver.cit.jdwglib.dwg.readers.IDwgFileReader#readObjectHeader(int[], int, com.iver.cit.jdwglib.dwg.DwgObject)
2073
         */
2074
        public int readObjectHeader(int[] data, int offset, DwgObject dwgObject) {
2075
                int bitPos = offset;
2076
                Integer mode = (Integer)DwgUtil.getBits(data, 2, bitPos);
2077
            bitPos += 2;
2078
            dwgObject.setMode(mode.intValue());
2079
            
2080
            List val = DwgUtil.getBitLong(data, bitPos);
2081
            bitPos = ((Integer)val.get(0)).intValue();
2082
            int rnum = ((Integer)val.get(1)).intValue();
2083
            dwgObject.setNumReactors(rnum);
2084
            //TODO hasta aqui igual que en Dwg 15
2085
            
2086
            val = DwgUtil.testBit(data, bitPos);
2087
            bitPos = ((Integer)val.get(0)).intValue();
2088
            boolean isLyrByLineType = ((Boolean)val.get(1)).booleanValue();
2089
            //TODO En la 15 es un flag, no un boolean. REVISAR
2090
            dwgObject.setLyrByLineType(isLyrByLineType);
2091
            
2092
            val = DwgUtil.testBit(data, bitPos);
2093
            bitPos = ((Integer)val.get(0)).intValue();
2094
            boolean noLinks = ((Boolean)val.get(1)).booleanValue();
2095
            dwgObject.setNoLinks(noLinks);
2096
            
2097
            val = DwgUtil.getBitShort(data, bitPos);
2098
            bitPos = ((Integer)val.get(0)).intValue();
2099
            int color = ((Integer)val.get(1)).intValue();
2100
            dwgObject.setColor(color);
2101
            
2102
            val = DwgUtil.getBitDouble(data, bitPos);
2103
            bitPos = ((Integer)val.get(0)).intValue();
2104
            float ltscale = ((Double)val.get(1)).floatValue();
2105
            //TODO tampoco se setea en la 15 (en su lugar, un flag de ints)
2106
            val = DwgUtil.getBitShort(data, bitPos);
2107
            bitPos = ((Integer)val.get(0)).intValue();
2108
            int invis = ((Integer)val.get(1)).intValue();
2109
            
2110
                return bitPos;        
2111
        }
2112

    
2113
        /* 
2114
         * 
2115
         * (non-Javadoc)
2116
         * @see com.iver.cit.jdwglib.dwg.readers.IDwgFileReader#readObjectTailer(int[], int, com.iver.cit.jdwglib.dwg.DwgObject)
2117
         */
2118
        public int readObjectTailer(int[] data, int offset, DwgObject dwgObject) throws RuntimeException, CorruptedDwgEntityException {
2119
                int bitPos = offset;
2120
                List val = null;
2121
                
2122
                /*
2123
                 * Subentity ref handle.
2124
                 * Esto se aplica sobre VERTEX, ATTRIB, SEQEND
2125
                 * */
2126
                if (dwgObject.getMode()==0x0) {
2127
                    DwgHandleReference subEntityHandle = new DwgHandleReference();
2128
                    bitPos = subEntityHandle.read(data, bitPos);
2129
                    dwgObject.setSubEntityHandle(subEntityHandle);
2130
                }
2131
                
2132
                /*
2133
                 * Reactors handles
2134
                 * DwgObject
2135
                 */
2136
                DwgHandleReference reactorHandle;
2137
                for (int i = 0; i < dwgObject.getNumReactors(); i++) {
2138
                        reactorHandle = new DwgHandleReference();
2139
                        bitPos = reactorHandle.read(data, bitPos);
2140
                        dwgObject.addReactorHandle(reactorHandle);
2141
                }
2142
                
2143
                /*
2144
                 * XDICOBJHANDLE
2145
                 */
2146
                DwgHandleReference xDicObjHandle = new DwgHandleReference();
2147
                bitPos = xDicObjHandle.read(data, bitPos);
2148
                dwgObject.setXDicObjHandle(xDicObjHandle);
2149

    
2150
                //          TODO Hasta aqui igual que en la 15
2151

    
2152
                /*
2153
                 * Layer Handle code
2154
                 */
2155
                
2156
                DwgHandleReference layerHandle = new DwgHandleReference();
2157
                bitPos = layerHandle.read(data, bitPos);
2158
                dwgObject.setLayerHandle(layerHandle);
2159

    
2160
                if(! dwgObject.isLyrByLineType()){
2161
                        DwgHandleReference lineTypeHandle = new DwgHandleReference();
2162
                        bitPos = lineTypeHandle.read(data, bitPos);
2163
                        dwgObject.setLineTypeHandle(lineTypeHandle);
2164
                }
2165
                String cadena = "";
2166
                if(! dwgObject.isNoLinks()){
2167

    
2168
                        /*
2169
                         * Previous Handle 
2170
                         */
2171
                        DwgHandleReference previousHandle = new DwgHandleReference();
2172
                        bitPos = previousHandle.read(data, bitPos);
2173
                        dwgObject.setPreviousHandle(previousHandle);
2174

    
2175
                        /*
2176
                         * Next Handle 
2177
                         */
2178
                        DwgHandleReference nextHandle = new DwgHandleReference();
2179
                        bitPos = nextHandle.read(data, bitPos);
2180
                        dwgObject.setNextHandle(nextHandle);
2181
                }
2182
                return bitPos;
2183
        }
2184
        
2185
}