package org.geotools.data.dxf.entities; import java.io.EOFException; import java.util.Vector; import org.geotools.data.dxf.parser.DXFLineNumberReader; import java.io.IOException; import org.geotools.data.GeometryType; import org.geotools.data.dxf.parser.DXFUnivers; import org.geotools.data.dxf.header.DXFLayer; import org.geotools.data.dxf.header.DXFTables; import org.geotools.data.dxf.header.DXFLineType; import org.geotools.data.dxf.parser.DXFCodeValuePair; import org.geotools.data.dxf.parser.DXFGroupCode; import org.geotools.data.dxf.parser.DXFParseException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class DXFSpLine extends DXFPolyline { private static final Log log = LogFactory.getLog(DXFSpLine.class); public DXFPoint _a = new DXFPoint(); public DXFPoint _b = new DXFPoint(); public DXFSpLine(DXFPolyline newPolyLine) { super(newPolyLine); setName("DXFSpLine"); } public DXFSpLine(String name, int flag, int c, DXFLayer l, Vector<DXFVertex> v, int visibility, DXFLineType lineType, double thickness) { super(name, flag, c, l, v, visibility, lineType, thickness); setName("DXFSpLine"); } public static DXFSpLine read(DXFLineNumberReader br, DXFUnivers univers) throws IOException { DXFLayer l = null; int flag = 0, visibility = 0, c = -1; String name = ""; DXFLineType lineType = null; Vector<DXFVertex> lv = new Vector<DXFVertex>(); 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; } // Unsupported GroupCodes: // HANDLE, SOFT_POINTER_HANDLE_1, SUBCLASS_DATA_MARKER, INT_1, INT_2, INT_3, INT_4, INT_5, DOUBLE_3, DOUBLE_4, DOUBLE_1, Z_1 switch (gc) { case TYPE: // geldt voor alle waarden van type br.reset(); doLoop = false; break; case LAYER_NAME: //"8" l = univers.findLayer(cvp.getStringValue()); break; case X_1: double x = cvp.getDoubleValue(); lv.add(new DXFVertex(x, -1, 1, c, l, visibility)); case Y_1: int lastIndex = lv.size() - 1; DXFVertex lastCoord = lv.get(lastIndex); lastCoord.setY(cvp.getDoubleValue()); lv.set(lastIndex, lastCoord); break; default: break; } } DXFSpLine e = new DXFSpLine(name, 4, c, l, lv, visibility, lineType, DXFTables.defaultThickness); e.setType(GeometryType.LINE); e.setStartingLineNumber(sln); e.setUnivers(univers); log.debug(e.toString(lv.get(0).X(), lv.get(0).Y(), lv.get(lv.size() - 1).X(), lv.get(lv.size() - 1).Y(), c, visibility)); log.debug(">Exit at line: " + br.getLineNumber()); return e; } public String toString(double x1, double y1, double x2, double y2, int c, int visibility) { StringBuffer s = new StringBuffer(); s.append("DXFSpLine ["); s.append("start x: "); s.append(x1 + ", "); s.append("start y: "); s.append(y1 + ", "); s.append("end x: "); s.append(x2 + ", "); s.append("end y: "); s.append(y2 + ", "); s.append("color: "); s.append(c + ", "); s.append("visibility: "); s.append(visibility); s.append("]"); return s.toString(); } }