Statistics
| Revision:

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

History | View | Annotate | Download (76.8 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.DwgClass;
49
import com.iver.cit.jdwglib.dwg.DwgFile;
50
import com.iver.cit.jdwglib.dwg.DwgObject;
51
import com.iver.cit.jdwglib.dwg.DwgObjectFactory;
52
import com.iver.cit.jdwglib.dwg.DwgObjectOffset;
53
import com.iver.cit.jdwglib.dwg.DwgUtil;
54
import com.iver.cit.jdwglib.dwg.objects.DwgArc;
55
import com.iver.cit.jdwglib.dwg.objects.DwgAttdef;
56
import com.iver.cit.jdwglib.dwg.objects.DwgAttrib;
57
import com.iver.cit.jdwglib.dwg.objects.DwgBlock;
58
import com.iver.cit.jdwglib.dwg.objects.DwgBlockControl;
59
import com.iver.cit.jdwglib.dwg.objects.DwgBlockHeader;
60
import com.iver.cit.jdwglib.dwg.objects.DwgCircle;
61
import com.iver.cit.jdwglib.dwg.objects.DwgEllipse;
62
import com.iver.cit.jdwglib.dwg.objects.DwgEndblk;
63
import com.iver.cit.jdwglib.dwg.objects.DwgInsert;
64
import com.iver.cit.jdwglib.dwg.objects.DwgLayer;
65
import com.iver.cit.jdwglib.dwg.objects.DwgLayerControl;
66
import com.iver.cit.jdwglib.dwg.objects.DwgLine;
67
import com.iver.cit.jdwglib.dwg.objects.DwgLwPolyline;
68
import com.iver.cit.jdwglib.dwg.objects.DwgMText;
69
import com.iver.cit.jdwglib.dwg.objects.DwgPoint;
70
import com.iver.cit.jdwglib.dwg.objects.DwgPolyline2D;
71
import com.iver.cit.jdwglib.dwg.objects.DwgPolyline3D;
72
import com.iver.cit.jdwglib.dwg.objects.DwgSeqend;
73
import com.iver.cit.jdwglib.dwg.objects.DwgSolid;
74
import com.iver.cit.jdwglib.dwg.objects.DwgSpline;
75
import com.iver.cit.jdwglib.dwg.objects.DwgText;
76
import com.iver.cit.jdwglib.dwg.objects.DwgVertex2D;
77
import com.iver.cit.jdwglib.dwg.objects.DwgVertex3D;
78

    
79
import freenet.support.HexUtil;
80

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

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

    
247
                        val = DwgUtil.getBitDouble(intData, bitPos);
248
                        bitPos = ((Integer)val.get(0)).intValue();
249
                        dwgFile.setHeader("VAL2", val.get(1));
250
                        
251
                        val = DwgUtil.getBitDouble(intData, bitPos);
252
                        bitPos = ((Integer)val.get(0)).intValue();
253
                        dwgFile.setHeader("VAL3", val.get(1));
254
                        
255
                        val = DwgUtil.getBitDouble(intData, bitPos);
256
                        bitPos = ((Integer)val.get(0)).intValue();
257
                        dwgFile.setHeader("VAL4", val.get(1));
258
                        
259
                        val = DwgUtil.getTextString(intData, bitPos);
260
                        bitPos = ((Integer)val.get(0)).intValue();
261
                        dwgFile.setHeader("STRING1", val.get(1));
262
                        
263
                        val = DwgUtil.getTextString(intData, bitPos);
264
                        bitPos = ((Integer)val.get(0)).intValue();
265
                        dwgFile.setHeader("STRING2", val.get(1));
266
                        
267
                        val = DwgUtil.getTextString(intData, bitPos);
268
                        bitPos = ((Integer)val.get(0)).intValue();
269
                        dwgFile.setHeader("STRING3", val.get(1));
270
                        
271
                        val = DwgUtil.getTextString(intData, bitPos);
272
                        bitPos = ((Integer)val.get(0)).intValue();
273
                        dwgFile.setHeader("STRING4", val.get(1));
274
                        
275
                        val = DwgUtil.getBitLong(intData, bitPos);
276
                        bitPos = ((Integer)val.get(0)).intValue();
277
                        dwgFile.setHeader("LONG1", val.get(1));
278
                        
279
                        val = DwgUtil.getBitLong(intData, bitPos);
280
                        bitPos = ((Integer)val.get(0)).intValue();
281
                        dwgFile.setHeader("LONG2", val.get(1));
282
                        
283
                        val = DwgUtil.getBitShort(intData, bitPos);
284
                        bitPos = ((Integer)val.get(0)).intValue();
285
                        dwgFile.setHeader("SHORT1", val.get(1));
286
                        
287
                        //TODO Los handle se leen asi??
288
                        val = DwgUtil.getHandle(intData, bitPos);
289
                        bitPos = ((Integer)val.get(0)).intValue();
290
                        dwgFile.setHeader("HANDLE1", val.get(1));
291
                        
292
                        val = DwgUtil.testBit(intData, bitPos);
293
                        bitPos = ((Integer)val.get(0)).intValue();
294
                        dwgFile.setHeader("DIMASO", val.get(1));
295
                        
296
                        val = DwgUtil.testBit(intData, bitPos);
297
                        bitPos = ((Integer)val.get(0)).intValue();
298
                        dwgFile.setHeader("DIMSHO", val.get(1));
299
                        
300
                        val = DwgUtil.testBit(intData, bitPos);
301
                        bitPos = ((Integer)val.get(0)).intValue();
302
                        dwgFile.setHeader("DIMSAV", val.get(1));
303
                        
304
                        val = DwgUtil.testBit(intData, bitPos);
305
                        bitPos = ((Integer)val.get(0)).intValue();
306
                        dwgFile.setHeader("PLINEGEN", val.get(1));
307
                        
308
                        val = DwgUtil.testBit(intData, bitPos);
309
                        bitPos = ((Integer)val.get(0)).intValue();
310
                        dwgFile.setHeader("ORTHOMODE", val.get(1));
311
                        
312
                        val = DwgUtil.testBit(intData, bitPos);
313
                        bitPos = ((Integer)val.get(0)).intValue();
314
                        dwgFile.setHeader("REGENMODE", val.get(1));
315
                        
316
                        val = DwgUtil.testBit(intData, bitPos);
317
                        bitPos = ((Integer)val.get(0)).intValue();
318
                        dwgFile.setHeader("FILLMODE", val.get(1));
319
                        
320
                        val = DwgUtil.testBit(intData, bitPos);
321
                        bitPos = ((Integer)val.get(0)).intValue();
322
                        dwgFile.setHeader("QTEXTMODE", val.get(1));
323
                        
324
                        val = DwgUtil.testBit(intData, bitPos);
325
                        bitPos = ((Integer)val.get(0)).intValue();
326
                        dwgFile.setHeader("PSLTSCALE", val.get(1));
327
                        
328
                        val = DwgUtil.testBit(intData, bitPos);
329
                        bitPos = ((Integer)val.get(0)).intValue();
330
                        dwgFile.setHeader("LIMCHECK", val.get(1));
331
                        
332
                        val = DwgUtil.testBit(intData, bitPos);
333
                        bitPos = ((Integer)val.get(0)).intValue();
334
                        dwgFile.setHeader("BLIPMODE", val.get(1));
335
                        
336
                        val = DwgUtil.testBit(intData, bitPos);
337
                        bitPos = ((Integer)val.get(0)).intValue();
338
                        dwgFile.setHeader("USER_TIMER", val.get(1));
339
                        
340
                        val = DwgUtil.testBit(intData, bitPos);
341
                        bitPos = ((Integer)val.get(0)).intValue();
342
                        dwgFile.setHeader("SKPOLY", val.get(1));
343
                        
344
                        val = DwgUtil.testBit(intData, bitPos);
345
                        bitPos = ((Integer)val.get(0)).intValue();
346
                        dwgFile.setHeader("ANGDIR", val.get(1));
347
                        
348
                        val = DwgUtil.testBit(intData, bitPos);
349
                        bitPos = ((Integer)val.get(0)).intValue();
350
                        dwgFile.setHeader("SPLFRAME", val.get(1));
351
                        
352
                        val = DwgUtil.testBit(intData, bitPos);
353
                        bitPos = ((Integer)val.get(0)).intValue();
354
                        dwgFile.setHeader("ATTREQ", val.get(1));
355
                        
356
                        val = DwgUtil.testBit(intData, bitPos);
357
                        bitPos = ((Integer)val.get(0)).intValue();
358
                        dwgFile.setHeader("ATTDIA", val.get(1));
359
                        
360
                        val = DwgUtil.testBit(intData, bitPos);
361
                        bitPos = ((Integer)val.get(0)).intValue();
362
                        dwgFile.setHeader("MIRRTEXT", val.get(1));
363
                        
364
                        val = DwgUtil.testBit(intData, bitPos);
365
                        bitPos = ((Integer)val.get(0)).intValue();
366
                        dwgFile.setHeader("WORLDVIEW", val.get(1));
367
                        
368
                        val = DwgUtil.testBit(intData, bitPos);
369
                        bitPos = ((Integer)val.get(0)).intValue();
370
                        dwgFile.setHeader("WIREFRAME", val.get(1));
371
                        
372
                        val = DwgUtil.testBit(intData, bitPos);
373
                        bitPos = ((Integer)val.get(0)).intValue();
374
                        dwgFile.setHeader("TILEMODE", val.get(1));
375
                        
376
                        val = DwgUtil.testBit(intData, bitPos);
377
                        bitPos = ((Integer)val.get(0)).intValue();
378
                        dwgFile.setHeader("PLIMCHECK", val.get(1));
379
                        
380
                        val = DwgUtil.testBit(intData, bitPos);
381
                        bitPos = ((Integer)val.get(0)).intValue();
382
                        dwgFile.setHeader("VISRETAIN", val.get(1));
383
                        
384
                        val = DwgUtil.testBit(intData, bitPos);
385
                        bitPos = ((Integer)val.get(0)).intValue();
386
                        dwgFile.setHeader("DELOBJ", val.get(1));
387
                        
388
                        val = DwgUtil.testBit(intData, bitPos);
389
                        bitPos = ((Integer)val.get(0)).intValue();
390
                        dwgFile.setHeader("DISPSILH", val.get(1));
391
                        
392
                        val = DwgUtil.testBit(intData, bitPos);
393
                        bitPos = ((Integer)val.get(0)).intValue();
394
                        dwgFile.setHeader("PELLISE", val.get(1));
395
                        
396
                        val = DwgUtil.getBitShort(intData, bitPos);
397
                        bitPos = ((Integer)val.get(0)).intValue();
398
                        if(dwgFile.getDwgVersion() == "R14")
399
                                dwgFile.setHeader("PROXYGRAPH", val.get(1));
400
                        else
401
                                dwgFile.setHeader("SAVEIMAGES", val.get(1));
402
                        
403
                        val = DwgUtil.getBitShort(intData, bitPos);
404
                        bitPos = ((Integer)val.get(0)).intValue();
405
                        dwgFile.setHeader("DRAGMODE", val.get(1));
406
                        
407
                        val = DwgUtil.getBitShort(intData, bitPos);
408
                        bitPos = ((Integer)val.get(0)).intValue();
409
                        dwgFile.setHeader("TREEDEPTH", val.get(1));
410
                        
411
                        val = DwgUtil.getBitShort(intData, bitPos);
412
                        bitPos = ((Integer)val.get(0)).intValue();
413
                        dwgFile.setHeader("LUNITS", val.get(1));
414
                        
415
                        val = DwgUtil.getBitShort(intData, bitPos);
416
                        bitPos = ((Integer)val.get(0)).intValue();
417
                        dwgFile.setHeader("LUPREC", val.get(1));
418
                        
419
                        val = DwgUtil.getBitShort(intData, bitPos);
420
                        bitPos = ((Integer)val.get(0)).intValue();
421
                        dwgFile.setHeader("AUNITS", val.get(1));
422
                        
423
                        val = DwgUtil.getBitShort(intData, bitPos);
424
                        bitPos = ((Integer)val.get(0)).intValue();
425
                        dwgFile.setHeader("AUPREC", val.get(1));
426
                        
427
                        val = DwgUtil.getBitShort(intData, bitPos);
428
                        bitPos = ((Integer)val.get(0)).intValue();
429
                        dwgFile.setHeader("OSMODE", val.get(1));
430
                        
431
                        val = DwgUtil.getBitShort(intData, bitPos);
432
                        bitPos = ((Integer)val.get(0)).intValue();
433
                        dwgFile.setHeader("ATTMODE", val.get(1));
434
                        
435
                        val = DwgUtil.getBitShort(intData, bitPos);
436
                        bitPos = ((Integer)val.get(0)).intValue();
437
                        dwgFile.setHeader("COORDS", val.get(1));
438
                        
439
                        val = DwgUtil.getBitShort(intData, bitPos);
440
                        bitPos = ((Integer)val.get(0)).intValue();
441
                        dwgFile.setHeader("PDMODE", val.get(1));
442
                        
443
                        val = DwgUtil.getBitShort(intData, bitPos);
444
                        bitPos = ((Integer)val.get(0)).intValue();
445
                        dwgFile.setHeader("PICKSTYLE", val.get(1));
446
                        
447
                        val = DwgUtil.getBitShort(intData, bitPos);
448
                        bitPos = ((Integer)val.get(0)).intValue();
449
                        dwgFile.setHeader("USERI1", val.get(1));
450
                        
451
                        val = DwgUtil.getBitShort(intData, bitPos);
452
                        bitPos = ((Integer)val.get(0)).intValue();
453
                        dwgFile.setHeader("USERI2", val.get(1));
454
                        
455
                        val = DwgUtil.getBitShort(intData, bitPos);
456
                        bitPos = ((Integer)val.get(0)).intValue();
457
                        dwgFile.setHeader("USERI3", val.get(1));
458
                        
459
                        val = DwgUtil.getBitShort(intData, bitPos);
460
                        bitPos = ((Integer)val.get(0)).intValue();
461
                        dwgFile.setHeader("USERI4", val.get(1));
462
                        
463
                        val = DwgUtil.getBitShort(intData, bitPos);
464
                        bitPos = ((Integer)val.get(0)).intValue();
465
                        dwgFile.setHeader("USERI5", val.get(1));
466
                        
467
                        val = DwgUtil.getBitShort(intData, bitPos);
468
                        bitPos = ((Integer)val.get(0)).intValue();
469
                        dwgFile.setHeader("SPLINESEGS", val.get(1));
470
                        
471
                        val = DwgUtil.getBitShort(intData, bitPos);
472
                        bitPos = ((Integer)val.get(0)).intValue();
473
                        dwgFile.setHeader("SURFU", val.get(1));
474
                        
475
                        val = DwgUtil.getBitShort(intData, bitPos);
476
                        bitPos = ((Integer)val.get(0)).intValue();
477
                        dwgFile.setHeader("SURFV", val.get(1));
478
                        
479
                        val = DwgUtil.getBitShort(intData, bitPos);
480
                        bitPos = ((Integer)val.get(0)).intValue();
481
                        dwgFile.setHeader("SURFTYPE", val.get(1));
482
                        
483
                        val = DwgUtil.getBitShort(intData, bitPos);
484
                        bitPos = ((Integer)val.get(0)).intValue();
485
                        dwgFile.setHeader("SURFTAB1", val.get(1));
486
                        
487
                        val = DwgUtil.getBitShort(intData, bitPos);
488
                        bitPos = ((Integer)val.get(0)).intValue();
489
                        dwgFile.setHeader("SURFTAB2", val.get(1));
490
                        
491
                        val = DwgUtil.getBitShort(intData, bitPos);
492
                        bitPos = ((Integer)val.get(0)).intValue();
493
                        dwgFile.setHeader("SPLINETYPE", val.get(1));
494
                        
495
                        val = DwgUtil.getBitShort(intData, bitPos);
496
                        bitPos = ((Integer)val.get(0)).intValue();
497
                        dwgFile.setHeader("SHADEDGE", val.get(1));
498
                        
499
                        val = DwgUtil.getBitShort(intData, bitPos);
500
                        bitPos = ((Integer)val.get(0)).intValue();
501
                        dwgFile.setHeader("SHADEDIF", val.get(1));
502
                        
503
                        val = DwgUtil.getBitShort(intData, bitPos);
504
                        bitPos = ((Integer)val.get(0)).intValue();
505
                        dwgFile.setHeader("UNITMODE", val.get(1));
506
                        
507
                        val = DwgUtil.getBitShort(intData, bitPos);
508
                        bitPos = ((Integer)val.get(0)).intValue();
509
                        dwgFile.setHeader("MAXACTVP", val.get(1));
510
                        
511
                        val = DwgUtil.getBitShort(intData, bitPos);
512
                        bitPos = ((Integer)val.get(0)).intValue();
513
                        dwgFile.setHeader("ISOLINES", val.get(1));
514
                        
515
                        val = DwgUtil.getBitShort(intData, bitPos);
516
                        bitPos = ((Integer)val.get(0)).intValue();
517
                        dwgFile.setHeader("CMLJUST", val.get(1));
518
                        
519
                        val = DwgUtil.getBitShort(intData, bitPos);
520
                        bitPos = ((Integer)val.get(0)).intValue();
521
                        dwgFile.setHeader("TEXTQLTY", val.get(1));
522
                        
523
                        val = DwgUtil.getBitDouble(intData, bitPos);
524
                        bitPos = ((Integer)val.get(0)).intValue();
525
                        dwgFile.setHeader("LTSCALE", val.get(1));
526
                        
527
                        val = DwgUtil.getBitDouble(intData, bitPos);
528
                        bitPos = ((Integer)val.get(0)).intValue();
529
                        dwgFile.setHeader("TEXTSIZE", val.get(1));
530
                        
531
                        val = DwgUtil.getBitDouble(intData, bitPos);
532
                        bitPos = ((Integer)val.get(0)).intValue();
533
                        dwgFile.setHeader("TRACEWID", val.get(1));
534
                        
535
                        val = DwgUtil.getBitDouble(intData, bitPos);
536
                        bitPos = ((Integer)val.get(0)).intValue();
537
                        dwgFile.setHeader("SKETCHINC", val.get(1));
538
                        
539
                        val = DwgUtil.getBitDouble(intData, bitPos);
540
                        bitPos = ((Integer)val.get(0)).intValue();
541
                        dwgFile.setHeader("FILLETRAD", val.get(1));
542
                        
543
                        val = DwgUtil.getBitDouble(intData, bitPos);
544
                        bitPos = ((Integer)val.get(0)).intValue();
545
                        dwgFile.setHeader("THICKNESS", val.get(1));
546
                        
547
                        val = DwgUtil.getBitDouble(intData, bitPos);
548
                        bitPos = ((Integer)val.get(0)).intValue();
549
                        dwgFile.setHeader("ANGBASE", val.get(1));
550
                        
551
                        val = DwgUtil.getBitDouble(intData, bitPos);
552
                        bitPos = ((Integer)val.get(0)).intValue();
553
                        dwgFile.setHeader("PDSIZE", val.get(1));
554
                        
555
                        val = DwgUtil.getBitDouble(intData, bitPos);
556
                        bitPos = ((Integer)val.get(0)).intValue();
557
                        dwgFile.setHeader("PLINEWID", val.get(1));
558
                        
559
                        val = DwgUtil.getBitDouble(intData, bitPos);
560
                        bitPos = ((Integer)val.get(0)).intValue();
561
                        dwgFile.setHeader("USERR1", val.get(1));
562
                        
563
                        val = DwgUtil.getBitDouble(intData, bitPos);
564
                        bitPos = ((Integer)val.get(0)).intValue();
565
                        dwgFile.setHeader("USERR2", val.get(1));
566
                        
567
                        val = DwgUtil.getBitDouble(intData, bitPos);
568
                        bitPos = ((Integer)val.get(0)).intValue();
569
                        dwgFile.setHeader("USERR3", val.get(1));
570
                        
571
                        val = DwgUtil.getBitDouble(intData, bitPos);
572
                        bitPos = ((Integer)val.get(0)).intValue();
573
                        dwgFile.setHeader("USERR4", val.get(1));
574
                        
575
                        val = DwgUtil.getBitDouble(intData, bitPos);
576
                        bitPos = ((Integer)val.get(0)).intValue();
577
                        dwgFile.setHeader("USERR5", val.get(1));
578
                        
579
                        val = DwgUtil.getBitDouble(intData, bitPos);
580
                        bitPos = ((Integer)val.get(0)).intValue();
581
                        dwgFile.setHeader("CHAMFERA", val.get(1));
582
                        
583
                        val = DwgUtil.getBitDouble(intData, bitPos);
584
                        bitPos = ((Integer)val.get(0)).intValue();
585
                        dwgFile.setHeader("CHAMFERB", val.get(1));
586
                        
587
                        val = DwgUtil.getBitDouble(intData, bitPos);
588
                        bitPos = ((Integer)val.get(0)).intValue();
589
                        dwgFile.setHeader("CHAMFERC", val.get(1));
590
                        
591
                        val = DwgUtil.getBitDouble(intData, bitPos);
592
                        bitPos = ((Integer)val.get(0)).intValue();
593
                        dwgFile.setHeader("CHAMFERD", val.get(1));
594
                        
595
                        val = DwgUtil.getBitDouble(intData, bitPos);
596
                        bitPos = ((Integer)val.get(0)).intValue();
597
                        dwgFile.setHeader("FACETRES", val.get(1));
598
                        
599
                        val = DwgUtil.getBitDouble(intData, bitPos);
600
                        bitPos = ((Integer)val.get(0)).intValue();
601
                        dwgFile.setHeader("CMLSCALE", val.get(1));
602
                        
603
                        val = DwgUtil.getBitDouble(intData, bitPos);
604
                        bitPos = ((Integer)val.get(0)).intValue();
605
                        dwgFile.setHeader("CELTSCALE", val.get(1));
606
                        
607
                        val = DwgUtil.getTextString(intData, bitPos);
608
                        bitPos = ((Integer)val.get(0)).intValue();
609
                        dwgFile.setHeader("MENUNAME", val.get(1));
610
                        
611
                        int[] tdcreate = new int[2];
612
                        val = DwgUtil.getBitLong(intData, bitPos);
613
                        bitPos = ((Integer)val.get(0)).intValue();
614
                        tdcreate[0] = ((Integer) val.get(1)).intValue();
615
                        val = DwgUtil.getBitLong(intData, bitPos);
616
                        bitPos = ((Integer)val.get(0)).intValue();
617
                        tdcreate[1] = ((Integer) val.get(1)).intValue();
618
                        dwgFile.setHeader("TDCREATE", tdcreate);
619
                        
620
                        int[] tdupdate = new int[2];
621
                        val = DwgUtil.getBitLong(intData, bitPos);
622
                        bitPos = ((Integer)val.get(0)).intValue();
623
                        tdupdate[0] = ((Integer) val.get(1)).intValue();
624
                        val = DwgUtil.getBitLong(intData, bitPos);
625
                        bitPos = ((Integer)val.get(0)).intValue();
626
                        tdupdate[1] = ((Integer) val.get(1)).intValue();
627
                        dwgFile.setHeader("TDUPDATE", tdupdate);
628
                        
629
                        int[] tdindwg = new int[2];
630
                        val = DwgUtil.getBitLong(intData, bitPos);
631
                        bitPos = ((Integer)val.get(0)).intValue();
632
                        tdindwg[0] = ((Integer) val.get(1)).intValue();
633
                        val = DwgUtil.getBitLong(intData, bitPos);
634
                        bitPos = ((Integer)val.get(0)).intValue();
635
                        tdindwg[1] = ((Integer) val.get(1)).intValue();
636
                        dwgFile.setHeader("TDINDWG", tdindwg);
637
                        
638
                        int[] tdusrtime = new int[2];
639
                        val = DwgUtil.getBitLong(intData, bitPos);
640
                        bitPos = ((Integer)val.get(0)).intValue();
641
                        tdusrtime[0] = ((Integer) val.get(1)).intValue();
642
                        val = DwgUtil.getBitLong(intData, bitPos);
643
                        bitPos = ((Integer)val.get(0)).intValue();
644
                        tdusrtime[1] = ((Integer) val.get(1)).intValue();
645
                        dwgFile.setHeader("TDUSRTIME", tdusrtime);
646
                        
647
                        val = DwgUtil.getBitShort(intData, bitPos);
648
                        bitPos = ((Integer)val.get(0)).intValue();
649
                        dwgFile.setHeader("CECOLOR", val.get(1));
650
                        
651
                        val = DwgUtil.getHandle(intData, bitPos);
652
                        bitPos = ((Integer)val.get(0)).intValue();
653
                        int intHandle = DwgUtil.handleToInt(val);
654
                        dwgFile.setHeader("HANDSEED", new Integer(intHandle));
655
                        
656
        //creo que CLAYER marca la capa actualmente seleccionada en el menu de autocad                
657
                        
658
                        val = DwgUtil.getHandle(intData, bitPos);
659
                        bitPos = ((Integer)val.get(0)).intValue();
660
                        intHandle = DwgUtil.handleToInt(val);
661
                        dwgFile.setHeader("CLAYER", new Integer(intHandle));
662
                        
663
                        val = DwgUtil.getHandle(intData, bitPos);
664
                        bitPos = ((Integer)val.get(0)).intValue();
665
                        intHandle = DwgUtil.handleToInt(val);
666
                        dwgFile.setHeader("TEXSTYLE", new Integer(intHandle));
667
                        
668
                        val = DwgUtil.getHandle(intData, bitPos);
669
                        bitPos = ((Integer)val.get(0)).intValue();
670
                        intHandle = DwgUtil.handleToInt(val);
671
                        dwgFile.setHeader("CELLTYPE", new Integer(intHandle));
672
                        
673
                        val = DwgUtil.getHandle(intData, bitPos);
674
                        bitPos = ((Integer)val.get(0)).intValue();
675
                        intHandle = DwgUtil.handleToInt(val);
676
                        dwgFile.setHeader("DIMSTYLE", new Integer(intHandle));
677
                        
678
                        val = DwgUtil.getHandle(intData, bitPos);
679
                        bitPos = ((Integer)val.get(0)).intValue();
680
                        intHandle = DwgUtil.handleToInt(val);
681
                        dwgFile.setHeader("CMLSTYLE", new Integer(intHandle));
682
                        
683
                        double[] spaces1 = new double[3];
684
                        val = DwgUtil.getBitDouble(intData, bitPos);
685
                        bitPos = ((Integer)val.get(0)).intValue();
686
                        spaces1[0] = ((Double)val.get(1)).doubleValue();
687
                        val = DwgUtil.getBitDouble(intData, bitPos);
688
                        bitPos = ((Integer)val.get(0)).intValue();
689
                        spaces1[1] = ((Double)val.get(1)).doubleValue();
690
                        val = DwgUtil.getBitDouble(intData, bitPos);
691
                        bitPos = ((Integer)val.get(0)).intValue();
692
                        spaces1[2] = ((Double)val.get(1)).doubleValue();
693
                        dwgFile.setHeader("PSPACE_INSBASE", spaces1);
694
                        
695
                        double[] spaces2 = new double[3];
696
                        val = DwgUtil.getBitDouble(intData, bitPos);
697
                        bitPos = ((Integer)val.get(0)).intValue();
698
                        spaces2[0] = ((Double)val.get(1)).doubleValue();
699
                        val = DwgUtil.getBitDouble(intData, bitPos);
700
                        bitPos = ((Integer)val.get(0)).intValue();
701
                        spaces2[1] = ((Double)val.get(1)).doubleValue();
702
                        val = DwgUtil.getBitDouble(intData, bitPos);
703
                        bitPos = ((Integer)val.get(0)).intValue();
704
                        spaces2[2] = ((Double)val.get(1)).doubleValue();
705
                        dwgFile.setHeader("PSPACE_EXTMIN", spaces2);
706
                        
707
                        double[] spaces3 = new double[3];
708
                        val = DwgUtil.getBitDouble(intData, bitPos);
709
                        bitPos = ((Integer)val.get(0)).intValue();
710
                        spaces3[0] = ((Double)val.get(1)).doubleValue();
711
                        val = DwgUtil.getBitDouble(intData, bitPos);
712
                        bitPos = ((Integer)val.get(0)).intValue();
713
                        spaces3[1] = ((Double)val.get(1)).doubleValue();
714
                        val = DwgUtil.getBitDouble(intData, bitPos);
715
                        bitPos = ((Integer)val.get(0)).intValue();
716
                        spaces3[2] = ((Double)val.get(1)).doubleValue();
717
                        dwgFile.setHeader("PSPACE_EXTMAX", spaces2);
718
                        
719
                        double[] spaces4 = new double[2];
720
                        val = DwgUtil.getRawDouble(intData, bitPos);
721
                        bitPos = ((Integer)val.get(0)).intValue();
722
                        spaces4[0] = ((Double)val.get(1)).doubleValue();
723
                        val = DwgUtil.getRawDouble(intData, bitPos);
724
                        bitPos = ((Integer)val.get(0)).intValue();
725
                        spaces4[1] = ((Double)val.get(1)).doubleValue();
726
                        dwgFile.setHeader("PSPACE_LIMMIN", spaces4);
727
                        
728
                        double[] spaces5 = new double[2];
729
                        val = DwgUtil.getRawDouble(intData, bitPos);
730
                        bitPos = ((Integer)val.get(0)).intValue();
731
                        spaces5[0] = ((Double)val.get(1)).doubleValue();
732
                        val = DwgUtil.getRawDouble(intData, bitPos);
733
                        bitPos = ((Integer)val.get(0)).intValue();
734
                        spaces5[1] = ((Double)val.get(1)).doubleValue();
735
                        dwgFile.setHeader("PSPACE_LIMMAX", spaces5);
736
                        
737
                        
738
                        val = DwgUtil.getBitDouble(intData, bitPos);
739
                        bitPos = ((Integer)val.get(0)).intValue();
740
                        dwgFile.setHeader("PSPACE_ELEVATION", val.get(1));
741
                        
742
                        double[] spaces6 = new double[6];
743
                        val = DwgUtil.getBitDouble(intData, bitPos);
744
                        bitPos = ((Integer)val.get(0)).intValue();
745
                        spaces6[0] = ((Double)val.get(1)).doubleValue();
746
                        val = DwgUtil.getBitDouble(intData, bitPos);
747
                        bitPos = ((Integer)val.get(0)).intValue();
748
                        spaces6[1] = ((Double)val.get(1)).doubleValue();
749
                        val = DwgUtil.getBitDouble(intData, bitPos);
750
                        bitPos = ((Integer)val.get(0)).intValue();
751
                        spaces6[2] = ((Double)val.get(1)).doubleValue();
752
                        dwgFile.setHeader("PSPACE_UCSORG", spaces6);
753
                        
754
                        double[] spaces7 = new double[6];
755
                        val = DwgUtil.getBitDouble(intData, bitPos);
756
                        bitPos = ((Integer)val.get(0)).intValue();
757
                        spaces7[0] = ((Double)val.get(1)).doubleValue();
758
                        val = DwgUtil.getBitDouble(intData, bitPos);
759
                        bitPos = ((Integer)val.get(0)).intValue();
760
                        spaces7[1] = ((Double)val.get(1)).doubleValue();
761
                        val = DwgUtil.getBitDouble(intData, bitPos);
762
                        bitPos = ((Integer)val.get(0)).intValue();
763
                        spaces7[2] = ((Double)val.get(1)).doubleValue();
764
                        dwgFile.setHeader("PSPACE_UCSXDIR", spaces7);
765
                        
766
                        double[] spaces8 = new double[6];
767
                        val = DwgUtil.getBitDouble(intData, bitPos);
768
                        bitPos = ((Integer)val.get(0)).intValue();
769
                        spaces8[0] = ((Double)val.get(1)).doubleValue();
770
                        val = DwgUtil.getBitDouble(intData, bitPos);
771
                        bitPos = ((Integer)val.get(0)).intValue();
772
                        spaces8[1] = ((Double)val.get(1)).doubleValue();
773
                        val = DwgUtil.getBitDouble(intData, bitPos);
774
                        bitPos = ((Integer)val.get(0)).intValue();
775
                        spaces8[2] = ((Double)val.get(1)).doubleValue();
776
                        dwgFile.setHeader("PSPACE_UCSYDIR", spaces8);
777
                        
778
                        val = DwgUtil.getHandle(intData, bitPos);
779
                        bitPos = ((Integer)val.get(0)).intValue();
780
                        intHandle = DwgUtil.handleToInt(val);
781
                        dwgFile.setHeader("PSPACE_UCSNAME", new Integer(intHandle));
782
                        
783
                        double[] spaces9 = new double[6];
784
                        val = DwgUtil.getBitDouble(intData, bitPos);
785
                        bitPos = ((Integer)val.get(0)).intValue();
786
                        spaces9[0] = ((Double)val.get(1)).doubleValue();
787
                        val = DwgUtil.getBitDouble(intData, bitPos);
788
                        bitPos = ((Integer)val.get(0)).intValue();
789
                        spaces9[1] = ((Double)val.get(1)).doubleValue();
790
                        val = DwgUtil.getBitDouble(intData, bitPos);
791
                        bitPos = ((Integer)val.get(0)).intValue();
792
                        spaces9[2] = ((Double)val.get(1)).doubleValue();
793
                        dwgFile.setHeader("MSPACE_INSBASE", spaces9);
794
                        
795
                        double[] spaces10 = new double[6];
796
                        val = DwgUtil.getBitDouble(intData, bitPos);
797
                        bitPos = ((Integer)val.get(0)).intValue();
798
                        spaces10[0] = ((Double)val.get(1)).doubleValue();
799
                        val = DwgUtil.getBitDouble(intData, bitPos);
800
                        bitPos = ((Integer)val.get(0)).intValue();
801
                        spaces10[1] = ((Double)val.get(1)).doubleValue();
802
                        val = DwgUtil.getBitDouble(intData, bitPos);
803
                        bitPos = ((Integer)val.get(0)).intValue();
804
                        spaces10[2] = ((Double)val.get(1)).doubleValue();
805
                        dwgFile.setHeader("MSPACE_EXTMIN", spaces10);
806
                        
807
                        double[] spaces11 = new double[3];
808
                        val = DwgUtil.getBitDouble(intData, bitPos);
809
                        bitPos = ((Integer)val.get(0)).intValue();
810
                        spaces11[0] = ((Double)val.get(1)).doubleValue();
811
                        val = DwgUtil.getBitDouble(intData, bitPos);
812
                        bitPos = ((Integer)val.get(0)).intValue();
813
                        spaces11[1] = ((Double)val.get(1)).doubleValue();
814
                        val = DwgUtil.getBitDouble(intData, bitPos);
815
                        bitPos = ((Integer)val.get(0)).intValue();
816
                        spaces11[2] = ((Double)val.get(1)).doubleValue();
817
                        dwgFile.setHeader("MSPACE_EXTMAX", spaces11);
818
                        
819
                        double[] spaces12= new double[2];
820
                        val = DwgUtil.getRawDouble(intData, bitPos);
821
                        bitPos = ((Integer)val.get(0)).intValue();
822
                        spaces12[0] = ((Double)val.get(1)).doubleValue();
823
                        val = DwgUtil.getRawDouble(intData, bitPos);
824
                        bitPos = ((Integer)val.get(0)).intValue();
825
                        spaces12[1] = ((Double)val.get(1)).doubleValue();
826
                        dwgFile.setHeader("MSPACE_LIMMIN", spaces12);
827
                        
828
                        double[] spaces13= new double[2];
829
                        val = DwgUtil.getRawDouble(intData, bitPos);
830
                        bitPos = ((Integer)val.get(0)).intValue();
831
                        spaces13[0] = ((Double)val.get(1)).doubleValue();
832
                        val = DwgUtil.getRawDouble(intData, bitPos);
833
                        bitPos = ((Integer)val.get(0)).intValue();
834
                        spaces13[1] = ((Double)val.get(1)).doubleValue();
835
                        dwgFile.setHeader("MSPACE_LIMMAX", spaces13);
836
                        
837
                        val = DwgUtil.getBitDouble(intData, bitPos);
838
                        bitPos = ((Integer)val.get(0)).intValue();
839
                        dwgFile.setHeader("MSPACE_ELEVATION", (Double)val.get(1));
840
                        
841
                        double[] spaces14 = new double[3];
842
                        val = DwgUtil.getBitDouble(intData, bitPos);
843
                        bitPos = ((Integer)val.get(0)).intValue();
844
                        spaces14[0] = ((Double)val.get(1)).doubleValue();
845
                        val = DwgUtil.getBitDouble(intData, bitPos);
846
                        bitPos = ((Integer)val.get(0)).intValue();
847
                        spaces14[1] = ((Double)val.get(1)).doubleValue();
848
                        val = DwgUtil.getBitDouble(intData, bitPos);
849
                        bitPos = ((Integer)val.get(0)).intValue();
850
                        spaces14[2] = ((Double)val.get(1)).doubleValue();
851
                        dwgFile.setHeader("MSPACE_UCSORG", spaces14);
852
                        
853
                        double[] spaces15 = new double[3];
854
                        val = DwgUtil.getBitDouble(intData, bitPos);
855
                        bitPos = ((Integer)val.get(0)).intValue();
856
                        spaces15[0] = ((Double)val.get(1)).doubleValue();
857
                        val = DwgUtil.getBitDouble(intData, bitPos);
858
                        bitPos = ((Integer)val.get(0)).intValue();
859
                        spaces15[1] = ((Double)val.get(1)).doubleValue();
860
                        val = DwgUtil.getBitDouble(intData, bitPos);
861
                        bitPos = ((Integer)val.get(0)).intValue();
862
                        spaces15[2] = ((Double)val.get(1)).doubleValue();
863
                        dwgFile.setHeader("MSPACE_UCSXDIR", spaces15);
864
                        
865
                        double[] spaces16 = new double[3];
866
                        val = DwgUtil.getBitDouble(intData, bitPos);
867
                        bitPos = ((Integer)val.get(0)).intValue();
868
                        spaces16[0] = ((Double)val.get(1)).doubleValue();
869
                        val = DwgUtil.getBitDouble(intData, bitPos);
870
                        bitPos = ((Integer)val.get(0)).intValue();
871
                        spaces16[1] = ((Double)val.get(1)).doubleValue();
872
                        val = DwgUtil.getBitDouble(intData, bitPos);
873
                        bitPos = ((Integer)val.get(0)).intValue();
874
                        spaces16[2] = ((Double)val.get(1)).doubleValue();
875
                        dwgFile.setHeader("MSPACE_UCSYDIR", spaces16);
876
                        
877
                        val = DwgUtil.getHandle(intData, bitPos);
878
                        bitPos = ((Integer)val.get(0)).intValue();
879
                        intHandle = DwgUtil.handleToInt(val);
880
                        dwgFile.setHeader("MSPACE_UCSNAME", new Integer(intHandle));
881
                        
882
                        val = DwgUtil.testBit(intData, bitPos);
883
                        bitPos = ((Integer)val.get(0)).intValue();
884
                        dwgFile.setHeader("DIMTOL", val.get(1));
885
                        
886
                        val = DwgUtil.testBit(intData, bitPos);
887
                        bitPos = ((Integer)val.get(0)).intValue();
888
                        dwgFile.setHeader("DIMLIM", val.get(1));
889
                        
890
                        val = DwgUtil.testBit(intData, bitPos);
891
                        bitPos = ((Integer)val.get(0)).intValue();
892
                        dwgFile.setHeader("DIMTIH", val.get(1));
893
                        
894
                        val = DwgUtil.testBit(intData, bitPos);
895
                        bitPos = ((Integer)val.get(0)).intValue();
896
                        dwgFile.setHeader("DIMTOH", val.get(1));
897
                        
898
                        val = DwgUtil.testBit(intData, bitPos);
899
                        bitPos = ((Integer)val.get(0)).intValue();
900
                        dwgFile.setHeader("DIMSE1", val.get(1));
901
                        
902
                        val = DwgUtil.testBit(intData, bitPos);
903
                        bitPos = ((Integer)val.get(0)).intValue();
904
                        dwgFile.setHeader("DIMTSE2", val.get(1));
905
                        
906
                        val = DwgUtil.testBit(intData, bitPos);
907
                        bitPos = ((Integer)val.get(0)).intValue();
908
                        dwgFile.setHeader("DIMALT", val.get(1));
909
                        
910
                        val = DwgUtil.testBit(intData, bitPos);
911
                        bitPos = ((Integer)val.get(0)).intValue();
912
                        dwgFile.setHeader("DIMTOFL", val.get(1));
913
                        
914
                        val = DwgUtil.testBit(intData, bitPos);
915
                        bitPos = ((Integer)val.get(0)).intValue();
916
                        dwgFile.setHeader("DIMSAH", val.get(1));
917
                        
918
                        val = DwgUtil.testBit(intData, bitPos);
919
                        bitPos = ((Integer)val.get(0)).intValue();
920
                        dwgFile.setHeader("DIMTIX", val.get(1));
921
                        
922
                        val = DwgUtil.testBit(intData, bitPos);
923
                        bitPos = ((Integer)val.get(0)).intValue();
924
                        dwgFile.setHeader("DIMSOXD", val.get(1));
925
                        
926
                        
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
                
1557
                
1558
                for (int i=0; i<dwgFile.getDwgObjectOffsets().size(); i++) {
1559
                        DwgObjectOffset doo = (DwgObjectOffset)dwgFile.getDwgObjectOffsets().get(i);
1560
                        DwgObject obj = readDwgObject(doo.getOffset(), i);
1561
                        /*
1562
                        azabala: las entidades DWG no implementadas no nos aportan nada
1563
                        (aunque la sigo leyendo por si aparecen problemas de puntero de fichero)
1564
                        No considero por tanto los DwgObject
1565
                        if (obj != null) {
1566
                dwgFile.addDwgObject(obj);
1567
            }
1568
            */
1569
                        if(obj != null && obj.getClass() != DwgObject.class){
1570
                                dwgFile.addDwgObject(obj);
1571
                        }
1572
                }//for
1573
        }
1574
        
1575
        /**
1576
         * Return a dwg object from its index in the dwg file
1577
         * @param index of the requested dwg object in the dwg file
1578
         * 
1579
         * */
1580
        public DwgObject getDwgObjectByIndex(int index){
1581
                DwgObjectOffset doo = (DwgObjectOffset)dwgFile.getDwgObjectOffsets().get(index);
1582
                return readDwgObject(doo.getOffset(), index);
1583
        }
1584
        
1585

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

    
1593
        
1594
        protected DwgObject readDwgObject(int offset, int index) {
1595
                try {
1596
                        bb.position(offset);
1597
                        int size = DwgUtil.getModularShort(bb);
1598
                        bb.order(ByteOrder.nativeOrder());
1599
                        //LITTLE ENDIAN es intel, mientras que el codigo Python hace
1600
                        //una lectura con bytes de la maquina (en un equipo no intel 
1601
                        //puede que no funcione
1602
//                        TODO bb.order(ByteOrder.LITTLE_ENDIAN);
1603
                        
1604
                        byte[] data = new byte[size];
1605
                        
1606
                        /*
1607
                         * TODO Ver si funciona lo mio (mas simple?)
1608
                        String[] dataMachValString = new String[size];
1609
                        int[] data = new int[size];
1610
                        for (int i=0; i < size; i++) {
1611
                                dataBytes[i] = bb.get();
1612
                                dataMachValString[i] = HexUtil.bytesToHex(new byte[]{dataBytes[i]});
1613
                                Integer dataMachValShort = Integer.decode("0x" + dataMachValString[i]);
1614
                                data[i] = dataMachValShort.byteValue();
1615
                                data[i] = ByteUtils.getUnsigned((byte)data[i]);
1616
                        }
1617
                        */
1618
                        bb.get(data);
1619
                        int[] intData = DwgUtil.toIntArray(data);
1620
                        
1621
                
1622
                        int bitPos = 0;
1623
                        List val = DwgUtil.getBitShort(intData, bitPos);
1624
                        bitPos = ((Integer)val.get(0)).intValue();
1625
                        int type = ((Integer)val.get(1)).intValue();
1626
                        
1627
                        DwgObject obj = DwgObjectFactory.
1628
                                                                getInstance().
1629
                                                                create(type, index);
1630
                   //TODO Hasta aqu? igual que el DWG 15
1631
                        
1632
                        
1633
//Esto no se lee en el 14, s? en el 15 (ver como se puede
1634
//meter herencia en esto
1635
                        
1636
//                    v = DwgUtil.getRawLong(data, bitPos);
1637
//                    bitPos = ((Integer)v.get(0)).intValue();
1638
//                    int objBSize = ((Integer)v.get(1)).intValue();
1639
//                    obj.setSizeInBits(objBSize);
1640
                    
1641
                        
1642
/*          TODO Ver si funciona mi metodo (mas simple)
1643
                    ArrayList entityHandle = new ArrayList();
1644
                    v = DwgUtil.getHandle(data, bitPos);
1645
                    bitPos = ((Integer)v.get(0)).intValue();
1646
                    for (int i=1;i<v.size();i++) {
1647
                            entityHandle.add(v.get(i));
1648
                    }
1649
                    obj.setHandle(DwgUtil.
1650
                                    handleBinToHandleInt(entityHandle));
1651
        */
1652
                        val = DwgUtil.getHandle(intData, bitPos);
1653
                        bitPos = ((Integer)val.get(0)).intValue();
1654
                        int handle = DwgUtil.handleToInt(val);
1655
                        obj.setHandle(handle);
1656
                        
1657
//TODO Si funciona, mover el metodo de esta clase a DwgUtil 
1658
                    val = readExtendedData(intData, bitPos);
1659
                    bitPos = ((Integer)val.get(0)).intValue();
1660
                    List extData = (List)val.get(1);
1661
                    obj.setExtendedData(extData);
1662
                    
1663
                    //Graphics data 
1664
                    boolean gflag = false;
1665
                    gflag = obj.isGraphicsFlag();           
1666
                    if (gflag) {
1667
                            val = DwgUtil.testBit(intData, bitPos);
1668
                            bitPos = ((Integer)val.get(0)).intValue();
1669
                            boolean hasGraphicsData = ((Boolean)val.get(1)).booleanValue();
1670
                           //si hay imagen asociada, se lee por completo
1671
                            if (hasGraphicsData) {
1672
                                    val = DwgUtil.getRawLong(intData, bitPos);
1673
                                    bitPos = ((Integer)val.get(0)).intValue();
1674
                                    size = ((Integer)val.get(1)).intValue();
1675
                                    int bgSize = size * 8;
1676
                                        Integer giData = (Integer)DwgUtil.getBits(intData, bgSize, bitPos);
1677
                                        obj.setGraphicData(giData.intValue());
1678
                                        bitPos = bitPos + bgSize;
1679
                            }
1680
                    }//if gflag
1681
                    
1682
                    
1683
                    //size in bits
1684
                    val = DwgUtil.getRawLong(intData, bitPos);
1685
                    bitPos = ((Integer)val.get(0)).intValue();
1686
                    int sizeInBits = ((Integer)val.get(1)).intValue();
1687
                    obj.setSizeInBits(sizeInBits);
1688
                    
1689
                    if(obj.getClass() != DwgObject.class){
1690
                            //El objeto ha sido reconocido
1691
                            readSpecificObject(obj, intData, bitPos);
1692
                    }else{
1693
                            if(type > 500){
1694
                                    /*
1695
                                     * Pag 46 de la spec: restamos 500 al tipo y nos da un ?ndice
1696
                                     * a la tabla de clases (CLASSES section)
1697
                                     * 
1698
                                     * Filtro aquellos que sean mayores de 500 porque todav?a
1699
                                     * nos quedan por implementar muchas entidades DWG (para no confundirlas)
1700
                                     * 
1701
                                     * */
1702
                                    int newIndex = type - 500;
1703
                                    if(newIndex < (dwgFile.getDwgClasses().size() - 1)){
1704
                                            DwgClass dwgClass = (DwgClass) dwgFile.getDwgClasses().get(index);
1705
                                            String dxfEntityName = dwgClass.getDxfName();
1706
                                            /*
1707
                                             * A partir del nombre de la entidad, la instanciamos
1708
                                             * y construimos un READER para ella.
1709
                                             * 
1710
                                             * Hay que a?adir un nuevo metodo para la factoria de DWG
1711
                                             * para que reciba un nombre de entidad DXF
1712
                                             * */
1713
                                    }
1714
                            }//if type 500
1715
                    }//if DwgObject.class        
1716
                    
1717
            
1718
                    
1719
                    
1720
               
1721
//                elif _type in _vmap:
1722
//                    _stype = _vmap[_type]
1723
//                  
1724
//                    if _stype == 'HATCH': # where is the data kept?
1725
//                        _bitpos, _val = dwgutil.test_bit(_data, _bitpos)
1726
//                        # print "graphic flag: " + str(_val)
1727
//                        
1728
//                    if _stype in _vobjmap:
1729
//                        _vobjmap[_stype](_ent, _data, _bitpos)
1730
//                else:
1731
//                    # print "unhandled object type: %d" % _type
1732
//                    pass
1733
//                _objlist.append(_ent)
1734
                    
1735
                    
1736
                    /*
1737
                     _vobjmap = {
1738
    'DICTIONARYVAR' : dictionaryvar_reader,
1739
    'HATCH' : hatch_reader,
1740
    'IDBUFFER' : idbuffer_reader,
1741
    'IMAGE' : image_reader,
1742
    'IMAGEDEF' : imagedef_reader,
1743
    'IMAGEDEFREACTOR' : imagedefreactor_reader,
1744
    'LAYER_INDEX' : layer_index_reader,
1745
    'LWPLINE' : lwpline_reader,
1746
#     'OLE2FRAME' : ole2frame_reader,
1747
    'RASTERVARIABLES' : rastervariables_reader,
1748
    'SORTENTSTABLE' : sortentstable_reader,
1749
    'SPATIAL_FILTER' : spatial_filter_reader,
1750
    'SPATIAL_INDEX' : spatial_index_reader,
1751
    'XRECORD' : xrecord_reader
1752
    }
1753
                      
1754
                      
1755
                      
1756
                     * */
1757
                    
1758
                    
1759
                    
1760
                    
1761
                        
1762
                    return obj;
1763
                    
1764
            } catch (Exception e) {
1765
//                logger.warn("Exception capturada. Probablemente se ha encontrado un" +
1766
//                                "objeto con type non fixed");
1767
                //e.printStackTrace();
1768
                return null;
1769
            }
1770
        }
1771
        
1772
        
1773
        /*
1774
         * TODO Esto est? pesimamente dise?ado.
1775
         * Cada objeto DwgObject debe tener un metodo
1776
         * readSpecificObject(data,bitPos)
1777
         * 
1778
         * */
1779
        protected void readSpecificObject(DwgObject obj, int[] data, int bitPos) throws Exception {
1780
                if (obj.getType()==0x11) {
1781
                        ((DwgArc)obj).readDwgArcV15(data, bitPos);
1782
                } else if (obj.getType()==0x12) {
1783
                        ((DwgCircle)obj).readDwgCircleV15(data, bitPos);
1784
                } else if (obj.getType()==0x13) {
1785
                        ((DwgLine)obj).readDwgLineV15(data, bitPos);
1786
                } else if (obj.getType()==0x1B) {
1787
                        ((DwgPoint)obj).readDwgPointV15(data, bitPos);
1788
                } else if (obj.getType()==0x0F) {
1789
                        ((DwgPolyline2D)obj).readDwgPolyline2DV15(data, bitPos);
1790
                } else if (obj.getType()==0x10) {
1791
                        ((DwgPolyline3D)obj).readDwgPolyline3DV15(data, bitPos);
1792
                } else if (obj.getType()==0x0A) {
1793
                        ((DwgVertex2D)obj).readDwgVertex2DV15(data, bitPos);
1794
                } else if (obj.getType()==0x0B) {
1795
                        ((DwgVertex3D)obj).readDwgVertex3DV15(data, bitPos);
1796
                } else if (obj.getType()==0x6) {
1797
                        ((DwgSeqend)obj).readDwgSeqendV15(data, bitPos);
1798
                } else if (obj.getType()==0x1) {
1799
                        ((DwgText)obj).readDwgTextV15(data, bitPos);
1800
                } else if (obj.getType()==0x2) {
1801
                        ((DwgAttrib)obj).readDwgAttribV15(data, bitPos);
1802
                } else if (obj.getType()==0x3) {
1803
                        ((DwgAttdef)obj).readDwgAttdefV15(data, bitPos);
1804
                } else if (obj.getType()==0x4) {
1805
                        ((DwgBlock)obj).readDwgBlockV15(data, bitPos);
1806
                } else if (obj.getType()==0x5) {
1807
                        ((DwgEndblk)obj).readDwgEndblkV15(data, bitPos);
1808
                } else if (obj.getType()==0x30) {
1809
                        ((DwgBlockControl)obj).readDwgBlockControlV15(data, bitPos);
1810
                } else if (obj.getType()==0x31) {
1811
                        ((DwgBlockHeader)obj).readDwgBlockHeaderV15(data, bitPos);
1812
                } else if (obj.getType()==0x32) {
1813
                        ((DwgLayerControl)obj).readDwgLayerControlV15(data, bitPos);
1814
                } else if (obj.getType()==0x33) {
1815
                        ((DwgLayer)obj).readDwgLayerV15(data, bitPos);
1816
                } else if (obj.getType()==0x7) {
1817
                        ((DwgInsert)obj).readDwgInsertV15(data, bitPos);
1818
                } else if (obj.getType()==0x2C) {
1819
                        ((DwgMText)obj).readDwgMTextV15(data, bitPos);
1820
                } else if (obj.getType()==0x1F) {
1821
                        ((DwgSolid)obj).readDwgSolidV15(data, bitPos);
1822
                } else if (obj.getType()==0x23) {
1823
                        ((DwgEllipse)obj).readDwgEllipseV15(data, bitPos);
1824
                } else if (obj.getType()==0x24) {
1825
                        ((DwgSpline)obj).readDwgSplineV15(data, bitPos);
1826
                } else if (obj.getType()==0x14) {
1827
                        //logger.warn("... detectado un dim del tipo 0x14 ...");
1828
                } else if (obj.getType()==0x15) {
1829
                        //logger.warn("... detectado un dim del tipo 0x15 ...");
1830
                        //((DwgLinearDimension)obj).readDwgLinearDimensionV15(data, bitPos);
1831
                } else if (obj.getType()==0x16) {
1832
                        //logger.warn("... detectado un dim del tipo 0x16 ...");
1833
                } else if (obj.getType()==0x17) {
1834
                        //logger.warn("... detectado un dim del tipo 0x17 ...");
1835
                } else if (obj.getType()==0x18) {
1836
                        //logger.warn("... detectado un dim del tipo 0x18 ...");
1837
                } else if (obj.getType()==0x19) {
1838
                        //logger.warn("... detectado un dim del tipo 0x19 ...");
1839
                } else if (obj.getType()==0x1A) {
1840
                        //logger.warn("... detectado un dim del tipo 0x1A ...");
1841
                } else if (obj.getType()==0x4D) {
1842
                        ((DwgLwPolyline)obj).readDwgLwPolylineV15(data, bitPos);
1843
                } else if (obj.getType()==0x4E) {
1844
                        ((DwgLwPolyline)obj).readDwgLwPolylineV15(data, bitPos);
1845
                } else if (obj.getType()==0x4F) {
1846
                        ((DwgLwPolyline)obj).readDwgLwPolylineV15(data, bitPos);
1847
                } else if (obj.getType()==0x50) {
1848
                        ((DwgLwPolyline)obj).readDwgLwPolylineV15(data, bitPos);
1849
                } else if (obj.getType()==0x51) {
1850
                        ((DwgLwPolyline)obj).readDwgLwPolylineV15(data, bitPos);
1851
                } else if (obj.getType()==0x52) {
1852
                        ((DwgLwPolyline)obj).readDwgLwPolylineV15(data, bitPos);
1853
                } else if (obj.getType()==0x53) {
1854
                        ((DwgLwPolyline)obj).readDwgLwPolylineV15(data, bitPos);
1855
                } else {
1856
                        //logger.warn("Tipo de objeto pendiente de implementaci?n");
1857
                }
1858
        }
1859
        /*
1860
         * TODO 
1861
         * En DwgUtil se dice que este metodo tiene graves errores.
1862
         * Intento de reimplementarlo a partir del codigo Python original
1863
         * 
1864
         * 
1865
        _eexdata = []
1866
        while True:
1867
            _bitpos, _exsize = dwgutil.get_bit_short(_data, _bitpos)
1868
            # print "extended data size: %d" % _exsize
1869
            if _exsize == 0:
1870
                break
1871
            # print "bitpos: %d" % _bitpos
1872
            
1873
            _bitpos, _handle = dwgutil.get_handle(_data, _bitpos)
1874
            # print "eed handle: " + str(_handle)
1875
            _count = 0
1876
            _eedata = []
1877
            
1878
            while (_count < _exsize):
1879
                # print "count: %d" % _count
1880
                _bitpos, _cb = dwgutil.get_raw_char(_data, _bitpos)
1881
                # print "code byte: %#x" % _cb
1882
                _count = _count + 1
1883
                if _cb == 0x0:
1884
                    _bitpos, _slen = dwgutil.get_raw_char(_data, _bitpos)
1885
                    _bitpos, _cp = dwgutil.get_raw_short(_data, _bitpos)
1886
                    # print "code page: %d" % _cp
1887
                    _chars = []
1888
                    for _i in range(_slen):
1889
                        _bitpos, _char = dwgutil.get_raw_char(_data, _bitpos)
1890
                        _chars.append(chr(_char))
1891
                    _string = "".join(_chars)
1892
                    _eedata.append(_string)
1893
                    _count = _count + 3 + _slen
1894
                elif _cb == 0x1:
1895
                    raise ValueError, "Invalid EEX code byte: 0x1"
1896
                elif _cb == 0x2:
1897
                    _bitpos, _char = dwgutil.get_raw_char(_data, _bitpos)
1898
                    if _char == 0x0:
1899
                        _eedata.append("{")
1900
                    elif _char == 0x1:
1901
                        _eedata.append("}")
1902
                    else:
1903
                        raise ValueError, "Unexpected EEX char: %#02x" % _char
1904
                    _count = _count + 1
1905
                elif _cb == 0x3:
1906
                    # print "layer table reference"
1907
                    _chars = []
1908
                    for _i in range(8):
1909
                        _bitpos, _char = dwgutil.get_raw_char(_data, _bitpos)
1910
                        _chars.append(_char)
1911
                    _eedata.append(_chars)
1912
                    _count = _count + 8
1913
                elif _cb == 0x4:
1914
                    # print "binary chunk"
1915
                    _bitpos, _len = dwgutil.get_raw_char(_data, _bitpos)
1916
                    _chars = []
1917
                    for _i in range(_len):
1918
                        _bitpos, _char = dwgutil.get_raw_char(_data, _bitpos)
1919
                        _chars.append(_char)
1920
                    _eedata.append(_chars)
1921
                    _count = _count + 1 + _len
1922
                elif _cb == 0x5:
1923
                    # print "entity handle reference"
1924
                    _chars = []
1925
                    for _i in range(8):
1926
                        _bitpos, _char = dwgutil.get_raw_char(_data, _bitpos)
1927
                        _chars.append(_char)
1928
                    _eedata.append(_chars)
1929
                    _count = _count + 8
1930
                elif (0xa <= _cb <= 0xd):
1931
                    # print "three doubles"
1932
                    _bitpos, _d1 = dwgutil.get_raw_double(_data, _bitpos)
1933
                    _bitpos, _d2 = dwgutil.get_raw_double(_data, _bitpos)
1934
                    _bitpos, _d3 = dwgutil.get_raw_double(_data, _bitpos)
1935
                    _eedata.append((_d1, _d2, _d3))
1936
                    _count = _count + 24
1937
                elif (0x28 <= _cb <= 0x2a):
1938
                    # print "one double"
1939
                    _bitpos, _d = dwgutil.get_raw_double(_data, _bitpos)
1940
                    _eedata.append(_d)
1941
                    _count = _count + 8
1942
                elif _cb == 0x46:
1943
                    # print "short int"
1944
                    _bitpos, _short = dwgutil.get_raw_short(_data, _bitpos)
1945
                    _eedata.append(_short)
1946
                    _count = _count + 2
1947
                elif _cb == 0x47:
1948
                    # print "long int"
1949
                    _bitpos, _long = dwgutil.get_raw_long(_data, _bitpos)
1950
                    _eedata.append(_long)
1951
                    print "long: %d" % _long
1952
                    _count = _count + 4
1953
                else:
1954
                    raise ValueError, "Unexpected code byte: %#02x" % _cb
1955
         * 
1956
         * 
1957
         * */
1958
        List readExtendedData(int[] data, int bitPos) throws Exception {
1959
                List solution = new ArrayList();
1960
                //TODO Ver si el array est? bien, o hay que cambiarlo por un stringbuffer
1961
                List extendedData = new ArrayList();
1962
                int size;
1963
                List val;
1964
                while(true){//TODO VER SI HAY PROBLEMAS DE NO SALIDA
1965
                        
1966
                        val = DwgUtil.getBitShort(data, bitPos);
1967
                        bitPos = ((Integer) val.get(0)).intValue();
1968
                        size = ((Integer) val.get(1)).intValue();
1969
                        if(size == 0)
1970
                                break;
1971
                        
1972
                        val = DwgUtil.getHandle(data, bitPos);
1973
                        bitPos = ((Integer) val.get(0)).intValue();
1974
                        int handle = DwgUtil.handleToInt(val);
1975
                        logger.debug("Handle del EXTENDED ENTITY DATA:"+handle);
1976
                        int count = 0;
1977
                        while(count < size){
1978
                                val = DwgUtil.getRawChar(data, bitPos);
1979
                                bitPos = ((Integer) val.get(0)).intValue();
1980
                                int codeByte = ((Integer) val.get(1)).intValue();
1981
                                count++;
1982
                                if(codeByte == 0x0){
1983
                                        val = DwgUtil.getRawChar(data, bitPos);
1984
                                        bitPos = ((Integer) val.get(0)).intValue();
1985
                                        int slen = ((Integer) val.get(1)).intValue();
1986
                                        val = DwgUtil.getRawShort(data, bitPos);
1987
                                        bitPos = ((Integer) val.get(0)).intValue();
1988
                                        int codePage = ((Integer) val.get(1)).intValue();
1989
                                        logger.debug("Extended Data (0x0): code page = " + codePage);
1990
                                        char[] chars = new char[slen];
1991
                                        for(int i = 0; i < slen; i++){
1992
                                                val = DwgUtil.getRawChar(data, bitPos);
1993
                                                bitPos = ((Integer) val.get(0)).intValue();
1994
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
1995
                                        }//for
1996
                                        String str = new String(chars);
1997
                                        logger.debug("Chars:"+str);
1998
                                        extendedData.add(str);
1999
                                        count += (3 + slen);
2000
                                }else if(codeByte == 0x1){
2001
                                                logger.debug("Invalid extended data code byte: 0x1");
2002
                                }else if(codeByte == 0x2){
2003
                                        val = DwgUtil.getRawChar(data, bitPos);
2004
                                        bitPos = ((Integer) val.get(0)).intValue();
2005
                                        int character = ((Integer)val.get(1)).intValue();
2006
                                        if(character == 0x0)
2007
                                                extendedData.add("{");
2008
                                        else if(character == 0x1)
2009
                                                extendedData.add("}");
2010
                                        else{
2011
                                                logger.warn("Invalid extended data char:"+character);
2012
                                        }
2013
                                        count++;  
2014
                                } else if(codeByte == 0x3){
2015
                                        char[] chars = new char[8];
2016
                                        for(int i = 0; i < 8; i++){
2017
                                                val = DwgUtil.getRawChar(data, bitPos);
2018
                                                bitPos = ((Integer) val.get(0)).intValue();
2019
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
2020
                                        }
2021
                                        String str = new String(chars);
2022
                                        logger.debug("Chars:"+str);
2023
                                        extendedData.add(str);
2024
                                        count += 8;
2025
                                }else if(codeByte == 0x4){
2026
                                        //binary chunk in extended data
2027
                                        val = DwgUtil.getRawChar(data, bitPos);
2028
                                        bitPos = ((Integer) val.get(0)).intValue();
2029
                                        int length = ((Integer) val.get(1)).intValue();
2030
                                        char[] chars = new char[length];
2031
                                        for(int i = 0; i < length; i++){
2032
                                                val = DwgUtil.getRawChar(data, bitPos);
2033
                                                bitPos = ((Integer) val.get(0)).intValue();
2034
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
2035
                                        }
2036
                                        String str = new String(chars);
2037
                                        logger.debug("Chars:"+str);
2038
                                        extendedData.add(str);
2039
                                        count += (1 + length);
2040
                                }else if(codeByte == 0x5){
2041
                                        //entity handle reference
2042
                                        char[] chars = new char[8];
2043
                                        for(int i = 0; i < 8; i++){
2044
                                                val = DwgUtil.getRawChar(data, bitPos);
2045
                                                bitPos = ((Integer) val.get(0)).intValue();
2046
                                                chars[i] = (char) ((Integer) val.get(1)).intValue();
2047
                                        }
2048
                                        String str = new String(chars);
2049
                                        logger.debug("Chars:"+str);
2050
                                        extendedData.add(str);
2051
                                        count += 8;
2052
                                }else if( (codeByte >= 0xa) && (codeByte <= 0xd)){
2053
                                        //three doubles
2054
                                        double[] dValues = new double[3];  
2055
                                        val = DwgUtil.getRawDouble(data, bitPos);
2056
                                        bitPos = ((Integer) val.get(0)).intValue();
2057
                                        dValues[0] =  ((Double) val.get(1)).doubleValue();
2058
                                        
2059
                                        val = DwgUtil.getRawDouble(data, bitPos);
2060
                                        bitPos = ((Integer) val.get(0)).intValue();
2061
                                        dValues[1] =  ((Double) val.get(1)).doubleValue();
2062
                                        
2063
                                        val = DwgUtil.getRawDouble(data, bitPos);
2064
                                        bitPos = ((Integer) val.get(0)).intValue();
2065
                                        dValues[2] =  ((Double) val.get(1)).doubleValue();
2066
                                        
2067
                                        logger.debug("Doubles:"+dValues);
2068
                                        extendedData.add(dValues);
2069
                                        count += 24;
2070
                                }else if( (codeByte >= 0x28) && (codeByte <= 0x2a)){
2071
                                        //one double
2072
                                        val = DwgUtil.getRawDouble(data, bitPos);
2073
                                        bitPos = ((Integer) val.get(0)).intValue();
2074
                                        double value =  ((Double) val.get(1)).doubleValue();
2075
                                        logger.debug("Double value:"+ value);
2076
                                        extendedData.add(val.get(1));
2077
                                        count += 8;
2078
                                }else if(codeByte == 0x46){
2079
                                        //a short value
2080
                                        val = DwgUtil.getRawShort(data, bitPos);
2081
                                        bitPos = ((Integer) val.get(0)).intValue();
2082
                                        int value = ((Integer) val.get(1)).intValue();
2083
                                        logger.debug("Short value:"+value);
2084
                                        extendedData.add(val.get(1));
2085
                                        count += 2;
2086
                                }else if(codeByte == 0x47){
2087
                                        //int value
2088
                                        val = DwgUtil.getRawLong(data, bitPos);
2089
                                        bitPos = ((Integer) val.get(0)).intValue();
2090
                                        int value = ((Integer) val.get(1)).intValue();
2091
                                        logger.debug("Int value:"+value);
2092
                                        extendedData.add(val.get(1));
2093
                                        count += 4;
2094
                                }else{
2095
                                        logger.debug("Unexpected code byte in EXTENDED DATA "+codeByte);
2096
                                }
2097
                        }//while
2098
                }//while
2099
                solution.add(new Integer(bitPos));
2100
                solution.add(extendedData);
2101
                return solution;
2102
        }
2103

    
2104
        /* (non-Javadoc)
2105
         * @see com.iver.cit.jdwglib.dwg.readers.IDwgFileReader#readObjectHeader(int[], int, com.iver.cit.jdwglib.dwg.DwgObject)
2106
         */
2107
        public int readObjectHeader(int[] data, int offset, DwgObject dwgObject) throws Exception {
2108
                int bitPos = offset;
2109
                Integer mode = (Integer)DwgUtil.getBits(data, 2, bitPos);
2110
            bitPos += 2;
2111
            dwgObject.setMode(mode.intValue());
2112
            
2113
            List val = DwgUtil.getBitLong(data, bitPos);
2114
            bitPos = ((Integer)val.get(0)).intValue();
2115
            int rnum = ((Integer)val.get(1)).intValue();
2116
            dwgObject.setNumReactors(rnum);
2117
            //TODO hasta aqui igual que en Dwg 15
2118
            
2119
            val = DwgUtil.testBit(data, bitPos);
2120
            bitPos = ((Integer)val.get(0)).intValue();
2121
            boolean isLyrByLineType = ((Boolean)val.get(1)).booleanValue();
2122
            //TODO En la 15 es un flag, no un boolean. REVISAR
2123
            dwgObject.setLyrByLineType(isLyrByLineType);
2124
            
2125
            val = DwgUtil.testBit(data, bitPos);
2126
            bitPos = ((Integer)val.get(0)).intValue();
2127
            boolean noLinks = ((Boolean)val.get(1)).booleanValue();
2128
            dwgObject.setNoLinks(noLinks);
2129
            
2130
            val = DwgUtil.getBitShort(data, bitPos);
2131
            bitPos = ((Integer)val.get(0)).intValue();
2132
            int color = ((Integer)val.get(1)).intValue();
2133
            dwgObject.setColor(color);
2134
            
2135
            val = DwgUtil.getBitDouble(data, bitPos);
2136
            bitPos = ((Integer)val.get(0)).intValue();
2137
            float ltscale = ((Double)val.get(1)).floatValue();
2138
            //TODO tampoco se setea en la 15 (en su lugar, un flag de ints)
2139
            val = DwgUtil.getBitShort(data, bitPos);
2140
            bitPos = ((Integer)val.get(0)).intValue();
2141
            int invis = ((Integer)val.get(1)).intValue();
2142
            
2143
                return bitPos;        
2144
        }
2145

    
2146
        /* 
2147
         * 
2148
         * (non-Javadoc)
2149
         * @see com.iver.cit.jdwglib.dwg.readers.IDwgFileReader#readObjectTailer(int[], int, com.iver.cit.jdwglib.dwg.DwgObject)
2150
         */
2151
        public int readObjectTailer(int[] data, int offset, DwgObject dwgObject) throws Exception {
2152
                int bitPos = offset;
2153
                List val = null;
2154
                
2155
                /*
2156
                 * Subentity ref handle.
2157
                 * Esto se aplica sobre VERTEX, ATTRIB, SEQEND
2158
                 * */
2159
                if (dwgObject.getMode()==0x0) {
2160
                        val = DwgUtil.getHandle(data, bitPos);
2161
                    bitPos = ((Integer)val.get(0)).intValue();
2162
                    int intHandle = DwgUtil.handleToInt(val);
2163
                    dwgObject.setSubEntityHandle(intHandle);
2164
                }
2165
                
2166
                /*
2167
                 * Reactors handles 
2168
                 * TODO No se est?n usando para setear nada en DwgObject
2169
                 * */
2170
                for (int i=0; i<dwgObject.getNumReactors(); i++) {
2171
                        val = DwgUtil.getHandle(data, bitPos);
2172
                        bitPos = ((Integer)val.get(0)).intValue();
2173
                        int reactorHandle = DwgUtil.handleToInt(val);
2174
                }
2175
                
2176
                val = DwgUtil.getHandle(data, bitPos);
2177
                bitPos = ((Integer)val.get(0)).intValue();
2178
                dwgObject.setXDicObjHandle(DwgUtil.handleToInt(val));
2179
                
2180
                val = DwgUtil.getHandle(data, bitPos);
2181
                bitPos = ((Integer)val.get(0)).intValue();
2182
                dwgObject.setLayerHandleCode(((Integer)val.get(1)).intValue());
2183
            dwgObject.setLayerHandle(DwgUtil.handleToInt(val));
2184
//          TODO Hasta aqui igual que en la 15
2185
                if(! dwgObject.isLyrByLineType()){
2186
                        val = DwgUtil.getHandle(data, bitPos);
2187
                        bitPos = ((Integer)val.get(0)).intValue();
2188
                        int handle = DwgUtil.handleToInt(val);
2189
                        dwgObject.setLineType(handle);
2190
                }
2191
                String cadena = "";
2192
                if(! dwgObject.isNoLinks()){
2193
                        val = DwgUtil.getHandle(data, bitPos);
2194
                        bitPos = ((Integer) val.get(0)).intValue();
2195
                        ArrayList prevhv = new ArrayList();
2196
                        int[] prev = new int[val.size() - 1];
2197
                        cadena = "PREVIOUS HANDLE = ";
2198
                        for (int i = 1; i < val.size(); i++) {
2199
                                prev[i - 1] = ((Integer) val.get(i)).intValue();
2200
                                prevhv.add(new Integer(prev[i - 1]));
2201
                                cadena += prev[i - 1] + " ";
2202
                        }//for
2203
                        System.out.println(cadena);
2204
                        dwgObject.setPreviousHandleCode(prev[0]);
2205
                        dwgObject.setPreviousHandle(DwgUtil.handleBinToHandleInt(prevhv));
2206
                        
2207
                        val = DwgUtil.getHandle(data, bitPos);
2208
                        bitPos = ((Integer) val.get(0)).intValue();
2209
                        ArrayList nexthv = new ArrayList();
2210
                        int[] next = new int[val.size() - 1];
2211
                        cadena = "NEXT HANDLE = ";
2212
                        for (int i = 1; i < val.size(); i++) {
2213
                                next[i - 1] = ((Integer) val.get(i)).intValue();
2214
                                nexthv.add(new Integer(next[i - 1]));
2215
                                cadena += next[i - 1] + " ";
2216
                        }
2217
                        System.out.println(cadena);
2218
                        dwgObject.setNextHandleCode(next[0]);
2219
                        dwgObject.setNextHandle(DwgUtil.handleBinToHandleInt(nexthv));
2220
                }
2221
                return bitPos;
2222
        }
2223
        
2224
}