package org.geotools.data.dxf.entities; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import java.io.EOFException; 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.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 DXFLine extends DXFEntity { private static final Log log = LogFactory.getLog(DXFLine.class); public DXFPoint _a = new DXFPoint(); public DXFPoint _b = new DXFPoint(); public DXFLine(DXFLine newLine) { this(new DXFPoint(newLine._a._point.x, newLine._a._point.y, newLine.getColor(), null, 0, newLine.getThickness()), new DXFPoint(newLine._b._point.x, newLine._b._point.y, newLine.getColor(), null, 0, newLine.getThickness()), newLine.getColor(), newLine.getRefLayer(), newLine.getLineType(), newLine.getThickness(), 0); setType(newLine.getType()); setStartingLineNumber(newLine.getStartingLineNumber()); setUnivers(newLine.getUnivers()); } public DXFLine(DXFPoint a, DXFPoint b, int c, DXFLayer l, DXFLineType lineType, double thickness, int visibility) { super(c, l, visibility, lineType, thickness); _a = a; _b = b; setName("DXFLine"); } public static DXFLine read(DXFLineNumberReader br, DXFUnivers univers) throws IOException { DXFLayer l = null; double x1 = 0, y1 = 0, x2 = 0, y2 = 0, thickness = 0; DXFLineType lineType = null; int visibility = 1, c = -1; 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(); // geldt voor alle waarden van type br.reset(); doLoop = false; break; case X_1: //"10" x1 = cvp.getDoubleValue(); break; case Y_1: //"20" y1 = cvp.getDoubleValue(); break; case X_2: //"11" x2 = cvp.getDoubleValue(); break; case Y_2: //"21" y2 = cvp.getDoubleValue(); break; case LAYER_NAME: //"8" l = univers.findLayer(cvp.getStringValue()); break; case COLOR: //"62" c = cvp.getShortValue(); break; case LINETYPE_NAME: //"6" lineType = univers.findLType(cvp.getStringValue()); break; case THICKNESS: //"39" thickness = cvp.getDoubleValue(); break; case VISIBILITY: //"60" visibility = cvp.getShortValue(); break; default: break; } } DXFLine e = new DXFLine(new DXFPoint(x1, y1, c, l, visibility, 1), new DXFPoint(x2, y2, c, l, visibility, 1), c, l, lineType, thickness, visibility); e.setType(GeometryType.LINE); e.setStartingLineNumber(sln); e.setUnivers(univers); log.debug(e.toString(x1, y1, x2, y2, c, visibility, thickness)); log.debug(">Exit at line: " + br.getLineNumber()); return e; } public Coordinate[] toCoordinateArray() { if (_a == null || _b == null) { addError("coordinate array can not be created."); return null; } return rotateAndPlace(new Coordinate[]{_a.toCoordinate(), _b.toCoordinate()}); } @Override public Geometry getGeometry() { if (geometry == null) { updateGeometry(); } return super.getGeometry(); } @Override public void updateGeometry() { Coordinate[] ca = toCoordinateArray(); if (ca != null && ca.length > 1) { geometry = getUnivers().getGeometryFactory().createLineString(ca); } else { addError("coordinate array faulty, size: " + (ca == null ? 0 : ca.length)); } } public String toString(double x1, double y1, double x2, double y2, int c, int visibility, double thickness) { StringBuffer s = new StringBuffer(); s.append("DXFLine ["); s.append("x1: "); s.append(x1 + ", "); s.append("y1: "); s.append(y1 + ", "); s.append("x2: "); s.append(x2 + ", "); s.append("y2: "); s.append(y2 + ", "); s.append("color: "); s.append(c + ", "); s.append("visibility: "); s.append(visibility + ", "); s.append("thickness: "); s.append(thickness); s.append("]"); return s.toString(); } @Override public DXFEntity translate(double x, double y) { _a._point.x += x; _a._point.y += y; _b._point.x += x; _b._point.y += y; return this; } @Override public DXFEntity clone() { return new DXFLine(this); } }