Revision 23940

View differences:

trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/readers/DwgObjectReaderPool.java
167 167
import com.iver.cit.jdwglib.dwg.readers.objreaders.v15.DwgVertexMeshReader15;
168 168
import com.iver.cit.jdwglib.dwg.readers.objreaders.v15.DwgVertexPFaceFaceReader15;
169 169
import com.iver.cit.jdwglib.dwg.readers.objreaders.v15.DwgVertexPFaceReader15;
170

  
170
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgArcReader2004;
171
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgAttdefReader2004;
172
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgAttribReader2004;
173
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgBlockControlReader2004;
174
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgBlockHeaderReader2004;
175
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgBlockReader2004;
176
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgCircleReader2004;
177
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgDictionaryReader2004;
178
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgEllipseReader2004;
179
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgEndBlkReader2004;
180
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgInsertReader2004;
181
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgLayerControlReader2004;
182
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgLayerReader2004;
183
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgLineReader2004;
184
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgLinearDimensionReader2004;
185
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgLwPolylineReader2004;
186
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgMTextReader2004;
187
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgMeshReader2004;
188
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgPFaceReader2004;
189
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgPointReader2004;
190
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgPolyline2DReader2004;
191
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgPolyline3DReader2004;
192
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgSeqEndReader2004;
193
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgSolidReader2004;
194
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgSplineReader2004;
195
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgTextReader2004;
196
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgVertex2DReader2004;
197
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgVertex3DReader2004;
198
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgVertexMeshReader2004;
199
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgVertexPFaceFaceReader2004;
200
import com.iver.cit.jdwglib.dwg.readers.objreaders.v2004.DwgVertexPFaceReader2004;
171 201
/**
172 202
 * @author azabala
173 203
 */
......
179 209
	private Map obj_readers;
180 210
	
181 211
	static{
212
		
213
//		READERS FOR DWG V2004
214
		_instance.put(DwgArc.class, "2004", new DwgArcReader2004());
215
		_instance.put(DwgAttdef.class, "2004", new DwgAttdefReader2004());
216
		_instance.put(DwgAttrib.class, "2004", new DwgAttribReader2004());
217
		_instance.put(DwgBlock.class, "2004", new DwgBlockReader2004());
218
		_instance.put(DwgBlockControl.class, "2004", new DwgBlockControlReader2004());
219
		_instance.put(DwgBlockHeader.class, "2004", new DwgBlockHeaderReader2004());
220
		_instance.put(DwgCircle.class, "2004", new DwgCircleReader2004());
221
		_instance.put(DwgEllipse.class, "2004", new DwgEllipseReader2004());
222
		_instance.put(DwgEndblk.class, "2004", new DwgEndBlkReader2004());
223
		_instance.put(DwgInsert.class, "2004", new DwgInsertReader2004());
224
		_instance.put(DwgLayer.class, "2004", new DwgLayerReader2004());
225
		_instance.put(DwgLayerControl.class, "2004", new DwgLayerControlReader2004());
226
		_instance.put(DwgLine.class, "2004", new DwgLineReader2004());
227
		_instance.put(DwgLinearDimension.class, "2004", new DwgLinearDimensionReader2004());
228
		_instance.put(DwgLwPolyline.class, "2004", new DwgLwPolylineReader2004());
229
		_instance.put(DwgMText.class, "2004", new DwgMTextReader2004());
230
		_instance.put(DwgPoint.class, "2004", new DwgPointReader2004());
231
		_instance.put(DwgPolyline2D.class, "2004", new DwgPolyline2DReader2004());
232
		_instance.put(DwgPolyline3D.class, "2004", new DwgPolyline3DReader2004());
233
		_instance.put(DwgSeqend.class, "2004", new DwgSeqEndReader2004());
234
		_instance.put(DwgSpline.class, "2004", new DwgSplineReader2004());
235
		_instance.put(DwgText.class, "2004", new DwgTextReader2004());
236
		_instance.put(DwgVertex2D.class, "2004", new DwgVertex2DReader2004());
237
		_instance.put(DwgVertex3D.class, "2004", new DwgVertex3DReader2004());
238
		_instance.put(DwgDictionary.class, "2004", new DwgDictionaryReader2004());
239
		_instance.put(DwgVertexPFace.class, "2004", new DwgVertexPFaceReader2004());
240
		_instance.put(DwgVertexPFaceFace.class, "2004", new DwgVertexPFaceFaceReader2004());
241
		_instance.put(DwgPFacePolyline.class, "2004", new DwgPFaceReader2004());
242
		_instance.put(DwgMeshPolyline.class, "2004", new DwgMeshReader2004());
243
		_instance.put(DwgVertexMesh.class, "2004", new DwgVertexMeshReader2004());
244
		_instance.put(DwgSolid.class, "2004", new DwgSolidReader2004());
245

  
182 246
		//READERS FOR DWG V15
183 247
		_instance.put(DwgArc.class, "15", new DwgArcReader15());
184 248
		_instance.put(DwgAttdef.class, "15", new DwgAttdefReader15());
......
211 275
		_instance.put(DwgPFacePolyline.class, "15", new DwgPFaceReader15());
212 276
		_instance.put(DwgMeshPolyline.class, "15", new DwgMeshReader15());
213 277
		_instance.put(DwgVertexMesh.class, "15", new DwgVertexMeshReader15());
214
		
215
		
216
		
217
		
278

  
218 279
		//READERS FOR DWG V13 AND V14
219 280
		_instance.put(DwgArc.class, "1314", new DwgArcReader1314());
220 281
		_instance.put(DwgAttdef.class, "1314", new DwgAttdefReader1314());
......
274 335
		obj_readers = new HashMap();
275 336
	}
276 337
	
338
	/**Get the specific reader for an object
339
	 * 
340
	 * @param obj Object we want to read
341
	 * @param dwgVersion version of dwg file
342
	 * @return The specific reader
343
	 */
277 344
	public IDwgObjectReader get(DwgObject obj, String dwgVersion){
345
		
278 346
		IDwgObjectReader reader = (IDwgObjectReader) obj_readers.
279 347
				get(obj.getClass().getName() + dwgVersion);
280 348
//		if(reader == null)
......
283 351
		
284 352
	}
285 353
	
354
	/**
355
	 * Stores in a map the different readers for objects
356
	 * @param dwgObjClass Object's class
357
	 * @param dwgVersion version of dwg file
358
	 * @param reader Specific reader for the object
359
	 */
286 360
	public void put(Class dwgObjClass, String dwgVersion, IDwgObjectReader reader){
287 361
		if(DwgObject.class.isAssignableFrom(dwgObjClass))
288 362
			obj_readers.put(dwgObjClass.getName()+ dwgVersion, reader);
289 363
		else
290
			throw new RuntimeException("Este pool solo admite como entrada clases de entidad de dibujo gr?fica");
364
			throw new RuntimeException("Este pool solo admite como entrada clases de entidad de dibujo grfica");
291 365
	}
292 366
	
293 367
}
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/readers/DwgFileV14Reader.java
85 85
			readDwgObjectOffsets();
86 86
			readDwgObjects();
87 87
		} catch (Exception e) {
88
			e.printStackTrace();
88 89
			logger.error(e);
89 90
		}
90 91

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

  
245
			
246
			//TODO REFACTORIZAR ESTO PARA USAR DWGHANDLEREFERENCE
247

  
248
			//TODO Los handle se leen asi??
246 249
			val = DwgUtil.getHandle(intData, bitPos);
247 250
			bitPos = ((Integer) val.get(0)).intValue();
248 251
			dwgFile.setHeader("HANDLE1", val.get(1));
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/readers/DwgFileV15Reader.java
1 1
/* jdwglib. Java Library for reading Dwg files.
2
 * 
2
 *
3 3
 * Author: Jose Morell Rama (jose.morell@gmail.com).
4 4
 * Port from the Pythoncad Dwg library by Art Haas.
5 5
 *
......
22 22
 * For more information, contact:
23 23
 *
24 24
 * Jose Morell (jose.morell@gmail.com)
25
 * 
25
 *
26 26
 * or
27 27
 *
28 28
 * IVER TI S.A.
......
56 56

  
57 57
/**
58 58
 * The DwgFileV15Reader reads the DWG version 15 format
59
 * 
59
 *
60 60
 * @author jmorell
61 61
 */
62 62
public class DwgFileV15Reader implements IDwgFileReader {
63 63
	protected DwgFile dwgFile;
64 64

  
65 65
	protected ByteBuffer bb;
66
	
66

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

  
70 70

  
71 71
	/**
72 72
	 * Reads the DWG version 15 format
73
	 * 
73
	 *
74 74
	 * @param dwgFile
75 75
	 *            Represents the DWG file that we want to read
76 76
	 * @throws IOException
......
90 90
			e.printStackTrace();
91 91
			logger.error(e);
92 92
		}
93
		
93

  
94 94
	}
95
	
95

  
96 96
	/*
97 97
	 *TODO: Eliminar esto cuando terminemos con el testeo
98 98
	 */
......
118 118
			logger.warn("+++++ SE HAN PERDIDO LAS SUPERENTIDADES DE "+ j+" OBJETOS +++++");
119 119
		}
120 120
		logger.info("***** FIN DEL CHEQUEO DE LAS SUPERENTIDADES *****");
121
		
121

  
122 122
	}
123
	
124 123

  
124

  
125 125
	/**
126 126
	 * It read the SECTIONS from the header of the DWG file
127 127
	 */
......
158 158
	 * location of each object in the DWG file. This table is broken into
159 159
	 * sections. It is basically a list of handle/file loc pairs. It could be
160 160
	 * readed with this pseudocode:
161
	 * 
161
	 *
162 162
	 * Set lastHandle to all 0 and last loc to 0L. Repeat until section size ==
163 163
	 * 2 section size = read short (in bigendian order) Repeat until out of data
164 164
	 * for this section offset of this handle form last handle as modular char
165 165
	 * offset of location in file from last location as modular char End repeat
166 166
	 * End repeat
167
	 *  
167
	 *
168 168
	 */
169 169
	protected void readDwgObjectOffsets() throws Exception {
170 170
		int offset = dwgFile.getDwgSectionOffset("OBJECTS");
......
180 180
				break;
181 181
			bb.order(ByteOrder.LITTLE_ENDIAN);
182 182
			byte[] dataBytes = new byte[size];
183
			for (int i = 0; i < dataBytes.length; i++) {
184
				dataBytes[i] = bb.get();
185
			}
183
			bb.get(dataBytes);
186 184
			int[] data = DwgUtil.bytesToMachineBytes(dataBytes);
187 185
			int lastHandle = 0;
188 186
			int lastLoc = 0;
......
200 198
		}//while
201 199
	}
202 200

  
201

  
203 202
	protected void readDwgClasses() throws Exception {
204 203
		int offset = dwgFile.getDwgSectionOffset("CLASSES");
205 204
		bb.position(offset);
......
321 320
		if (lastSentinnel[15] != 0x75)
322 321
			logger.warn("lastSentinnel[15] != 0x75");
323 322
	}
324
	
323

  
325 324
	protected void readDwgClasses2() throws Exception {
326 325
		int offset = dwgFile.getDwgSectionOffset("CLASSES");
327 326
		// Por ahora nos saltamos los 16 bytes de control
......
363 362
	 */
364 363
	protected void readDwgObjects() {
365 364
		for (int i = 0; i < dwgFile.getDwgObjectOffsets().size(); i++) {
366
			DwgObjectOffset doo = (DwgObjectOffset) dwgFile
367
					.getDwgObjectOffsets().get(i);
368
			
369
			DwgObject obj = readDwgObject(doo.getOffset(), i);
370
			/*
371
			 * azabala: las entidades DWG no implementadas no nos aportan nada
372
			 * (aunque la sigo leyendo por si aparecen problemas de puntero de
373
			 * fichero) No considero por tanto los DwgObject if (obj != null) {
374
			 * dwgFile.addDwgObject(obj); }
375
			 *	
376
			 * paco: propongo reconsiderar esto. Si no cargamos todos los objetos
377
			 * podemos tener problemas con las subentities.
378
			 */
379
			if (obj != null && obj.getClass() != DwgObject.class) {
380
				dwgFile.addDwgObject(obj);
381
//			    DwgObject superEnt = dwgFile.getDwgSuperEntity(obj);
382
//			    if(superEnt != null){
383
//			      System.out.println(superEnt.getClass().getName() + "(TIPO " +Integer.toHexString(superEnt.getType())+") ES SUPERENTITY DE "+obj.getClass().getName());
384
			    } 
365
				 try{
366
					DwgObjectOffset doo = (DwgObjectOffset) dwgFile
367
							.getDwgObjectOffsets().get(i);
385 368

  
386
//			}
387
		}
369
					DwgObject obj = readDwgObject(doo.getOffset(), i);
370
					/*
371
					 * azabala: las entidades DWG no implementadas no nos aportan nada
372
					 * (aunque la sigo leyendo por si aparecen problemas de puntero de
373
					 * fichero) No considero por tanto los DwgObject if (obj != null) {
374
					 * dwgFile.addDwgObject(obj); }
375
					 *
376
					 * paco: propongo reconsiderar esto. Si no cargamos todos los objetos
377
					 * podemos tener problemas con las subentities.
378
					 */
379
					if (obj != null && obj.getClass() != DwgObject.class) {
380
						dwgFile.addDwgObject(obj);
381
					}
382
				}catch(Exception e){
383
					logger.error(e);
384
					continue;
385
				}
386
			}//for
387

  
388 388
	}
389
	
390 389

  
391 390

  
391

  
392 392
	/**
393 393
	 * Reads the header of an object in a DWG file Version 15
394
	 * 
394
	 *
395 395
	 * @param data
396 396
	 *            Array of unsigned bytes obtained from the DWG binary file
397 397
	 * @param offset
......
414 414
		bitPos = ((Integer) v.get(0)).intValue();
415 415
		int rnum = ((Integer) v.get(1)).intValue();
416 416
		dwgObject.setNumReactors(rnum);
417
		
417

  
418 418
		v = DwgUtil.testBit(data, bitPos);
419 419
		bitPos = ((Integer) v.get(0)).intValue();
420 420
		boolean nolinks = ((Boolean) v.get(1)).booleanValue();
......
448 448

  
449 449
	/**
450 450
	 * Reads the tail of an object in a DWG file Version 15
451
	 * 
451
	 *
452 452
	 * @param data
453 453
	 *            Array of bytes obtained from the DWG binary file
454 454
	 * @param offset
455 455
	 *            Offset for this array of bytes
456 456
	 * @return int New offset
457
	 * @throws CorruptedDwgEntityException 
458
	 * @throws RuntimeException 
457
	 * @throws CorruptedDwgEntityException
458
	 * @throws RuntimeException
459 459
	 */
460 460
	public int readObjectTailer(int[] data, int offset, DwgObject dwgObject) throws RuntimeException, CorruptedDwgEntityException {
461 461
		int bitPos = offset;
......
466 466
			DwgHandleReference subEntityHandle = new DwgHandleReference();
467 467
			bitPos = subEntityHandle.read(data, bitPos);
468 468
			dwgObject.setSubEntityHandle(subEntityHandle);
469
//			System.out.println("subEntityHandle: code = "+subEntityHandle.getCode()+" offset = "+subEntityHandle.getOffset());
470 469
		}
471 470

  
472 471
		/*
473
		 * Reactors handles TODO No se est?n usando para setear nada en
472
		 * Reactors handles TODO No se estn usando para setear nada en
474 473
		 * DwgObject
475 474
		 */
476 475
		DwgHandleReference reactorHandle;
......
478 477
			reactorHandle = new DwgHandleReference();
479 478
			bitPos = reactorHandle.read(data, bitPos);
480 479
			dwgObject.addReactorHandle(reactorHandle);
481
//			System.out.println("reactorHandle "+i+": code = "+reactorHandle.getCode()+" offset = "+reactorHandle.getOffset());
482 480
		}
483 481

  
484 482
		/*
......
487 485
		DwgHandleReference xDicObjHandle = new DwgHandleReference();
488 486
		bitPos = xDicObjHandle.read(data, bitPos);
489 487
		dwgObject.setXDicObjHandle(xDicObjHandle);
490
//		System.out.println("xDicObjHandle: code = "+xDicObjHandle.getCode()+" offset = "+xDicObjHandle.getOffset());
491
		
488

  
492 489
		/*
493 490
		 * Layer Handle code
494 491
		 */
495
		
492

  
496 493
		DwgHandleReference handle = new DwgHandleReference();
497 494
		bitPos = handle.read(data, bitPos);
498 495
		dwgObject.setLayerHandle(handle);
499
//		System.out.println("layerHandle: code = "+handle.getCode()+" offset = "+handle.getOffset());
500
		
496

  
501 497
		if (!dwgObject.isNoLinks()) {
502 498

  
503 499
			DwgHandleReference previousHandle = new DwgHandleReference();
504 500
			bitPos = previousHandle.read(data, bitPos);
505 501
			dwgObject.setPreviousHandle(previousHandle);
506
//			System.out.println("previousHandle: code = "+previousHandle.getCode()+" offset = "+previousHandle.getOffset());
507
	
502

  
508 503
			DwgHandleReference nextHandle = new DwgHandleReference();
509 504
			bitPos = nextHandle.read(data, bitPos);
510 505
			dwgObject.setNextHandle(nextHandle);
511
//			System.out.println("nextHandle: code = "+nextHandle.getCode()+" offset = "+nextHandle.getOffset());
512 506

  
513 507
		}
514 508

  
......
516 510
			DwgHandleReference lineTypeHandle = new DwgHandleReference();
517 511
			bitPos = lineTypeHandle.read(data, bitPos);
518 512
			dwgObject.setLineTypeHandle(lineTypeHandle);
519
//			System.out.println("lineTypeHandle: code = "+lineTypeHandle.getCode()+" offset = "+lineTypeHandle.getOffset());
520 513

  
521 514
		}
522 515

  
......
524 517
			DwgHandleReference plotStyleHandle = new DwgHandleReference();
525 518
			bitPos = plotStyleHandle.read(data, bitPos);
526 519
			dwgObject.setPlotStyleHandle(plotStyleHandle);
527
//			System.out.println("plotStyleHandle: code = "+plotStyleHandle.getCode()+" offset = "+plotStyleHandle.getOffset());
528 520

  
529 521
		}
530 522
		return bitPos;
......
532 524

  
533 525
	/**
534 526
	 * Return a dwg object from its index in the dwg file
535
	 * 
527
	 *
536 528
	 * @param index
537 529
	 *            of the requested dwg object in the dwg file
538
	 *  
530
	 *
539 531
	 */
540 532
	public DwgObject getDwgObjectByIndex(int index) {
541 533
		DwgObjectOffset doo = (DwgObjectOffset) dwgFile.getDwgObjectOffsets()
......
543 535
		return readDwgObject(doo.getOffset(), index);
544 536
	}
545 537

  
546
	
538

  
547 539
	/**
548 540
	 * Reads a dwg drawing entity (dwg object) given its offset in the file
549 541
	 */
......
596 588
					return null;
597 589
				}
598 590
			}//if obj == null
599
			
600
			
591

  
592

  
601 593
			v = DwgUtil.getRawLong(data, bitPos);
602 594
			bitPos = ((Integer) v.get(0)).intValue();
603 595
			int objBSize = ((Integer) v.get(1)).intValue();
......
606 598
			DwgHandleReference entityHandle = new DwgHandleReference();
607 599
			bitPos = entityHandle.read(data, bitPos);
608 600
			obj.setHandle(entityHandle);
609
//			System.out.println("entityHandle:code = " + entityHandle.getCode() +" offset = "+entityHandle.getOffset());
610 601

  
611 602
			v = DwgUtil.readExtendedData(data, bitPos);
612 603
			bitPos = ((Integer) v.get(0)).intValue();
......
634 625
			}
635 626
				if(obj.getClass() != DwgObject.class)
636 627
					readSpecificObject(obj, data, bitPos);
637
//				else
638
//					System.out.println("Dwg Object desconocido:"+obj.getType());
639 628
		} catch (RuntimeException e) {
640 629
			e.printStackTrace();
641 630
		} catch (CorruptedDwgEntityException e) {
642 631
			// TODO Auto-generated catch block
643 632
			e.printStackTrace();
644
			return null;	
633
			return null;
645 634
		}
646 635
		return obj;
647 636
	}
......
649 638
	/*
650 639
	 * TODO Esto est? pesimamente dise?ado. Cada objeto DwgObject debe tener un
651 640
	 * metodo readSpecificObject(data,bitPos)
652
	 *  
641
	 *
653 642
	 */
654 643
	protected void readSpecificObject(DwgObject obj, int[] data, int bitPos)
655 644
			throws RuntimeException, CorruptedDwgEntityException {
......
662 651
				logger.warn("No se ha implementado la lectura de "+obj.getClass().getName()+", code="+obj.getType());
663 652
			}
664 653
	}
665
	
666
	
654

  
655

  
667 656
	//TODO PROBAR, ESTA COPIADO A PELO DE DWG13-14. SI VALE, LLEVAR A UNA
668 657
	//CLASE ABSTRACTA
669 658
	protected void readHeaders() {
......
920 909

  
921 910
			val = DwgUtil.getBitShort(intData, bitPos);
922 911
			bitPos = ((Integer) val.get(0)).intValue();
923
			if (dwgFile.getDwgVersion() == "R14")
924
				dwgFile.setHeader("PROXYGRAPH", val.get(1));
925
			else
926
				dwgFile.setHeader("SAVEIMAGES", val.get(1));
912
//			if (dwgFile.getDwgVersion() == "R14")
913
			dwgFile.setHeader("PROXYGRAPH", val.get(1));
914
//			else
915
//				dwgFile.setHeader("SAVEIMAGES", val.get(1));
927 916

  
928 917
//			val = DwgUtil.getBitShort(intData, bitPos);
929 918
//			bitPos = ((Integer) val.get(0)).intValue();
......
1137 1126
			val = DwgUtil.getBitLong(intData, bitPos);
1138 1127
			bitPos = ((Integer) val.get(0)).intValue();
1139 1128
			tdcreate[0] = ((Integer) val.get(1)).intValue();
1129

  
1140 1130
			val = DwgUtil.getBitLong(intData, bitPos);
1141 1131
			bitPos = ((Integer) val.get(0)).intValue();
1142 1132
			tdcreate[1] = ((Integer) val.get(1)).intValue();
......
1146 1136
			val = DwgUtil.getBitLong(intData, bitPos);
1147 1137
			bitPos = ((Integer) val.get(0)).intValue();
1148 1138
			tdupdate[0] = ((Integer) val.get(1)).intValue();
1139

  
1149 1140
			val = DwgUtil.getBitLong(intData, bitPos);
1150 1141
			bitPos = ((Integer) val.get(0)).intValue();
1151 1142
			tdupdate[1] = ((Integer) val.get(1)).intValue();
......
1155 1146
			val = DwgUtil.getBitLong(intData, bitPos);
1156 1147
			bitPos = ((Integer) val.get(0)).intValue();
1157 1148
			tdindwg[0] = ((Integer) val.get(1)).intValue();
1149

  
1158 1150
			val = DwgUtil.getBitLong(intData, bitPos);
1159 1151
			bitPos = ((Integer) val.get(0)).intValue();
1160 1152
			tdindwg[1] = ((Integer) val.get(1)).intValue();
......
1211 1203
			val = DwgUtil.getBitDouble(intData, bitPos);
1212 1204
			bitPos = ((Integer) val.get(0)).intValue();
1213 1205
			dwgFile.setHeader("PSVPSCALE", val.get(1));
1214
							
1215
			
1206

  
1207

  
1216 1208
			double[] spaces1 = new double[3];
1217 1209
			val = DwgUtil.getBitDouble(intData, bitPos);
1218 1210
			bitPos = ((Integer) val.get(0)).intValue();
......
1313 1305
			dwgFile.setHeader("PSPACE_UCSNAME", new Integer(intHandle));
1314 1306

  
1315 1307
			///DWG 2000 ONLY
1316
			
1308

  
1317 1309
			val = DwgUtil.getHandle(intData, bitPos);
1318 1310
			bitPos = ((Integer) val.get(0)).intValue();
1319 1311
			intHandle = DwgUtil.handleToInt(val);
1320 1312
			dwgFile.setHeader("PUCSBASE", new Integer(intHandle));
1321
			
1313

  
1322 1314
			val = DwgUtil.getBitShort(intData, bitPos);
1323 1315
			bitPos = ((Integer) val.get(0)).intValue();
1324
			dwgFile.setHeader("PUCSBASE", val.get(1));
1325
			
1316
			dwgFile.setHeader("PUCSORTHOVIEW", val.get(1));
1317

  
1326 1318
			val = DwgUtil.getHandle(intData, bitPos);
1327 1319
			bitPos = ((Integer) val.get(0)).intValue();
1328 1320
			intHandle = DwgUtil.handleToInt(val);
1329 1321
			dwgFile.setHeader("PUCSORTHOREF", new Integer(intHandle));
1330
			
1322

  
1331 1323
			double[] pucsorgtop = new double[3];
1332 1324
			val = DwgUtil.getBitDouble(intData, bitPos);
1333 1325
			bitPos = ((Integer) val.get(0)).intValue();
......
1339 1331
			bitPos = ((Integer) val.get(0)).intValue();
1340 1332
			pucsorgtop[2] = ((Double) val.get(1)).doubleValue();
1341 1333
			dwgFile.setHeader("PUCSORGTOP", pucsorgtop);
1342
				
1334

  
1343 1335
			double[] pucsorgbottom = new double[3];
1344 1336
			val = DwgUtil.getBitDouble(intData, bitPos);
1345 1337
			bitPos = ((Integer) val.get(0)).intValue();
......
1351 1343
			bitPos = ((Integer) val.get(0)).intValue();
1352 1344
			pucsorgbottom[2] = ((Double) val.get(1)).doubleValue();
1353 1345
			dwgFile.setHeader("PUCSORGBOTTOM", pucsorgbottom);
1354
			
1346

  
1355 1347
			double[] pucsorgleft = new double[3];
1356 1348
			val = DwgUtil.getBitDouble(intData, bitPos);
1357 1349
			bitPos = ((Integer) val.get(0)).intValue();
......
1363 1355
			bitPos = ((Integer) val.get(0)).intValue();
1364 1356
			pucsorgleft[2] = ((Double) val.get(1)).doubleValue();
1365 1357
			dwgFile.setHeader("PUCSORGLEFT", pucsorgleft);
1366
				
1358

  
1367 1359
			double[] pucsorgright = new double[3];
1368 1360
			val = DwgUtil.getBitDouble(intData, bitPos);
1369 1361
			bitPos = ((Integer) val.get(0)).intValue();
......
1375 1367
			bitPos = ((Integer) val.get(0)).intValue();
1376 1368
			pucsorgright[2] = ((Double) val.get(1)).doubleValue();
1377 1369
			dwgFile.setHeader("PUCSORGRIGHT", pucsorgright);
1378
			
1370

  
1379 1371
			double[] pucsorgfront = new double[3];
1380 1372
			val = DwgUtil.getBitDouble(intData, bitPos);
1381 1373
			bitPos = ((Integer) val.get(0)).intValue();
......
1387 1379
			bitPos = ((Integer) val.get(0)).intValue();
1388 1380
			pucsorgfront[2] = ((Double) val.get(1)).doubleValue();
1389 1381
			dwgFile.setHeader("PUCSORGFRONT", pucsorgfront);
1390
			
1382

  
1391 1383
			double[] pucsorgback = new double[3];
1392 1384
			val = DwgUtil.getBitDouble(intData, bitPos);
1393 1385
			bitPos = ((Integer) val.get(0)).intValue();
......
1398 1390
			val = DwgUtil.getBitDouble(intData, bitPos);
1399 1391
			bitPos = ((Integer) val.get(0)).intValue();
1400 1392
			pucsorgback[2] = ((Double) val.get(1)).doubleValue();
1401
			dwgFile.setHeader("PUCSORGBACK", pucsorgback);	
1402
				
1403
			
1393
			dwgFile.setHeader("PUCSORGBACK", pucsorgback);
1394

  
1395

  
1404 1396
			//COMMON
1405 1397
			double[] spaces9 = new double[6];
1406 1398
			val = DwgUtil.getBitDouble(intData, bitPos);
......
1502 1494
			dwgFile.setHeader("MSPACE_UCSNAME", new Integer(intHandle));
1503 1495

  
1504 1496
			//DWG 2000
1505
			
1497

  
1506 1498
			val = DwgUtil.getHandle(intData, bitPos);
1507 1499
			bitPos = ((Integer) val.get(0)).intValue();
1508 1500
			intHandle = DwgUtil.handleToInt(val);
1509 1501
			dwgFile.setHeader("UCSBASE", new Integer(intHandle));
1510
			
1502

  
1511 1503
			val = DwgUtil.getBitShort(intData, bitPos);
1512 1504
			bitPos = ((Integer) val.get(0)).intValue();
1513 1505
			dwgFile.setHeader("UCSORTHOVIEW", val.get(1));
1514
			
1506

  
1515 1507
			val = DwgUtil.getHandle(intData, bitPos);
1516 1508
			bitPos = ((Integer) val.get(0)).intValue();
1517 1509
			intHandle = DwgUtil.handleToInt(val);
1518 1510
			dwgFile.setHeader("UCSORTHOREF", new Integer(intHandle));
1519
			
1511

  
1520 1512
			double[] ucsorgtop = new double[3];
1521 1513
			val = DwgUtil.getBitDouble(intData, bitPos);
1522 1514
			bitPos = ((Integer) val.get(0)).intValue();
......
1527 1519
			val = DwgUtil.getBitDouble(intData, bitPos);
1528 1520
			bitPos = ((Integer) val.get(0)).intValue();
1529 1521
			ucsorgtop[2] = ((Double) val.get(1)).doubleValue();
1530
			dwgFile.setHeader("UCSORGTOP", ucsorgtop);	
1531
			
1522
			dwgFile.setHeader("UCSORGTOP", ucsorgtop);
1523

  
1532 1524
			double[] ucsorgbottom = new double[3];
1533 1525
			val = DwgUtil.getBitDouble(intData, bitPos);
1534 1526
			bitPos = ((Integer) val.get(0)).intValue();
......
1540 1532
			bitPos = ((Integer) val.get(0)).intValue();
1541 1533
			ucsorgbottom[2] = ((Double) val.get(1)).doubleValue();
1542 1534
			dwgFile.setHeader("UCSORGBOTTOM", ucsorgbottom);
1543
			
1535

  
1544 1536
			double[] ucsorgleft = new double[3];
1545 1537
			val = DwgUtil.getBitDouble(intData, bitPos);
1546 1538
			bitPos = ((Integer) val.get(0)).intValue();
......
1551 1543
			val = DwgUtil.getBitDouble(intData, bitPos);
1552 1544
			bitPos = ((Integer) val.get(0)).intValue();
1553 1545
			ucsorgleft[2] = ((Double) val.get(1)).doubleValue();
1554
			dwgFile.setHeader("UCSORGLEFT", ucsorgleft);	
1555
			
1546
			dwgFile.setHeader("UCSORGLEFT", ucsorgleft);
1547

  
1556 1548
			double[] ucsorgright = new double[3];
1557 1549
			val = DwgUtil.getBitDouble(intData, bitPos);
1558 1550
			bitPos = ((Integer) val.get(0)).intValue();
......
1563 1555
			val = DwgUtil.getBitDouble(intData, bitPos);
1564 1556
			bitPos = ((Integer) val.get(0)).intValue();
1565 1557
			ucsorgright[2] = ((Double) val.get(1)).doubleValue();
1566
			dwgFile.setHeader("UCSORGRIGHT", ucsorgright);	
1567
			
1558
			dwgFile.setHeader("UCSORGRIGHT", ucsorgright);
1559

  
1568 1560
			double[] ucsorgfront = new double[3];
1569 1561
			val = DwgUtil.getBitDouble(intData, bitPos);
1570 1562
			bitPos = ((Integer) val.get(0)).intValue();
......
1575 1567
			val = DwgUtil.getBitDouble(intData, bitPos);
1576 1568
			bitPos = ((Integer) val.get(0)).intValue();
1577 1569
			ucsorgfront[2] = ((Double) val.get(1)).doubleValue();
1578
			dwgFile.setHeader("UCSORGFRONT", ucsorgfront);	
1579
			
1570
			dwgFile.setHeader("UCSORGFRONT", ucsorgfront);
1571

  
1580 1572
			double[] ucsorgback = new double[3];
1581 1573
			val = DwgUtil.getBitDouble(intData, bitPos);
1582 1574
			bitPos = ((Integer) val.get(0)).intValue();
......
1587 1579
			val = DwgUtil.getBitDouble(intData, bitPos);
1588 1580
			bitPos = ((Integer) val.get(0)).intValue();
1589 1581
			ucsorgback[2] = ((Double) val.get(1)).doubleValue();
1590
			dwgFile.setHeader("UCSORGBACK", ucsorgback);	
1591
			
1582
			dwgFile.setHeader("UCSORGBACK", ucsorgback);
1583

  
1592 1584
			val = DwgUtil.getTextString(intData, bitPos);
1593 1585
			bitPos = ((Integer) val.get(0)).intValue();
1594
			dwgFile.setHeader("DIMPOST", val.get(1));	
1595
				
1586
			dwgFile.setHeader("DIMPOST", val.get(1));
1587

  
1596 1588
			val = DwgUtil.getTextString(intData, bitPos);
1597 1589
			bitPos = ((Integer) val.get(0)).intValue();
1598
			dwgFile.setHeader("DIMAPOST", val.get(1));	
1599
			
1600
				
1590
			dwgFile.setHeader("DIMAPOST", val.get(1));
1591

  
1592

  
1601 1593
			//Not readed in dwg 2000
1602
			
1594

  
1603 1595
//			val = DwgUtil.testBit(intData, bitPos);
1604 1596
//			bitPos = ((Integer) val.get(0)).intValue();
1605 1597
//			dwgFile.setHeader("DIMTOL", val.get(1));
......
1758 1750
			dwgFile.setHeader("DIMTM", val.get(1));
1759 1751

  
1760 1752
			//DWG 2000 only
1761
			
1753

  
1762 1754
			val = DwgUtil.testBit(intData, bitPos);
1763 1755
			bitPos = ((Integer) val.get(0)).intValue();
1764 1756
			dwgFile.setHeader("DIMTOL", val.get(1));
1765
			
1757

  
1766 1758
			val = DwgUtil.testBit(intData, bitPos);
1767 1759
			bitPos = ((Integer) val.get(0)).intValue();
1768 1760
			dwgFile.setHeader("DIMLIM", val.get(1));
1769
			
1761

  
1770 1762
			val = DwgUtil.testBit(intData, bitPos);
1771 1763
			bitPos = ((Integer) val.get(0)).intValue();
1772 1764
			dwgFile.setHeader("DIMTIH", val.get(1));
1773
			
1765

  
1774 1766
			val = DwgUtil.testBit(intData, bitPos);
1775 1767
			bitPos = ((Integer) val.get(0)).intValue();
1776 1768
			dwgFile.setHeader("DIMTOH", val.get(1));
1777
			
1769

  
1778 1770
			val = DwgUtil.testBit(intData, bitPos);
1779 1771
			bitPos = ((Integer) val.get(0)).intValue();
1780 1772
			dwgFile.setHeader("DIMSE1", val.get(1));
1781
			
1773

  
1782 1774
			val = DwgUtil.testBit(intData, bitPos);
1783 1775
			bitPos = ((Integer) val.get(0)).intValue();
1784 1776
			dwgFile.setHeader("DIMSE2", val.get(1));
1785
			
1777

  
1786 1778
			val = DwgUtil.getBitShort(intData, bitPos);
1787 1779
			bitPos = ((Integer) val.get(0)).intValue();
1788 1780
			dwgFile.setHeader("DIMTAD", val.get(1));
1789
			
1781

  
1790 1782
			val = DwgUtil.getBitShort(intData, bitPos);
1791 1783
			bitPos = ((Integer) val.get(0)).intValue();
1792 1784
			dwgFile.setHeader("DIMZIN", val.get(1));
1793
			
1785

  
1794 1786
			val = DwgUtil.getBitShort(intData, bitPos);
1795 1787
			bitPos = ((Integer) val.get(0)).intValue();
1796 1788
			dwgFile.setHeader("DIMAZIN", val.get(1));
1797
				
1789

  
1798 1790
			//common
1799
			
1791

  
1800 1792
			val = DwgUtil.getBitDouble(intData, bitPos);
1801 1793
			bitPos = ((Integer) val.get(0)).intValue();
1802 1794
			dwgFile.setHeader("DIMTXT", val.get(1));
......
1830 1822
			dwgFile.setHeader("DIMGAP", val.get(1));
1831 1823

  
1832 1824
			//not readed in DWG 2000
1833
			
1825

  
1834 1826
//			val = DwgUtil.getTextString(intData, bitPos);
1835 1827
//			bitPos = ((Integer) val.get(0)).intValue();
1836 1828
//			dwgFile.setHeader("DIMPOST", val.get(1));
......
1853 1845

  
1854 1846
			val = DwgUtil.getBitDouble(intData, bitPos);
1855 1847
			bitPos = ((Integer) val.get(0)).intValue();
1856
			dwgFile.setHeader("DIMALTRND", val.get(1));	
1857
			
1848
			dwgFile.setHeader("DIMALTRND", val.get(1));
1849

  
1858 1850
			val = DwgUtil.testBit(intData, bitPos);
1859 1851
			bitPos = ((Integer) val.get(0)).intValue();
1860 1852
			dwgFile.setHeader("DIMALT", val.get(1));
1861
			
1853

  
1862 1854
			val = DwgUtil.getBitShort(intData, bitPos);
1863 1855
			bitPos = ((Integer) val.get(0)).intValue();
1864 1856
			dwgFile.setHeader("DIMALTD", val.get(1));
1865
				
1857

  
1866 1858
			val = DwgUtil.testBit(intData, bitPos);
1867 1859
			bitPos = ((Integer) val.get(0)).intValue();
1868 1860
			dwgFile.setHeader("DIMTOFL", val.get(1));
1869
			
1861

  
1870 1862
			val = DwgUtil.testBit(intData, bitPos);
1871 1863
			bitPos = ((Integer) val.get(0)).intValue();
1872 1864
			dwgFile.setHeader("DIMSAH", val.get(1));
1873
			
1865

  
1874 1866
			val = DwgUtil.testBit(intData, bitPos);
1875 1867
			bitPos = ((Integer) val.get(0)).intValue();
1876 1868
			dwgFile.setHeader("DIMTIX", val.get(1));
1877
			
1869

  
1878 1870
			val = DwgUtil.testBit(intData, bitPos);
1879 1871
			bitPos = ((Integer) val.get(0)).intValue();
1880 1872
			dwgFile.setHeader("DIMSOXD", val.get(1));
1881
			
1873

  
1882 1874
			//common
1883 1875
			val = DwgUtil.getBitShort(intData, bitPos);
1884 1876
			bitPos = ((Integer) val.get(0)).intValue();
......
1896 1888
			val = DwgUtil.getBitShort(intData, bitPos);
1897 1889
			bitPos = ((Integer) val.get(0)).intValue();
1898 1890
			dwgFile.setHeader("DIMADEC", val.get(1));
1899
			
1891

  
1900 1892
			val = DwgUtil.getBitShort(intData, bitPos);
1901 1893
			bitPos = ((Integer) val.get(0)).intValue();
1902 1894
			dwgFile.setHeader("DIMDEC", val.get(1));
1903
			
1895

  
1904 1896
			val = DwgUtil.getBitShort(intData, bitPos);
1905 1897
			bitPos = ((Integer) val.get(0)).intValue();
1906 1898
			dwgFile.setHeader("DIMTDEC", val.get(1));
1907
			
1899

  
1908 1900
			val = DwgUtil.getBitShort(intData, bitPos);
1909 1901
			bitPos = ((Integer) val.get(0)).intValue();
1910 1902
			dwgFile.setHeader("DIMALTU", val.get(1));
1911
			
1903

  
1912 1904
			val = DwgUtil.getBitShort(intData, bitPos);
1913 1905
			bitPos = ((Integer) val.get(0)).intValue();
1914 1906
			dwgFile.setHeader("DIMALTTD", val.get(1));
1915
			
1907

  
1916 1908
			val = DwgUtil.getBitShort(intData, bitPos);
1917 1909
			bitPos = ((Integer) val.get(0)).intValue();
1918 1910
			dwgFile.setHeader("DIMAUNIT", val.get(1));
1919
			
1911

  
1920 1912
			val = DwgUtil.getBitShort(intData, bitPos);
1921 1913
			bitPos = ((Integer) val.get(0)).intValue();
1922 1914
			dwgFile.setHeader("DIMFRAC", val.get(1));
1923
			
1915

  
1924 1916
			val = DwgUtil.getBitShort(intData, bitPos);
1925 1917
			bitPos = ((Integer) val.get(0)).intValue();
1926 1918
			dwgFile.setHeader("DIMLUNIT", val.get(1));
1927
			
1919

  
1928 1920
			val = DwgUtil.getBitShort(intData, bitPos);
1929 1921
			bitPos = ((Integer) val.get(0)).intValue();
1930 1922
			dwgFile.setHeader("DIMDSEP", val.get(1));
1931
			
1923

  
1932 1924
			val = DwgUtil.getBitShort(intData, bitPos);
1933 1925
			bitPos = ((Integer) val.get(0)).intValue();
1934 1926
			dwgFile.setHeader("DIMTMOVE", val.get(1));
1935
			
1927

  
1936 1928
			val = DwgUtil.getBitShort(intData, bitPos);
1937 1929
			bitPos = ((Integer) val.get(0)).intValue();
1938 1930
			dwgFile.setHeader("DIMJUST", val.get(1));
1939
			
1931

  
1940 1932
			val = DwgUtil.testBit(intData, bitPos);
1941 1933
			bitPos = ((Integer) val.get(0)).intValue();
1942 1934
			dwgFile.setHeader("DIMSD1", val.get(1));
1943
				
1935

  
1944 1936
			val = DwgUtil.testBit(intData, bitPos);
1945 1937
			bitPos = ((Integer) val.get(0)).intValue();
1946 1938
			dwgFile.setHeader("DIMSD2", val.get(1));
1947
			
1948
			
1939

  
1940

  
1949 1941
			val = DwgUtil.getBitShort(intData, bitPos);
1950 1942
			bitPos = ((Integer) val.get(0)).intValue();
1951 1943
			dwgFile.setHeader("DIMTOLJ", val.get(1));
1952
			
1944

  
1953 1945
			val = DwgUtil.getBitShort(intData, bitPos);
1954 1946
			bitPos = ((Integer) val.get(0)).intValue();
1955 1947
			dwgFile.setHeader("DIMTZIN", val.get(1));
1956
			
1948

  
1957 1949
			val = DwgUtil.getBitShort(intData, bitPos);
1958 1950
			bitPos = ((Integer) val.get(0)).intValue();
1959 1951
			dwgFile.setHeader("DIMALTZ", val.get(1));
1960
			
1952

  
1961 1953
			val = DwgUtil.getBitShort(intData, bitPos);
1962 1954
			bitPos = ((Integer) val.get(0)).intValue();
1963 1955
			dwgFile.setHeader("DIMALTTZ", val.get(1));
1964
				
1956

  
1965 1957
			val = DwgUtil.testBit(intData, bitPos);
1966 1958
			bitPos = ((Integer) val.get(0)).intValue();
1967 1959
			dwgFile.setHeader("DIMUPT", val.get(1));
1968
			
1960

  
1969 1961
			val = DwgUtil.getBitShort(intData, bitPos);
1970 1962
			bitPos = ((Integer) val.get(0)).intValue();
1971 1963
			dwgFile.setHeader("DIMFIT", val.get(1));
1972
			
1964

  
1973 1965
			val = DwgUtil.getHandle(intData, bitPos);
1974 1966
			bitPos = ((Integer) val.get(0)).intValue();
1975 1967
			intHandle = DwgUtil.handleToInt(val);
1976 1968
			dwgFile.setHeader("DIMTXTSTY", new Integer(intHandle));
1977
				
1969

  
1978 1970
			val = DwgUtil.getHandle(intData, bitPos);
1979 1971
			bitPos = ((Integer) val.get(0)).intValue();
1980 1972
			intHandle = DwgUtil.handleToInt(val);
1981 1973
			dwgFile.setHeader("DIMLDRBLK", new Integer(intHandle));
1982
			
1974

  
1983 1975
			val = DwgUtil.getHandle(intData, bitPos);
1984 1976
			bitPos = ((Integer) val.get(0)).intValue();
1985 1977
			intHandle = DwgUtil.handleToInt(val);
1986 1978
			dwgFile.setHeader("DIMBLK", new Integer(intHandle));
1987
			
1979

  
1988 1980
			val = DwgUtil.getHandle(intData, bitPos);
1989 1981
			bitPos = ((Integer) val.get(0)).intValue();
1990 1982
			intHandle = DwgUtil.handleToInt(val);
1991 1983
			dwgFile.setHeader("DIMBLK1", new Integer(intHandle));
1992
			
1984

  
1993 1985
			val = DwgUtil.getHandle(intData, bitPos);
1994 1986
			bitPos = ((Integer) val.get(0)).intValue();
1995 1987
			intHandle = DwgUtil.handleToInt(val);
1996 1988
			dwgFile.setHeader("DIMBLK2", new Integer(intHandle));
1997
			
1989

  
1998 1990
			val = DwgUtil.getBitShort(intData, bitPos);
1999 1991
			bitPos = ((Integer) val.get(0)).intValue();
2000 1992
			dwgFile.setHeader("DIMLWD", val.get(1));
2001
			
1993

  
2002 1994
			val = DwgUtil.getBitShort(intData, bitPos);
2003 1995
			bitPos = ((Integer) val.get(0)).intValue();
2004 1996
			dwgFile.setHeader("DIMLWE", val.get(1));
2005
				
1997

  
2006 1998
			//common
2007 1999
			val = DwgUtil.getHandle(intData, bitPos);
2008 2000
			bitPos = ((Integer) val.get(0)).intValue();
......
2022 2014
			val = DwgUtil.getHandle(intData, bitPos);
2023 2015
			bitPos = ((Integer) val.get(0)).intValue();
2024 2016
			intHandle = DwgUtil.handleToInt(val);
2025
			dwgFile
2026
					.setHeader("LINETYPE_CONTROL_OBJECT",
2027
							new Integer(intHandle));
2017
			dwgFile.setHeader("LINETYPE_CONTROL_OBJECT",new Integer(intHandle));
2028 2018

  
2029 2019
			val = DwgUtil.getHandle(intData, bitPos);
2030 2020
			bitPos = ((Integer) val.get(0)).intValue();
......
2053 2043
							new Integer(intHandle));
2054 2044

  
2055 2045
			//TODO Se lee para 2000? (en la doc. dice r13-r15)
2046
			//Se supone que sí r15 == 2000
2056 2047
			val = DwgUtil.getHandle(intData, bitPos);
2057 2048
			bitPos = ((Integer) val.get(0)).intValue();
2058 2049
			intHandle = DwgUtil.handleToInt(val);
......
2075 2066
							new Integer(intHandle));
2076 2067

  
2077 2068
			//only dwg 2000
2078
			
2069

  
2079 2070
			//unknown bitshort
2080 2071
			val = DwgUtil.getBitShort(intData, bitPos);
2081 2072
			bitPos = ((Integer) val.get(0)).intValue();
2082
			
2073

  
2083 2074
//			unknown bitshort
2084 2075
			val = DwgUtil.getBitShort(intData, bitPos);
2085 2076
			bitPos = ((Integer) val.get(0)).intValue();
2086
			
2077

  
2087 2078
			val = DwgUtil.getTextString(intData, bitPos);
2088 2079
			bitPos = ((Integer) val.get(0)).intValue();
2089 2080
			dwgFile.setHeader("HYPERLINKBASE",
2090 2081
					val.get(1));
2091
			
2082

  
2092 2083
			val = DwgUtil.getTextString(intData, bitPos);
2093 2084
			bitPos = ((Integer) val.get(0)).intValue();
2094 2085
			dwgFile.setHeader("STYLESHEET",
2095 2086
					val.get(1));
2096
			
2087

  
2097 2088
			val = DwgUtil.getHandle(intData, bitPos);
2098 2089
			bitPos = ((Integer) val.get(0)).intValue();
2099 2090
			intHandle = DwgUtil.handleToInt(val);
2100 2091
			dwgFile.setHeader("LAYOUT_DICTIONARY",
2101 2092
							new Integer(intHandle));
2102
			
2093

  
2103 2094
			val = DwgUtil.getHandle(intData, bitPos);
2104 2095
			bitPos = ((Integer) val.get(0)).intValue();
2105 2096
			intHandle = DwgUtil.handleToInt(val);
2106 2097
			dwgFile.setHeader("PLOT_SETTINGS_DICTIONARY",
2107 2098
							new Integer(intHandle));
2108
			
2099

  
2109 2100
			val = DwgUtil.getHandle(intData, bitPos);
2110 2101
			bitPos = ((Integer) val.get(0)).intValue();
2111 2102
			intHandle = DwgUtil.handleToInt(val);
2112 2103
			dwgFile.setHeader("PLOT_STYLES_DICTIONARY",
2113 2104
							new Integer(intHandle));
2114
			
2105

  
2115 2106
			/*
2116 2107
			 Flags:
2117 2108
				CELWEIGHT	Flags & 0x001F
......
2127 2118
			bitPos = ((Integer) val.get(0)).intValue();
2128 2119
			dwgFile.setHeader("FLAGS",
2129 2120
					val.get(1));
2130
			
2121

  
2131 2122
			val = DwgUtil.getBitShort(intData, bitPos);
2132 2123
			bitPos = ((Integer) val.get(0)).intValue();
2133 2124
			dwgFile.setHeader("INSUNITS",
2134 2125
					val.get(1));
2135
			
2126

  
2136 2127
			val = DwgUtil.getBitShort(intData, bitPos);
2137 2128
			bitPos = ((Integer) val.get(0)).intValue();
2138 2129
			dwgFile.setHeader("CEPSNTYPE",
2139 2130
					val.get(1));
2140
				
2131

  
2141 2132
			if(((Integer)val.get(1)).intValue() == 3){
2142 2133
				val = DwgUtil.getHandle(intData, bitPos);
2143 2134
				bitPos = ((Integer) val.get(0)).intValue();
......
2145 2136
				dwgFile.setHeader("CPSNID",
2146 2137
								new Integer(intHandle));
2147 2138
			}
2148
			
2139

  
2149 2140
			val = DwgUtil.getTextString(intData, bitPos);
2150 2141
			bitPos = ((Integer) val.get(0)).intValue();
2151 2142
			dwgFile.setHeader("FINGERPRINTGUID",
2152 2143
					val.get(1));
2153
			
2144

  
2154 2145
			val = DwgUtil.getTextString(intData, bitPos);
2155 2146
			bitPos = ((Integer) val.get(0)).intValue();
2156 2147
			dwgFile.setHeader("VERSIONGUID",
2157
					val.get(1));	
2158
				
2159
			
2148
					val.get(1));
2149

  
2150

  
2160 2151
			val = DwgUtil.getHandle(intData, bitPos);
2161 2152
			bitPos = ((Integer) val.get(0)).intValue();
2162 2153
			intHandle = DwgUtil.handleToInt(val);
......
2191 2182
		}
2192 2183
	}
2193 2184

  
2194
	
2195
	
2196
	
2185

  
2186

  
2187

  
2197 2188
}
trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/readers/DwgFileVR2004Reader.java
1 1
/*
2 2
 * Created on 09-ene-2007
3 3
 *
4
 * gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
4
 * gvSIG. Sistema de Informaci�n Geogr�fica de la Generalitat Valenciana
5 5
 *
6 6
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
7 7
 *
......
23 23
 *
24 24
 *  Generalitat Valenciana
25 25
 *   Conselleria d'Infraestructures i Transport
26
 *   Av. Blasco Ib??ez, 50
26
 *   Av. Blasco Ib��ez, 50
27 27
 *   46010 VALENCIA
28 28
 *   SPAIN
29 29
 *
......
44 44

  
45 45
package com.iver.cit.jdwglib.dwg.readers;
46 46

  
47
import java.io.IOException;
47 48
import java.nio.ByteBuffer;
48 49
import java.nio.ByteOrder;
50
import java.util.ArrayList;
51
import java.util.Comparator;
52
import java.util.List;
53
import java.util.TreeSet;
49 54

  
55
import org.apache.log4j.Logger;
56

  
57
import com.iver.cit.jdwglib.dwg.CorruptedDwgEntityException;
58
import com.iver.cit.jdwglib.dwg.DwgClass2004;
59
import com.iver.cit.jdwglib.dwg.DwgFile;
60
import com.iver.cit.jdwglib.dwg.DwgHandleReference;
61
import com.iver.cit.jdwglib.dwg.DwgObject;
62
import com.iver.cit.jdwglib.dwg.DwgObjectFactory;
63
import com.iver.cit.jdwglib.dwg.DwgObjectOffset;
64
import com.iver.cit.jdwglib.dwg.DwgUtil;
65

  
50 66
/**
51 67
 * @author alzabord
52 68
 *
53
 * TODO To change the template for this generated type comment go to
54
 * Window - Preferences - Java - Code Style - Code Templates
69
 * TODO To change the template for this generated type comment go to Window -
70
 * Preferences - Java - Code Style - Code Templates
55 71
 */
56
public class DwgFileVR2004Reader extends DwgFileV15Reader {
57
	protected void readDwgSectionOffsets(ByteBuffer bb) {
58
		bb.position(12);
72
public class DwgFileVR2004Reader implements IDwgFileReader {
73

  
74
	protected DwgFile dwgFile;
75

  
76
	protected ByteBuffer bb;
77

  
78
	static byte[] magicNumber = null;
79

  
80
	private String version = "";
81

  
82
	private byte[] unknowSixBytes;
83

  
84
	private byte[] threeBytes0;
85

  
86
	private byte[] unknowTwoBytes;
87

  
88
	private byte[] eightyTwoBytes0;
89

  
90
	private byte[] encryptedData;
91

  
92
	private byte[] decryptedData;
93

  
94
	private String fileID = "";
95

  
96
	private int rootTreeNodeGap;
97

  
98
	private int lowermostLeftTreeNodeGap;
99

  
100
	private int lowermostRightTreeNodeGap;
101

  
102
	private int lastSectionId; // Last Section identifier
103

  
104
	private int lastSectionAddress; // Last Section Address
105

  
106
	private int SecondHeaderAddress; // Second Header Address
107

  
108
	private int gapAmount; // Number of Gaps
109

  
110
	private int sectionAmount; // Number of Sections
111

  
112
	private int sectionMapId; // Section Map identifier
113

  
114
	private int sectionMapAddress; // Section Map address
115

  
116
	private int sectionInfoId; // Section Info identifier
117

  
118
	private int sectionInfoIndex = 0; // Section Info identifier into the
119

  
120
	// Sections Array
121

  
122
	private int sectionArraySize;
123

  
124
	private int gapArraySize;
125

  
126
	private byte[] generatedSequence;
127

  
128
	private Section[] sections;
129

  
130
	private Gap[] gaps;
131

  
132
	static final int TYPE_SECTION_MAP = 1;
133

  
134
	static final int TYPE_SECTION_INFO = 2;
135

  
136
	private static Logger logger = Logger.getLogger(DwgFileVR2004Reader.class.getName());
137

  
138
	/**
139
	 * Reads the DWG version 2004 format
140
	 *
141
	 * @param dwgFile
142
	 *            Represents the DWG file that we want to read
143
	 * @throws IOException
144
	 *             When DWG file path is wrong
145
	 */
146
	public void read(DwgFile dwgFile, ByteBuffer bb) throws IOException {
147

  
148
		this.dwgFile = dwgFile;
149
		this.bb = bb;
150

  
151
		readDwgR2004FileHeader(bb);
152
		readDwgR2004SectionMap(bb);
153
		readDwgR2004InfoSection(bb);
154
		readDwgR2004Headers(bb);
155
		readDwgR2004Classes(bb);
156
		readDwgR2004ObjectOffsets(bb);
157

  
158
		readDwgR2004Objects();
159

  
160
	}
161

  
162
	protected void readDwgR2004InfoSection(ByteBuffer bb) {
163
		int numDescriptions;
164

  
165
		int sizeOfSection;
166
		int numSections;
167
		int maxDecompressedSize;
168
		int compressed;
169
		int sectionType;
170
		int encrypted;
171
		String sectionName = "";
172

  
173
		int sectionNumber;
174
		int dataSize;
175
		int startOffset;
176

  
177
		char c;
178
		int pos;
179

  
180
		if (sectionInfoIndex == 0) {
181
			logger.error("No se ha encontrado la Section Info en el array de secciones.");
182
		}
183

  
184
		pos = sections[sectionInfoIndex].getAddress(); // we get the address for the Section Info
185

  
186
		bb.position(pos);
187

  
188
		ByteBuffer dData = readSystemSection(bb);
189
		dData.order(ByteOrder.LITTLE_ENDIAN);
190
		dData.position(0);
191

  
192
		/*
193
		 * We start reading the Section Info once decompressed We will find data
194
		 * blocks depending on numDescriptions value
195
		 */
196
		numDescriptions = dData.getInt();
197
		dData.getInt(); // 0x02
198
		dData.getInt(); // 0x00007400
199
		dData.getInt(); // 0x00
200
		dData.getInt(); // unknown
201

  
202
		for (int i = 0; i < numDescriptions; i++) {
203
			sizeOfSection = dData.getInt();
204
			dData.getInt(); // unknown
205
			numSections = dData.getInt();
206
			maxDecompressedSize = dData.getInt();
207
			dData.getInt(); // unknown
208
			compressed = dData.getInt();
209
			sectionType = dData.getInt();
210
			encrypted = dData.getInt();
211
			sectionName = "";
212
			for (int j = 0; j < 64; j++) {
213
				c = (char) dData.get();
214
				sectionName = sectionName + c;
215
			}
216

  
217
			for (int k = 0; k < numSections; k++) {
218
				sectionNumber = dData.getInt(); // index into the Sections Array
219
				dataSize = dData.getInt();
220
				startOffset = dData.getInt();
221
				dData.getInt(); // unknown
222

  
223

  
224
				// We set the name for the Section, so we can localize it by the name
225
				for (int j = 0; j < sectionAmount; j++) {
226
					Section section = sections[j];
227
					if (section.getNumber() == sectionNumber) {
228
						section.setName(sectionName);
229
						section.setSizeOfLogicalSection(sizeOfSection);
230
						section.setDataSize(dataSize);
231
						section.setMaxDecompressedSize(maxDecompressedSize);
232
						section.setCompressed(compressed);
233
						section.setType(sectionType);
234
						section.setEncrypted(encrypted);
235
						section.setStartOffset(startOffset);
236
					}
237
				}
238

  
239
			}
240
		}
241
	}
242

  
243
	/**
244
	 * This function reads the header section of the file, with the encrypted
245
	 * data
246
	 *
247
	 * @param bb
248
	 *            ByteBuffer containing the opened DWG file
249
	 */
250
	protected void readDwgR2004FileHeader(ByteBuffer bb) {
251

  
252
		logger.info("STARTING TO READ DWG FILE.");
59 253
		bb.order(ByteOrder.LITTLE_ENDIAN);
60
		short codePage = bb.getShort();
61
		int count = bb.getInt();
62
		for (int i=0; i<count; i++) {
63
			byte rec = bb.get();
64
			int seek = bb.getInt();
65
			int size = bb.getInt();
66
			if (rec==0) {
67
				dwgFile.addDwgSectionOffset("HEADERS", seek, size);
68
			} else if (rec==1) {
69
				dwgFile.addDwgSectionOffset("CLASSES", seek, size);
70
			} else if (rec==2) {
71
				dwgFile.addDwgSectionOffset("OBJECTS", seek, size);
72
			} else if (rec==3) {
73
				dwgFile.addDwgSectionOffset("UNKNOWN", seek, size);
74
			} else if (rec==4) {
75
				dwgFile.addDwgSectionOffset("R14DATA", seek, size);
76
			} else if (rec==5) {
77
				dwgFile.addDwgSectionOffset("R14REC5", seek, size);
254
		for (int i = 0; i < 6; i++) {
255
			version = version + (char) bb.get();
256
		}
257
		if (!version.equalsIgnoreCase("AC1018")) {
258
			logger.error("Error en la version: " + version);
259
		}
260

  
261
		/*
262
		 * OpenAlliance documentation says we will read 6 0x00 bytes but the
263
		 * sixth one is always 0x4C
264
		 */
265
		unknowSixBytes = new byte[6];
266
		int pos = 6;
267
		for (int i = 0; i < 5; i++) {
268
			unknowSixBytes[i] = bb.get();
269
			if (unknowSixBytes[i] != 0) {
270
				logger.warn("(unknowSixBytes) En la posicion 0x"
271
						+ Integer.toHexString(pos + i)
272
						+ " debería haber un 0, pero hay un 0x"
273
						+ Integer.toHexString(unknowSixBytes[i]));
274
			}
275
		}
276
		pos = 0xB;
277
		unknowSixBytes[5] = bb.get();
278
		if (unknowSixBytes[5] != 0x4C) {
279
			logger.warn("(unknowSixBytes) En la posicion 0x"
280
					+ Integer.toHexString(pos)
281
					+ " debería haber un 0x4C, pero hay un 0x"
282
					+ Integer.toHexString(unknowSixBytes[5]));
283
		}
284

  
285
		bb.get(); // Unknown Byte
286
		bb.getInt(); // previewAddress
287
		bb.get(); // dwgVer
288
		bb.get(); // maintReleaseVer
289
		bb.getShort(); // codepage
290

  
291
		/*
292
		 * OpenAlliance documentation says we will read 3 0x00 bytes but what we
293
		 * always find is 0x00, 0x19 and then 0x4C
294
		 */
295
		threeBytes0 = new byte[3];
296
		pos = 0x15;
297
		bb.get(threeBytes0);
298
		if (threeBytes0[0] != 0x0) {
299
			logger.warn("Posible error leyendo la cabecera del archivo DWG: " +
300
					"En la posicion 0x" + Integer.toHexString(pos)
301
					+ " debería haber un 0x0, pero hay un 0x"
302
					+ Integer.toHexString(threeBytes0[0]));
303
		}
304
		pos = 0x16;
305
		if (threeBytes0[1] != 0x19) {
306
			logger.warn("Posible error leyendo la cabecera del archivo DWG: " +
307
					"En la posicion 0x" + Integer.toHexString(pos)
308
					+ " debería haber un 0x19, pero hay un 0x"
309
					+ Integer.toHexString(threeBytes0[1]));
310
		}
311
		pos = 0x17;
312
		if (threeBytes0[2] != 0x4C) {
313
			logger.warn("Posible error leyendo la cabecera del archivo DWG: " +
314
					"En la posicion 0x" + Integer.toHexString(pos)
315
					+ " debería haber un 0x4C, pero hay un 0x"
316
					+ Integer.toHexString(threeBytes0[2]));
317
		}
318

  
319
		bb.getInt(); // security Type
320
		bb.getInt(); // unknownLong
321
		bb.getInt(); // dwgPropertyAddr
322
		bb.getInt(); // vbaProjectAddr
323
		bb.getInt(); // 0x00000080
324

  
325
		pos = 0x2C;
326

  
327
		unknowTwoBytes = new byte[2];
328
		for (int i = 0; i < 2; i++) {
329
			unknowTwoBytes[i] = bb.get();
330
		}
331
		pos = 0x2E;
332
		eightyTwoBytes0 = new byte[82];
333
		for (int i = 0; i < eightyTwoBytes0.length; i++) {
334
			eightyTwoBytes0[i] = bb.get();
335
			if (eightyTwoBytes0[i] != 0) {
336
				logger.warn("Posible error leyendo la cabecera del archivo DWG: " +
337
						"(eightyTwoBytes0) En la posicion 0x"
338
						+ Integer.toHexString(pos + i)
339
						+ " debería haber un 0, pero hay un 0x"
340
						+ Integer.toHexString(eightyTwoBytes0[i]));
341
			}
342
		}
343

  
344
		int len = 0x6C;
345
		encryptedData = new byte[len];
346
		decryptedData = new byte[len];
347
		if (magicNumber == null) {
348
			DwgFileVR2004Reader.setMagicNumber();
349
		}
350

  
351
		// decryptedData will contain the decrypted sequence after xor'ing the
352
		// encrypted data
353
		for (int i = 0; i < len; i++) {
354
			encryptedData[i] = bb.get();
355
			decryptedData[i] = (byte) (encryptedData[i] ^ magicNumber[i]);
356
		}
357

  
358
		ByteBuffer decryptedDataBB = ByteBuffer.allocate(len);
359
		decryptedDataBB.put(decryptedData);
360
		decryptedDataBB.position(0);
361
		decryptedDataBB.order(ByteOrder.LITTLE_ENDIAN);
362

  
363
		// we start intercepting the decrypted variables
364
		for (int i = 0; i < 12; i++) {
365
			fileID = fileID + (char) decryptedDataBB.get();
366
		}
367
		decryptedDataBB.getInt(); // 0x00
368

  
369
		decryptedDataBB.getInt(); // 0x6C
370

  
371
		decryptedDataBB.getInt(); // 0x04
372

  
373
		rootTreeNodeGap = decryptedDataBB.getInt();
374
		lowermostLeftTreeNodeGap = decryptedDataBB.getInt();
375
		lowermostRightTreeNodeGap = decryptedDataBB.getInt();
376
		decryptedDataBB.getInt(); // unknown
377
		lastSectionId = decryptedDataBB.getInt();
378

  
379
		lastSectionAddress = decryptedDataBB.getInt();
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff