package org.geotools.data.dxf.header; import java.awt.BasicStroke; import java.io.EOFException; import java.io.IOException; import java.util.Vector; import org.geotools.data.dxf.parser.DXFParseException; import org.geotools.data.dxf.parser.DXFCodeValuePair; import org.geotools.data.dxf.parser.DXFConstants; import org.geotools.data.dxf.parser.DXFGroupCode; import org.geotools.data.dxf.parser.DXFLineNumberReader; import org.geotools.data.dxf.parser.DXFUnivers; import org.geotools.data.dxf.header.DXFBlockRecord; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class DXFTables implements DXFConstants { private static final Log log = LogFactory.getLog(DXFTables.class); public static final double defaultThickness = 1.0f; public Vector<DXFLayer> theLayers = new Vector<DXFLayer>(); public Vector<DXFLineType> theLineTypes = new Vector<DXFLineType>(); public DXFTables() { } public DXFTables(Vector<DXFLayer> sLayers, Vector<DXFLineType> sLineTypes) { this.theLayers = sLayers; this.theLineTypes = sLineTypes; } public static DXFTables readTables(DXFLineNumberReader br, DXFUnivers univers) throws IOException { Vector<DXFLayer> sLayers = new Vector<DXFLayer>(); Vector<DXFLineType> sLineTypes = new Vector<DXFLineType>(); int sln = br.getLineNumber(); log.debug(">Enter at line: " + sln); DXFCodeValuePair cvp = null; DXFGroupCode gc = null; boolean doLoop = true; while (doLoop) { cvp = new DXFCodeValuePair(); try { gc = cvp.read(br); } catch (DXFParseException ex) { throw new IOException("DXF parse error" + ex.getLocalizedMessage()); } catch (EOFException e) { doLoop = false; break; } switch (gc) { case TYPE: String type = cvp.getStringValue(); if (type.equals(ENDSEC)) { doLoop = false; break; } else if (type.equals(TABLE)) { readTable(br, sLayers, sLineTypes, univers); } break; default: break; } } DXFTables e = new DXFTables(sLayers, sLineTypes); log.debug(e.toString(sLayers.size(), sLineTypes.size())); log.debug(">Exit at line: " + br.getLineNumber()); return e; } public static void readTable(DXFLineNumberReader br, Vector<DXFLayer> sLayers, Vector<DXFLineType> sLineTypes, DXFUnivers univers) throws IOException { int sln = br.getLineNumber(); log.debug(">>Enter at line: " + sln); DXFCodeValuePair cvp = null; DXFGroupCode gc = null; boolean doLoop = true; while (doLoop) { cvp = new DXFCodeValuePair(); try { gc = cvp.read(br); } catch (DXFParseException ex) { throw new IOException("DXF parse error" + ex.getLocalizedMessage()); } catch (EOFException e) { doLoop = false; break; } switch (gc) { case TYPE: String type = cvp.getStringValue(); if (type.equals(ENDSEC)) { // hack om einde zonder ENDTAB te werken br.reset(); doLoop = false; break; } else if (type.equals(ENDTAB)) { doLoop = false; break; } else if (type.equals(LAYER)) { DXFLayer layer = DXFLayer.read(br); sLayers.add(layer); } else if (type.equals(LTYPE)) { DXFLineType lt = DXFLineType.read(br); sLineTypes.add(lt); } else if (type.equals(BLOCK_RECORD)) { log.info("Blockrecord at " + br.getLineNumber()); // DXFBlockRecord dt = DXFBlockRecord.read(br, univers); } break; default: break; } } } public String toString(int numLayers, int numLineTypes) { StringBuffer s = new StringBuffer(); s.append("DXFTables ["); s.append("numLayers: "); s.append(numLayers + ", "); s.append("numLineTypes: "); s.append(numLineTypes); s.append("]"); return s.toString(); } }