Revision 10632 trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/readers/DwgFileV12Reader.java
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