Revision 10632 trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/readers/DwgFileV12Reader.java

View differences:

DwgFileV12Reader.java
55 55
import com.iver.cit.jdwglib.dwg.DwgHandleReference;
56 56
import com.iver.cit.jdwglib.dwg.DwgObject;
57 57
import com.iver.cit.jdwglib.dwg.DwgObjectFactory;
58
import com.iver.cit.jdwglib.dwg.DwgUtil;
58
import com.iver.cit.jdwglib.dwg.IDwgBlockMember;
59
import com.iver.cit.jdwglib.dwg.IDwgPolyline;
60
import com.iver.cit.jdwglib.dwg.IDwgVertex;
59 61
import com.iver.cit.jdwglib.dwg.objects.DwgArc;
60 62
import com.iver.cit.jdwglib.dwg.objects.DwgBlockHeader;
61 63
import com.iver.cit.jdwglib.dwg.objects.DwgCircle;
64
import com.iver.cit.jdwglib.dwg.objects.DwgEndblk;
62 65
import com.iver.cit.jdwglib.dwg.objects.DwgInsert;
63 66
import com.iver.cit.jdwglib.dwg.objects.DwgLayer;
64 67
import com.iver.cit.jdwglib.dwg.objects.DwgLine;
......
67 70
import com.iver.cit.jdwglib.dwg.objects.DwgPoint;
68 71
import com.iver.cit.jdwglib.dwg.objects.DwgPolyline2D;
69 72
import com.iver.cit.jdwglib.dwg.objects.DwgPolyline3D;
73
import com.iver.cit.jdwglib.dwg.objects.DwgSeqend;
70 74
import com.iver.cit.jdwglib.dwg.objects.DwgSolid;
71 75
import com.iver.cit.jdwglib.dwg.objects.DwgText;
72 76
import com.iver.cit.jdwglib.dwg.objects.DwgVertex2D;
73 77
import com.iver.cit.jdwglib.dwg.objects.DwgVertex3D;
74 78
import com.iver.cit.jdwglib.dwg.objects.DwgVertexPFace;
75 79
import com.iver.cit.jdwglib.dwg.objects.DwgVertexPFaceFace;
76
import com.iver.cit.jdwglib.util.ByteUtils;
77 80

  
78 81
/**
79 82
 * Reads version 12 dwg files.
......
104 107
	private boolean r13 = false;
105 108
	int index = 0;
106 109
	
110
	ArrayList blocks = new ArrayList();
111
	
112
	
113
	/**
114
	 * While DwgBlock is a DWG entity, readed from the DWG entities
115
	 * section, a Block is an entry in the BLOCK Section of DWG 12 format.
116
	 * 
117
	 * Block has block name attribute (like DwgBlock), but its most
118
	 * important attribute is its order in the Block section.
119
	 * 
120
	 * Inserts has a short number that we think is the order of its
121
	 * referred block in the block table (the only approach to fech
122
	 * the block of an insert)
123
	 * */
124
	class Block {
125
		/*
126
        |----------|--------------------------------------------|
127
        | 1        | This is an anonymous Block generated by    |
128
        |          | hatching, associative dimensioning, other  |
129
        |          | internal operations, or an application     |
130
        |----------|--------------------------------------------|
131
        | 2        | This Block has Attributes                  |
132
        |----------|--------------------------------------------|
133
        | 4        | This Block is an external reference (Xref) |
134
        |----------|--------------------------------------------|
135
        | 8        | not used                                   |
136
        |----------|--------------------------------------------|
137
        | 16       | This Block is externally dependent         |
138
        |----------|--------------------------------------------|
139
        | 32       | This is a resolved external reference, or  |
140
        |          | dependent of an external reference         |
141
        |----------|--------------------------------------------|
142
        | 64       | This definition is referenced              |
143
        +-------------------------------------------------------+
144
        */
145
		byte flag;
146
		String name;
147
		short used;
148
		
149
		byte b1;
150
		short w1;
151
		byte b2;
152
		short w3;
153
		short crc;
154
	}
155
	
107 156
	public DwgFileV12Reader(boolean isR13){
108 157
		r13 = isR13;
109 158
		readers.add(null);//0
......
117 166
		readers.add(new ArcReader());//8
118 167
		readers.add(new TraceReader());//9
119 168
		readers.add(null);//10
120
		readers.add(new SolidReader());//12
121
		readers.add(new BlkReader());//13
122
		readers.add(new EndBlkReader());//14
123
		readers.add(new InsertReader());//15
124
		readers.add(new AttDefReader());//16
125
		readers.add(new AttribReader());//17
126
		readers.add(new SbEndReader());//18
127
		readers.add(null);//19
128
		readers.add(new PlineReader());//20
129
		readers.add(new VertexReader());//21
130
		readers.add(null);//22
131
		readers.add(new Face3DReader());//23
132
		readers.add(new DimReader());//24
133
		readers.add(new VPortReader());//25
169
		readers.add(new SolidReader());//11
170
		readers.add(new BlkReader());//12
171
		readers.add(new EndBlkReader());//13
172
		readers.add(new InsertReader());//14
173
		readers.add(new AttDefReader());//15
174
		readers.add(new AttribReader());//16
175
		readers.add(new SbEndReader());//17
176
		readers.add(null);//18
177
		readers.add(new PlineReader());//19
178
		readers.add(new VertexReader());//20
179
		readers.add(null);//21
180
		readers.add(new Face3DReader());//22
181
		readers.add(new DimReader());//23
182
		readers.add(new VPortReader());//24
134 183
	}
135 184
	
136 185
	
......
219 268
			
220 269
			readBlockTable(blockTable);
221 270
			readLayerTable(layerTable);
222
			readStyleTable(styleTable);
223
			readLTypeTable(lineTypeTable);
224
			readViewTable(viewTable);
225
			readUcsTable(ucsTable);
226
			readVportTable(vportTable);
227
			readAppidTable(appidTable);
228
			readDimStyleTable(dimStyleTable);
271
			
272
//de momento nos saltamos estas tablas
273
//			readStyleTable(styleTable);
274
//			readLTypeTable(lineTypeTable);
275
//			readViewTable(viewTable);
276
//			readUcsTable(ucsTable);
277
//			readVportTable(vportTable);
278
//			readAppidTable(appidTable);
279
//			readDimStyleTable(dimStyleTable);
229 280
//			readP13Table(p13table);
230 281
			
231 282
			//luego lee entidades de bloque
......
631 682
		short size = layerTable.s1;
632 683
		int numR = layerTable.i1;
633 684
		int start = layerTable.i2;
685
		
686
		int begin = -1;
634 687
		int end = -1;
635
		bb.position(start);
636 688
		
637 689
		DwgLayer layer = null;
638
		
639
		
640 690
		for(int i = 0; i < numR; i++){
691
			begin = start + i * size;
692
			bb.position(begin);
693
			end = begin + size - 2;
641 694
			
642 695
			layer = new DwgLayer(index);
643 696
			index++;
644
			end = bb.position() + size;
697
			
645 698
			byte flag = bb.get();
646 699
			/*
647 700
			 +=====================================================+
......
668 721
			
669 722
			byte[] nameByte = new byte[32];
670 723
			bb.get(nameByte);
671
			String name = new String(nameByte);
724
			String name = new String(nameByte).trim();
672 725
			layer.setName(name);
673 726
			
674 727
			bb.order(ByteOrder.LITTLE_ENDIAN);
......
677 730
			layer.setColor(color);
678 731
			short style = bb.getShort();
679 732
			short crc = bb.getShort();
680
			
681
			int offset = end - bb.position();
682
			
733

  
683 734
			//TODO Vemos si el indice que ocupa la layer en la tabla
684 735
			//de layers se corresponde con el valor short de las entidades
685 736
			//graficas
686 737
			DwgHandleReference handle = new DwgHandleReference(0x5, i);
687 738
			layer.setHandle(handle);
688 739
			dwgFile.addDwgObject(layer);
740
			
741
			
742
			int offset = end - bb.position();
689 743
			if(offset > 0)
690 744
				bb.position(bb.position() + offset);
691 745
			
......
797 851
			double d40 = bb.getDouble();
798 852
			circle.setRadius(d40);
799 853
			
854
			double[] pt210 = null;
800 855
			if((opts & 0x1) > 0){
801
				double[] pt210 = getPoint(true);
802
				circle.setExtrusion(pt210);
856
				pt210 = getPoint(true);
857
				
858
			}else{
859
				pt210 = new double[]{0,0,1};
803 860
			}
804
			
861
			circle.setExtrusion(pt210);
805 862
			if((opts & 0x2) > 0){
806 863
				bb.order(ByteOrder.LITTLE_ENDIAN);
807 864
				double db38 = bb.getDouble();
......
929 986
			double d51 = bb.getDouble();
930 987
			arc.setEndAngle(51);
931 988
			
989
			double[] pt210 = null;
932 990
			if((opts & 0x1) > 0){
933
				double[] pt210 = getPoint(true);
991
				pt210 = getPoint(true);
934 992
				arc.setExtrusion(pt210);
993
			}else{
994
				pt210 = new double[]{1, 0, 0};
935 995
			}
936 996
			if((opts & 0x2) > 0){
937 997
				bb.order(ByteOrder.LITTLE_ENDIAN);
......
993 1053
				solid.getCorner3()[2] = db38;
994 1054
				solid.getCorner4()[2] = db38;
995 1055
			}
1056
			
1057
			solid.setExtrusion(new double[]{0, 0, 1});
996 1058
		}
997 1059
	}
998 1060
	
1061
	
1062
	private Block getBlock(String blockName){
1063
		for(int i = 0; i < blocks.size(); i++){
1064
			Block block = (Block) blocks.get(i);
1065
			if(block.name.equalsIgnoreCase(blockName)){
1066
				return block;
1067
			}
1068
		}
1069
		return null;
1070
	}
1071
	
1072
	
1073
	
999 1074
	class BlkReader implements EntityReader{
1000 1075
		public void read(ByteBuffer bb, byte flags, short opts, DwgObject dwgObj) {
1001 1076
			if(! (dwgObj instanceof DwgBlockHeader))
......
1007 1082
			blk.setBasePoint(pt10);
1008 1083
			String blockName = getString();
1009 1084
			
1085
			Block block = getBlock(blockName);
1086
			if(block == null){
1087
				System.out.println(blockName+" no encontrado en la tabla de bloques");
1088
			}
1089
			
1010 1090
			//TODO En DWG 12 no se distingue Block de BlockHeader, en ulteriores
1011 1091
			//versiones si
1012 1092
			//REVISAR EL CASO DE LOS BLOQUES
......
1068 1148
		}
1069 1149
	}
1070 1150
	class EndBlkReader implements EntityReader{
1071
		public void read(ByteBuffer bb, byte flags, short opts, DwgObject dwgObj) {}
1151
		public void read(ByteBuffer bb, byte flags, short opts, DwgObject dwgObj) {
1152
			System.out.println("endblk");
1153
		}
1072 1154
	}
1073 1155
	
1074 1156
	class InsertReader implements EntityReader{
......
1078 1160
			DwgInsert insert = (DwgInsert) dwgObj;
1079 1161
			
1080 1162
			bb.order(ByteOrder.nativeOrder());
1081
			short w1 = bb.getShort();
1163
			short w1 = bb.getShort();//Puede ser este el identificador de bloque???
1082 1164
			
1083
			
1084
			
1085 1165
			double[] pt10 = getPoint(false);
1086 1166
			insert.setInsertionPoint(pt10);
1087 1167
			
......
1131 1211
				double db45 = bb.getDouble();
1132 1212
				//row spacing
1133 1213
			}
1214
			insert.setExtrusion(new double[]{0, 0, 1});
1134 1215
		}
1135 1216
	}
1136 1217
	
......
1228 1309
			if((opts & 0x80) > 0){
1229 1310
				double[] p11 = getPoint(false);
1230 1311
			}
1231
			
1312
			double[] p210 = null;
1232 1313
			if((opts & 0x100) > 0){
1233
				double[] p210 = getPoint(true);
1314
				p210 = getPoint(true);
1315
			}else{
1316
				p210 = new double[]{0, 0, 1};
1234 1317
			}
1235 1318
			bb.order(ByteOrder.LITTLE_ENDIAN);
1236 1319
			if((opts & 0x200) > 0){
......
1365 1448
					((DwgPolyline2D)solution).setInitWidth(startW40);
1366 1449
				}
1367 1450
			}
1451
			
1452
			
1368 1453
			return solution;
1369 1454
		}
1370 1455
	}
......
1565 1650
		}
1566 1651
	}
1567 1652
	
1568
	
1569
	
1570 1653
	/**
1571 1654
	 * @param start
1572 1655
	 * @param end
......
1577 1660
		int emax = readers.size();
1578 1661
		EntityReader reader = null;
1579 1662
		
1663
		/*
1664
		 * it isnt null until well finish to read the vertices
1665
		 * of a given polyline (seqend found)
1666
		 * 
1667
		 */
1668
		IDwgPolyline currentPolyline = null;
1669
		
1670
		/*
1671
		 * Not null when a DwgBlock is found, it will be null
1672
		 * when a DwgEndBlk found. While this, all entities readed
1673
		 * will be added to currentBlock
1674
		 * */
1675
		DwgBlockHeader currentBlock = null;
1676
		
1580 1677
		while(ant < (end - 32)){
1581 1678
			bb.order(ByteOrder.LITTLE_ENDIAN);
1582 1679
			
......
1643 1740
							getInstance().
1644 1741
							create(kind, index);
1645 1742
				
1646
				DwgHandleReference hdl = null;
1647
				
1648
				
1649
				//TODO HANDLES. Tampoco se si en DWG 12 se leen 
1650
				//igual que en DWG 13 y posteriores		
1651
				if(handle != null){
1652
					int offset = handle.hashCode();
1653
					hdl = new DwgHandleReference(0, offset);
1654
				}else{
1655
					System.out.println("HANDLE A NULL");
1656
					bb.position(crcpos);
1657
					short crc = bb.getShort();
1658
					continue;
1659
				}
1660
				
1661 1743
				//TODO Idem con el espacio papel o el espacio modelo
1662 1744
				boolean paperSpace = false;
1663 1745
				if(paper != 0){
......
1668 1750
					entity = ((DefferedEntityReader)reader).getDwgObject(index);	
1669 1751
				}
1670 1752
				
1753
				if(entity instanceof IDwgPolyline){
1754
					currentPolyline = (IDwgPolyline) entity;
1755
				}
1756
				else if(entity instanceof DwgSeqend){
1757
					currentPolyline = null;
1758
				}else if(entity instanceof DwgBlockHeader){
1759
					currentBlock = (DwgBlockHeader) entity;
1760
				}else if(entity instanceof DwgEndblk){
1761
					currentBlock = null;
1762
				}
1763
				
1764
				DwgHandleReference hdl = null;
1765
				/*
1766
				In V12 format a handle has 2 bytes, while
1767
				in later formats a hande has 4 bytes. To avoid
1768
				rewriting a lot of code we are going to do some "tricks"
1769
				with handles.
1770
				*/
1771
				if(entity instanceof DwgBlockHeader){
1772
					/*
1773
					 * If entity is a block, in a later step we'll match
1774
					 * an insert with its block by handle.
1775
				     * In dwg 12 format, association insert-blocks is not
1776
				     * by handle (is from the order of the block in block table)
1777
				     * So here we use a little trick to avoid rewriting of
1778
				     * block and inserts management logic.
1779
					 * */
1780
					int order = -1;
1781
					DwgBlockHeader blk = (DwgBlockHeader) entity;
1782
					String blockName = blk.getName();
1783
					Block block = getBlock(blockName);
1784
					if(block != null){
1785
						order = blocks.indexOf(block);
1786
						hdl = new DwgHandleReference(0, order);
1787
					}else{
1788
						System.out.println("BLOQUE "+blockName+" NO EST? EN LA TABLA DE BLOQUES");
1789
						bb.position(crcpos);
1790
						short crc = bb.getShort();
1791
						continue;
1792
					}
1793
				}else{
1794
					if(handle != null){
1795
						int offset = handle.hashCode();
1796
						hdl = new DwgHandleReference(0, offset);
1797
					}else{
1798
						System.out.println("HANDLE A NULL");
1799
						bb.position(crcpos);
1800
						short crc = bb.getShort();
1801
						continue;
1802
					}
1803
				}
1804
				
1671 1805
				entity.setColor(color);
1672 1806
				entity.setType(type);//TODO Este type es el mismo que para DWG 13-14-2000?
1673 1807
				entity.setSizeInBits(lenght);//TODO Este size es el mismo que para DWG 13-14-2000?
......
1706 1840
				}
1707 1841
				short crc = bb.getShort();
1708 1842
				
1709
//				if(! paperSpace)//TODO solo a?adimos las entidades en espacio modelo????
1710
				dwgFile.addDwgObject(entity);
1711
				
1843
				if( (entity instanceof IDwgVertex) && (currentPolyline != null)){
1844
					currentPolyline.addVertex((IDwgVertex) entity);
1845
					
1846
				}else if( (entity instanceof IDwgBlockMember) && (currentBlock != null)){
1847
					currentBlock.addObject(entity);
1848
				} else{
1849
//					if(! paperSpace)//TODO solo a?adimos las entidades en espacio modelo????
1850
					dwgFile.addDwgObject(entity);
1851
				}
1712 1852
			}//if reader
1713 1853
			else{
1714 1854
				System.out.println("Reader a NULL. DWG 12 MAL LEIDO");
......
1856 1996
	//TODO Que se hacen con los registros que se leen???
1857 1997
	private void readBlockTable(Dwg12Table blockTable) {
1858 1998
		short size = blockTable.s1;
1859
		int numRecords = blockTable.i1;
1999
		int numRecords =  blockTable.i1;
1860 2000
		int start = blockTable.i2;
1861
		bb.position(start);
1862 2001
		
2002
		int begin = -1;
1863 2003
		int end = -1;
1864 2004
		
1865 2005
		for(int i = 0; i < numRecords; i++){
1866
			end = bb.position() + size;
2006
			
2007
			begin = start + i * size;
2008
			bb.position(begin);
2009
			
2010
			end = begin + size - 2;
2011
	
1867 2012
			byte flag = bb.get();
1868
			//TODO No estoy muy seguro de que esto sea
1869
			//igual que handle.read(32) en Python
1870 2013
			byte[] nameByte = new byte[32];
1871 2014
			bb.get(nameByte);
1872
			String name = new String(nameByte);
2015
			String name = new String(nameByte).trim();
1873 2016
			
1874 2017
			bb.order(ByteOrder.LITTLE_ENDIAN);
1875 2018
			
......
1877 2020
			byte b1 = bb.get();
1878 2021
			short w1 = bb.getShort();
1879 2022
			byte b2 = bb.get();
1880
			short w2 = bb.getShort();
2023
			
2024
			short w3 = bb.getShort();
1881 2025
			short crc = bb.getShort();
1882 2026
		
1883 2027
			int offset = end - bb.position();
1884 2028
			if(offset > 0)
1885 2029
				bb.position(bb.position() + end);
1886
		}
2030
			
2031
			Block block = new Block();
2032
			block.flag = flag;
2033
			block.name = name;
2034
			block.used = used;
2035
			block.b1 = b1;
2036
			block.w1 = w1;
2037
			block.b2 = b2;
2038
			block.w3 = w3;
2039
			block.crc = crc;
2040
			blocks.add(block);
2041
		}//for
1887 2042
		byte[] crc32 = new byte[32];
1888 2043
		bb.get(crc32);
1889 2044
	}

Also available in: Unified diff